From 6af2853faa148eaf479bba0e5f7478b70a9f3e32 Mon Sep 17 00:00:00 2001 From: Daniel Noulet Date: Sat, 19 Sep 2026 17:33:44 +0200 Subject: [PATCH] build and ready for demo login screen --- .dockerignore | 20 + .env.example | 10 +- .gitignore | 14 +- Dockerfile | 31 + Makefile | 74 +- cmd/server/main.go | 51 +- cmd/server/migrations/postgres/001_init.sql | 9 - .../migrations/postgres/002_content.sql | 32 - .../postgres/003_content_taxonomy.sql | 26 - cmd/server/migrations/postgres/004_sso.sql | 35 - docker-compose.yml | 19 - go.mod | 21 - go.sum | 66 -- internal/config/config.go | 25 +- internal/domain/models.go | 33 - internal/persistence/mapping.go | 15 - internal/persistence/models.go | 44 - internal/persistence/models_test.go | 30 - internal/repository/gorm.go | 79 -- internal/repository/interfaces.go | 14 - internal/service/content.go | 474 +++++++++- internal/service/content_test.go | 127 +++ internal/service/demo_auth.go | 76 ++ internal/service/seed.go | 835 ++++++++++++++++++ internal/web/handlers.go | 219 +++-- internal/web/handlers_test.go | 43 +- scripts/seed_content.sql | 581 ------------ ui/app/assets/background.png | Bin 0 -> 259847 bytes ui/app/src/App.tsx | 55 +- ui/app/src/api.ts | 80 +- ui/app/src/auth.tsx | 24 +- ui/app/src/styles.css | 73 ++ ui/app/vite.config.ts | 6 + 33 files changed, 2020 insertions(+), 1221 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile delete mode 100644 cmd/server/migrations/postgres/001_init.sql delete mode 100644 cmd/server/migrations/postgres/002_content.sql delete mode 100644 cmd/server/migrations/postgres/003_content_taxonomy.sql delete mode 100644 cmd/server/migrations/postgres/004_sso.sql delete mode 100644 docker-compose.yml delete mode 100644 internal/domain/models.go delete mode 100644 internal/persistence/mapping.go delete mode 100644 internal/persistence/models.go delete mode 100644 internal/persistence/models_test.go delete mode 100644 internal/repository/gorm.go delete mode 100644 internal/repository/interfaces.go create mode 100644 internal/service/content_test.go create mode 100644 internal/service/demo_auth.go create mode 100644 internal/service/seed.go delete mode 100644 scripts/seed_content.sql create mode 100644 ui/app/assets/background.png diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1f32c37 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,20 @@ +# Keep the build context small and never ship local state. +.git +.gitignore +.idea +.vscode +*.md +.env +.env.example + +# Node and frontend build output +**/node_modules +ui/dist +ui/app/dist + +# Go build output +bin + +# Local content store +*.json.tmp +data \ No newline at end of file diff --git a/.env.example b/.env.example index 54ceb07..0ffc588 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,14 @@ CMS_HTTP_ADDR=:8080 -CMS_APPLICATION_DATABASE_URL="host=localhost user=cms password=cms dbname=cms port=5432 sslmode=disable" CMS_ALLOWED_ORIGINS=http://localhost:5173 +CMS_PROFILE=demo +# Production profile uses SSO and reserves this URL for the PostgreSQL +# persistence adapter. Demo mode intentionally does not need a database. +CMS_POSTGRES_URL= + +# Optional content file. Leave empty for a pure in-memory demo that reloads the +# seed on every start. Set it to a path on a mounted volume to keep edits: +# CMS_CONTENT_FILE=/data/content.json +CMS_CONTENT_FILE= # Single sign-on. The CMS does not sign anyone in: an identity-aware proxy # (oauth2-proxy, Authelia, Cloudflare Access, ...) authenticates the owner and diff --git a/.gitignore b/.gitignore index 18c8452..a323705 100644 --- a/.gitignore +++ b/.gitignore @@ -2,15 +2,19 @@ bin/ *.test -# Local environment and data +# Frontend build output. The compiled app is embedded from +# cmd/server/web/dist, which keeps only its committed placeholder in git. +ui/dist/ +cmd/server/web/dist/* +!cmd/server/web/dist/placeholder.txt + +# Local environment and content store .env -*.db -*.sqlite -*.sqlite3 +data/ +*.json.tmp # Node node_modules/ -ui/app/dist/ ui/app/.vite/ # IDE and OS diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8bc3d10 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +# Build the React app into ui/dist. +FROM node:22-alpine AS ui +WORKDIR /src/ui/app +COPY ui/app/package.json ui/app/package-lock.json ./ +RUN npm ci +COPY ui/app/ ./ +RUN npm run build -- --outDir /src/ui/dist --emptyOutDir + +# Compile the Go binary with the built frontend embedded. +FROM golang:1.27-alpine AS backend +WORKDIR /src +COPY go.mod ./ +COPY cmd/ ./cmd/ +COPY internal/ ./internal/ +COPY --from=ui /src/ui/dist/ ./cmd/server/web/dist/ +RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/cms ./cmd/server + +# Runtime: one static binary, no database, no shell tooling. +FROM alpine:3.20 +RUN apk add --no-cache ca-certificates tzdata \ + && adduser -D -u 10001 cms +COPY --from=backend /out/cms /usr/local/bin/cms +USER cms +EXPOSE 8080 +ENV CMS_HTTP_ADDR=:8080 +# Mount a volume here and set CMS_CONTENT_FILE=/data/content.json to keep edits +# across restarts; without it the store is memory-only and the seed reloads. +VOLUME ["/data"] +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \ + CMD wget -qO- http://127.0.0.1:8080/health || exit 1 +ENTRYPOINT ["/usr/local/bin/cms"] \ No newline at end of file diff --git a/Makefile b/Makefile index a7fffdf..59a91e6 100644 --- a/Makefile +++ b/Makefile @@ -1,36 +1,60 @@ SHELL := /bin/sh -COMPOSE ?= docker compose -GOOSE ?= go run github.com/pressly/goose/v3/cmd/goose@v3.24.3 -POSTGRES_URL ?= postgres://cms:cms@localhost:5432/cms?sslmode=disable +IMAGE ?= cms-demo +TAG ?= latest -.PHONY: up down migrate seed backend frontend dev +.PHONY: help ui backend demo production run test check docker docker-run clean -up: - $(COMPOSE) up -d --wait +help: + @echo "make ui build the React app into cmd/server/web/dist" + @echo "make backend run the Go server on :8080 (serves the last UI build)" + @echo "make demo run the in-memory demo profile" + @echo "make production run the SSO production profile" + @echo "make run build the UI, then run the server" + @echo "make test run the Go test suite" + @echo "make check gofmt, vet, and tests" + @echo "make docker build the all-in-one image" + @echo "make docker-run run the image on :8080" + @echo "make clean remove build output" -down: - $(COMPOSE) down - -migrate: - $(GOOSE) -dir cmd/server/migrations/postgres postgres "$(POSTGRES_URL)" up - -seed: - psql "$(POSTGRES_URL)" -v ON_ERROR_STOP=1 -f scripts/seed_content.sql +# The Go server embeds the compiled frontend, so the UI is built first and copied +# into the embed directory that cmd/server/main.go points at. +ui: + @if [ ! -d ui/app/node_modules ]; then \ + npm --prefix ui/app ci; \ + fi + npm --prefix ui/app run build + rm -rf cmd/server/web/dist + mkdir -p cmd/server/web/dist + cp -R ui/dist/. cmd/server/web/dist/ backend: set -a; [ ! -f .env ] || . ./.env; set +a; \ - CMS_APPLICATION_DATABASE_URL="$${CMS_APPLICATION_DATABASE_URL:-host=localhost user=cms password=cms dbname=cms port=5432 sslmode=disable}" \ go run ./cmd/server -frontend: - @if [ ! -x ui/app/node_modules/.bin/vite ]; then \ - npm --prefix ui/app ci; \ - fi - npm --prefix ui/app run dev +demo: + CMS_PROFILE=demo $(MAKE) backend -dev: up migrate - @trap 'kill 0' INT TERM; \ - $(MAKE) backend & \ - $(MAKE) frontend & \ - wait +production: + CMS_PROFILE=production $(MAKE) backend + +run: ui backend + +test: + go test ./... + +check: + gofmt -l ./cmd ./internal + go vet ./... + go test ./... + +docker: + docker build -t $(IMAGE):$(TAG) . + +docker-run: + docker run --rm -p 8080:8080 --env-file .env $(IMAGE):$(TAG) + +clean: + rm -rf cmd/server/web/dist ui/dist + mkdir -p cmd/server/web/dist + printf 'Placeholder so the Go embed directive resolves before the frontend is built.\nRun `make ui` to replace this directory with the real React build.\n' > cmd/server/web/dist/placeholder.txt diff --git a/cmd/server/main.go b/cmd/server/main.go index 02e3321..37e5962 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1,55 +1,52 @@ package main import ( - "context" "embed" "io/fs" "log" "net/http" + "time" "github.com/example/cms/internal/config" - "github.com/example/cms/internal/repository" "github.com/example/cms/internal/security" "github.com/example/cms/internal/service" "github.com/example/cms/internal/web" - "github.com/pressly/goose/v3" - "github.com/pressly/goose/v3/database" - "gorm.io/driver/postgres" - "gorm.io/gorm" ) -//go:embed migrations/postgres/*.sql -var migrations embed.FS +// web/dist holds the compiled React app. A placeholder file is committed so the +// embed directive always resolves, even when the frontend has not been built. +// +//go:embed all:web/dist +var ui embed.FS func main() { cfg := config.Load() - applicationDB, err := gorm.Open(postgres.Open(cfg.ApplicationDatabaseURL), &gorm.Config{}) + + content, err := service.NewContentService(service.SeedContent(), cfg.ContentFile) if err != nil { log.Fatal(err) } - applicationSQLDB, err := applicationDB.DB() + + assets, err := fs.Sub(ui, "web/dist") if err != nil { log.Fatal(err) } - applicationMigrations, err := fs.Sub(migrations, "migrations/postgres") - if err != nil { - log.Fatal(err) - } - applicationStore, err := database.NewStore(goose.DialectPostgres, "goose_application_db_version") - if err != nil { - log.Fatal(err) - } - applicationProvider, err := goose.NewProvider("", applicationSQLDB, applicationMigrations, goose.WithStore(applicationStore)) - if err != nil { - log.Fatal(err) - } - if _, err = applicationProvider.Up(context.Background()); err != nil { - log.Fatal(err) - } - content := service.NewContentService(repository.NewContentRepository(applicationDB)) + sso := security.NewSSOTokenVerifier(cfg.SSOHeader, cfg.SSOToken, cfg.SSOCookie) + var demo *service.DemoAuth + if cfg.Profile == "demo" { + demo = service.NewDemoAuth() + log.Printf("CMS profile: demo (in-memory, %d seeded articles)", len(service.SeedContent())) + } else { + log.Printf("CMS profile: %s (SSO identity required; PostgreSQL URL configured: %t)", cfg.Profile, cfg.PostgresURL != "") + } + server := &http.Server{ + Addr: cfg.HTTPAddr, + Handler: web.NewHandler(content, assets, sso, demo).Routes(cfg.AllowedOrigins), + ReadHeaderTimeout: 10 * time.Second, + } log.Printf("CMS listening on %s", cfg.HTTPAddr) - if err = http.ListenAndServe(cfg.HTTPAddr, web.NewHandler(content, sso).Routes(cfg.AllowedOrigins)); err != nil { + if err = server.ListenAndServe(); err != nil { log.Fatal(err) } } diff --git a/cmd/server/migrations/postgres/001_init.sql b/cmd/server/migrations/postgres/001_init.sql deleted file mode 100644 index a79aa24..0000000 --- a/cmd/server/migrations/postgres/001_init.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +goose Up -CREATE TABLE IF NOT EXISTS users (id BIGSERIAL PRIMARY KEY, email TEXT NOT NULL, name TEXT NOT NULL DEFAULT '', provider TEXT NOT NULL, provider_subject TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL); -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email); -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_provider_subject ON users(provider, provider_subject); -CREATE TABLE IF NOT EXISTS sessions (id BIGSERIAL PRIMARY KEY, token TEXT NOT NULL UNIQUE, user_id BIGINT REFERENCES users(id), admin_id BIGINT, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL); -CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at); --- +goose Down -DROP TABLE IF EXISTS sessions; -DROP TABLE IF EXISTS users; diff --git a/cmd/server/migrations/postgres/002_content.sql b/cmd/server/migrations/postgres/002_content.sql deleted file mode 100644 index 342d711..0000000 --- a/cmd/server/migrations/postgres/002_content.sql +++ /dev/null @@ -1,32 +0,0 @@ --- +goose Up -ALTER TABLE users ADD COLUMN IF NOT EXISTS role TEXT NOT NULL DEFAULT ''; -ALTER TABLE users ADD COLUMN IF NOT EXISTS editor BOOLEAN NOT NULL DEFAULT FALSE; -CREATE TABLE IF NOT EXISTS content ( - id BIGSERIAL PRIMARY KEY, - slug TEXT NOT NULL UNIQUE, - title TEXT NOT NULL, - summary TEXT NOT NULL DEFAULT '', - body TEXT NOT NULL, - status TEXT NOT NULL DEFAULT 'draft', - published BOOLEAN NOT NULL DEFAULT FALSE, - created_at TIMESTAMPTZ NOT NULL, - updated_at TIMESTAMPTZ NOT NULL, - created_by BIGINT REFERENCES users(id), - updated_by BIGINT REFERENCES users(id) -); -CREATE INDEX IF NOT EXISTS idx_content_updated_at ON content(updated_at DESC, created_at DESC, id DESC); -CREATE TABLE IF NOT EXISTS content_history ( - id BIGSERIAL PRIMARY KEY, - content_id BIGINT NOT NULL REFERENCES content(id) ON DELETE CASCADE, - operation TEXT NOT NULL, - actor_id BIGINT REFERENCES users(id), - actor_admin_id BIGINT, - created_at TIMESTAMPTZ NOT NULL, - snapshot JSONB NOT NULL -); -CREATE INDEX IF NOT EXISTS idx_content_history_content_id ON content_history(content_id, created_at DESC); --- +goose Down -DROP TABLE IF EXISTS content_history; -DROP TABLE IF EXISTS content; -ALTER TABLE users DROP COLUMN IF EXISTS editor; -ALTER TABLE users DROP COLUMN IF EXISTS role; diff --git a/cmd/server/migrations/postgres/003_content_taxonomy.sql b/cmd/server/migrations/postgres/003_content_taxonomy.sql deleted file mode 100644 index 9ff578d..0000000 --- a/cmd/server/migrations/postgres/003_content_taxonomy.sql +++ /dev/null @@ -1,26 +0,0 @@ --- +goose Up -CREATE TABLE IF NOT EXISTS categories ( - id BIGSERIAL PRIMARY KEY, - slug TEXT NOT NULL UNIQUE, - name TEXT NOT NULL -); -ALTER TABLE content ADD COLUMN IF NOT EXISTS category_id BIGINT REFERENCES categories(id); -CREATE INDEX IF NOT EXISTS idx_content_category_id ON content(category_id); - -CREATE TABLE IF NOT EXISTS badges ( - id BIGSERIAL PRIMARY KEY, - name TEXT NOT NULL UNIQUE -); -CREATE TABLE IF NOT EXISTS content_badges ( - content_id BIGINT NOT NULL REFERENCES content(id) ON DELETE CASCADE, - badge_id BIGINT NOT NULL REFERENCES badges(id) ON DELETE CASCADE, - PRIMARY KEY (content_id, badge_id) -); -CREATE INDEX IF NOT EXISTS idx_content_badges_badge_id ON content_badges(badge_id); - --- +goose Down -DROP TABLE IF EXISTS content_badges; -DROP TABLE IF EXISTS badges; -DROP INDEX IF EXISTS idx_content_category_id; -ALTER TABLE content DROP COLUMN IF EXISTS category_id; -DROP TABLE IF EXISTS categories; diff --git a/cmd/server/migrations/postgres/004_sso.sql b/cmd/server/migrations/postgres/004_sso.sql deleted file mode 100644 index 200cada..0000000 --- a/cmd/server/migrations/postgres/004_sso.sql +++ /dev/null @@ -1,35 +0,0 @@ --- +goose Up --- The CMS no longer stores identities: the upstream SSO proxy owns them. -ALTER TABLE content DROP COLUMN IF EXISTS created_by; -ALTER TABLE content DROP COLUMN IF EXISTS updated_by; -ALTER TABLE content_history DROP COLUMN IF EXISTS actor_id; -ALTER TABLE content_history DROP COLUMN IF EXISTS actor_admin_id; -DROP TABLE IF EXISTS sessions; -DROP TABLE IF EXISTS users; - --- +goose Down -CREATE TABLE IF NOT EXISTS users ( - id BIGSERIAL PRIMARY KEY, - email TEXT NOT NULL, - name TEXT NOT NULL DEFAULT '', - provider TEXT NOT NULL, - provider_subject TEXT NOT NULL, - role TEXT NOT NULL DEFAULT '', - editor BOOLEAN NOT NULL DEFAULT FALSE, - created_at TIMESTAMPTZ NOT NULL -); -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email); -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_provider_subject ON users(provider, provider_subject); -CREATE TABLE IF NOT EXISTS sessions ( - id BIGSERIAL PRIMARY KEY, - token TEXT NOT NULL UNIQUE, - user_id BIGINT REFERENCES users(id), - admin_id BIGINT, - expires_at TIMESTAMPTZ NOT NULL, - created_at TIMESTAMPTZ NOT NULL -); -CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at); -ALTER TABLE content ADD COLUMN IF NOT EXISTS created_by BIGINT REFERENCES users(id); -ALTER TABLE content ADD COLUMN IF NOT EXISTS updated_by BIGINT REFERENCES users(id); -ALTER TABLE content_history ADD COLUMN IF NOT EXISTS actor_id BIGINT REFERENCES users(id); -ALTER TABLE content_history ADD COLUMN IF NOT EXISTS actor_admin_id BIGINT; diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 5eda2d9..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,19 +0,0 @@ -services: - postgres: - image: postgres:17-alpine - environment: - POSTGRES_DB: cms - POSTGRES_USER: cms - POSTGRES_PASSWORD: cms - ports: - - "5432:5432" - volumes: - - cms-postgres-data:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U cms -d cms"] - interval: 5s - timeout: 5s - retries: 10 - -volumes: - cms-postgres-data: diff --git a/go.mod b/go.mod index 4198609..896d955 100644 --- a/go.mod +++ b/go.mod @@ -1,24 +1,3 @@ module github.com/example/cms go 1.27.1 - -require ( - github.com/pressly/goose/v3 v3.24.3 - gorm.io/driver/postgres v1.6.0 - gorm.io/gorm v1.31.1 -) - -require ( - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.4 // indirect - github.com/jackc/puddle/v2 v2.2.2 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/mfridman/interpolate v0.0.2 // indirect - github.com/sethvargo/go-retry v0.3.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/sync v0.14.0 // indirect - golang.org/x/text v0.25.0 // indirect -) diff --git a/go.sum b/go.sum index 4a11e27..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,66 +0,0 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= -github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= -github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= -github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= -github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pressly/goose/v3 v3.24.3 h1:DSWWNwwggVUsYZ0X2VitiAa9sKuqtBfe+Jr9zFGwWlM= -github.com/pressly/goose/v3 v3.24.3/go.mod h1:v9zYL4xdViLHCUUJh/mhjnm6JrK7Eul8AS93IxiZM4E= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= -github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= -gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= -gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= -gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= -modernc.org/libc v1.65.0 h1:e183gLDnAp9VJh6gWKdTy0CThL9Pt7MfcR/0bgb7Y1Y= -modernc.org/libc v1.65.0/go.mod h1:7m9VzGq7APssBTydds2zBcxGREwvIGpuUBaKTXdm2Qs= -modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= -modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= -modernc.org/memory v1.10.0 h1:fzumd51yQ1DxcOxSO+S6X7+QTuVU+n8/Aj7swYjFfC4= -modernc.org/memory v1.10.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/sqlite v1.37.0 h1:s1TMe7T3Q3ovQiK2Ouz4Jwh7dw4ZDqbebSDTlSJdfjI= -modernc.org/sqlite v1.37.0/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM= diff --git a/internal/config/config.go b/internal/config/config.go index 1b35eb1..83835ad 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,24 +1,25 @@ +// Package config carries the runtime settings for the demo CMS. There is no +// database to configure: content is seeded in memory and optionally mirrored to +// a single JSON file. package config -import ( - "os" -) +import "os" -// Config carries the runtime settings for the CMS. The application database is -// the only datastore: identities and sessions belong to the upstream SSO proxy. type Config struct { - HTTPAddr, ApplicationDatabaseURL string + HTTPAddr, Profile, ContentFile, PostgresURL string AllowedOrigins, SSOHeader, SSOToken, SSOCookie string } func Load() Config { return Config{ - HTTPAddr: get("CMS_HTTP_ADDR", ":8080"), - ApplicationDatabaseURL: get("CMS_APPLICATION_DATABASE_URL", "host=localhost user=cms password=cms dbname=cms port=5432 sslmode=disable"), - AllowedOrigins: get("CMS_ALLOWED_ORIGINS", "http://localhost:5173"), - SSOHeader: get("CMS_SSO_HEADER", "X-SSO-Token"), - SSOToken: get("CMS_SSO_TOKEN", ""), - SSOCookie: get("CMS_SSO_COOKIE", ""), + HTTPAddr: get("CMS_HTTP_ADDR", ":8080"), + Profile: get("CMS_PROFILE", "demo"), + ContentFile: get("CMS_CONTENT_FILE", ""), + PostgresURL: get("CMS_POSTGRES_URL", ""), + AllowedOrigins: get("CMS_ALLOWED_ORIGINS", "http://localhost:5173"), + SSOHeader: get("CMS_SSO_HEADER", "X-SSO-Token"), + SSOToken: get("CMS_SSO_TOKEN", ""), + SSOCookie: get("CMS_SSO_COOKIE", ""), } } diff --git a/internal/domain/models.go b/internal/domain/models.go deleted file mode 100644 index efe8168..0000000 --- a/internal/domain/models.go +++ /dev/null @@ -1,33 +0,0 @@ -package domain - -import "time" - -type Content struct { - ID uint - Slug, Title, Summary, Body string - Status string - Published bool - CategoryID uint - Category string - Badges []string - CreatedAt, UpdatedAt time.Time -} - -type Category struct { - ID uint - Slug string - Name string -} - -type Badge struct { - ID uint - Name string -} - -type ContentHistory struct { - ID uint - ContentID uint - Operation string - CreatedAt time.Time - Snapshot string -} diff --git a/internal/persistence/mapping.go b/internal/persistence/mapping.go deleted file mode 100644 index 4b834af..0000000 --- a/internal/persistence/mapping.go +++ /dev/null @@ -1,15 +0,0 @@ -package persistence - -import "github.com/example/cms/internal/domain" - -func ContentToDomain(m ContentModel) domain.Content { - badges := make([]string, len(m.Badges)) - for i := range m.Badges { - badges[i] = m.Badges[i].Name - } - return domain.Content{ID: m.ID, Slug: m.Slug, Title: m.Title, Summary: m.Summary, Body: m.Body, Status: m.Status, Published: m.Published, CategoryID: m.CategoryID, Category: m.Category.Name, Badges: badges, CreatedAt: m.CreatedAt, UpdatedAt: m.UpdatedAt} -} - -func ContentFromDomain(d domain.Content) ContentModel { - return ContentModel{ID: d.ID, Slug: d.Slug, Title: d.Title, Summary: d.Summary, Body: d.Body, Status: d.Status, Published: d.Published, CreatedAt: d.CreatedAt, UpdatedAt: d.UpdatedAt} -} diff --git a/internal/persistence/models.go b/internal/persistence/models.go deleted file mode 100644 index 46be5e0..0000000 --- a/internal/persistence/models.go +++ /dev/null @@ -1,44 +0,0 @@ -package persistence - -import "time" - -type ContentModel struct { - ID uint `gorm:"primaryKey"` - Slug string `gorm:"uniqueIndex;not null"` - Title string `gorm:"not null"` - Summary string - Body string `gorm:"not null"` - Status string `gorm:"not null;default:'draft'"` - Published bool `gorm:"not null;default:false"` - CategoryID uint - Category CategoryModel `gorm:"foreignKey:CategoryID"` - Badges []BadgeModel `gorm:"many2many:content_badges;joinForeignKey:ContentID;joinReferences:BadgeID"` - CreatedAt, UpdatedAt time.Time -} - -func (ContentModel) TableName() string { return "content" } - -type CategoryModel struct { - ID uint `gorm:"primaryKey"` - Slug string `gorm:"uniqueIndex;not null"` - Name string `gorm:"not null"` -} - -func (CategoryModel) TableName() string { return "categories" } - -type BadgeModel struct { - ID uint `gorm:"primaryKey"` - Name string `gorm:"uniqueIndex;not null"` -} - -func (BadgeModel) TableName() string { return "badges" } - -type ContentHistoryModel struct { - ID uint `gorm:"primaryKey"` - ContentID uint `gorm:"index;not null"` - Operation string `gorm:"not null"` - CreatedAt time.Time - Snapshot string `gorm:"type:jsonb;not null"` -} - -func (ContentHistoryModel) TableName() string { return "content_history" } diff --git a/internal/persistence/models_test.go b/internal/persistence/models_test.go deleted file mode 100644 index e916641..0000000 --- a/internal/persistence/models_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package persistence - -import ( - "testing" - "time" - - "github.com/example/cms/internal/domain" -) - -func TestModelsUseMigrationTableNames(t *testing.T) { - tests := map[string]string{ - "content": (ContentModel{}).TableName(), - "content_history": (ContentHistoryModel{}).TableName(), - "categories": (CategoryModel{}).TableName(), - "badges": (BadgeModel{}).TableName(), - } - for expected, actual := range tests { - if actual != expected { - t.Errorf("table name = %q, want %q", actual, expected) - } - } -} - -func TestContentMappingRoundTrip(t *testing.T) { - d := domain.Content{ID: 2, Slug: "hello-world", Title: "Hello", Body: "body", Status: "draft", Badges: []string{"go"}, CreatedAt: time.Now()} - got := ContentToDomain(ContentFromDomain(d)) - if got.Slug != d.Slug || got.Title != d.Title || got.Status != d.Status { - t.Fatalf("round trip mismatch: %+v", got) - } -} diff --git a/internal/repository/gorm.go b/internal/repository/gorm.go deleted file mode 100644 index e148450..0000000 --- a/internal/repository/gorm.go +++ /dev/null @@ -1,79 +0,0 @@ -package repository - -import ( - "context" - "github.com/example/cms/internal/domain" - "github.com/example/cms/internal/persistence" - "gorm.io/gorm" -) - -type GORMContentRepository struct{ db *gorm.DB } - -func NewContentRepository(db *gorm.DB) IContentRepository { return &GORMContentRepository{db} } -func (r *GORMContentRepository) List(ctx context.Context, limit, offset int, category, status string, badges []string) ([]domain.Content, error) { - var rows []persistence.ContentModel - query := r.db.WithContext(ctx).Model(&persistence.ContentModel{}).Preload("Category").Preload("Badges") - if category != "" { - query = query.Where("category_id IN (SELECT id FROM categories WHERE slug = ?)", category) - } - if status != "" { - query = query.Where("status = ?", status) - } - for _, badge := range badges { - query = query.Where("EXISTS (SELECT 1 FROM content_badges cb JOIN badges b ON b.id = cb.badge_id WHERE cb.content_id = content.id AND b.name = ?)", badge) - } - err := query.Order("updated_at DESC, created_at DESC, id DESC").Limit(limit).Offset(offset).Find(&rows).Error - out := make([]domain.Content, len(rows)) - for i := range rows { - out[i] = persistence.ContentToDomain(rows[i]) - } - return out, err -} -func (r *GORMContentRepository) ListCategories(ctx context.Context) ([]domain.Category, error) { - var rows []persistence.CategoryModel - if err := r.db.WithContext(ctx).Order("name ASC").Find(&rows).Error; err != nil { - return nil, err - } - out := make([]domain.Category, len(rows)) - for i := range rows { - out[i] = domain.Category{ID: rows[i].ID, Slug: rows[i].Slug, Name: rows[i].Name} - } - return out, nil -} -func (r *GORMContentRepository) ListBadges(ctx context.Context) ([]domain.Badge, error) { - var rows []persistence.BadgeModel - if err := r.db.WithContext(ctx).Order("name ASC").Find(&rows).Error; err != nil { - return nil, err - } - out := make([]domain.Badge, len(rows)) - for i := range rows { - out[i] = domain.Badge{ID: rows[i].ID, Name: rows[i].Name} - } - return out, nil -} -func (r *GORMContentRepository) FindBySlug(ctx context.Context, slug string) (domain.Content, error) { - var row persistence.ContentModel - if err := r.db.WithContext(ctx).Preload("Category").Preload("Badges").Where("slug = ?", slug).First(&row).Error; err != nil { - return domain.Content{}, err - } - return persistence.ContentToDomain(row), nil -} -func (r *GORMContentRepository) Update(ctx context.Context, d domain.Content, h domain.ContentHistory) error { - return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { - if err := tx.Model(&persistence.ContentModel{}).Where("id = ?", d.ID).Updates(map[string]any{"slug": d.Slug, "title": d.Title, "summary": d.Summary, "body": d.Body, "status": d.Status, "published": d.Published, "updated_at": d.UpdatedAt}).Error; err != nil { - return err - } - if err := tx.Exec("DELETE FROM content_badges WHERE content_id = ?", d.ID).Error; err != nil { - return err - } - for _, badge := range d.Badges { - if err := tx.Exec("INSERT INTO badges (name) VALUES (?) ON CONFLICT (name) DO NOTHING", badge).Error; err != nil { - return err - } - if err := tx.Exec("INSERT INTO content_badges (content_id, badge_id) SELECT ?, id FROM badges WHERE name = ? ON CONFLICT DO NOTHING", d.ID, badge).Error; err != nil { - return err - } - } - return tx.Create(&persistence.ContentHistoryModel{ContentID: h.ContentID, Operation: h.Operation, CreatedAt: h.CreatedAt, Snapshot: h.Snapshot}).Error - }) -} diff --git a/internal/repository/interfaces.go b/internal/repository/interfaces.go deleted file mode 100644 index 832ed06..0000000 --- a/internal/repository/interfaces.go +++ /dev/null @@ -1,14 +0,0 @@ -package repository - -import ( - "context" - "github.com/example/cms/internal/domain" -) - -type IContentRepository interface { - List(context.Context, int, int, string, string, []string) ([]domain.Content, error) - ListCategories(context.Context) ([]domain.Category, error) - ListBadges(context.Context) ([]domain.Badge, error) - FindBySlug(context.Context, string) (domain.Content, error) - Update(context.Context, domain.Content, domain.ContentHistory) error -} diff --git a/internal/service/content.go b/internal/service/content.go index 3ff2a41..e69e2b4 100644 --- a/internal/service/content.go +++ b/internal/service/content.go @@ -1,33 +1,375 @@ +// Package service holds the application use cases. The demo CMS keeps its +// content in memory: it is seeded at startup and optionally mirrored to a single +// JSON file, so the container needs no database server. package service import ( "context" "encoding/json" "errors" - "github.com/example/cms/internal/domain" - "github.com/example/cms/internal/repository" + "os" + "path/filepath" "regexp" + "sort" "strings" + "sync" "time" ) -// IContentService exposes the content use cases. Read operations are anonymous; -// Update is only reachable once the web layer verified the SSO proxy identity. -type IContentService interface { - List(context.Context, int, int, string, string, []string) ([]domain.Content, error) - ListCategories(context.Context) ([]domain.Category, error) - ListBadges(context.Context) ([]domain.Badge, error) - Get(context.Context, string) (domain.Content, error) - Update(context.Context, domain.Content) (domain.Content, error) -} -type ContentService struct { - repo repository.IContentRepository +// Content is a single article in the backlog. +type Content struct { + ID uint `json:"id"` + Slug string `json:"slug"` + Title string `json:"title"` + Summary string `json:"summary"` + Body string `json:"body"` + Status string `json:"status"` + Published bool `json:"published"` + Category string `json:"category,omitempty"` + Badges []string `json:"badges"` + Author string `json:"author"` + PublishedAt *time.Time `json:"publishedAt,omitempty"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` } -func NewContentService(r repository.IContentRepository) *ContentService { - return &ContentService{repo: r} +// Category groups content for the filter dropdown. +type Category struct { + ID uint `json:"id"` + Slug string `json:"slug"` + Name string `json:"name"` } -func (s *ContentService) List(ctx context.Context, limit, offset int, category, status string, badges []string) ([]domain.Content, error) { + +// Badge is a reusable tag shared by any number of articles. +type Badge struct { + ID uint `json:"id"` + Name string `json:"name"` +} + +// contentRevision records one edit so the app keeps an audit trail. +type contentRevision struct { + ContentID uint `json:"contentId"` + Operation string `json:"operation"` + CreatedAt time.Time `json:"createdAt"` + Snapshot string `json:"snapshot"` +} + +// IContentService exposes the content use cases. Reads are anonymous; Update is +// only reachable once the web layer verified the SSO identity. +type IContentService interface { + List(context.Context, int, int, string, string, []string) ([]Content, error) + ListCategories(context.Context) ([]Category, error) + ListBadges(context.Context) ([]Badge, error) + Get(context.Context, string) (Content, error) + Update(context.Context, Content) (Content, error) +} + +// ContentService keeps the demo content in memory behind a mutex. When file is +// set, the store is loaded from that JSON file on startup and written back after +// every edit, so a mounted volume keeps changes across restarts. +type ContentService struct { + mu sync.RWMutex + items []Content + history []contentRevision + categories map[string]string + categoryOrder []string + allBadges []string + nextID uint + file string +} + +// NewContentService seeds the store from the given articles. When file is not +// empty and already exists, the store is loaded from it instead, which lets a +// mounted volume keep edits across restarts. +func NewContentService(seed []Content, file string) (*ContentService, error) { + s := &ContentService{file: file} + if file != "" { + if _, err := os.Stat(file); err == nil { + if err := s.load(file); err != nil { + return nil, err + } + return s, nil + } + } + if len(seed) == 0 { + return nil, errors.New("no seed content available") + } + s.applySeed(seed) + if err := s.persistLocked(); err != nil { + return nil, err + } + return s, nil +} + +func (s *ContentService) applySeed(seed []Content) { + s.categories = map[string]string{} + s.categoryOrder = nil + s.items = make([]Content, 0, len(seed)) + s.history = nil + known := map[string]struct{}{} + for i, item := range seed { + item.ID = uint(i + 1) + item.Category = normalizeCategory(item.Category) + if _, seen := s.categories[item.Category]; !seen && item.Category != "" { + s.categories[item.Category] = categoryDisplay(item.Category) + s.categoryOrder = append(s.categoryOrder, item.Category) + } + item.Badges = normalizeBadges(item.Badges) + for _, badge := range item.Badges { + known[badge] = struct{}{} + } + item.Status = normalizeStatus(item.Status) + if item.CreatedAt.IsZero() { + item.CreatedAt = time.Now() + } + if item.UpdatedAt.IsZero() { + item.UpdatedAt = item.CreatedAt + } + s.items = append(s.items, item) + } + s.nextID = uint(len(seed) + 1) + s.allBadges = sortedKeys(known) + sortContent(s.items) +} + +// List returns a page of articles filtered by category, status, and badges. The +// selected badges are combined with AND semantics. +func (s *ContentService) List(_ context.Context, limit, offset int, category, status string, badges []string) ([]Content, error) { + limit, offset = clampPage(limit, offset) + category = normalizeCategory(category) + if strings.TrimSpace(status) != "" { + status = normalizeStatus(status) + } + wanted := normalizeBadges(badges) + + s.mu.RLock() + defer s.mu.RUnlock() + + out := make([]Content, 0, limit) + for _, item := range s.items { + if category != "" && item.Category != category { + continue + } + if status != "" && item.Status != status { + continue + } + if !hasBadges(item, wanted) { + continue + } + if offset > 0 { + offset-- + continue + } + if len(out) == limit { + break + } + out = append(out, cloneContent(item)) + } + return out, nil +} + +// ListCategories returns the fixed category list used by the filter dropdown. +func (s *ContentService) ListCategories(context.Context) ([]Category, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + out := make([]Category, 0, len(s.categoryOrder)) + for i, slug := range s.categoryOrder { + out = append(out, Category{ID: uint(i + 1), Slug: slug, Name: s.categories[slug]}) + } + return out, nil +} + +// ListBadges returns every badge carried by an article, so the filter and the +// editor never suggest a badge that would return nothing. +func (s *ContentService) ListBadges(context.Context) ([]Badge, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + known := map[string]struct{}{} + for _, badge := range s.allBadges { + known[badge] = struct{}{} + } + for _, item := range s.items { + for _, badge := range item.Badges { + known[badge] = struct{}{} + } + } + names := sortedKeys(known) + out := make([]Badge, 0, len(names)) + for i, name := range names { + out = append(out, Badge{ID: uint(i + 1), Name: name}) + } + return out, nil +} + +// Get returns one article by slug. +func (s *ContentService) Get(_ context.Context, slug string) (Content, error) { + slug = strings.ToLower(strings.TrimSpace(slug)) + if !validSlug(slug) { + return Content{}, errors.New("invalid slug") + } + s.mu.RLock() + defer s.mu.RUnlock() + + for _, item := range s.items { + if item.Slug == slug { + return cloneContent(item), nil + } + } + return Content{}, errors.New("content not found") +} + +// Update saves an edited article, records a revision, and mirrors the store to +// disk when a content file is configured. +func (s *ContentService) Update(_ context.Context, c Content) (Content, error) { + return s.update(c, "") +} + +func (s *ContentService) UpdateAs(_ context.Context, c Content, actor string) (Content, error) { + return s.update(c, actor) +} + +func (s *ContentService) update(c Content, actor string) (Content, error) { + c.Slug = strings.ToLower(strings.TrimSpace(c.Slug)) + if !validSlug(c.Slug) || strings.TrimSpace(c.Title) == "" || strings.TrimSpace(c.Body) == "" { + return Content{}, errors.New("invalid content") + } + c.Badges = normalizeBadges(c.Badges) + c.Status = normalizeStatus(c.Status) + c.Published = c.Status == "published" + + s.mu.Lock() + defer s.mu.Unlock() + + index := -1 + for i := range s.items { + if s.items[i].Slug == c.Slug { + index = i + break + } + } + if index < 0 { + return Content{}, errors.New("content not found") + } + current := s.items[index] + if actor != "" && current.Author != actor { + return Content{}, errors.New("you can only edit your own content") + } + c.ID = current.ID + c.CreatedAt = current.CreatedAt + c.UpdatedAt = time.Now().Truncate(time.Second) + c.Category = normalizeCategory(current.Category) + c.Author = current.Author + if c.Status == "published" && c.PublishedAt == nil { + now := time.Now().Truncate(time.Second) + c.PublishedAt = &now + } + if c.Status != "published" { + c.PublishedAt = nil + } + + s.items[index] = c + sortContent(s.items) + snapshot, _ := json.Marshal(c) + s.history = append(s.history, contentRevision{ContentID: c.ID, Operation: "updated", CreatedAt: c.UpdatedAt, Snapshot: string(snapshot)}) + if err := s.persistLocked(); err != nil { + return Content{}, err + } + return cloneContent(c), nil +} + +// storedContent is the on-disk shape of an article. Identifiers are positional +// so the JSON file stays readable and diff-friendly. +type storedContent struct { + Slug string `json:"slug"` + Title string `json:"title"` + Summary string `json:"summary"` + Body string `json:"body"` + Status string `json:"status"` + Published bool `json:"published"` + Category string `json:"category,omitempty"` + Badges []string `json:"badges"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +} + +type storedFile struct { + Categories map[string]string `json:"categories"` + Content []storedContent `json:"content"` + History []contentRevision `json:"history,omitempty"` +} + +func (s *ContentService) load(file string) error { + data, err := os.ReadFile(file) + if err != nil { + return err + } + var payload storedFile + if err := json.Unmarshal(data, &payload); err != nil { + return err + } + s.categories = payload.Categories + if s.categories == nil { + s.categories = map[string]string{} + } + s.categoryOrder = make([]string, 0, len(s.categories)) + for slug := range s.categories { + s.categoryOrder = append(s.categoryOrder, slug) + } + sort.Strings(s.categoryOrder) + s.history = payload.History + + known := map[string]struct{}{} + s.items = make([]Content, 0, len(payload.Content)) + for i, item := range payload.Content { + c := Content{ + ID: uint(i + 1), Slug: item.Slug, Title: item.Title, Summary: item.Summary, Body: item.Body, + Status: normalizeStatus(item.Status), Category: normalizeCategory(item.Category), + Badges: normalizeBadges(item.Badges), CreatedAt: item.CreatedAt, UpdatedAt: item.UpdatedAt, + } + c.Published = c.Status == "published" + for _, badge := range c.Badges { + known[badge] = struct{}{} + } + s.items = append(s.items, c) + } + s.nextID = uint(len(s.items) + 1) + s.allBadges = sortedKeys(known) + sortContent(s.items) + return nil +} + +func (s *ContentService) persistLocked() error { + if s.file == "" { + return nil + } + payload := storedFile{Categories: s.categories, History: s.history} + payload.Content = make([]storedContent, 0, len(s.items)) + for _, item := range s.items { + payload.Content = append(payload.Content, storedContent{ + Slug: item.Slug, Title: item.Title, Summary: item.Summary, Body: item.Body, + Status: item.Status, Published: item.Published, Category: item.Category, + Badges: item.Badges, CreatedAt: item.CreatedAt, UpdatedAt: item.UpdatedAt, + }) + } + data, err := json.MarshalIndent(payload, "", " ") + if err != nil { + return err + } + if dir := filepath.Dir(s.file); dir != "" && dir != "." { + if err := os.MkdirAll(dir, 0o755); err != nil { + return err + } + } + tmp := s.file + ".tmp" + if err := os.WriteFile(tmp, data, 0o644); err != nil { + return err + } + return os.Rename(tmp, s.file) +} + +func clampPage(limit, offset int) (int, int) { if limit < 1 { limit = 20 } @@ -37,39 +379,58 @@ func (s *ContentService) List(ctx context.Context, limit, offset int, category, if offset < 0 { offset = 0 } - return s.repo.List(ctx, limit, offset, category, status, badges) + return limit, offset } -func (s *ContentService) ListCategories(ctx context.Context) ([]domain.Category, error) { - return s.repo.ListCategories(ctx) -} -func (s *ContentService) ListBadges(ctx context.Context) ([]domain.Badge, error) { - return s.repo.ListBadges(ctx) -} -func (s *ContentService) Get(ctx context.Context, slug string) (domain.Content, error) { - if !validSlug(slug) { - return domain.Content{}, errors.New("invalid slug") - } - return s.repo.FindBySlug(ctx, slug) -} -func (s *ContentService) Update(ctx context.Context, c domain.Content) (domain.Content, error) { - if !validSlug(c.Slug) || strings.TrimSpace(c.Title) == "" || strings.TrimSpace(c.Body) == "" { - return domain.Content{}, errors.New("invalid content") - } - old, err := s.repo.FindBySlug(ctx, c.Slug) - if err != nil { - return domain.Content{}, err - } - c.ID = old.ID - c.CreatedAt = old.CreatedAt - c.UpdatedAt = time.Now() - c.Badges = normalizeBadges(c.Badges) - snapshot, _ := json.Marshal(c) - h := domain.ContentHistory{ContentID: c.ID, Operation: "updated", CreatedAt: c.UpdatedAt, Snapshot: string(snapshot)} - if err = s.repo.Update(ctx, c, h); err != nil { - return domain.Content{}, err +func hasBadges(item Content, wanted []string) bool { + for _, badge := range wanted { + found := false + for _, have := range item.Badges { + if have == badge { + found = true + break + } + } + if !found { + return false + } + } + return true +} + +// sortContent orders articles newest first, matching the list page ordering. +func sortContent(items []Content) { + sort.SliceStable(items, func(i, j int) bool { + if !items[i].UpdatedAt.Equal(items[j].UpdatedAt) { + return items[i].UpdatedAt.After(items[j].UpdatedAt) + } + if !items[i].CreatedAt.Equal(items[j].CreatedAt) { + return items[i].CreatedAt.After(items[j].CreatedAt) + } + return items[i].ID > items[j].ID + }) +} + +func cloneContent(c Content) Content { + c.Badges = append([]string(nil), c.Badges...) + return c +} + +func normalizeCategory(value string) string { + value = strings.ToLower(strings.TrimSpace(value)) + if !validSlug(value) { + return "" + } + return value +} + +func normalizeStatus(value string) string { + switch value = strings.ToLower(strings.TrimSpace(value)); value { + case "published", "draft", "review", "archived": + return value + default: + return "draft" } - return c, nil } func normalizeBadges(values []string) []string { @@ -86,9 +447,28 @@ func normalizeBadges(values []string) []string { seen[value] = struct{}{} result = append(result, value) } + sort.Strings(result) return result } +func sortedKeys(set map[string]struct{}) []string { + out := make([]string, 0, len(set)) + for key := range set { + out = append(out, key) + } + sort.Strings(out) + return out +} + +// categoryDisplay returns the readable name for a category slug, falling back +// to a title-cased slug for anything not in the seeded list. +func categoryDisplay(slug string) string { + if name, ok := categoryNames[slug]; ok { + return name + } + return strings.ToUpper(slug[:1]) + slug[1:] +} + var slugRE = regexp.MustCompile(`^[a-z0-9]+(?:-[a-z0-9]+)*$`) -func validSlug(s string) bool { return len(s) <= 200 && slugRE.MatchString(s) } +func validSlug(s string) bool { return len(s) > 0 && len(s) <= 200 && slugRE.MatchString(s) } diff --git a/internal/service/content_test.go b/internal/service/content_test.go new file mode 100644 index 0000000..35c331e --- /dev/null +++ b/internal/service/content_test.go @@ -0,0 +1,127 @@ +package service + +import ( + "context" + "path/filepath" + "testing" +) + +func TestSeedStoreListsNewestFirst(t *testing.T) { + s, err := NewContentService(SeedContent(), "") + if err != nil { + t.Fatal(err) + } + items, err := s.List(context.Background(), 5, 0, "", "", nil) + if err != nil { + t.Fatal(err) + } + if len(items) != 5 { + t.Fatalf("limit ignored: got %d items", len(items)) + } + if items[0].Slug != "built-with-ai" { + t.Fatalf("newest item = %q, want built-with-ai", items[0].Slug) + } + if !items[0].UpdatedAt.After(items[1].UpdatedAt) && !items[0].UpdatedAt.Equal(items[1].UpdatedAt) { + t.Fatalf("items are not ordered newest first: %v then %v", items[0].UpdatedAt, items[1].UpdatedAt) + } +} + +func TestListFiltersByCategoryAndBadge(t *testing.T) { + s, err := NewContentService(SeedContent(), "") + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + categories, err := s.ListCategories(ctx) + if err != nil || len(categories) == 0 { + t.Fatalf("categories = %v err = %v", categories, err) + } + + byCategory, err := s.List(ctx, 100, 0, "linux", "", nil) + if err != nil || len(byCategory) == 0 { + t.Fatalf("linux category returned %d items (err %v)", len(byCategory), err) + } + for _, item := range byCategory { + if item.Category != "linux" { + t.Fatalf("category filter leaked %q", item.Category) + } + } + + // Badges combine with AND semantics, so this pair must be narrower than one. + tagged, err := s.List(ctx, 100, 0, "", "", []string{"tooling"}) + if err != nil || len(tagged) < 2 { + t.Fatalf("tooling badge returned %d items (err %v)", len(tagged), err) + } + both, err := s.List(ctx, 100, 0, "", "", []string{"tooling", "docker"}) + if err != nil { + t.Fatal(err) + } + if len(both) == 0 || len(both) >= len(tagged) { + t.Fatalf("badge AND filtering wrong: tooling=%d tooling+docker=%d", len(tagged), len(both)) + } + for _, item := range both { + if !contains(item.Badges, "tooling") || !contains(item.Badges, "docker") { + t.Fatalf("badge filter leaked %v", item.Badges) + } + } +} + +func contains(values []string, want string) bool { + for _, value := range values { + if value == want { + return true + } + } + return false +} + +func TestUpdatePersistsAcrossRestart(t *testing.T) { + file := filepath.Join(t.TempDir(), "content.json") + s, err := NewContentService(SeedContent(), file) + if err != nil { + t.Fatal(err) + } + saved, err := s.Update(context.Background(), Content{ + Slug: "built-with-ai", + Title: "Edited title", + Body: "Edited body", + Status: "draft", + Badges: []string{"Go", "go", "writing"}, + }) + if err != nil { + t.Fatal(err) + } + if saved.Title != "Edited title" || saved.Published { + t.Fatalf("unexpected save result: %+v", saved) + } + if len(saved.Badges) != 2 { + t.Fatalf("badges were not normalised and deduplicated: %v", saved.Badges) + } + + // A new service pointed at the same file must load the edit, not the seed. + restarted, err := NewContentService(SeedContent(), file) + if err != nil { + t.Fatal(err) + } + reloaded, err := restarted.Get(context.Background(), "built-with-ai") + if err != nil { + t.Fatal(err) + } + if reloaded.Title != "Edited title" { + t.Fatalf("edit did not survive restart: %q", reloaded.Title) + } +} + +func TestUpdateRejectsInvalidContent(t *testing.T) { + s, err := NewContentService(SeedContent(), "") + if err != nil { + t.Fatal(err) + } + if _, err = s.Update(context.Background(), Content{Slug: "missing", Title: "T", Body: "B"}); err == nil { + t.Fatal("expected unknown slug to be rejected") + } + if _, err = s.Update(context.Background(), Content{Slug: "built-with-ai", Title: "", Body: "B"}); err == nil { + t.Fatal("expected empty title to be rejected") + } +} diff --git a/internal/service/demo_auth.go b/internal/service/demo_auth.go new file mode 100644 index 0000000..8572403 --- /dev/null +++ b/internal/service/demo_auth.go @@ -0,0 +1,76 @@ +package service + +import ( + "crypto/rand" + "encoding/hex" + "errors" + "strings" + "sync" +) + +type DemoUser struct { + Username string `json:"username"` + Name string `json:"name"` + Password string `json:"-"` +} + +type DemoAuth struct { + mu sync.RWMutex + users []DemoUser + sessions map[string]string +} + +func NewDemoAuth() *DemoAuth { + return &DemoAuth{ + users: []DemoUser{ + {Username: "urpi", Name: "Urpi"}, + {Username: "tux", Name: "Tux"}, + {Username: "gopher", Name: "Gopher"}, + }, + sessions: map[string]string{}, + } +} + +func (a *DemoAuth) Users() []DemoUser { + a.mu.RLock() + defer a.mu.RUnlock() + out := make([]DemoUser, len(a.users)) + copy(out, a.users) + for i := range out { + out[i].Password = "" + } + return out +} + +func (a *DemoAuth) Login(username, password string) (string, DemoUser, error) { + username = strings.ToLower(strings.TrimSpace(username)) + a.mu.RLock() + var user DemoUser + for _, candidate := range a.users { + if candidate.Username == username { + user = candidate + break + } + } + a.mu.RUnlock() + if user.Username == "" || password != username { + return "", DemoUser{}, errors.New("invalid demo credentials") + } + raw := make([]byte, 24) + if _, err := rand.Read(raw); err != nil { + return "", DemoUser{}, err + } + token := hex.EncodeToString(raw) + a.mu.Lock() + a.sessions[token] = user.Username + a.mu.Unlock() + user.Password = "" + return token, user, nil +} + +func (a *DemoAuth) Authenticated(token string) (string, bool) { + a.mu.RLock() + defer a.mu.RUnlock() + username, ok := a.sessions[strings.TrimSpace(token)] + return username, ok +} diff --git a/internal/service/seed.go b/internal/service/seed.go new file mode 100644 index 0000000..723bcbd --- /dev/null +++ b/internal/service/seed.go @@ -0,0 +1,835 @@ +package service + +import ( + "fmt" + "strings" + "time" +) + +// categoryNames maps the seeded category slugs to their display names. The +// filter dropdown is built from the categories actually present in the seed and +// keeps this order. +var categoryNames = map[string]string{ + "linux": "Linux", + "bash": "Bash & Shell", + "go": "Go", + "java": "Java", + "devops": "DevOps", + "tooling": "Tooling", + "design": "Design & Editorial", + "workflow": "Workflow", +} + +// daysAgo returns a timestamp relative to startup so the demo always shows a +// fresh-looking timeline. +func daysAgo(days int) time.Time { + return time.Now().AddDate(0, 0, -days).Truncate(time.Second) +} + +// SeedContent returns the demo backlog loaded into the in-memory store. +func SeedContent() []Content { + items := make([]Content, 0, 560) + for i, item := range seedContent { + item.Author = demoAuthors[i%len(demoAuthors)] + if item.Status == "published" { + published := item.CreatedAt.Add(24 * time.Hour) + item.PublishedAt = &published + } + items = append(items, item) + } + for i := len(items); i < 560; i++ { + items = append(items, generatedContent(i)) + } + return items +} + +var demoAuthors = []string{"urpi", "tux", "gopher"} + +func generatedContent(index int) Content { + topics := []struct { + category string + topic string + badges []string + }{ + {"linux", "systemd service", []string{"linux", "systemd", "terminal"}}, + {"bash", "shell pipeline", []string{"bash", "cli", "automation"}}, + {"go", "Go worker", []string{"go", "testing", "concurrency"}}, + {"java", "Spring Boot endpoint", []string{"java", "spring-boot", "api"}}, + {"devops", "deployment runbook", []string{"devops", "ci", "reliability"}}, + {"tooling", "developer workstation", []string{"tooling", "linux", "productivity"}}, + } + topic := topics[index%len(topics)] + author := demoAuthors[index%len(demoAuthors)] + created := time.Now().AddDate(0, 0, -(index%180 + 200)).Truncate(time.Second) + published := created.Add(12 * time.Hour) + return Content{ + Slug: fmt.Sprintf("lab-note-%03d-%s", index+1, strings.ReplaceAll(topic.topic, " ", "-")), + Title: fmt.Sprintf("Lab Note %03d: %s", index+1, topic.topic), + Summary: fmt.Sprintf("A practical backlog note about a %s in the Urpi workshop.", topic.topic), + Body: fmt.Sprintf("This generated demo article explores a %s from a Linux-first engineering perspective.\n\nThe useful habit is to keep the command, the reason, and the rollback path close together. Measure the result, write down what changed, and leave the next reader a small example they can run.", topic.topic), + Status: "published", + Category: topic.category, + Badges: topic.badges, + Author: author, + CreatedAt: created, + UpdatedAt: created.Add(2 * time.Hour), + PublishedAt: &published, + } +} + +// seedContent is the demo dataset, written in the voice of the backlog: notes on +// Linux, Go, Java, and the workflows around them. +var seedContent = []Content{ + { + Slug: "postmortems-that-people-read", + Title: "Postmortems That People Actually Read", + Summary: "A blameless template short enough to be reused and specific enough to prevent a repeat.", + Body: `A postmortem is a tool for changing behaviour, not a document for assigning blame. If nobody reads it twice, it did not work. + +We keep the template to one page: what happened, who saw it first, what made it worse, what made it better, and the smallest change that would have prevented it. Longer analysis lives in linked notes so the summary stays skimmable. + +Every postmortem ends with at most three follow-ups, each with an owner and a date. If a follow-up cannot be scheduled, we say so honestly instead of writing a wish list.`, + Status: "published", + Category: "devops", + Badges: []string{"reliability", "writing", "documentation"}, + CreatedAt: daysAgo(115), UpdatedAt: daysAgo(112), + }, + { + Slug: "health-checks-and-readiness", + Title: "Health Checks and Readiness Are Different Questions", + Summary: "Liveness asks whether the process survived; readiness asks whether it should receive traffic.", + Body: `Conflating liveness and readiness turns a slow dependency into a restart loop. + +A liveness probe answers one question: is this process stuck badly enough that restarting is the best option? It should not call the database, the queue, or anything else that can be slow without being fatal. + +A readiness probe answers a different question: can this instance serve useful responses right now? That one is allowed to check dependencies, and it is allowed to fail temporarily. Failing readiness removes the instance from rotation; failing liveness restarts it. Different consequences deserve different probes.`, + Status: "published", + Category: "devops", + Badges: []string{"kubernetes", "reliability", "http"}, + CreatedAt: daysAgo(111), UpdatedAt: daysAgo(108), + }, + { + Slug: "backups-you-have-restored", + Title: "Backups You Have Restored", + Summary: "An untested backup is a rumour. A restore drill is evidence.", + Body: `The only backup that counts is one you have restored, timed, and verified. + +Once a quarter we take the most recent snapshot, restore it into a scratch environment, and check three things: how long it took, whether the row counts match expectations, and whether the application can start against it. The drill notes go next to the schedule, not in a separate wiki nobody opens. + +If a restore needs a person who is on holiday, the backup is not finished. Fix the runbook before writing more backups.`, + Status: "published", + Category: "devops", + Badges: []string{"reliability", "postgresql", "automation"}, + CreatedAt: daysAgo(106), UpdatedAt: daysAgo(104), + }, + { + Slug: "log-lines-worth-keeping", + Title: "Log Lines Worth Keeping", + Summary: "Write logs for the person debugging at an inconvenient hour.", + Body: `Logs are read under pressure, usually by someone who did not write the code and cannot change it quickly. + +A useful line names the operation, the subject, and the outcome, and it includes the identifiers needed to find the related records. Redundancy across layers is noise: if the HTTP handler already logs the request, the repository should not log it again. + +Levels are a contract. Debug is safe to delete, info describes normal progress, warn needs attention eventually, and error means a human should look. If everything is an error, nothing is.`, + Status: "published", + Category: "devops", + Badges: []string{"logging", "observability", "debugging"}, + CreatedAt: daysAgo(101), UpdatedAt: daysAgo(99), + }, + { + Slug: "metrics-that-earn-their-keep", + Title: "Metrics That Earn Their Keep", + Summary: "Four signals nobody has to interpret beat forty dashboards nobody opens.", + Body: `Every metric costs something: collection, storage, and the attention needed to notice when it moves. + +We start with latency, traffic, errors, and saturation for each user-facing path, then add a metric only when we can name the decision it would change. A dashboard that has never been opened during an incident is decoration. + +Graphs are more useful with a line for the last release. Most arguments about a trend dissolve when the deployment markers are visible.`, + Status: "published", + Category: "devops", + Badges: []string{"metrics", "observability", "reliability"}, + CreatedAt: daysAgo(96), UpdatedAt: daysAgo(95), + }, + { + Slug: "secrets-stay-out-of-git", + Title: "Secrets Stay Out of Git", + Summary: "A short policy: no credentials in the repository, ever, including in history.", + Body: `A secret committed once is a secret leaked, because history is copied, cached, and cloned. + +The rule is simple: configuration lives in the repository, credentials do not. Local development reads from an untracked environment file, and pipelines read from the platform secret store. When a key must be rotated, we rotate it before deleting the commit that exposed it. + +We also check for the accidental paste in review. A pre-commit hook that flags likely keys costs nothing and prevents the slowest kind of incident.`, + Status: "published", + Category: "devops", + Badges: []string{"encryption", "git", "tooling"}, + CreatedAt: daysAgo(91), UpdatedAt: daysAgo(90), + }, + { + Slug: "blue-green-without-drama", + Title: "Blue-Green Without Drama", + Summary: "Cutovers stay calm when both sides are deliberately boring.", + Body: `Blue-green deployment is mostly an exercise in refusing to be clever. + +Both environments run the same configuration, differ only in the image tag, and are exercised by the same smoke tests. The switch is a routing change that can be reverted in one step, which is the entire point: the rollback path is rehearsed because it is the same path used to deploy. + +The difficult part is not the routing, it is the data. Any schema change must be compatible with both versions for the length of the cutover window, which is why we expand first, migrate, and contract later.`, + Status: "published", + Category: "devops", + Badges: []string{"reliability", "automation", "ci"}, + CreatedAt: daysAgo(86), UpdatedAt: daysAgo(85), + }, + { + Slug: "cron-is-a-fine-scheduler", + Title: "Cron Is a Fine Scheduler", + Summary: "Before reaching for a workflow engine, check whether cron plus a lock is enough.", + Body: `Scheduled work is usually simpler than the tooling sold for it. + +Cron is unglamorous and reliable. Add flock so overlapping runs cannot stack, write a log line with a run identifier, and make the job idempotent so a retry after a failure is harmless. That combination covers most nightly jobs we have ever needed. + +Reach for a real orchestrator when the work has dependencies, partial failures that must be resumed, or a need for per-step visibility. Those are real requirements, but they should arrive before the tool does.`, + Status: "published", + Category: "devops", + Badges: []string{"cron", "automation", "linux"}, + CreatedAt: daysAgo(81), UpdatedAt: daysAgo(80), + }, + { + Slug: "systemd-timers-are-just-cron-with-manners", + Title: "systemd Timers Are Just Cron With Manners", + Summary: "Timers bring logging, dependencies, and a useful status command to scheduled work.", + Body: `The first thing to say about systemd timers is that the schedule itself is not the interesting part. The interesting part is everything around it.\n\nA timer unit can declare that it runs after the network is up, that it jitters to avoid a thundering herd at midnight, and that failures are visible through the same status command used for services. Logs land in the journal with the rest of the machine.\n\nThe costs are also real: two unit files instead of one crontab line, and a syntax that rewards a quick look at the manual. For anything that matters, that trade is usually worth taking.`, + Status: "published", + Category: "linux", + Badges: []string{"systemd", "systemd-units", "automation"}, + CreatedAt: daysAgo(76), UpdatedAt: daysAgo(75), + }, + { + Slug: "reading-a-cgroup-pressure-file", + Title: "Reading a cgroup Pressure File", + Summary: "PSI numbers explain whether a machine is slow because of CPU, memory, or IO.", + Body: `When a host feels slow, the usual averages hide the cause. Pressure stall information does not.\n\nThe files under the pressure directory report the share of time tasks were stalled waiting for a resource. A rising IO stall with idle CPU points somewhere very different from a saturated CPU, and the difference decides whether you look at disks or at code.\n\nThe numbers are also cumulative, so what matters is the rate of change. Read them twice, a minute apart, and the answer is usually obvious without installing anything.`, + Status: "published", + Category: "linux", + Badges: []string{"cgroups", "performance", "troubleshooting"}, + CreatedAt: daysAgo(71), UpdatedAt: daysAgo(70), + }, + { + Slug: "lvm-for-people-who-like-undo", + Title: "LVM for People Who Like Undo", + Summary: "Logical volumes make storage changes reversible, which is the real feature.", + Body: `The headline feature of LVM is not snapshots, it is that resizing stops being frightening.\n\nA volume group turns fixed partitions into a pool, so growing a filesystem is a two-command operation and taking a snapshot before a risky change costs a few seconds. Snapshots are not backups, and they are not free, but they turn a mistake from an afternoon into a rollback.\n\nThe rule we follow is simple: any operation that could lose data gets a snapshot first, and the snapshot gets deleted the moment the change is verified.`, + Status: "published", + Category: "linux", + Badges: []string{"lvm", "filesystem"}, + CreatedAt: daysAgo(66), UpdatedAt: daysAgo(65), + }, + { + Slug: "permissions-without-superstition", + Title: "Permissions Without Superstition", + Summary: "Read the octal number as three questions instead of memorising a table.", + Body: `Most permission confusion comes from treating the numbers as magic.\n\nRead them as three questions about the owner, the group, and everyone else: can they read, can they write, can they execute? Three bits each, four plus two plus one. Once that clicks, 755 and 644 stop being incantations.\n\nThe remaining decision is ownership. Files that a service must write belong to that service, not to a shared group with generous permissions. Narrow ownership and a clear group are easier to reason about than a permissive mode applied to everything.`, + Status: "published", + Category: "linux", + Badges: []string{"permissions", "filesystem"}, + CreatedAt: daysAgo(61), UpdatedAt: daysAgo(60), + }, + { + Slug: "ssh-keys-you-can-audit", + Title: "SSH Keys You Can Audit", + Summary: "One key per machine, a comment that identifies it, and a rotation you have practised.", + Body: `A key you cannot identify is a key you cannot safely revoke.\n\nEvery key gets a comment naming the device and the year, lives in the agent with a passphrase, and is listed somewhere we can read during an incident. Shared keys are a shortcut that turns revocation into an archaeology project.\n\nThe rotation is deliberately dull: generate, install, confirm access, remove the old line. Doing it once while nothing is wrong is what makes it possible during an incident.`, + Status: "published", + Category: "linux", + Badges: []string{"ssh", "encryption", "tooling"}, + CreatedAt: daysAgo(56), UpdatedAt: daysAgo(55), + }, + { + Slug: "wireguard-on-a-laptop", + Title: "WireGuard on a Laptop", + Summary: "A minimal tunnel config that reconnects quietly and stays out of the way.", + Body: `WireGuard is refreshingly small: a private key, a peer, an allowed range, and an endpoint.\n\nThe parts worth getting right are not the cryptography but the behaviour. Keep the allowed range tight so only the services you meant to reach are routed, enable the persistent keepalive only when you are behind a NAT, and let the tooling reconnect rather than adding a script that fights it.\n\nWe keep one configuration per purpose. A tunnel that tries to be the office, the lab, and the internet at once is the tunnel that breaks at the worst time.`, + Status: "published", + Category: "linux", + Badges: []string{"wireguard", "networking", "encryption"}, + CreatedAt: daysAgo(51), UpdatedAt: daysAgo(50), + }, + { + Slug: "journalctl-in-anger", + Title: "journalctl in Anger", + Summary: "Filter by unit, by time, and by priority before you start scrolling.", + Body: `The journal is only intimidating until you use three flags.\n\nFilter to a unit, bound the time range to the incident window, and raise the priority floor so informational chatter disappears. Almost every investigation is these three filters plus a search for an identifier you already know.\n\nFollow mode is the other half of the tool: watching a unit while you reproduce a problem beats reconstructing the sequence afterwards from an unfiltered dump.`, + Status: "published", + Category: "linux", + Badges: []string{"logging", "systemd", "troubleshooting"}, + CreatedAt: daysAgo(46), UpdatedAt: daysAgo(45), + }, + { + Slug: "keeping-updates-boring", + Title: "Keeping Updates Boring", + Summary: "Update often, reboot deliberately, and keep a note of what changed.", + Body: `The dangerous update is the one that has been postponed for months.\n\nWe apply updates on a schedule small enough that any single change is unremarkable, and we reboot at a moment we chose rather than one the machine chose. A short note in the log recording the date and the packages that moved is enough to connect a new symptom to a recent change.\n\nWhen something does break, the boring habit pays off: a small set of candidate changes is far easier to reason about than a year of accumulated drift.`, + Status: "published", + Category: "linux", + Badges: []string{"linux", "reliability", "troubleshooting"}, + CreatedAt: daysAgo(41), UpdatedAt: daysAgo(40), + }, + { + Slug: "taming-grep-with-context", + Title: "Taming grep With Context", + Summary: "Three flags turn search output into something a human can read.", + Body: `Search results without context are a puzzle, not an answer.\n\nThe flags worth memorising are the ones that show neighbouring lines, print the filename, and count matches per file. Together they let you triage a repository without opening an editor. Add the fixed-string option and the recursive option and you rarely need anything else.\n\nThe habit that matters is searching for the thing that would have to be true for the bug to exist, rather than the message you already read in the logs.`, + Status: "published", + Category: "linux", + Badges: []string{"grep", "terminal", "debugging"}, + CreatedAt: daysAgo(36), UpdatedAt: daysAgo(35), + }, + { + Slug: "a-tmux-layout-that-survives", + Title: "A tmux Layout That Survives", + Summary: "A layout per task, kept in a config file instead of in muscle memory.", + Body: `A terminal multiplexer earns its place when a session outlives a dropped connection.\n\nThe useful discipline is naming sessions after the task, not after the machine, and keeping a layout definition in the configuration so a rebuild looks the same as the original. Windows for editing, tests, and logs are enough for most work.\n\nThe extra benefit is psychological: an attached session makes it obvious what was in progress when you come back to a machine you last touched a week ago.`, + Status: "published", + Category: "linux", + Badges: []string{"tmux", "terminal", "tooling"}, + CreatedAt: daysAgo(131), UpdatedAt: daysAgo(130), + }, + { + Slug: "makefiles-for-small-projects", + Title: "Makefiles for Small Projects", + Summary: "A dozen lines of make beat remembering six commands.", + Body: `Make is unfashionable and completely sufficient for the jobs a small repository actually has.\n\nWe keep targets for the things a newcomer will need in the first ten minutes: build, test, run, and clean. Declaring them phony avoids the classic confusion, and a single default target means the repository explains itself.\n\nThe test for whether a Makefile is doing too much is whether you can read it in one screen. When it grows past that, the build probably wants a real dependency graph, but most repositories never get there.`, + Status: "published", + Category: "linux", + Badges: []string{"makefile", "tooling", "automation"}, + CreatedAt: daysAgo(31), UpdatedAt: daysAgo(30), + }, + { + Slug: "context-is-not-a-cancellation-token", + Title: "Context Is Not Just a Cancellation Token", + Summary: "Pass it as the first argument, cancel it at the boundary, and never store it.", + Body: `Context carries three things: cancellation, deadlines, and request-scoped values. Most bugs come from mixing them up.\n\nIt belongs in the function signature as the first parameter and nowhere else. Storing it in a struct makes lifetime ambiguous, and using it for optional configuration hides dependencies that should be arguments.\n\nThe cancellation should originate at the edge, where the request or the command decides how long the work may take. Every layer below just honours it. When a deadline expires, the useful question is which stage ignored it for too long.`, + Status: "published", + Category: "go", + Badges: []string{"concurrency", "api", "errors"}, + CreatedAt: daysAgo(141), UpdatedAt: daysAgo(140), + }, + { + Slug: "table-tests-that-still-read", + Title: "Table Tests That Still Read", + Summary: "A named case with a clear input, a clear expectation, and no shared state.", + Body: `A table test is only better than three separate tests if it stays readable.\n\nWe name every case with the behaviour it protects, keep setup inside the case where possible, and avoid clever closures that make failures hard to trace. When a case needs a paragraph of setup, it usually deserves to be its own function.\n\nThe failure message matters as much as the assertion. A test that prints the input, the actual value, and the expected value saves a debugging round trip in continuous integration.`, + Status: "published", + Category: "go", + Badges: []string{"testing", "code-review"}, + CreatedAt: daysAgo(26), UpdatedAt: daysAgo(25), + }, + { + Slug: "generics-when-they-help", + Title: "Generics, When They Help", + Summary: "Reach for type parameters when the algorithm is identical and only the type changes.", + Body: `Generics are a tool for removing duplicated algorithms, not for expressing clever abstractions.\n\nIf two functions differ only in the type they operate on, a type parameter removes the copy without hiding anything. If they differ in behaviour, an interface expresses the variation more honestly, because it names the operations that matter.\n\nThe cost is readability for readers who have not internalised the syntax, so we use them where the saving is obvious and skip them where an interface would document intent better.`, + Status: "published", + Category: "go", + Badges: []string{"generics", "library", "architecture"}, + CreatedAt: daysAgo(21), UpdatedAt: daysAgo(20), + }, + { + Slug: "error-wrapping-that-survives", + Title: "Error Wrapping That Survives", + Summary: "Add context once per layer, and let callers ask questions with errors.Is.", + Body: `An error message should read like a path from the entry point to the failure.\n\nWrap once per layer with the operation that failed, and keep the original error in the chain so callers can test for it. Repeating the same words at every level produces messages that are long and useless.\n\nSentinel errors answer a question about kind, custom types answer a question about detail, and everything else is context for a human. Deciding which of those a caller needs is the actual design work.`, + Status: "published", + Category: "go", + Badges: []string{"errors", "debugging", "api"}, + CreatedAt: daysAgo(16), UpdatedAt: daysAgo(15), + }, + { + Slug: "understanding-go-gc-pauses", + Title: "Understanding Go GC Pauses", + Summary: "Allocation rate, not heap size, is what usually drives pause behaviour.", + Body: `The collector is doing less work when the program allocates less.\n\nPauses grow when the allocation rate grows, because the collector has to run more often to keep up with the target. Reducing temporary allocations in a hot path often helps latency more than tuning any threshold.\n\nMeasure before tuning. The trace shows pause duration and frequency next to the work that caused it, which is the only way to tell an allocation problem apart from a scheduling one.`, + Status: "published", + Category: "go", + Badges: []string{"gc", "memory", "performance"}, + CreatedAt: daysAgo(11), UpdatedAt: daysAgo(10), + }, + { + Slug: "profiling-before-optimising", + Title: "Profiling Before Optimising", + Summary: "A profile turns an argument about performance into a list of the top three costs.", + Body: `Optimisation without a profile is guessing with extra steps.\n\nStart with the profile that matches the symptom: CPU for throughput, heap for memory, mutex and block profiles for contention. The first screen usually names a function nobody suspected.\n\nBenchmarks protect the change once it is made. A benchmark without a profile tells you that something got faster; a profile tells you why, which is what makes the next change obvious.`, + Status: "published", + Category: "go", + Badges: []string{"profiling", "performance", "benchmarks"}, + CreatedAt: daysAgo(146), UpdatedAt: daysAgo(145), + }, + { + Slug: "interfaces-small-enough-to-implement", + Title: "Interfaces Small Enough to Implement", + Summary: "Declare the interface where it is consumed, and keep it to the methods you call.", + Body: `A one-method interface is easy to satisfy and easy to read. A fifteen-method interface is a description of a package, not a seam.\n\nWe declare interfaces next to the code that consumes them, not next to the implementation. That keeps them honest: the only methods present are the ones a caller actually needs, which makes fakes trivial to write in tests.\n\nThe corollary is that adding a method to a widely used interface is a design change, not a convenience. It should come with a reason that mentions the caller.`, + Status: "published", + Category: "go", + Badges: []string{"architecture", "api", "code-review"}, + CreatedAt: daysAgo(6), UpdatedAt: daysAgo(5), + }, + { + Slug: "defer-in-a-loop", + Title: "defer in a Loop", + Summary: "Deferred calls run when the function returns, which is rarely what a loop wants.", + Body: `A deferred call inside a loop accumulates until the surrounding function ends.\n\nThat is usually harmless for a single mutex release and occasionally catastrophic for file handles or database rows. The fix is to move the body into its own function so each iteration has its own scope, which also tends to make the loop easier to read.\n\nWhen reviewing, missing deferral is one of the few patterns worth grepping for rather than reading for, because it is invisible in a quick scan.`, + Status: "published", + Category: "go", + Badges: []string{"errors", "memory", "code-review"}, + CreatedAt: daysAgo(151), UpdatedAt: daysAgo(150), + }, + { + Slug: "sync-pool-is-not-a-cache", + Title: "sync.Pool Is Not a Cache", + Summary: "It reduces allocation pressure; it does not promise that anything survives.", + Body: `A pool exists to shorten the life of short-lived objects, and it is allowed to drop everything at any moment.\n\nReaching for it to keep expensive things around is a mistake, because the runtime may clear the pool during a collection. If the resource must survive, it needs a real cache with a real lifetime policy.\n\nWhere the pool shines is in hot paths that allocate a buffer per request. The measured benefit is fewer collections, not faster individual operations.`, + Status: "published", + Category: "go", + Badges: []string{"memory", "performance", "concurrency"}, + CreatedAt: daysAgo(156), UpdatedAt: daysAgo(155), + }, + { + Slug: "json-encoding-details", + Title: "JSON Encoding Details That Bite", + Summary: "Field tags, zero values, and streaming are the three places bugs hide.", + Body: `Encoding looks like a solved problem until a zero value quietly disappears.\n\nThe omitempty option removes zero values, which is convenient for optional fields and surprising for booleans and counters that legitimately mean zero. Decide per field, and write the response shape down in a test so a future tag change is visible.\n\nFor large responses, stream into the writer instead of building the whole document in memory. It is barely more code and it removes a whole class of memory surprises.`, + Status: "published", + Category: "go", + Badges: []string{"api", "http", "rest"}, + CreatedAt: daysAgo(161), UpdatedAt: daysAgo(160), + }, + { + Slug: "graceful-shutdown", + Title: "Graceful Shutdown and the Requests You Forgot", + Summary: "Stop accepting new work, finish what is in flight, and give both a deadline.", + Body: `A process that exits immediately leaves a trail of half-finished work and confusing client errors.\n\nThe pattern is small: listen for the termination signal, stop accepting new connections, wait for in-flight requests with a deadline, and close resources in the reverse order they were opened. Background workers need the same treatment so their current item can finish.\n\nThe deadline is the important part. A shutdown with no bound is a shutdown that occasionally waits forever, which is worse than an abrupt stop.`, + Status: "published", + Category: "go", + Badges: []string{"http", "reliability", "concurrency"}, + CreatedAt: daysAgo(166), UpdatedAt: daysAgo(165), + }, + { + Slug: "reading-the-race-detector", + Title: "Reading the Race Detector", + Summary: "Two stacks, one shared address, and the write that proves the bug is real.", + Body: `A race report looks intimidating because it prints the same memory twice.\n\nThe first stack is one access, the second is the conflicting one, and the address they share names the variable. At least one of them is a write. Once you find that line, the question becomes which of the two goroutines owns the value, and the answer is usually that neither does.\n\nBecause the detector only reports races it actually observes, a clean run of the test suite is evidence, not proof. Keeping the flagged case as a regression test is what makes the fix durable.`, + Status: "published", + Category: "go", + Badges: []string{"concurrency", "testing", "debugging"}, + CreatedAt: daysAgo(171), UpdatedAt: daysAgo(170), + }, + { + Slug: "virtual-threads-in-practice", + Title: "Virtual Threads in Practice", + Summary: "They remove the thread-per-request cost, not the need to bound work.", + Body: `Virtual threads make blocking code affordable again, which is a bigger change than it sounds.\n\nA request per virtual thread keeps the code sequential and readable while the runtime multiplexes onto a small pool of carrier threads. The catch is that a resource you block on still has to be bounded: a connection pool with twenty connections will queue no matter how cheap the threads are.\n\nThe awkward part is anything that pins the carrier, which keeps the blocking call stuck to a platform thread. Finding those cases is a matter of watching the thread dumps under load rather than guessing.`, + Status: "published", + Category: "java", + Badges: []string{"threads", "concurrency", "performance"}, + CreatedAt: daysAgo(136), UpdatedAt: daysAgo(135), + }, + { + Slug: "records-and-the-end-of-boilerplate", + Title: "Records and the End of Boilerplate", + Summary: "A record says what the data is, and the compiler writes the rest.", + Body: `Most value classes are a name and a list of fields, and records describe exactly that.\n\nThe generated accessors, equality, and string form remove a page of code that nobody reviewed anyway. Validation belongs in a compact constructor, which keeps the rule next to the fields it protects.\n\nThe remaining judgement is whether the type is genuinely a value. If it has behaviour, identity, or mutable state, a record is the wrong shape and a normal class documents the intent better.`, + Status: "published", + Category: "java", + Badges: []string{"java", "api"}, + CreatedAt: daysAgo(226), UpdatedAt: daysAgo(225), + }, + { + Slug: "gradle-builds-you-can-read", + Title: "Gradle Builds You Can Read", + Summary: "Keep the build script boring and put logic in tasks, not in the configuration block.", + Body: `A build that needs a debugger is a build nobody will maintain.\n\nWe keep plugins and versions in one catalog, declare dependencies in one obvious place, and avoid clever logic in configuration. Anything conditional belongs in a task with a name, so it appears in the task list and can be run on its own.\n\nBuild time is a feature. Configuration cache and a warm daemon are usually worth more than any micro-optimisation inside a task.`, + Status: "published", + Category: "java", + Badges: []string{"gradle", "tooling", "ci"}, + CreatedAt: daysAgo(221), UpdatedAt: daysAgo(220), + }, + { + Slug: "jvm-memory-you-can-explain", + Title: "JVM Memory You Can Explain", + Summary: "Heap, metaspace, and the stack each answer a different question.", + Body: `Memory problems are easier to reason about once the three areas are distinct.\n\nThe heap holds objects and is what most tuning is about. Metaspace holds class metadata, which is why a classloader leak looks like native memory growth. The stack is per thread, which is why a thousand threads cost more than the objects they touch.\n\nReading a heap histogram before and after a suspected leak answers the question faster than any amount of configuration tuning, because it names the class that is accumulating.`, + Status: "published", + Category: "java", + Badges: []string{"jvm", "memory", "profiling"}, + CreatedAt: daysAgo(216), UpdatedAt: daysAgo(215), + }, + { + Slug: "checked-exceptions-revisited", + Title: "Checked Exceptions Revisited", + Summary: "They are a documentation tool, and they are easy to abuse.", + Body: `A checked exception forces a caller to acknowledge that something can fail, which is genuinely useful for recovery paths.\n\nThe abuse is a signature that lists five checked exceptions, most of which nobody can act on. Those belong in a single application exception or in an unchecked type, so the interesting failure stays visible.\n\nThe honest test is whether a caller would do something different for this failure. If not, it should not be in the signature.`, + Status: "published", + Category: "java", + Badges: []string{"errors", "java", "api"}, + CreatedAt: daysAgo(211), UpdatedAt: daysAgo(210), + }, + { + Slug: "streams-are-not-always-faster", + Title: "Streams Are Not Always Faster", + Summary: "They express a pipeline; they do not promise a faster one.", + Body: `A stream describes what should happen, and the runtime decides how.\n\nThat trade is usually worth it for readability, especially for filter-and-map work over a collection. It is a poor trade in the hottest loop of a program, where an explicit loop with a preallocated array is often measurably faster and no less clear.\n\nThe functional style also hides cost when intermediate operations allocate. If the pipeline is in a hot path, measure it with the same discipline used for anything else.`, + Status: "published", + Category: "java", + Badges: []string{"performance", "java", "benchmarks"}, + CreatedAt: daysAgo(206), UpdatedAt: daysAgo(205), + }, + { + Slug: "set-e-is-not-a-strategy", + Title: "set -e Is Not a Strategy", + Summary: "Errexit helps, but it does not replace checking what you actually care about.", + Body: `Turning on errexit catches the common case and gives a false sense of safety.\n\nCommands used as conditions, anything in a pipeline except the last element, and failures inside a subshell can all slip past. Reaching for the pipefail option fixes one of those and leaves the rest.\n\nThe scripts that stay reliable are the ones that check the result of anything destructive, print what they are about to do, and are short enough to read in one sitting. Options help; they do not decide.`, + Status: "published", + Category: "bash", + Badges: []string{"bash", "errors", "automation"}, + CreatedAt: daysAgo(196), UpdatedAt: daysAgo(195), + }, + { + Slug: "quoting-is-the-whole-language", + Title: "Quoting Is the Whole Language", + Summary: "Almost every mysterious shell bug is a missing pair of quotes.", + Body: `The shell splits, expands, and globs, and quoting is how you say no.\n\nDouble quotes keep a value together while still expanding variables. Single quotes keep everything literal. Unquoted values are where filenames with spaces become two arguments and an empty variable disappears entirely.\n\nThe habit worth building is quoting every expansion by default and removing quotes only when word splitting is genuinely wanted, which is rare and should look deliberate.`, + Status: "published", + Category: "bash", + Badges: []string{"bash", "shell", "debugging"}, + CreatedAt: daysAgo(191), UpdatedAt: daysAgo(190), + }, + { + Slug: "pipes-without-surprises", + Title: "Pipes Without Surprises", + Summary: "Buffering, exit codes, and missing input are the three things to watch.", + Body: `A pipeline is a small distributed system, and it fails in the same interesting ways.\n\nThe exit status of a pipeline is the status of its last command unless you ask for more. A consumer that exits early leaves the producer writing into a closed pipe. Buffering means output can appear in a different order than you expect when watching a live log.\n\nWriting the intermediate result to a file while developing is not a defeat. It turns three commands into two understandable steps and usually finds the bug faster.`, + Status: "published", + Category: "bash", + Badges: []string{"bash", "shell", "troubleshooting"}, + CreatedAt: daysAgo(186), UpdatedAt: daysAgo(185), + }, + { + Slug: "arrays-in-bash", + Title: "Arrays in Bash, Carefully", + Summary: "Quote the expansion, iterate over values, and do not use strings as lists.", + Body: `Arrays exist so that filenames with spaces stop being a problem.\n\nExpanding an array unquoted reintroduces exactly that problem, so the expansion gets quotes like any other value. Iterating over the elements rather than over an index keeps the loop simple and avoids off-by-one mistakes.\n\nThe alternative, packing a list into a delimited string, works until the first value contains the delimiter. If the list can contain arbitrary text, use the array.`, + Status: "published", + Category: "bash", + Badges: []string{"bash", "shell", "snippets"}, + CreatedAt: daysAgo(181), UpdatedAt: daysAgo(180), + }, + { + Slug: "trap-and-cleanup", + Title: "trap and Cleanup", + Summary: "Temporary files and locks should be released even when the script fails.", + Body: `A script that leaves state behind is a script that breaks the next run.\n\nA trap on exit runs whether the script succeeded, failed, or was interrupted, which makes it the right place to remove temporary directories and release locks. Handling the interrupt signal lets a long job stop between steps instead of in the middle of one.\n\nThe cleanup should be idempotent, because a trap can run when the resource was never created. Checking before removing costs one line and prevents a confusing error at exactly the worst moment.`, + Status: "published", + Category: "bash", + Badges: []string{"bash", "automation", "reliability"}, + CreatedAt: daysAgo(176), UpdatedAt: daysAgo(175), + }, + { + Slug: "find-with-print0", + Title: "find With print0", + Summary: "Newline-separated filenames break on real filesystems.", + Body: `Passing a list of paths through a newline is an assumption that filenames are well behaved.\n\nUsing the null-terminated output with the matching input option removes the assumption entirely, which matters as soon as a filename contains a space, a quote, or a newline. It costs one extra flag on each side.\n\nThe other half of the habit is limiting the search early: by depth, by type, or by modification time. A find that scans an entire home directory to produce three results is a find that should have been narrower.`, + Status: "published", + Category: "bash", + Badges: []string{"filesystem", "bash", "terminal"}, + CreatedAt: daysAgo(121), UpdatedAt: daysAgo(120), + }, + { + Slug: "awk-one-liners-worth-knowing", + Title: "awk One-Liners Worth Knowing", + Summary: "Choosing fields, filtering rows, and summing a column cover most real work.", + Body: `Awk is a tiny language for columns, and three of its features handle most tasks.\n\nPrinting selected fields, filtering lines by a condition, and accumulating a total are enough to replace a great deal of fragile text processing. Field numbering is one-based, and treating the first line differently is a one-line idiom.\n\nThe reason to prefer awk over a chain of substitutions is that it parses structure rather than matching text, which makes it survive changes that would break a regular expression.`, + Status: "published", + Category: "bash", + Badges: []string{"awk", "terminal", "snippets"}, + CreatedAt: daysAgo(116), UpdatedAt: daysAgo(114), + }, + { + Slug: "sed-substitutions-that-are-safe", + Title: "sed Substitutions That Are Safe", + Summary: "Preview, choose an unusual delimiter, and back up before writing in place.", + Body: `An in-place substitution without a backup is a one-way door.\n\nThe safe habit is to run the substitution first and read the output, then repeat it with the in-place flag and a backup suffix. Choosing a delimiter that does not appear in the pattern removes a whole category of quoting confusion when the text involves paths.\n\nFor anything beyond a simple substitution, the honest answer is usually that the task wants a real parser. Sed is excellent at what it does and quietly dangerous outside that.`, + Status: "published", + Category: "bash", + Badges: []string{"sed", "regex", "terminal"}, + CreatedAt: daysAgo(111), UpdatedAt: daysAgo(109), + }, + { + Slug: "docker-images-that-stay-small", + Title: "Docker Images That Stay Small", + Summary: "Multi-stage builds, static binaries, and a base image with nothing extra.", + Body: `Most image size comes from build tooling that should not exist at runtime.\n\nA multi-stage build keeps the compiler, the package manager, and the source tree in the first stage and copies only the finished artifact into the second. For a language that can produce a static binary, the runtime stage needs nothing but certificates and a non-root user.\n\nThe payoff is not only size. A smaller image starts faster, has fewer packages to patch, and makes the container's purpose obvious to anyone reading the file.`, + Status: "published", + Category: "tooling", + Badges: []string{"docker", "containers", "ci"}, + CreatedAt: daysAgo(106), UpdatedAt: daysAgo(105), + }, + { + Slug: "dockerfiles-people-can-trust", + Title: "Dockerfiles People Can Trust", + Summary: "Pin versions, order layers by change frequency, and run as a normal user.", + Body: `A Dockerfile is a build script with a cache, and both parts deserve attention.\n\nPinning the base version makes a rebuild reproducible instead of a surprise. Copying the dependency manifest and installing before copying the source keeps the expensive layer cached while the code changes underneath it. Creating an unprivileged user costs two lines and removes a whole class of escalation.\n\nWe also like a build that fails loudly: no silent ignoring of errors, no downloads without checksums, no assumptions about the network.`, + Status: "published", + Category: "tooling", + Badges: []string{"docker", "containers", "encryption"}, + CreatedAt: daysAgo(206), UpdatedAt: daysAgo(204), + }, + { + Slug: "compose-for-local-only", + Title: "Compose for Local Only", + Summary: "A good compose file documents how to run the project on a laptop.", + Body: `The value of a compose file is onboarding, not orchestration.\n\nIt should start the one or two dependencies a developer actually needs, with health checks so the app does not race them, and named volumes so data survives a restart. Anything that only matters in production belongs somewhere else.\n\nKeeping the file short is a feature. If a newcomer has to read it for five minutes, it has stopped doing its job.`, + Status: "published", + Category: "tooling", + Badges: []string{"docker", "compose", "tooling"}, + CreatedAt: daysAgo(101), UpdatedAt: daysAgo(100), + }, + { + Slug: "changelogs-with-a-point-of-view", + Title: "Changelogs With a Point of View", + Summary: "Write for the reader deciding whether to upgrade.", + Body: `A changelog is a decision aid, not a commit log.\n\nEntries grouped by what changed for the user, with breaking changes called out first and the reason stated briefly, are worth more than a complete list of tickets. Linking to the relevant documentation turns an announcement into something actionable.\n\nThe tone matters too. A changelog that says only what was fixed leaves readers wondering what is still broken. Naming the trade-offs builds the trust that makes the next release easier to adopt.`, + Status: "published", + Category: "tooling", + Badges: []string{"documentation", "writing", "changelog"}, + CreatedAt: daysAgo(96), UpdatedAt: daysAgo(95), + }, + { + Slug: "linters-earn-their-place", + Title: "Linters Have to Earn Their Place", + Summary: "Every rule should prevent a bug somebody actually shipped.", + Body: `A linter is a code review that never gets tired, and like a code review it can be wrong.\n\nWe enable rules with a reason attached: this one catches a mistake we made twice, that one keeps a style argument from recurring. Rules that only express a preference are turned off deliberately rather than tolerated forever.\n\nFormatting belongs to a formatter, not to a discussion. Agreeing to stop arguing about whitespace is one of the cheapest productivity gains available.`, + Status: "published", + Category: "tooling", + Badges: []string{"tooling", "code-review", "ci"}, + CreatedAt: daysAgo(91), UpdatedAt: daysAgo(90), + }, + { + Slug: "git-bisect-when-things-break", + Title: "git bisect When Things Break", + Summary: "A scripted good and bad commit turns a mystery into a short search.", + Body: `Bisect is the fastest way to answer "when did this start?" and it is usually forgotten.\n\nMarking a known good and a known bad revision halves the search space each step, which finds the culprit in a handful of builds even in a long history. Automating the check with a script makes it possible to walk away while it runs.\n\nThe prerequisite is a test that fails reliably. If the check is flaky, bisect returns a confident wrong answer, which is worse than no answer at all.`, + Status: "published", + Category: "tooling", + Badges: []string{"git", "debugging", "testing"}, + CreatedAt: daysAgo(86), UpdatedAt: daysAgo(85), + }, + { + Slug: "editor-config-as-a-document", + Title: "Editor Config as a Document", + Summary: "Aligning the small conventions removes a recurring review comment.", + Body: `Line endings, indentation, and trailing whitespace produce a surprising share of review noise.\n\nDeclaring them once in a shared file means the editor agrees with continuous integration and with colleagues on other platforms. It is a small file with a large return, because it removes a class of comment that carries no information.\n\nThe same idea applies to the manifest that pins the toolchain version. When the version is written down, works-on-my-machine becomes a conversation about the file rather than about machines.`, + Status: "published", + Category: "tooling", + Badges: []string{"tooling", "code-review", "documentation"}, + CreatedAt: daysAgo(79), UpdatedAt: daysAgo(78), + }, + { + Slug: "vim-motions-worth-practising", + Title: "Vim Motions Worth Practising", + Summary: "Structure-aware movement beats repeating a character search.", + Body: `The motions that pay back their practice time are the ones that move by structure.\n\nJumping to a word, to a paragraph, to a matching bracket, and to the last edit covers most navigation. Combining a motion with an operator is what turns editing into a sentence rather than a sequence of keystrokes.\n\nReaching for the search command instead of holding a movement key is the single habit that changes the most, because it turns a long scroll into one jump.`, + Status: "published", + Category: "tooling", + Badges: []string{"vim", "terminal", "tooling"}, + CreatedAt: daysAgo(76), UpdatedAt: daysAgo(75), + }, + { + Slug: "http-clients-that-timeout", + Title: "HTTP Clients That Time Out", + Summary: "The default has no deadline, which is a bug waiting for a slow dependency.", + Body: `A client without a timeout will wait as long as the server feels like making it wait.\n\nSetting a total timeout, a connection timeout, and a response header timeout separately makes the failure mode easy to reason about. Retries belong on top of those, bounded and only for idempotent requests, ideally with a little randomised delay.\n\nThe same discipline applies to the server side. A handler that can block forever turns one slow dependency into an outage, and a deadline propagated from the request is what prevents it.`, + Status: "published", + Category: "tooling", + Badges: []string{"http", "reliability", "api"}, + CreatedAt: daysAgo(176), UpdatedAt: daysAgo(174), + }, + { + Slug: "yaml-is-a-data-format-honestly", + Title: "YAML Is a Data Format, Honestly", + Summary: "Two spaces, no tabs, and quote anything that looks like a special value.", + Body: `Most configuration mystery comes from YAML being more clever than expected.\n\nIndentation is significant and tabs are forbidden, so a consistent editor setting prevents the most common failure. Values that look like booleans or numbers are coerced unless quoted, which is how a version number becomes a float.\n\nThe practical rule is to treat YAML as JSON with comments: keep the structure shallow, quote the ambiguous scalars, and let a validator catch the rest before a deployment does.`, + Status: "published", + Category: "tooling", + Badges: []string{"yaml", "tooling", "troubleshooting"}, + CreatedAt: daysAgo(171), UpdatedAt: daysAgo(170), + }, + { + Slug: "writing-for-readers-in-a-hurry", + Title: "Writing for Readers in a Hurry", + Summary: "The first sentence should answer the question that brought them here.", + Body: `Most readers arrive with a question and very little patience.\n\nPutting the answer in the first sentence, before the context and before the caveats, respects that. Background belongs after the answer, where a reader who needs it will happily go.\n\nThe structure that survives editing is: what, so what, now what. What happened, why it matters to you, and what you should do next. Everything else is optional.`, + Status: "published", + Category: "design", + Badges: []string{"writing", "editorial", "documentation"}, + CreatedAt: daysAgo(166), UpdatedAt: daysAgo(165), + }, + { + Slug: "headings-are-a-table-of-contents", + Title: "Headings Are a Table of Contents", + Summary: "Read only the headings; if the outline does not make sense, the piece does not either.", + Body: `A reader skimming the headings should be able to reconstruct the argument.\n\nThat test catches most structural problems before a word of prose is rewritten. If two headings say the same thing, there is one section too many. If a heading is a noun phrase with no verb, it probably describes a topic instead of a claim.\n\nWe keep one idea per heading level and avoid skipping levels, because the hierarchy is a promise about how the parts relate.`, + Status: "published", + Category: "design", + Badges: []string{"writing", "editorial", "typography"}, + CreatedAt: daysAgo(161), UpdatedAt: daysAgo(160), + }, + { + Slug: "the-first-draft-is-for-you", + Title: "The First Draft Is for You", + Summary: "Write it badly, then delete the parts that only helped you think.", + Body: `The first draft exists to discover what the piece is actually about.\n\nThat means it is allowed to be repetitive, uncertain, and too long. The editing pass is where the discovered argument gets stated once and the scaffolding comes down.\n\nThe tell-tale sign of an unedited draft is explanation that answers a question the reader never asked. It was necessary to write; it is not necessary to read.`, + Status: "published", + Category: "design", + Badges: []string{"writing", "editing", "editorial"}, + CreatedAt: daysAgo(156), UpdatedAt: daysAgo(155), + }, + { + Slug: "accessibility-is-not-a-checklist", + Title: "Accessibility Is Not a Checklist", + Summary: "Contrast and keyboard access are the floor, not the ceiling.", + Body: `Passing an automated audit is the beginning of accessibility work, not the end.\n\nThe parts a tool cannot see are usually the parts that matter most: whether the reading order makes sense, whether a change is announced to assistive technology, whether an error explains how to recover. Those come from using the thing the way a person with different needs would.\n\nThe cheapest improvement in any interface is almost always better contrast and a visible focus state. Both are one line of styling and both help everybody.`, + Status: "published", + Category: "design", + Badges: []string{"accessibility", "css", "design"}, + CreatedAt: daysAgo(151), UpdatedAt: daysAgo(150), + }, + { + Slug: "empty-states-are-real-states", + Title: "Empty States Are Real States", + Summary: "The screen with no data is the first screen many people ever see.", + Body: `An empty list is not an edge case; for a new account it is the default.\n\nA good empty state says why there is nothing here, what would put something here, and offers the action that does it. It is the most useful onboarding surface in the product and it is usually left as a blank rectangle.\n\nThe same applies to loading and error states. If those three were designed alongside the populated view instead of after it, most interface awkwardness would disappear.`, + Status: "published", + Category: "design", + Badges: []string{"design", "css", "typography"}, + CreatedAt: daysAgo(146), UpdatedAt: daysAgo(145), + }, + { + Slug: "boring-typography-scales", + Title: "Boring Typography Scales", + Summary: "Two families, a handful of sizes, and a generous line height.", + Body: `Typography decisions get easier when the scale is small enough to remember.\n\nOne family for prose and one for code, four or five sizes total, and a line height that grows as the text gets smaller. Constraining the choices removes the meeting about which heading deserves an extra two pixels.\n\nThe most common mistake is not a bad font, it is too little spacing. Reading is easier with slightly more space than looks correct on a designer's monitor.`, + Status: "published", + Category: "design", + Badges: []string{"typography", "css", "design"}, + CreatedAt: daysAgo(141), UpdatedAt: daysAgo(140), + }, + { + Slug: "deep-work-and-the-backlog", + Title: "Deep Work and the Backlog", + Summary: "A backlog that everyone can read is a backlog that interrupts everyone.", + Body: `A shared list of everything is a shared invitation to interrupt.\n\nWe keep a small, visible queue of committed work and a longer list that nobody is expected to watch. The visible part is what the team is doing now, and it should be short enough to hold in mind.\n\nProtecting a block of uninterrupted time is not a personal preference, it is a scheduling decision with a cost attached. Naming the cost makes it possible to defend.`, + Status: "published", + Category: "workflow", + Badges: []string{"roadmap", "workflow", "writing"}, + CreatedAt: daysAgo(136), UpdatedAt: daysAgo(135), + }, + { + Slug: "code-review-as-a-conversation", + Title: "Code Review as a Conversation", + Summary: "Ask about intent before style, and separate blocking from optional.", + Body: `A review that begins with formatting has skipped the part where the author learns something.\n\nThe useful order is intent, then correctness, then clarity, then style. The first question is whether the change does what it claims; everything else is cheaper to discuss once that is settled.\n\nLabelling comments as blocking or optional removes the guesswork. A reviewer who writes only the blocking ones is being kind, not lazy.`, + Status: "published", + Category: "workflow", + Badges: []string{"code-review", "review", "writing"}, + CreatedAt: daysAgo(131), UpdatedAt: daysAgo(130), + }, + { + Slug: "documentation-next-to-the-code", + Title: "Documentation Next to the Code", + Summary: "A document in the repository is reviewed, versioned, and found.", + Body: `Documentation that lives only in a wiki drifts out of date without anyone noticing.\n\nKeeping the explanation in the repository means a change that invalidates it appears in the same review as the change itself. Comments explain why, the readme explains how to run it, and the design notes explain what was rejected.\n\nThe best documentation is short, current, and located where somebody will trip over it. A perfect document nobody opens is a hobby.`, + Status: "published", + Category: "workflow", + Badges: []string{"documentation", "writing", "code-review"}, + CreatedAt: daysAgo(126), UpdatedAt: daysAgo(125), + }, + { + Slug: "estimates-as-ranges", + Title: "Estimates as Ranges", + Summary: "A range with an assumption attached is more useful than a date without one.", + Body: `A single date invites an argument about the date rather than the work.\n\nA range plus the assumption it rests on gives the reader something to reason with: if the assumption holds, the work lands here, and if the integration turns out to be more involved, it moves. That is a more honest sentence than any point estimate.\n\nThe practice also surfaces hidden uncertainty early. When the range is very wide, the useful next step is usually a small experiment rather than more discussion.`, + Status: "published", + Category: "workflow", + Badges: []string{"roadmap", "workflow", "writing"}, + CreatedAt: daysAgo(121), UpdatedAt: daysAgo(120), + }, + { + Slug: "turning-incidents-into-habits", + Title: "Turning Incidents Into Habits", + Summary: "A fix in a document gets forgotten; a fix in automation does not.", + Body: `The end of an incident is the moment when a lesson is easy to capture and easy to lose.\n\nThe durable outcome is not the write-up, it is the check that runs automatically, the alert that fires earlier, or the guard rail that makes the wrong action impossible. Prefer the change that works when nobody remembers the incident.\n\nWe keep one follow-up of that kind per incident. A list of ten improvements usually produces zero, and one automation produces a permanent reminder.`, + Status: "published", + Category: "workflow", + Badges: []string{"reliability", "automation", "reminders"}, + CreatedAt: daysAgo(116), UpdatedAt: daysAgo(115), + }, + { + Slug: "shipping-the-boring-improvement", + Title: "Shipping the Boring Improvement", + Summary: "The change nobody will notice is often the one that removes the most pain.", + Body: `Rewrites are exciting and rarely the best use of a week.\n\nThe improvements that hold up are dull: a clearer error message, one fewer manual step, a test that closes a flaky path, a log line that names the request. None of them make a good demo, and together they change how the work feels.\n\nWe protect time for them explicitly. If only the interesting work gets scheduled, the boring improvements accumulate as complaints instead of commits.`, + Status: "published", + Category: "workflow", + Badges: []string{"workflow", "review", "roadmap"}, + CreatedAt: daysAgo(111), UpdatedAt: daysAgo(110), + }, + { + Slug: "notes-from-automating-my-own-workflow", + Title: "Notes From Automating My Own Workflow", + Summary: "Automate the second time you do something, not the first.", + Body: `Automating a task you have done once produces a script shaped like a guess.\n\nThe second time, the variation is visible: which parts are always the same and which parts change. That is the moment a script earns its keep, because the interface it needs is now obvious.\n\nThe other rule is to keep the automation readable. A script with no output and no comments saves five minutes and costs thirty the next time it fails silently.`, + Status: "published", + Category: "workflow", + Badges: []string{"automation", "tooling", "bash"}, + CreatedAt: daysAgo(106), UpdatedAt: daysAgo(105), + }, + { + Slug: "the-meeting-that-should-be-a-note", + Title: "The Meeting That Should Be a Note", + Summary: "If nobody will ask a question, write it down instead.", + Body: `Recurring meetings survive long after the reason for them has been forgotten.\n\nThe test is simple: is there a decision to make or a question to answer that requires people in the same moment? If the answer is that the meeting exists to share status, a short written update does the job better and consumes less of everyone's attention.\n\nConverting one meeting into a note is a cheap experiment. If nothing breaks, the meeting was already finished.`, + Status: "published", + Category: "workflow", + Badges: []string{"workflow", "writing", "documentation"}, + CreatedAt: daysAgo(66), UpdatedAt: daysAgo(65), + }, + { + Slug: "built-with-ai", + Title: "This Demo Was Built With AI, and That Is the Point", + Summary: "This whole backlog, the API behind it, and the image it runs in were written in conversation with an AI assistant. Here is what that felt like.", + Body: `This application is a demo, and it has a confession: almost all of it was written together with an AI assistant. + +The backend is a small Go service with a hand-written router, an in-memory store, and one dependency-free security seam. The frontend is React and TypeScript. The whole thing ships as a single container with the compiled binary and the static assets inside, and the articles you are reading are seeded from a Go slice rather than a database. None of that was typed out from a blank page. It was described, generated, reviewed, corrected, and described again. + +What worked well was the speed of the boring parts. Renaming a field across a layer, adding a test that mirrors an existing one, restructuring a file so the pieces sit in a sensible order, writing fifty articles in a consistent voice: these are the tasks where a clear instruction produces a usable result in seconds. The assistant was also good at the thing people often forget to ask for, which is consistency. Once it had seen the shape of the codebase, it kept producing code that looked like it belonged there. + +What worked less well was anything that depended on judgement that had not been stated out loud. Left alone, the assistant will happily keep a database that nobody asked for, add an abstraction layer to a five-line function, or write a test that asserts nothing meaningful. Every one of those happened during this build. The fix was never clever prompting, it was reading the diff. + +That is the habit this project mostly taught. AI is excellent at producing plausible code quickly, and plausible is not the same as correct. The security model in this repository changed shape twice: once when it became clear that a demo with one owner should not carry an account system at all, and once when the storage layer was replaced rather than repaired. Both decisions were human, and both were simpler than what had grown there before. The assistant implemented them faithfully and quickly; it did not propose them. + +A few practical notes, in case this is useful to someone reading it as a case study rather than as an article. + +Describe the constraint, not just the task. Asking for a single self-contained image produced a very different result from asking for a deployment. + +Let the assistant see the whole picture. The quality of generated code tracked the accuracy of the surrounding context almost exactly. + +Insist on verification. Every claim in this project was checked by building it, testing it, and running it. The assistant is at least as good at explaining why something works as it is at making it work, so the explanation was never treated as evidence. + +Keep the changelog honest. The record of what was asked and what was done is more interesting than the result, and it is the only part of this that a future reader cannot reconstruct. + +So the demo is small, and it is finished, and an AI wrote most of the words and most of the lines. The architecture, the trade-offs, and the decision to throw away the database were mine. That division of labour is the interesting part, and it is probably how a lot of small software gets built now. It was, honestly, fun.`, + Status: "published", + Category: "workflow", + Badges: []string{"open-source", "writing", "documentation"}, + CreatedAt: daysAgo(2), UpdatedAt: daysAgo(1), + }, +} diff --git a/internal/web/handlers.go b/internal/web/handlers.go index e225a92..4621dfd 100644 --- a/internal/web/handlers.go +++ b/internal/web/handlers.go @@ -1,54 +1,96 @@ package web import ( + "context" "encoding/json" "fmt" + "io/fs" "net/http" "strings" - "github.com/example/cms/internal/domain" "github.com/example/cms/internal/security" "github.com/example/cms/internal/service" ) -// Handler serves the CMS API. Reading content is anonymous; every mutation -// requires the identity asserted by the upstream SSO proxy. +// Handler serves the CMS API and the embedded React app from one binary. +// Reading content is anonymous; every mutation requires the identity asserted by +// the upstream SSO proxy. type Handler struct { content service.IContentService + assets fs.FS sso security.ITokenVerifier + demo *service.DemoAuth } -func NewHandler(content service.IContentService, sso security.ITokenVerifier) *Handler { - return &Handler{content: content, sso: sso} +func NewHandler(content service.IContentService, assets fs.FS, sso security.ITokenVerifier, demo ...*service.DemoAuth) *Handler { + h := &Handler{content: content, assets: assets, sso: sso} + if len(demo) > 0 { + h.demo = demo[0] + } + return h } + func (h *Handler) Routes(origins string) http.Handler { mux := http.NewServeMux() - mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { jsonWrite(w, 200, map[string]string{"status": "ok"}) }) + mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + jsonWrite(w, http.StatusOK, map[string]string{"status": "ok"}) + }) mux.HandleFunc("/api/auth/session", h.session) + mux.HandleFunc("/api/auth/sudo", h.sudo) + mux.HandleFunc("/api/auth/users", h.users) mux.HandleFunc("/api/protected", h.protected) mux.HandleFunc("/api/test/protected", h.protected) mux.HandleFunc("/api/content", h.contentList) mux.HandleFunc("/api/content/categories", h.contentCategories) mux.HandleFunc("/api/content/badges", h.contentBadges) mux.HandleFunc("/api/content/", h.contentDetail) + mux.HandleFunc("/", h.singlePageApp) return cors(mux, origins, h.sso.HeaderName()) } + func (h *Handler) session(w http.ResponseWriter, r *http.Request) { - authenticated := h.sso.Authenticated(r) - jsonWrite(w, http.StatusOK, map[string]any{"authenticated": authenticated, "canEdit": authenticated}) + username, authenticated := h.identity(r) + jsonWrite(w, http.StatusOK, map[string]any{"authenticated": authenticated, "canEdit": authenticated, "username": username}) } + func (h *Handler) protected(w http.ResponseWriter, r *http.Request) { - if !h.sso.Authenticated(r) { - jsonWrite(w, 401, map[string]string{"error": "authentication required"}) + if _, ok := h.identity(r); !ok { + jsonWrite(w, http.StatusUnauthorized, map[string]string{"error": "authentication required"}) return } - jsonWrite(w, 200, map[string]string{"status": "authenticated"}) + jsonWrite(w, http.StatusOK, map[string]string{"status": "authenticated"}) } -func (h *Handler) contentList(w http.ResponseWriter, r *http.Request) { - if h.content == nil { - jsonWrite(w, 503, map[string]string{"error": "content unavailable"}) + +func (h *Handler) users(w http.ResponseWriter, r *http.Request) { + if h.demo == nil || r.Method != http.MethodGet { + http.NotFound(w, r) return } + jsonWrite(w, http.StatusOK, map[string]any{"items": h.demo.Users()}) +} + +func (h *Handler) sudo(w http.ResponseWriter, r *http.Request) { + if h.demo == nil || r.Method != http.MethodPost { + http.NotFound(w, r) + return + } + var input struct { + Username string `json:"username"` + Password string `json:"password"` + } + if !decode(r, &input) { + jsonWrite(w, http.StatusBadRequest, map[string]string{"error": "invalid JSON"}) + return + } + token, user, err := h.demo.Login(input.Username, input.Password) + if err != nil { + jsonWrite(w, http.StatusUnauthorized, map[string]string{"error": "invalid demo credentials"}) + return + } + jsonWrite(w, http.StatusOK, map[string]any{"token": token, "user": user}) +} + +func (h *Handler) contentList(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { jsonWrite(w, http.StatusMethodNotAllowed, nil) return @@ -58,94 +100,128 @@ func (h *Handler) contentList(w http.ResponseWriter, r *http.Request) { _, _ = fmt.Sscanf(r.URL.Query().Get("offset"), "%d", &offset) badges := r.URL.Query()["badge"] if len(badges) == 0 { - badges = strings.Split(strings.TrimSpace(r.URL.Query().Get("badges")), ",") + badges = strings.Split(r.URL.Query().Get("badges"), ",") } - filtered := badges[:0] - for _, badge := range badges { - if badge = strings.TrimSpace(strings.ToLower(badge)); badge != "" { - filtered = append(filtered, badge) - } - } - items, e := h.content.List(r.Context(), limit, offset, - strings.TrimSpace(strings.ToLower(r.URL.Query().Get("category"))), - strings.TrimSpace(strings.ToLower(r.URL.Query().Get("status"))), - filtered, + items, err := h.content.List(r.Context(), limit, offset, + r.URL.Query().Get("category"), + r.URL.Query().Get("status"), + badges, ) - if e != nil { - jsonWrite(w, 500, map[string]string{"error": e.Error()}) + if err != nil { + jsonWrite(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } - jsonWrite(w, 200, map[string]any{"items": items, "limit": limit, "offset": offset}) + jsonWrite(w, http.StatusOK, map[string]any{"items": items, "limit": limit, "offset": offset}) } + func (h *Handler) contentCategories(w http.ResponseWriter, r *http.Request) { - if h.content == nil { - jsonWrite(w, 503, map[string]string{"error": "content unavailable"}) - return - } if r.Method != http.MethodGet { jsonWrite(w, http.StatusMethodNotAllowed, nil) return } categories, err := h.content.ListCategories(r.Context()) if err != nil { - jsonWrite(w, 500, map[string]string{"error": err.Error()}) + jsonWrite(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } - jsonWrite(w, 200, map[string]any{"items": categories}) + jsonWrite(w, http.StatusOK, map[string]any{"items": categories}) } + func (h *Handler) contentBadges(w http.ResponseWriter, r *http.Request) { - if h.content == nil { - jsonWrite(w, 503, map[string]string{"error": "content unavailable"}) - return - } if r.Method != http.MethodGet { jsonWrite(w, http.StatusMethodNotAllowed, nil) return } badges, err := h.content.ListBadges(r.Context()) if err != nil { - jsonWrite(w, 500, map[string]string{"error": err.Error()}) + jsonWrite(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) return } - jsonWrite(w, 200, map[string]any{"items": badges}) + jsonWrite(w, http.StatusOK, map[string]any{"items": badges}) } + func (h *Handler) contentDetail(w http.ResponseWriter, r *http.Request) { - if h.content == nil { - jsonWrite(w, 503, map[string]string{"error": "content unavailable"}) - return - } slug := strings.TrimPrefix(r.URL.Path, "/api/content/") - if r.Method == http.MethodGet { - c, e := h.content.Get(r.Context(), slug) - if e != nil { - jsonWrite(w, 404, map[string]string{"error": "content not found"}) + switch r.Method { + case http.MethodGet: + item, err := h.content.Get(r.Context(), slug) + if err != nil { + jsonWrite(w, http.StatusNotFound, map[string]string{"error": "content not found"}) return } - jsonWrite(w, 200, c) - return + jsonWrite(w, http.StatusOK, item) + case http.MethodPut: + username, authenticated := h.identity(r) + if !authenticated { + jsonWrite(w, http.StatusUnauthorized, map[string]string{"error": "authentication required"}) + return + } + var item service.Content + if !decode(r, &item) { + jsonWrite(w, http.StatusBadRequest, map[string]string{"error": "invalid JSON"}) + return + } + item.Slug = slug + var saved service.Content + var err error + if owned, ok := h.content.(interface { + UpdateAs(context.Context, service.Content, string) (service.Content, error) + }); ok { + saved, err = owned.UpdateAs(r.Context(), item, username) + } else { + saved, err = h.content.Update(r.Context(), item) + } + if err != nil { + jsonWrite(w, http.StatusBadRequest, map[string]string{"error": err.Error()}) + return + } + + jsonWrite(w, http.StatusOK, saved) + default: + jsonWrite(w, http.StatusMethodNotAllowed, nil) } - if r.Method != http.MethodPut { - jsonWrite(w, 405, nil) - return - } - if !h.sso.Authenticated(r) { - jsonWrite(w, 401, map[string]string{"error": "authentication required"}) - return - } - var c domain.Content - if !decode(r, &c) { - jsonWrite(w, 400, map[string]string{"error": "invalid JSON"}) - return - } - c.Slug = slug - out, e := h.content.Update(r.Context(), c) - if e != nil { - jsonWrite(w, 400, map[string]string{"error": e.Error()}) - return - } - jsonWrite(w, 200, out) } + +func (h *Handler) identity(r *http.Request) (string, bool) { + if h.demo != nil { + token := strings.TrimSpace(strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer ")) + if username, ok := h.demo.Authenticated(token); ok { + return username, true + } + } + if h.sso.Authenticated(r) { + return "sso-owner", true + } + return "", false +} + +// singlePageApp serves the embedded build and falls back to index.html so the +// client-side router owns every non-API path. +func (h *Handler) singlePageApp(w http.ResponseWriter, r *http.Request) { + if h.assets == nil { + http.NotFound(w, r) + return + } + name := strings.TrimPrefix(r.URL.Path, "/") + if name != "" { + if file, err := h.assets.Open(name); err == nil { + _ = file.Close() + http.FileServer(http.FS(h.assets)).ServeHTTP(w, r) + return + } + } + index, err := fs.ReadFile(h.assets, "index.html") + if err != nil { + http.NotFound(w, r) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("Cache-Control", "no-cache") + _, _ = w.Write(index) +} + func decode(r *http.Request, v any) bool { return json.NewDecoder(r.Body).Decode(v) == nil } + func jsonWrite(w http.ResponseWriter, status int, v any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) @@ -153,6 +229,7 @@ func jsonWrite(w http.ResponseWriter, status int, v any) { _ = json.NewEncoder(w).Encode(v) } } + func cors(next http.Handler, origin, ssoHeader string) http.Handler { allowed := "Content-Type, Authorization" if ssoHeader != "" && !strings.EqualFold(ssoHeader, "Authorization") { @@ -164,7 +241,7 @@ func cors(next http.Handler, origin, ssoHeader string) http.Handler { w.Header().Set("Access-Control-Allow-Headers", allowed) w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS") if r.Method == http.MethodOptions { - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) return } next.ServeHTTP(w, r) diff --git a/internal/web/handlers_test.go b/internal/web/handlers_test.go index fb9f0fb..cc1bdf1 100644 --- a/internal/web/handlers_test.go +++ b/internal/web/handlers_test.go @@ -6,28 +6,37 @@ import ( "net/http/httptest" "strings" "testing" + "testing/fstest" - "github.com/example/cms/internal/domain" "github.com/example/cms/internal/security" + "github.com/example/cms/internal/service" ) type fakeContent struct{ updated bool } -func (f *fakeContent) List(context.Context, int, int, string, string, []string) ([]domain.Content, error) { - return nil, nil +func (f *fakeContent) List(context.Context, int, int, string, string, []string) ([]service.Content, error) { + return []service.Content{{Slug: "post", Title: "Post"}}, nil } -func (f *fakeContent) ListCategories(context.Context) ([]domain.Category, error) { return nil, nil } -func (f *fakeContent) ListBadges(context.Context) ([]domain.Badge, error) { return nil, nil } -func (f *fakeContent) Get(context.Context, string) (domain.Content, error) { - return domain.Content{Slug: "post", Title: "Post", Body: "body"}, nil +func (f *fakeContent) ListCategories(context.Context) ([]service.Category, error) { + return []service.Category{{Slug: "go", Name: "Go"}}, nil } -func (f *fakeContent) Update(_ context.Context, c domain.Content) (domain.Content, error) { +func (f *fakeContent) ListBadges(context.Context) ([]service.Badge, error) { + return []service.Badge{{Name: "go"}}, nil +} +func (f *fakeContent) Get(context.Context, string) (service.Content, error) { + return service.Content{Slug: "post", Title: "Post", Body: "body"}, nil +} +func (f *fakeContent) Update(_ context.Context, c service.Content) (service.Content, error) { f.updated = true return c, nil } func newTestRoutes(content *fakeContent) http.Handler { - return NewHandler(content, security.NewSSOTokenVerifier("X-SSO-Token", "", "")).Routes("http://localhost:5173") + assets := fstest.MapFS{ + "index.html": &fstest.MapFile{Data: []byte("
")}, + "assets/index.js": &fstest.MapFile{Data: []byte("console.log('cms')")}, + } + return NewHandler(content, assets, security.NewSSOTokenVerifier("X-SSO-Token", "", "")).Routes("http://localhost:5173") } func TestAnonymousCanReadButNotEdit(t *testing.T) { @@ -79,3 +88,19 @@ func TestProxyIdentityCanEdit(t *testing.T) { t.Fatalf("owner session = %s", sessionRec.Body.String()) } } + +func TestServesEmbeddedAppForClientRoutes(t *testing.T) { + routes := newTestRoutes(&fakeContent{}) + + asset := httptest.NewRecorder() + routes.ServeHTTP(asset, httptest.NewRequest(http.MethodGet, "/assets/index.js", nil)) + if asset.Code != http.StatusOK || !strings.Contains(asset.Body.String(), "console.log") { + t.Fatalf("static asset status = %d body = %q", asset.Code, asset.Body.String()) + } + + page := httptest.NewRecorder() + routes.ServeHTTP(page, httptest.NewRequest(http.MethodGet, "/content/some-post", nil)) + if page.Code != http.StatusOK || !strings.Contains(page.Body.String(), `id="root"`) { + t.Fatalf("spa fallback status = %d body = %q", page.Code, page.Body.String()) + } +} diff --git a/scripts/seed_content.sql b/scripts/seed_content.sql deleted file mode 100644 index ea89cd8..0000000 --- a/scripts/seed_content.sql +++ /dev/null @@ -1,581 +0,0 @@ --- Seed data for the PostgreSQL content table. --- Safe to run repeatedly: rows are upserted by slug. --- --- Run with: --- psql "$POSTGRES_URL" -f scripts/seed_content.sql - -INSERT INTO categories (slug, name) VALUES - ('linux', 'Linux'), - ('bash', 'Bash & Shell'), - ('go', 'Go'), - ('java', 'Java'), - ('devops', 'DevOps') -ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name; - -INSERT INTO content ( - slug, title, summary, body, status, published, created_at, updated_at -) VALUES -( - 'welcome-to-the-cms', - 'Welcome to the CMS', - 'A short introduction to the editorial workspace and the ideas behind this publication.', - $$Welcome to the CMS journal. - -This space is where the team shares product updates, practical guides, and notes from the work behind the scenes. Each story is written to be useful on its own, while also giving readers a clearer picture of how the product is built. - -Start with the latest articles, save the pieces that are useful to your team, and send us feedback when something could be clearer.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '24 days', CURRENT_TIMESTAMP - INTERVAL '20 days' -), -( - 'designing-for-clarity', - 'Designing for Clarity', - 'How a small set of deliberate design decisions can make a complex workflow feel calm and understandable.', - $$Clarity is not the same as simplicity. A good interface can expose a powerful workflow without asking people to understand every implementation detail. - -We begin by naming the user''s goal, then remove everything that competes with it. Labels should describe outcomes, actions should have predictable results, and important feedback should appear close to the action that caused it. - -The best design review question is often simple: what would a first-time user expect to happen next?$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '23 days', CURRENT_TIMESTAMP - INTERVAL '18 days' -), -( - 'a-practical-guide-to-editorial-workflows', - 'A Practical Guide to Editorial Workflows', - 'A repeatable process for taking an idea from a rough note to a polished, published story.', - $$A dependable editorial workflow gives ideas room to develop without allowing unfinished work to slip into production. - -Our process has four stages: capture, shape, review, and publish. Capture is intentionally lightweight. Shape gives the draft a clear audience and purpose. Review checks accuracy, tone, and accessibility. Publish is the final technical and editorial check. - -The workflow works because every stage has a clear owner and a clear definition of done.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '22 days', CURRENT_TIMESTAMP - INTERVAL '16 days' -), -( - 'building-a-better-content-calendar', - 'Building a Better Content Calendar', - 'A lightweight planning method that balances consistency with enough flexibility for timely ideas.', - $$A content calendar should create confidence, not bureaucracy. - -We plan around themes rather than filling every date in advance. Each month has a primary theme, two supporting topics, and a small reserve for timely announcements. This gives the team a reliable rhythm while leaving space for unexpected opportunities. - -The calendar is most useful when it shows the reason for each piece, not only its due date.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '21 days', CURRENT_TIMESTAMP - INTERVAL '15 days' -), -( - 'the-case-for-small-releases', - 'The Case for Small Releases', - 'Why shipping focused improvements regularly creates better feedback and lower operational risk.', - $$Small releases make learning cheaper. - -When a change has a narrow scope, it is easier to test, explain, monitor, and roll back. The team gets useful feedback while the context is still fresh, and users see a steady stream of improvements rather than waiting for a single large launch. - -Small does not mean insignificant. A series of focused changes can transform an experience when each one solves a real problem.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '20 days', CURRENT_TIMESTAMP - INTERVAL '14 days' -), -( - 'how-we-write-useful-documentation', - 'How We Write Useful Documentation', - 'Documentation is most valuable when it helps someone complete a task at the moment they need it.', - $$Useful documentation starts with the reader''s question, not the system''s architecture. - -We lead with the expected result, show the smallest complete example, and explain the assumptions that could otherwise cause confusion. Details belong after the main path, where they can help without blocking progress. - -Documentation is part of the product. When it is accurate, direct, and easy to scan, it reduces support work and helps users become independent faster.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '19 days', CURRENT_TIMESTAMP - INTERVAL '13 days' -), -( - 'accessibility-is-a-quality-practice', - 'Accessibility Is a Quality Practice', - 'Accessibility checks improve the experience for everyone, not only for users who identify with a specific access need.', - $$Accessibility is a practical way to test whether an interface communicates clearly. - -Keyboard navigation reveals hidden interaction assumptions. Good contrast helps in bright rooms and on small screens. Descriptive labels help screen-reader users and also make automated tests more meaningful. - -Treating accessibility as a quality practice means including it in design, implementation, and review instead of leaving it for the final checklist.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '18 days', CURRENT_TIMESTAMP - INTERVAL '12 days' -), -( - 'measuring-what-matters', - 'Measuring What Matters', - 'A guide to choosing a small set of product signals that lead to better decisions.', - $$Metrics are useful when they change what the team does. - -We prefer a small collection of signals with clear owners: successful task completion, time to value, reliable publishing, and meaningful engagement. Every metric should have a question behind it and a decision that it can inform. - -A dashboard full of numbers is not automatically useful. The goal is shared understanding, not decorative precision.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '17 days', CURRENT_TIMESTAMP - INTERVAL '11 days' -), -( - 'notes-from-a-content-migration', - 'Notes from a Content Migration', - 'Lessons learned while moving a growing library into a structured content model.', - $$A migration is an opportunity to clarify the shape of the content, not only to move records from one place to another. - -We started by identifying the fields that readers actually depend on. Then we separated durable content from presentation details and created a small set of validation rules. The result was less data than we expected, but much more confidence in what remained. - -The most important migration tool was a clear decision log. It made trade-offs visible and prevented the team from reopening settled questions.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '16 days', CURRENT_TIMESTAMP - INTERVAL '10 days' -), -( - 'making-search-feel-natural', - 'Making Search Feel Natural', - 'Search works best when it understands the words people use, not only the labels in a database.', - $$People search with questions, fragments, and remembered phrases. They rarely use the exact vocabulary that an internal system uses. - -Useful search begins with good titles and summaries, then adds ranking that rewards relevance without hiding recent work. Empty results should offer a next step, and near matches should be understandable rather than mysterious. - -Search is a conversation with the content library. Every result teaches users what the system considers important.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '15 days', CURRENT_TIMESTAMP - INTERVAL '9 days' -), -( - 'a-field-guide-to-content-reviews', - 'A Field Guide to Content Reviews', - 'A concise review checklist for accuracy, usefulness, voice, and technical readiness.', - $$A strong review is more than proofreading. - -First confirm that the piece answers a real reader question. Then verify names, dates, links, examples, and claims. Check that the heading structure is logical and that the summary makes sense outside the article. Finally, read it once as a person who knows nothing about the project. - -Reviewers should improve the work while protecting the author''s intent. Specific suggestions are more helpful than broad requests to make something better.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '14 days', CURRENT_TIMESTAMP - INTERVAL '8 days' -), -( - 'reliability-behind-the-scenes', - 'Reliability Behind the Scenes', - 'The habits and safeguards that help a small team operate dependable services.', - $$Reliability is built from ordinary habits practiced consistently. - -We keep operational changes small, make failures visible, and write down the recovery path before an incident happens. Health checks tell us whether a service is alive; useful logs help us understand whether it is doing the right work. - -The goal is not to eliminate every failure. It is to make failures understandable, contained, and recoverable.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '13 days', CURRENT_TIMESTAMP - INTERVAL '7 days' -), -( - 'the-anatomy-of-a-good-release-note', - 'The Anatomy of a Good Release Note', - 'Release notes should help readers understand what changed and why it matters to them.', - $$A good release note answers three questions quickly: what changed, who benefits, and what should the reader do now? - -We avoid internal ticket numbers and implementation language unless they clarify the result. A short example is often more useful than a list of changed files. When a change requires action, the action should be explicit and easy to find. - -Release notes are part of the product''s memory. Written well, they help current users and future teammates understand how the experience evolved.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '12 days', CURRENT_TIMESTAMP - INTERVAL '6 days' -), -( - 'working-with-feedback', - 'Working with Feedback', - 'A practical approach to turning scattered comments into decisions and improvements.', - $$Feedback is raw material, not a verdict. - -We group comments by the problem they describe, look for repeated evidence, and separate requests from the underlying need. Some feedback should lead to an immediate fix; some should become a research question; some should be acknowledged and intentionally deferred. - -The most useful response to feedback is a visible decision. People do not need every request to be accepted, but they do need to know that it was understood.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '11 days', CURRENT_TIMESTAMP - INTERVAL '5 days' -), -( - 'the-value-of-a-calm-admin-interface', - 'The Value of a Calm Admin Interface', - 'Administrative tools should reduce cognitive load so people can focus on making good decisions.', - $$An admin interface is often used under time pressure, which makes calm design especially important. - -Clear status labels, predictable controls, and safe defaults help editors move quickly without guessing. Destructive actions need friction, while routine publishing actions should feel direct and reversible. - -Good administration is invisible when it works. The interface gives people confidence without demanding their attention.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '10 days', CURRENT_TIMESTAMP - INTERVAL '4 days' -), -( - 'when-to-use-a-draft', - 'When to Use a Draft', - 'Drafts are a tool for thinking in public without publishing unfinished decisions.', - $$A draft is useful whenever the content or the decision still needs context. - -Use a draft to collect research, test an outline, ask for review, or preserve an idea that is not ready for an audience. A draft should still have a clear next step; otherwise it becomes a storage drawer. - -The best draft is easy for another person to pick up. Give it a useful title, explain what is unresolved, and note what kind of feedback would help.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '9 days', CURRENT_TIMESTAMP - INTERVAL '3 days' -), -( - 'our-approach-to-technical-debt', - 'Our Approach to Technical Debt', - 'Technical debt is easier to manage when it is connected to a user impact or an operational risk.', - $$Not every shortcut needs immediate repayment. The important question is whether the shortcut is making future work slower, riskier, or harder to understand. - -We record debt near the code or workflow it affects, describe the cost in concrete terms, and revisit it when related work is already planned. This keeps maintenance connected to product decisions rather than turning it into an abstract list. - -Small, regular payments are usually healthier than a dramatic cleanup project.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '8 days', CURRENT_TIMESTAMP - INTERVAL '2 days' -), -( - 'a-better-way-to-plan-content', - 'A Better Way to Plan Content', - 'Planning becomes easier when every proposed story has a reader, a purpose, and a natural next step.', - $$Content planning is not a contest to produce the most ideas. - -For each idea, write down who it helps, what question it answers, and what the reader can do afterward. This makes promising ideas easier to prioritize and exposes ideas that are interesting but not yet useful. - -The strongest plans leave room for discovery. A clear purpose is more valuable than a rigid publishing schedule.$$, - 'review', FALSE, CURRENT_TIMESTAMP - INTERVAL '4 days', CURRENT_TIMESTAMP - INTERVAL '1 day' -), -( - 'meet-the-editorial-team', - 'Meet the Editorial Team', - 'A behind-the-scenes look at the people who shape the CMS journal.', - $$The editorial team brings together product, design, engineering, and customer perspectives. - -That mix helps us ask better questions. Writers bring clarity, subject experts bring depth, and reviewers make sure the result is accurate and useful. The team is intentionally small so that conversations stay close to the work. - -In the coming weeks we will share more of the practices that help this group collaborate.$$, - 'draft', FALSE, CURRENT_TIMESTAMP - INTERVAL '3 days', CURRENT_TIMESTAMP - INTERVAL '12 hours' -), -( - 'what-we-learned-from-our-first-workshop', - 'What We Learned from Our First Workshop', - 'A reflection on the exercises that helped a mixed team agree on the most important user problems.', - $$Our first workshop was designed to create alignment without pretending that every question had an immediate answer. - -The most productive exercise was mapping the moments where users hesitate. Those moments gave the team a shared language for discussing confusing workflows and showed where a small improvement could have an outsized effect. - -The next step is to turn those observations into experiments that can be tested with real users.$$, - 'draft', FALSE, CURRENT_TIMESTAMP - INTERVAL '2 days', CURRENT_TIMESTAMP - INTERVAL '8 hours' -), -( - 'a-small-experiment-in-onboarding', - 'A Small Experiment in Onboarding', - 'We are testing a shorter first-run experience focused on one successful outcome.', - $$This is an early experiment, not a final design. - -The current version asks new users to complete one meaningful task before introducing secondary features. We expect this to make the first session more focused and give us a clearer signal about where people need help. - -We will compare completion rates and qualitative feedback before deciding whether to keep the change.$$, - 'review', FALSE, CURRENT_TIMESTAMP - INTERVAL '1 day', CURRENT_TIMESTAMP - INTERVAL '4 hours' -), -( - 'questions-we-are-exploring', - 'Questions We Are Exploring', - 'A living list of questions that will guide upcoming product and editorial work.', - $$We are exploring how teams decide which content deserves an update, how readers move from one useful story to the next, and how editors can collaborate without losing ownership. - -These questions are intentionally open. They will become more specific as we talk to users, observe workflows, and test small improvements. - -If your team has a different perspective, we would like to hear what you have learned.$$, - 'draft', FALSE, CURRENT_TIMESTAMP - INTERVAL '18 hours', CURRENT_TIMESTAMP - INTERVAL '2 hours' -), -( - 'content-modeling-principles', - 'Content Modeling Principles', - 'The principles we use to keep content structured, portable, and easy to evolve.', - $$A content model should reflect the meaning of content before it reflects a particular screen. - -We prefer explicit fields over hidden conventions, stable identifiers over presentation-dependent names, and validation that explains what is wrong. A model should support today''s workflows while leaving room for tomorrow''s channels. - -The best model is not the most abstract one. It is the one that helps people create and maintain useful content with confidence.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '7 days', CURRENT_TIMESTAMP - INTERVAL '1 day' -), -( - 'why-plain-language-wins', - 'Why Plain Language Wins', - 'Clear writing helps people make decisions faster and makes products feel more trustworthy.', - $$Plain language is not about removing nuance. It is about putting the nuance where readers can use it. - -Use familiar words, prefer active sentences, and explain specialized terms when they matter. Short paragraphs make ideas easier to navigate, while concrete examples help readers connect advice to their own work. - -When writing is clear, readers spend their energy on the decision instead of decoding the sentence.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '6 days', CURRENT_TIMESTAMP - INTERVAL '20 hours' -), -( - 'a-note-on-data-retention', - 'A Note on Data Retention', - 'How we think about keeping only the data that supports a clear product or operational purpose.', - $$Data should have a reason to exist and a responsible owner. - -We review retention from the perspective of usefulness, privacy, and operational cost. When data no longer serves a purpose, deleting it is often safer than preserving it just in case. - -Good retention practices are part of good product design because they make expectations clearer for everyone involved.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '5 days', CURRENT_TIMESTAMP - INTERVAL '16 hours' -), -( - 'the-next-quarter', - 'Looking Ahead to the Next Quarter', - 'The themes that will shape our next set of product, platform, and editorial improvements.', - $$The next quarter is about making the core experience more dependable and more useful. - -We will focus on faster editorial workflows, clearer content discovery, stronger operational feedback, and a more consistent foundation for future features. We will measure progress by the quality of completed work, not by the number of initiatives started. - -There is a lot to do, so focus will matter as much as ambition.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '4 days', CURRENT_TIMESTAMP - INTERVAL '8 hours' -), -( - 'community-notes-june', - 'Community Notes: June', - 'A monthly collection of questions, ideas, and observations shared by the CMS community.', - $$This month the community asked for better preview tools, clearer publishing status, and more ways to reuse content across channels. - -Several teams also shared small workflow improvements that they built locally. Those examples remind us that the best ideas often begin as a practical response to a real constraint. - -We are collecting these notes to make useful patterns easier to find and discuss.$$, - 'published', TRUE, CURRENT_TIMESTAMP - INTERVAL '3 days', CURRENT_TIMESTAMP - INTERVAL '6 hours' -), -( - 'release-0-3-preview', - 'Release 0.3 Preview', - 'A preview of the next CMS iteration, including improved content editing and migration tooling.', - $$The next release will make content editing more approachable and the local development workflow more predictable. - -Planned improvements include clearer editor permissions, stronger migration checks, better empty states, and a more useful content preview. These changes are still being tested and may change before release. - -We will publish final notes when the release is ready for general use.$$, - 'review', FALSE, CURRENT_TIMESTAMP - INTERVAL '12 hours', CURRENT_TIMESTAMP - INTERVAL '1 hour' -) -ON CONFLICT (slug) DO UPDATE SET - title = EXCLUDED.title, - summary = EXCLUDED.summary, - body = EXCLUDED.body, - status = EXCLUDED.status, - published = EXCLUDED.published, - updated_at = EXCLUDED.updated_at; - -UPDATE content SET category_id = categories.id -FROM categories -WHERE categories.slug = CASE - WHEN content.slug IN ('designing-for-clarity', 'accessibility-is-a-quality-practice', 'the-value-of-a-calm-admin-interface') THEN 'design' - WHEN content.slug IN ('the-case-for-small-releases', 'measuring-what-matters', 'making-search-feel-natural', 'a-small-experiment-in-onboarding', 'the-next-quarter') THEN 'product' - WHEN content.slug IN ('a-practical-guide-to-editorial-workflows', 'building-a-better-content-calendar', 'how-we-write-useful-documentation', 'a-field-guide-to-content-reviews', 'when-to-use-a-draft', 'a-better-way-to-plan-content', 'why-plain-language-wins') THEN 'editorial' - WHEN content.slug IN ('meet-the-editorial-team', 'working-with-feedback', 'community-notes-june', 'what-we-learned-from-our-first-workshop', 'questions-we-are-exploring') THEN 'community' - ELSE 'engineering' -END; - -INSERT INTO badges (name) VALUES - ('go'), ('postgresql'), ('docker'), ('react'), ('typescript'), - ('java'), ('spring-boot'), ('maven'), ('accessibility'), - ('content-strategy'), ('product-management'), ('documentation'), - ('reliability'), ('search'), ('community') -ON CONFLICT (name) DO NOTHING; - -INSERT INTO content_badges (content_id, badge_id) -SELECT c.id, b.id -FROM (VALUES - ('welcome-to-the-cms', 'content-strategy'), - ('welcome-to-the-cms', 'community'), - ('designing-for-clarity', 'accessibility'), - ('designing-for-clarity', 'content-strategy'), - ('a-practical-guide-to-editorial-workflows', 'content-strategy'), - ('building-a-better-content-calendar', 'content-strategy'), - ('the-case-for-small-releases', 'product-management'), - ('how-we-write-useful-documentation', 'documentation'), - ('accessibility-is-a-quality-practice', 'accessibility'), - ('measuring-what-matters', 'product-management'), - ('notes-from-a-content-migration', 'postgresql'), - ('notes-from-a-content-migration', 'docker'), - ('making-search-feel-natural', 'search'), - ('a-field-guide-to-content-reviews', 'documentation'), - ('reliability-behind-the-scenes', 'go'), - ('reliability-behind-the-scenes', 'docker'), - ('the-anatomy-of-a-good-release-note', 'documentation'), - ('working-with-feedback', 'community'), - ('the-value-of-a-calm-admin-interface', 'design'), - ('when-to-use-a-draft', 'content-strategy'), - ('our-approach-to-technical-debt', 'go'), - ('our-approach-to-technical-debt', 'postgresql'), - ('a-better-way-to-plan-content', 'content-strategy'), - ('meet-the-editorial-team', 'community'), - ('what-we-learned-from-our-first-workshop', 'community'), - ('a-small-experiment-in-onboarding', 'react'), - ('a-small-experiment-in-onboarding', 'typescript'), - ('questions-we-are-exploring', 'product-management'), - ('content-modeling-principles', 'postgresql'), - ('content-modeling-principles', 'content-strategy'), - ('why-plain-language-wins', 'documentation'), - ('a-note-on-data-retention', 'postgresql'), - ('the-next-quarter', 'product-management'), - ('community-notes-june', 'community'), - ('release-0-3-preview', 'react'), - ('release-0-3-preview', 'go') -) AS seed(slug, badge) -JOIN content c ON c.slug = seed.slug -JOIN badges b ON b.name = seed.badge -ON CONFLICT DO NOTHING; - --- Re-theme the repeatable examples around Linux, shell tooling, Go, Java, and DevOps. -INSERT INTO badges (name) VALUES - ('linux'), ('bash'), ('shell'), ('terminal'), ('systemd'), ('grep'), - ('awk'), ('sed'), ('ssh'), ('git'), ('journalctl'), ('go'), ('java'), ('spring-boot'), - ('maven'), ('postgresql'), ('docker'), ('kubernetes'), ('devops') -ON CONFLICT (name) DO NOTHING; - -UPDATE content AS c -SET title = seed.title, summary = seed.summary, body = seed.body -FROM (VALUES - ('welcome-to-the-cms', 'Welcome to Urpi''s backlog', 'A terminal-shaped notebook for Linux, Bash, Go, Java, and useful experiments.', $$Welcome to Urpi''s backlog. - -This is a working notebook for the tools that make a developer''s day better: a clean Linux shell, a small Bash script, a reliable Go service, and a Java application that is easier to operate. - -The best notes are practical. They show the command, explain the why, and leave enough context for future-you to use them again.$$), - ('designing-for-clarity', 'Designing a Calm Terminal Workflow', 'Small conventions that make command-line work easier to read, repeat, and recover.', $$A good terminal workflow is easy to scan at a glance. - -Use clear prompts, predictable directories, short commands, and output that explains what happened. Keep destructive operations explicit and make the safe path the easy path. - -The shell is not only a place to execute commands. It is an interface worth designing.$$), - ('a-practical-guide-to-editorial-workflows', 'A Practical Bash Script Workflow', 'How to write shell scripts that are safe to run, easy to debug, and friendly to the next maintainer.', $$A useful Bash script starts with strict mode, meaningful names, and a clear exit path. - -Use set -euo pipefail when appropriate, quote variables, validate inputs, and print progress around operations that may take time. Prefer small functions over one long pipeline when the script is important enough to maintain. - -Scripts become tools when another person can understand them without reverse engineering the author''s terminal session.$$), - ('building-a-better-content-calendar', 'Building a Personal Linux Command Log', 'A simple way to turn repeated terminal discoveries into searchable notes.', $$Whenever a command solves a problem, write down the context with it. - -Record the operating system, the input, the useful output, and the reason the command worked. A note such as journalctl -u service --since today is much more valuable when it says which service was failing and what the logs revealed. - -Over time, the command log becomes a small, personal operations manual.$$), - ('the-case-for-small-releases', 'The Case for Small CLI Releases', 'Why focused command-line improvements are easier to test, ship, and roll back.', $$A small release is easier to inspect with git diff, test from a clean shell, and undo when it does not behave as expected. - -This is especially useful for developer tools. A narrow change to a flag or output format gives users a clear upgrade path and gives maintainers a focused set of failure modes. - -Small releases keep the feedback loop close to the command that changed.$$), - ('how-we-write-useful-documentation', 'How to Document a Bash Command', 'A command is not documented until someone knows what it changes and how to undo it.', $$Good shell documentation shows a complete example, explains expected output, and calls out permissions or paths that matter. - -Always distinguish a read-only command from one that modifies files or services. Include a dry-run option when possible and show the recovery command beside the change. - -The goal is not more prose. It is a safer next terminal session.$$), - ('accessibility-is-a-quality-practice', 'Readable Output Is a Quality Practice', 'Terminal output should work in bright rooms, small windows, logs, and automated checks.', $$Readable output uses stable labels, useful exit codes, and enough spacing to separate one result from the next. - -Do not rely on color alone. A warning should still be clear when output is redirected to a file or viewed through SSH. Good command-line output helps both humans and scripts. - -Accessibility is another word for making the right information available in the conditions people actually work in.$$), - ('measuring-what-matters', 'Measuring a Service from the Shell', 'A few dependable commands can tell you more than a noisy dashboard.', $$Start with the signals that answer an operational question: is the process running, is the port listening, are requests succeeding, and is the disk filling up? - -Commands such as systemctl status, ss, curl, df, and journalctl are powerful because they connect directly to the machine''s state. - -Measure what helps you choose the next command, not what merely looks impressive.$$), - ('notes-from-a-content-migration', 'Notes from a PostgreSQL Migration', 'Lessons from moving local content data into PostgreSQL with repeatable migrations.', $$A database migration should be boring to run and easy to inspect. - -Keep schema changes in versioned SQL, make seed data idempotent, and verify the result with psql before the application starts depending on it. A migration that works only on one laptop is not finished. - -The terminal is an excellent place to make database state visible.$$), - ('making-search-feel-natural', 'Searching Code with grep, rg, and git', 'A practical tour of fast text searches for a busy Linux repository.', $$Start broad with rg, narrow by file type, and include line numbers when the result will become a follow-up task. - -git grep is useful when you want the tracked view of a repository. grep -R remains available almost everywhere, which makes it a dependable fallback on minimal systems. - -The best search command shortens the distance between a question and the file that answers it.$$), - ('a-field-guide-to-content-reviews', 'A Field Guide to Shell Script Reviews', 'A compact checklist for reviewing Bash before it reaches production.', $$Check quoting, glob behavior, unset variables, exit codes, temporary files, permissions, and cleanup paths. - -Then read the script as a sequence of commands run by a new shell on a machine with a different environment. Reviewers should ask what happens when the network is unavailable, a file is missing, or a command returns no rows. - -The best review catches an unsafe assumption before it becomes an incident.$$), - ('reliability-behind-the-scenes', 'Reliability with systemd and journalctl', 'A practical pairing for running and diagnosing Linux services.', $$systemd describes how a service should run; journalctl shows what it actually did. - -Use systemctl status for a quick state check, systemctl cat to inspect the loaded unit, and journalctl -u service --since today to follow the evidence. Keep restart policies intentional and make health checks observable. - -Reliable services leave a useful trail when something goes wrong.$$), - ('the-anatomy-of-a-good-release-note', 'The Anatomy of a Good CLI Release', 'Release notes for developer tools should show the changed command and its effect.', $$A useful CLI release note includes the old behavior, the new command, and one realistic terminal example. - -Mention changed defaults, removed flags, migration steps, and compatibility concerns. Users should be able to decide whether to upgrade without searching through implementation details. - -Good release notes make a tool feel stable even as it evolves.$$), - ('working-with-feedback', 'Working with Terminal Feedback', 'How command output, bug reports, and shell history reveal what a tool should improve.', $$A failed command is feedback with context attached. - -Capture the exact command, environment, exit status, and the smallest useful piece of output. Repeated confusion around the same flag is often a documentation problem; repeated slow commands may be a design problem. - -Treat reports as clues about the workflow, not only as isolated defects.$$), - ('the-value-of-a-calm-admin-interface', 'The Value of a Calm Operations Console', 'A good operations screen should feel like a well-organized terminal session.', $$Operations work needs clear status, safe defaults, and an obvious path back from a mistake. - -Show what is running, what changed, and which command or action will happen next. Destructive operations should make scope visible before they ask for confirmation. - -The calmest interface is the one that helps a tired operator make the right decision.$$), - ('when-to-use-a-draft', 'When to Keep a Shell Note as a Draft', 'Some commands need a little more testing before they become part of the permanent runbook.', $$Keep a command note in draft while paths, permissions, and failure behavior are still uncertain. - -Run it from a clean directory, test the negative path, and write down the rollback before calling it ready. A draft is useful when it preserves the question as well as the current answer.$$), - ('our-approach-to-technical-debt', 'Our Approach to Shell and Build Debt', 'Technical debt in scripts and build files compounds quickly when nobody owns the cleanup.', $$A clever one-liner can become expensive when it is copied into five deployment scripts. - -Prefer named functions, stable interfaces, and explicit dependencies. In Go and Java projects, keep build commands discoverable through Make, Maven, or a documented task runner. - -Pay down debt when you are already working near the command that created it.$$), - ('a-better-way-to-plan-content', 'A Better Way to Plan a Linux Lab', 'Plan experiments around one command, one hypothesis, and one observable result.', $$A useful Linux lab has a question such as “what happens when this unit restarts?” and a small set of commands that can answer it. - -Write the expected result before running the experiment. Save the actual output, explain the difference, and turn the conclusion into a reusable note. - -Focused experiments produce better operational knowledge than a long list of disconnected commands.$$), - ('meet-the-editorial-team', 'Meet the Tools in the Terminal', 'The daily toolkit: Bash for glue, Go for services, Java for platforms, and Linux underneath.', $$Different tools earn their place by solving different problems. - -Bash connects existing commands. Go makes small services and utilities easy to ship. Java and Spring Boot support long-lived applications with strong conventions. Linux gives all of them a dependable home. - -The interesting work happens at the boundaries between those tools.$$), - ('what-we-learned-from-our-first-workshop', 'What We Learned from a Shell Workshop', 'A few exercises that helped developers become more confident at the command line.', $$The most useful workshop exercise was troubleshooting a broken service from symptoms alone. - -Participants used systemctl, journalctl, ss, curl, and grep to form a hypothesis, test it, and explain the fix. The lesson was less about memorizing commands and more about building a reliable investigation loop. - -Confidence grows when every command has a question behind it.$$), - ('a-small-experiment-in-onboarding', 'A Small Experiment with Bash Completion', 'We are testing whether better completion makes unfamiliar commands easier to discover.', $$Completion can turn a blank prompt into a gentle guide. - -The experiment adds examples for common flags, paths, and service names while keeping the underlying command unchanged. We will compare successful first attempts and the number of help-page lookups. - -Good completion should teach without getting in the way.$$), - ('questions-we-are-exploring', 'Questions We Are Exploring', 'Open questions about Linux workflows, build tools, and the boundary between scripts and software.', $$When should a Bash script become a Go command? When does a Maven plugin deserve a dedicated build step? Which operational knowledge belongs in a runbook and which belongs in automation? - -These questions are intentionally open. Experiments in the terminal will give us better answers than abstract rules.$$), - ('content-modeling-principles', 'Content Modeling for Runbooks', 'A runbook needs commands, assumptions, expected output, and recovery steps—not just a paragraph of advice.', $$A useful runbook entry describes the situation, the command to run, the expected evidence, and the safe recovery path. - -Keep environment-specific values visible, separate read-only checks from changes, and include links to the service or migration that the command supports. - -Structured operational notes are easier to search when the next incident arrives.$$), - ('why-plain-language-wins', 'Why Plain Language Wins in Man Pages', 'Clear command descriptions help people move from a prompt to a correct action.', $$A man page should tell readers what a command does before listing every option. - -Use examples that resemble real work, explain dangerous flags near the command that uses them, and avoid hiding the important behavior behind jargon. - -Plain language is a reliability feature for people working under pressure.$$), - ('a-note-on-data-retention', 'A Note on Logs and Data Retention', 'Keep logs long enough to investigate, but not so long that useful evidence disappears in noise.', $$Log retention is an operational decision. - -Choose a period that supports debugging and compliance, rotate files predictably, and make sure disk usage is observable. journalctl and logrotate are only useful when their limits are understood. - -The right amount of history is the amount that helps answer the next incident question.$$), - ('the-next-quarter', 'Looking Ahead from the Terminal', 'The next stretch of work focuses on sharper Linux workflows, dependable Go services, and practical Java notes.', $$The backlog ahead includes systemd troubleshooting, Bash patterns, Go HTTP services, Spring Boot operations, Maven build hygiene, and better PostgreSQL tooling. - -The goal is not to collect technologies. It is to understand the small commands and decisions that make them pleasant to use.$$), - ('community-notes-june', 'Community Notes from the Linux Shell', 'A collection of commands and habits shared by people who spend their days in terminals.', $$This month''s notes include using ssh config aliases, pairing find with xargs carefully, checking ports with ss, and using git worktree for parallel fixes. - -The common thread is respect for the next person at the prompt: make the command visible, explain the edge case, and leave the machine in a known state.$$), - ('release-0-3-preview', 'Release 0.3 Preview: More Terminal, Less Guessing', 'A preview of improvements for Linux-first development workflows.', $$The next release will add clearer command output, safer local migrations, better Go service diagnostics, and more useful notes for Java and Spring Boot projects. - -These changes are still being tested. The target is simple: fewer guesses between opening a terminal and understanding what the application is doing.$$) -) AS seed(slug, title, summary, body) WHERE c.slug = seed.slug; - -UPDATE content SET category_id = categories.id -FROM categories -WHERE categories.slug = CASE - WHEN content.slug IN ('a-practical-guide-to-editorial-workflows', 'building-a-better-content-calendar', 'how-we-write-useful-documentation', 'accessibility-is-a-quality-practice', 'making-search-feel-natural', 'a-field-guide-to-content-reviews', 'when-to-use-a-draft', 'a-better-way-to-plan-content', 'why-plain-language-wins', 'welcome-to-the-cms') THEN 'bash' - WHEN content.slug IN ('the-case-for-small-releases', 'measuring-what-matters', 'reliability-behind-the-scenes', 'our-approach-to-technical-debt', 'meet-the-editorial-team', 'what-we-learned-from-our-first-workshop') THEN 'go' - WHEN content.slug IN ('a-small-experiment-in-onboarding', 'questions-we-are-exploring') THEN 'java' - WHEN content.slug IN ('notes-from-a-content-migration', 'the-anatomy-of-a-good-release-note', 'working-with-feedback', 'the-value-of-a-calm-admin-interface', 'content-modeling-principles', 'a-note-on-data-retention', 'the-next-quarter', 'community-notes-june', 'release-0-3-preview') THEN 'devops' - ELSE 'linux' -END; - -DELETE FROM content_badges; -INSERT INTO content_badges (content_id, badge_id) -SELECT c.id, b.id -FROM (VALUES - ('welcome-to-the-cms', 'linux'), ('welcome-to-the-cms', 'terminal'), ('welcome-to-the-cms', 'bash'), - ('designing-for-clarity', 'terminal'), ('designing-for-clarity', 'shell'), - ('a-practical-guide-to-editorial-workflows', 'bash'), ('a-practical-guide-to-editorial-workflows', 'shell'), - ('building-a-better-content-calendar', 'linux'), ('building-a-better-content-calendar', 'grep'), - ('the-case-for-small-releases', 'go'), ('the-case-for-small-releases', 'git'), - ('how-we-write-useful-documentation', 'bash'), ('how-we-write-useful-documentation', 'terminal'), - ('accessibility-is-a-quality-practice', 'linux'), ('accessibility-is-a-quality-practice', 'shell'), - ('measuring-what-matters', 'linux'), ('measuring-what-matters', 'systemd'), - ('notes-from-a-content-migration', 'postgresql'), ('notes-from-a-content-migration', 'docker'), - ('making-search-feel-natural', 'grep'), ('making-search-feel-natural', 'awk'), - ('a-field-guide-to-content-reviews', 'bash'), ('a-field-guide-to-content-reviews', 'shell'), - ('reliability-behind-the-scenes', 'systemd'), ('reliability-behind-the-scenes', 'linux'), - ('the-anatomy-of-a-good-release-note', 'go'), ('the-anatomy-of-a-good-release-note', 'git'), - ('working-with-feedback', 'terminal'), ('working-with-feedback', 'ssh'), - ('the-value-of-a-calm-admin-interface', 'devops'), ('the-value-of-a-calm-admin-interface', 'linux'), - ('when-to-use-a-draft', 'bash'), ('when-to-use-a-draft', 'git'), - ('our-approach-to-technical-debt', 'go'), ('our-approach-to-technical-debt', 'java'), - ('a-better-way-to-plan-content', 'linux'), ('a-better-way-to-plan-content', 'terminal'), - ('meet-the-editorial-team', 'bash'), ('meet-the-editorial-team', 'go'), ('meet-the-editorial-team', 'java'), - ('what-we-learned-from-our-first-workshop', 'systemd'), ('what-we-learned-from-our-first-workshop', 'journalctl'), - ('a-small-experiment-in-onboarding', 'bash'), ('a-small-experiment-in-onboarding', 'terminal'), - ('questions-we-are-exploring', 'go'), ('questions-we-are-exploring', 'spring-boot'), ('questions-we-are-exploring', 'maven'), - ('content-modeling-principles', 'devops'), ('content-modeling-principles', 'postgresql'), - ('why-plain-language-wins', 'linux'), ('why-plain-language-wins', 'terminal'), - ('a-note-on-data-retention', 'systemd'), ('a-note-on-data-retention', 'devops'), - ('the-next-quarter', 'linux'), ('the-next-quarter', 'go'), ('the-next-quarter', 'java'), - ('community-notes-june', 'ssh'), ('community-notes-june', 'git'), ('community-notes-june', 'shell'), - ('release-0-3-preview', 'go'), ('release-0-3-preview', 'spring-boot'), ('release-0-3-preview', 'maven') -) AS seed(slug, badge) -JOIN content c ON c.slug = seed.slug -JOIN badges b ON b.name = seed.badge; diff --git a/ui/app/assets/background.png b/ui/app/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..30b5963fac68451e01ec9950eec786c74e039a00 GIT binary patch literal 259847 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

CVcazM|nVc1^{*#L|S*&h{7XY3;?S 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

OVX58=#S^r)Tb1pP#{=>u`?m4hv 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ð6p&$^yl@&*G~m9t$w= zRLf^xp=+{Pi_Iq&>(I71$Kw0a-_P!T?!o?=nh4B08aAqQtRuf~miu|xo~Sl@bSd6t z^o;#wJ$f`AMR96f|FRRY@^Yz>3YD-Q#%p=sxL?ZAR9q9I>jDH|hdvRVC z_nSR)aj6@a#`QzV)k`p)EXEbcxd7G+1-y^pGq0TEL8io%&s*rAO~r>+F0loL#1a_ zp5e#`R*BV{2AO@L3%IbcPxQ;QrC9~`s-7?Vn-WbhDZhG!zj@RdJ}G%YX|B)dPr1!} zd#ccMz!JTkQ&Q@Ftk-q=Y0S6V4l&QgLGYuI(uLKP1ko-M#_iFb}4Y0mOJYUQIXi4KWS@jqd5?7aEdq7m<+S=$F zgLAIPNXvsz)o5D<42@L0LLwd0-`su)XHwdyxS(^ny@U^AU2&mgn1V?`FfNNJF1>_G zTlj#Ih0Y6h`=jg3Op9!ff5p%UY=|G@I>#P*w$llHg`h$)fX-j2%Acy!Mk*}PU9S-bl@Z1b6q2BLMM zA7)(fGb21Jh(`~cS+@%>>O&Sxp}cyWE7{DLRt@(=La=GY3}XAu^#<-`nT=u6)|T6( zree+xbm2==!%r&lkQadL)So^_lwL3FdD4qIUFULz*PP#`PkF4{2V5i8?JE!Ir;!{R z>#n}=tTb%uGfNbo!!z2lYLdBq;MGvAXCCZI?4XN+Dhh0mtCt6%;BTU`$m{dY6WZ+mJ? zH3{Tz4QlJV=izex{QoMk>^kl!o5Z?3D=9tYRoJ8%R9EYQAukF(##9Sa5To;KaTY7y zle#L*RmUJu!D~vOng#eOkNo9E;D~$DnJIXh9cggVAoqKcwY)BiZNDbg z*WxNGbWn`>W=QPVW29Y(nWpHC@ETk$PMCIb|FMc^YEEV(cJWi+_W_<(YgD-9Ysivc zondF}SK_fl^)#89l=t_pL} zBo&;=;9nAdes!`QatqF`(bN8#xh+?1c2GF0MO!Ip8?K*V3Po=Y{hi16=IWws?wOag zrCml~O%TCLyDi3rAj`D&Qv=xX&I$J2cP8XcNYC2$)&zO?*&veg>mAgX%$`N`*1k26 zxDR75R2jx>`e00SC$a=qQfJOwiT73T@s4)S??iWPscr!K_j{Rb<39!>uD(j({>hPQ z;C}J7Frh0JLC5XgK~u$rpvDswjknrUqlC^J9rL7}93K6KJ^QRb-4hN!9- zGQm)5x@$k#)XIN8ZE~n)_M4G{VD2=0y=-*ioY2jj$UPiT%sL}1GZRwnYz=Ofjp410 z$mT|00J%jkpb}K=eevQYt|n}~(R>-(Czh0?jt@H>)8roUoX0qweAAfDduJvEeJ^za zsPb@WDPAWScsKINeN-q$?qGFaO!#)_ zGrb!;nB3=4$OKR%vPmG!U2`Oe=gWChgP6;C+j+!#uCd(EX6;DX?kUKuPYXqqkSuz% zAph+6tbU6gI}?)1i*~#J>vnr9Re_l*CwfS>L|w}<1!@AbfyeNQ9Yo6ziZAL;F**Qx zrOkl5)dV$fW&*PsZ9Jb@h#N^LXz~7BDOerzyxF1uL(z|g0}Mxs3vpN98#;xLji<4F zH0E7IYo%|Y)H!_VWm6OirZ%fD;;T>#EH`cyh}%pe-{=2qL_O*>wGCT!Q;5<7ZBe1` z?l;@rSq>BT*zfs>rF8OKB5j+m85disi>5hpv?<3a)G{j?G3kQYg5!myh?!-NShN6i z1%r|;4?t#?b?@bs_nSVf7+B-!KTR|j8~B>`C-9vh@P$@oz`)*lj}7#ng**WF^Z zgbqDtjPAlFQ5L0K$VRUUIgNsE&{U{tC3N# zn?pHFCJ&~x1@Fudt)TSt=@0j#-5YWdG+N<)zvo@L*JWlXJnLZ%c#4zz`K;NHpYi@O z)!^r4eucuI#RQE?@jCtfvqk{%dNTT*H^30%X}eFaie(M*hnJ0a4SagTCUvD)VYt)X z2D3n&%!P+evcmiHdTG3RJ(ff=9M*)x}t({q-($MHb?tCWS`ujy>| z+5VnMe$y$F?~7`6CU|?7{-#BN0G|Gunu4L32(2NcTA}HC_N1_er99aPtGa0@iodpS zh#oOod6YdLKw9FD(FDf0vh@bhxuDE?4JRf1LYpGy_{v-AW{PK$mhk>XC;SfXqNgVF z`pWVLBr?5c8d9IE^^;Y_!gN*(`+mPkjoT(?tfdN!Q28>+3UgfYA|uz+p8`k7?22!~ z9jhf8Wehrt)Qn+xKZ(jbC6nI63cG9?C6PpZ-_fAnW4Atc!Lm(r#Y*p<1T5n}#Ba-#9|XZCy%pfV%h|1&ML;zPCGHEZYmfm1 zlWsl`9WlGIs0C&dmxj`~G#_^`wWqQs-Z840R8_KtAJ(z6vlE%)H{$nAiWQuZvR zlO_iZU;oc2exxU&!xA@z(CoHB&E|N_?@>&Z{so>fP!U8o<StVEx z^e~Sk3?1GKkL$SmZ2(NA5iqH|U|tHTkn^qn$uV8D%1^i?t2>^{^LL*SxUE#Wq^#?x zrO6epde$s3Q%GRcIDjRyHiuZyqX5Z-$DI^+TfH=2ODm}3Sdq{5c>4Cby-LAqPHf2M}_Veqx6VfT5f`x zYE^GP6JM7)4j#y}iUi-vI4^q3*D9;&9FzV#>YyHIb!YAEOw?KGiWQShg2l(9Lh;HD z+2w0J_ZXIn%`Za^={TFi@lLHL7DwF zttRgs@kl48O~H1E#MeqR2gv{Gl@{3*YG)TNsowt05Q{NtUcOxA( zSdqo^GFVwYvh3NwsJe9IH*rskX8#QTDRLStgIB(L(cXl8CSUM)`O5YqJVSI|-;0G! zdJx_=;Z~!XO$$7U!6D2x_4=Iq@+KCtQjqD++pi zpn>V+X!>rH$PebuLKc(&eG-lny;`E%Dlb(Kc{iGQ_OqsfFw$+fEd5U^S4ra(;VC|o z)-$%dzByWagO;EJc1_I{7eowDtuMlvl|(-(Cnn64p0HwmsLTFfvY##)M5rp0Ng{af zHJ310TA`%z4`F+AKRusDMGys|rEbYhx)3wGx$ZU#oURMdalpN1+nt`G97@D#*7z*& zzP376=uxl^Ix#mBf=JDd1~B3Mtz;lOxrS_~2In>|0Zdmbl(JD^4cnl_ZwtT^Zo6?NGZlEt2+=*-8BobC%K}My|>q0ct?^3yXAXyH4 zI=e)@=5;9I`)D=W()F?g>2l`90|$LIN7=TrVaekY2zN?(3+U{x?`txKTCoWWt zLv>jvu)h4bib991A^0Wn5*V#?HUUbPqCS50skeJZe_x04oA0#aJFW-#)6+Ys12Wg& zJb3vb#&&COt^bZSNA~V7`CMJ!x{9J?f8@k89$+`7xv4b!EE;OflhjLGlU=5VW2jM# z{R+LR)fR~L*&J_A@qT8g_|=k47F1w}dEWJQhoL!S)r%9hn{B5~7-%hI(q%3Gsg9F_R7|$r8q4Nj_)uI-)f&@SEK5h3693Kh zS}C%SvK{7w(%Qv;Aw4!b^!mlx zStqR!qGw`kOnQ^7ncI6-fs3z zLwiDeZ&j><_z1Llc|SzW$U*?q&bZ%K1L)-EVV%>dIAsV+3UW;z2l(FU#w zTR)C5xqK*a(CP!%n5vUljZ6kL2}QeiTyh4l~58c$~+-{-nrcYUWeE{~mBDc%5EOjCC42u$6vPa^G&ArJiv+Pm)}WHE_-&lCUPIaj4RFD;NaJCxV>XU7o<6VkB@_z=8D!Ug2+oQ?jaD>T9upBF-$$==&Tr@o>@m;-_|p8 zzL;9&n7gUFRq~$1RNaETJorAo^zzyT@aSMwRI#`zLBk`?3{CYtv3o_|pN*wj&-It?v;cZJGJfj8giOZR(m7%qNCl#kLsn*xtkeAoH z0~4v>+Z1cC64TlbCEm68UGvD!ehs_Z4NHLsXO+0LmFfmsEY#p@G}&MSa5F96PIZ8W zew4Vro-{~^wZRTqM5i{%7~x7kMi#^F{5rZn*M&3I2v4XzH&4XG4&gRytEUTV zMgg3ri)zfvPbf{+w59HJ{U7dN#rHerJS%RmS+_W%TjgYx%!~W7$WN;7EHDsTOV!ls9uj;htviLLCruyw`CD9(-sGn1Is4npb4Fmt zLv^UhI+QEG1d2OwK9}g->_M#NXT@t(uA&umF7rsn3zv4kv2CwuW6zFp5k$`jMQGf! zf@27ihfO}T_NK96$EOAPpfqmci?aodD7$Zk*WoS_K2`H!m$@XIdb}p#?~9tD0M&KU1#CI^J&H{I{>UB8Ie=H~HF= z!133I4rvQGsL_wcpRH3pgbUlmFQ0g5EJ^(foT~@{@C7i;|GVFRs=lMK{|**K7_n^O z<>dOU?ASJOaLY2T<=Z@Qs2Vt16B@GpEhKTmfG5CpzacL;CTPPhtUw8)F-+k79_PxA zKUqLMPEld@w$dNhb28Bm^C22I#RAv*&{Gv-_(JoywL+XgGLV+ZRXGm8Xpz;v9M7IN zUSc?5i5%h(kzd(W7(DqFPz1IdJ^L!YSa3h?`{O;+PItMv1>IsT>w#$LXI+of2{*1j zprm2-XPD%zv?`HPnss_8zMX&#V`{&q40^9Wsse!pyO8H3xHaC*nx`ZQ#nil2(kgI` zo|nS1<<%mZnuEmCIMDJ>UfbCJ$b);1c)of0WHq1}dTTw_c~BWy4xy<9;Ojgb{z{cr z9jOo}){j3|=C?Zm^IuD$nLI||Y=z>VX6$T>C~`XP@_jJFc05XdFw)K_msku<6wu4d z;6zLsT%#JydZN^d7luz}`du%UR9gK4hmghjHB^S#M3CI5qZu7#Z*?WY<;xIa%TGXr z81a0s?vrC%4X>g_p>L`qk-S%?{>^|xfmb0Xd3gX;pTe1)#^YW6oS8%%WdZ6RHl|K| zqXkHGYV{4?StlAc|nHmQHa4oNcH{PbKusfKhU>BA2)zX^`xo1w(ft6bD^7q^_ z?*!~-a`RO-4S%eX61aQE(WxU02Uhzh6c#5|B2!Ae$j;@LpXakDNleZc#q+m_N^8<$aGL zt1Bf?kAV$y!3uA_%*F;6$_nq5{NNf{8FuB_JvFr$@oYt?bH#Q)l*cqbcpK9s?6|?Y zI$7kky=dG;A$NuQJ6%Qm^xc;{m;1-^ylfFNF8JHU%%NLdp4X#e_fTdlfyEY)tlz}Z z#w~)1wtl*j)~3j59%h|Cq($msQfb<5{~iweIg>rE5~53c4L)~{qSK~6S#3TJ%%W^= za11;FI%Lv#O3`jYJ#RjL=U0&U*v44Ug{<*8n?y5vdt2Ij2${cK;o*#|;=yjrB_zj5 z(^9yx8s1n~STU|JpP8K2kKRiV}E89Ox-S z8%ti@_?OZ&KEm z+vd(thmvzZlW;%w){fechWRY0)fTQ~I3})5~J5GgnTjsmb0;k;)3s-)Pg)SVp$l zbOi6hw#Y09tc=#0^FCI08Y3135QvxDETa&v2K5LqZN^^&3p%&E6WW9+wMID>X;e+p zul%S4zX~#ob^Q67ZBBvo!zq6P^qzGsqn3G>9GbFh!8<*gCCmP40Ed0yB1ZGG&c{|* zdT?L0xEl1GAVRbM4`v%@?w0aq&$#jsv0I9dv)Hltk^2u+o!)5IzN==D)4z4V?PJhi zrbDZNtCXKIhSDUY)FW7BU-|dRhPq6-iUD5UGnOHZR9}}T=LCm-qR4k#czxl+rSGIq zt#lv3(CWz_GE-m@F60jw*X|$u8^)@&kM-9RJKoNn7VctsIW~`tz6UEaR6AU1-!!{7 zh>;OL(5P-JAX4iVxNjzrzlbG@v-p~0)A*mspbHVnZG555he2f#x-T2qh}m4$#se6q zdQ0x0w}QJ;#aHx7E|7LFEfDH?m+E2`vFxNRX8AGv*< z2{k(bq$OeRTeBW=5^ebQ2`BXuo_ zo^>wL!~EPp%0VkB&DaKyOI?R)@8PnDnFNPv*)quE^g z;B{;%7hQ`NSy5^oM ziWwDVl@|Ph0|;k75Axj=Mwv2E-!m{=aGAp(hqj`wy{c9xd}(xIIBLpL@E{JZpm(#} zRudwTQ^vbhjG7NQNx(y9bNmkYb=MB(An9Dt!&8YA_ zhPWnR&1;JZT<)m~pkj+aKRK-+B~zN-2_iqVS{(o4Io@2$c!R1j1!$NRz@4*uj^ZkxM$q%QX!~KbZn+y^o?a{`ANJ z&(sjIVrd6a5FT!oojhl}*@Q@*UaBx73{Le-lX{cY6zGRdU(n#9k%wk6bV(hHp!J&+ zYlp7GtuS_KxN2J3H8}q%ZCD46*}3mRHC(81JYf9~Nxc$(tfon9 zShqg5S4EzVc_|-g*&UETZ-=VRcgl)z>CMm2+i>3 znwhMqS9sgyXm!iB6c=L3phFSZ!*wwQV_Zn!^Xih9ucu@_)%;ksmB@F`shh&43F(#m z+n-cYm5`it;KbSxE`Rl>*Rnb&oETq7P<$BoN)itF;p5U3spkTju-8_>#nVw=3xu)< zWpVIlhXuz+PXofjX~`$9G!#hBCm)WL6qacAeyY-zIF4MGc9|$F$6z~U*%F6@X5nW% zAHD~<@9p)EN|(!Vpm*m*znAw!WlNtgu=trtJlp}Kq40xF!cnlc@u>3j*#0iqfVx<~ z3sjDW?;~3NnX3>?rNRSW2+{EO6T2%5WOlyv7TfBr>x}1}Qmf)Q1W8_zwz$BXHLiwn z|AdyZ%B?K3N|W5nY`K4~$v4{$l@Hxs=ui=x4Q#3MbojpcJjDsvExgo5eul`tt-53l zg2LM#1)Iyc72DWp%=GfSFt26;fh71&u3n@35fA8Ws0`@0_o#(^+5wqULta~gOBF?A zo&kyG)q-C}9Y$ zvR#S0asZfwnxWGH34D&4Zo%}Sg_F-JlAja8EIiHg-ukb|s&E+&;o4OGV*+jerp2v$ z*aMrKW>4}c@6-gRa-F>u0lc;Qce7lW?oP|K8XFY;4E!jN7&JB*%KY_wFGu;Hh-4GZ zIwikSbOX_Y{j0q18s~B8h8(pZ>CM8vS@-D`66ZyPut}9A3zCeNt0Cuha4Efn1A*_1 zek66P`EH?9O!-=492{3c1{K9^Ea3jrW5W5JImSPkLTBb@A=BnB6Ecti_1E1%!ierM zq15D(&>qM0g&M2TToM3Ycq88EfaT;#m1)_JA7+a~i=*WaQH8Lon@nd;z-B}1>Ug4O z%!K4iEV(6p@2tuU0|wQ)fomQUI{K_JIoOCr4Bqf8XlMIx|L$3s#~Hn^Rwe+|E}>C% zHX97Zy-noo))oBgYmu5#-f;!xcA&8y$kfpaAU-|T(e&{kR{W<|>D0bD+puNxKGh*= z!r&LC-e&ZSLe?)$KuasSVmmFG|eNsdzQ1mhUq1TutF_Zia;1Sf;xmR8i7fIicoIo<)Vl@xpmbo0^0 zPU0i@(45(gUt#`y&XN&uTG^hEGhM>}3XJlWyBW-8nVt|d{7)F&!a=HRX71X{IywtG zI+h>XIltLuIciq*Wj+k0=`}y43lE8m7mifK&{cj!vpBPcQaCqpO!7YX<3}smJD0hW zADLN01j;GrM8`J#cE)_sLivX$0O)%7@enPcDz&$Y%`bgS7~i@?zJhCtwZWD?rg%y< zaTvDNDNdmT<%@6u6+hQbfM!zjS~KcHYF?z*=dsGMU7NsSCp}e#W@I4whqQZw_h-UP zC%_L;<_zp=#dpP6w9qiyF}C^r8XFo9Dn4TF5}Sju?WT?OSJ(T+^O+V$JV9?4N9#u$o^&V-+A=Q zzT__bK6&dl@}}Tr{^ze#w_ys|x3kh%Sv%JB#p5)#gIP7g=TwA`N;AUD^Z{pg)BSEG zL1W)wqnN+WQ_LAs=`8rMxVh4e)&BRCeOj@X^Qc+N)y4ETP0POH%ibsVGKN_Lnor)@ zy@N+KZ*H0~V$BP&(7)^AGQ zNFT-o>jD9HVc#lKRTylk0&ijU%4ClQ$;R|8uC$AHlo%>waN|K0JwF@)7$4+gjjhtq z#S-X1@vn4pv2_#v>5*63*dP6{erkq>(w&ys5(A~MJhs3pEBMe9UNyCj5` zWTT3*X)M}pd(D+T&Xgvm+#buesm|}WERx@5P~1 zLO75VXAAs_qk9qyn*an7nr^xqwU%R)ZscpUEt`rXZrdp~^)l+?l_MsF^ppT~f~G94 zqfp3XxRb^6MH&@N=a0+9>Ciq;jF^N)j*`W8{BcH;0t^-7A#EiM7ibr3@AaL%%XJA! zrE%;h!DxLF%s|=|D_UZF`l~`*W6H4l{yP5az8G=GQ_r6IW_BFBeb@^O+%b^5j|bk$ zhuFPN+zj^Q-%J}{KuIH~!fz|%hRjTfkCvpBE+|F0`iUPjIi$5?9EMLM8H(imyy8G% z@yr=FOJloL&IB;Si~brlo$y8Qy7gVeT(r}kl)NV(iPpByUYhoBHb(NZ_(H6i?nQ`D zFE3k>UlI;l>#LSaj>1a^JYmnD-8{-|{vASYL&cX<6){;Iwkw6Z6naa`9v8*%_Q$&O zmAgQ!#h}DlsY=a?O6IinS8VLwylw)tb==-lD>wNY`!3P7cBx#1?C-MU*D?l-0j&wU z=bn-rL<<&vGWf!FJgXS`MHN8O3&;#`k)GqWNRir9xe||vTu%h zMkJZ+ys_v?G)30QsXdZ#7qysm`{`NYif(iW2}vK*!>TW@W{K*cNdQOf6dsZ5^gt-j zZp3J*+*~Xroj&d@HK`2)AI=e}ybFI{LDRDk(+8~gsfcyQ+|&9#l=ci|PXaZ2$T87PGw|3z06QI_4s(J!+60gY2;d&Tk3xHN zBsp-^9%<%X&V`t1^@nT7^FsD3veBK2j2N2&3_ODG3gnfRzn40L@9`9Ji48S}uU=l| zeRWz#E>~6W%Yw{A_iJdCd`in%OZX=Ra!9zQ4nlC-%3cFAPx-I@Jbu&?|k$X zT3BEsjfZe*`O;aFp}+|d^1Cg6pI~jvEYhGP54SUxNe!b^*qV)z?h#+zkn`im=W}dJ zGidY#C41!ZTwAKzYwHkC?~G{#cx;BTUm3~ z0?$}Uf*U`z$?EeluC6WVZH06><68zw+z3}$UHxZ3MviW*wU}qk6M=Rbez;%(qh35b zy+ya{MwGh0mDVi^|51Vms7Pj9z~+$c8I5j%*CH1^60p3+WS};27max;Dtgo~$F*;> zl`2aab&?*nrF^EX&#T)mNi>@5r%S7RlqQD6-Ei{H!05-E#;7UEX|Xba(V@2=)a_e& zMm{Fn!Y>-#1JAKI{TNWpo4$f#hR(sD4CmBb>|1H8niFKwgBjzq8WDa#dgCXX(pypF zv0uPHSy`k{+fc#QaUF!T0I9U4D}R&PM~X%hBHKZ+d6B_Lb2IpCiS>bj^mvxW)jyQ} zsU0)eHo(d+hPYQHT=B?&)9eaqsV-&vcbx*y;bSm;Z@aMy{M%k#d3Kk@OOGnnRq9mw z!)-4{H=gnx{F~S|r7ZU}l8r3nB3dx04TD2f0Jo}?qlT&4t*~^M@lVwGA0|6zP73;K zSYsQ-$?}X?jKUK zVl!1jZrBAUmWHuT<4EA;U}~n3=L(p{C$lwvh-Y363bYQ$>-~Fu>_pB2Xz18=B4f@v zP7R%41AyGo<2Ey_t%}iITph1NUOXP8Y=SZR6-xvq8VslDMrXV;Yg>b&o0L1ad$79h z67*P^OF~I4Mt#{TyU#oaH;o9j(%MnKU9*_5{z%-z_Av*Xpr(*`E$XJsPd31 zFL!ve$*J;7>w!kiT)iiAQ?E(%ioo%PXK&{ALTJh~q;(^;mQC}Rf`UDaojPkE^%M7w zW12Z0s-N9-rd(|0*Np z)>*rcmfn$NdYC7Vy?=$6;gf=1A70F4xY+rnfh!4CyT&@z+R-$iIqwE@E*Edxr7|Mg zP$}a*sX7Y*d9PDRks@l`=%0;vea#;%+FBoS$K5jO?9Jn$U{A~PN$7a2^s`$dX;IdQv0<6xT16Xb@Z3qy;H3TJ$5X^0wGaMbXL4RoXx%B6 z6J(ZOGlLD!^9Kuysn2_3<^bRj&!#y6RG*-pW_xzLUau zwfzT+*3(vQ%Z*YlXC}5ew4GVaQX!qMH($v{ayg6{=}Pa!70~pCT?#KHzbsS?NWWWH zv{*YlC%`m)aiHI!kO2I#?_)GbO z7k1kXGI1Wear?%vK%fRB`j2)NDJUAfZFNnz@+PhyiO=iwa8uDNV?7Fjqpw`3!1$c8 z+|g*eA1YVxCryx}V$lSfsKj!0`dN~Z0AU#IJu2hoBBxQt-}ROlRdoN8lLYvT>0Hpq|uM&q8Y9A^irZMsf^%Bp9_ z{>G`vspLm`|$tfdy(XXycod zwRFnAgo(b{ZIsdY#$O9KB?3o=*Dn~>^-IrC4r^E=(ZiF4_I-;h`kPk@L0V zua4`xDDhT(N9TQ!C_x{)#PBKs4E$k*f3Y2vZkfbj=Wp$XKhk+mQx$m?9-UkD7zAz<66j;0lV6^!x?c4wBk z$yHR!aKkDq>|1|adcQ!|Fmz6Dzy3aL6U{9T8IykEMXZOZPa5w&S-pQxhfYZUGyP$a z_+){KF!v+($Y52YQrP7q6bWINk*IhiF_ybiUze{Px|de+4WZcWrEaeR@2SEtw3*eN z`Aw+Xz+ekki9p%7Ch&hmC~SZqCdN^x%1LVElTLPP-MQkPBeR^!|;g zDTTLd(vLXEsi% z7=Z_8<}3`!=c+dGD;-KD4sWHOSWuT-)VVE-^zEP#WJsrPYRZPcr37!WpW!Uy#$o%s z@ekxBcwH2Ynk29GtzLiW$X7D1m`P@Ks5C`)D4Jq!I{S^|PCyMyFmiK0yZ2P2bw~&x zX6OU}zRE)AUP2&~C*}`+Pz=vIE3{wVP)nC*+>f~ME98VKGnD9ub-(+;RkrfH55@3Y zJ-72vy~AC%v&Fy)yg(tR!>&E2yL2n(B42eTswNZku}&FDHy3s*w^i!TsM*fk0G#X)8JYLH^@V6G^KOlhA ze1^q=wir1C?L#_w3-OS%5lNI5nKRqy3cvp)M0#f9lhY zo#M$hWZtshb-Q`CpcT`#0Lqn?G0sZRsV5U2iGDzb3I3vPIfmea?zA`d((Jflm%$>? z8*WG@)eq$ZtluMgI#EB5hg)lXwULL(syc8W!GGV-Bjg76jXpPtN`kb>#U{xth|)=X z!Wi%|Xhdrs;K?nu4a?;N?2iy~%PP+uPKZ99(K|dKFq+=2;~C?=iB^)@P;NC{3MOm* z`3rxATu+iC$=oiE#r-r`MoNavDlgi?&hU97MmM2_#A1IJ*K1<{n%NoB#Thj#%+Nr@JSV-lGs05y}(_4jHTJ`vAE<1|W?}%4DL((Zmnby5NEZIxa zdVm%lg#ya6o|4wkTom4+*9Fl+q+RtIPFbYJlf1R_Oz#aUF5^_zH5! zIYow_&Hn_t*i)~uyol;*g-7+zoqp=6+^OY}qhz9~GvF!mh24sRZ)(d!o zf8cihszUl}ay)Z^I>9D@ARcjgo)?g0us}nbW6bhQ%%2-6kzDu&KciK3{4nT!tY2_k35S!~*R}$~ z4_WxoNp{Ja7A{s(5{HD|0j|_LU|wOGau{-_Sj67U{uuEsYpx-DUgkvyI*!UM zxo%`MI9sC~OLFHB<8|F7vCVvrEcTOJ%^C38HaTo{+r(;@b4Gu~^E8h0#ZmZqz`aIY zbRj!A~G^5TcYXa$M8A-D&MXDF-GC^QV8c&CfD&r+r*1`BE!whcKd5=M|IoO zNyGE%E2?)>|MS5Atu+c?s5hUjd6lR^f4Fe| zP1MxZUxW67HLsF-lyOtA*-%>Q;tCL?Sk(4h)rg@b9!RL=$jI8Z@yTy%BBev*ZS^gl zrl$S>!aKRK=2k{tClg`#Ek0hh6j#nih7lG@A=hKCrISCbO+xH+o>gK++GL4f(6F;QF!@)6~y{9Ssk$Z)uFzyBkhfaJosTPJ1kJSE>E%d^(yXz&P}<_Sny zE@0AY(rGz(VR(!2U4yb+(vZym2Lh1XR+n3psTc#SUkx}Tb)v;LOZaYwSFbK>icxuH}3&x7=Tg*81Wo0@xY8e)%&1yys z57L|-$QzBXr+%13t#Q(RdY^+=#jhyK?zfTi;1NaC{W zV)*lNkv~xwtEM@EKQk#&KhDb+1pQeCyy#d-KR`F+S3=|Q!!s1H0i9V7P`1GHE@e5i zE<*>Ip2+w%P`58{Ok3@O4n3BCrUjsCQk5p(A>!c>jZYLFUdxEW{q4jRh1>ladW=Pi zz#~`QB#QoxctnV)m!iYPmU28{b5nfFDa8of=YYKJOV(w?IuBbMPQZbr{kT+=r`$H* zt`7CPcGz7pJ4xuG=+MN>7a^RE-p4SL)4J;=2Iy{rpHWVHmalp>LD(Aq?uAYT@dbP} z4SLfXZM!B~JBhAXp{19ty~8r`06~lOK=x&UalR8OK^~aeCAMkk^{%jIuN-%gW@8kX zVz6pWqe?W7WSyu)=YkDD-h!tpDgxHh#LaZY+2}3FpVb&?B;p-b)b_YxO!(`q)8r3t z)RqQ*FHvwVV30n43TW#iipusHEp? zMn%V(NQZ;3GP7Swgq*I^01=AQ?LJ*L6@nrr@Ry5Fb@02MIJ3BCmY zNqZ+qR*;d5*$D&TuDaWQ2<>VLgzQrwUCYBF;1||MNqPLH(OMLn8i#E`}`w z?k7xRNquK4pDw4DQ>=ofXgN1B?Q}slv`nc?*h9_vsAJb1k868vHJNqhe{6sD&g}w! z1ulD`9X+H&y#1L0)!WKgF*hsn(eo<&{D;+v(PMPN!$KBsP*1+ z16YKZpXtWG=aU|L!FIy8K%e5>Yi3;d0c4NhJ_7t(FNJk{v_q!7ELEM+;8QfzuQ^tF zl-$_fV^AmZc@4E{X1{iGN4a2>%a<|t2qUI9U5$fAu)`2TEVad!CE?gUt?VT=)_&&6 z)Ta{d4@bg@SdH%w9$^f`-@lSa(9gPWy||TM8t74nd>#GHf|d(3O&Ce+qy=~c^%;e8 z=XqP=aQL|}_FqOxt*57gB^9U+M4aWA|4-)p>Xp$v;@s0)vj`EiKDBi^7F9;sY>WN0 z-KD>(Ryx-lQxP^zbj1X04-;@upP^vKVaWS2?@hufH&=kHsz*M>+yVtqDH4hLKkWDf2(V>VRx*(v-8#cW7LjcPY)f z>CDr@9k=%*+ONaA-u1Rm`JTj=!mMab=)}QigG7dhrMq#dO#7rWU9Zq`1R=$Pp zks;h=<|U8o4Y1rT4y-P9G!RQNJ7_o_VoK2+2P7U!%Gj3s5a+Fv zX3f6)e5TZ1hQ$X}Q=orHapxvvSL?V+>cH|YJpL+JA=7O5s@3gW*o}a_*p>p2Sb*i(w4PMN`dxDb8sc-j*zpxWBHQ1;=jsti*s17Nith04=F{e~0_ z*J{B{86$i{*YUd_KqzaElWUwBs)eM(uPz2uGvUppN%QeuOo&l- z%)LVjoqBIH_1VZ`sB?2o=HPH9J6;*oBMAigGAs4s*{92i|8c20Kjy``r09Ts3 zO!>D1qTa(qy`U5=`4|6QRd=#nYTbgI>Nt}3)ES+9+%B7M-;P%U40lte$(*fyw~pPa z`mujSO%nF^*c@i^Z^AouUp)NbcS9!;?*HyN)V8WHj$Z%w5vJ9qccPTlU8f<=?cw zOkA{uo21WlaC(Z2dGZ_-V9&cut+eBSB#=%fB=-K1fPRVWk^XHy>A>`9xIX6BYkTkt z2Y8&9Gey=ns^pE8U+HRJ4i)GmhBS)SS$tg<-Xhdrx1c<3E^VI9>yn}buM8;yI_>oI zm3dzECGSZ$v2@z`;5**z&laSewFVBE*s#1CK~uiL-d5}>&yI7!JrGvf9H1+*WW1tD zPFs_!FIr`CfKd3RC4J1%L@#nU^%wicY$9A0BhM zTpRB_5x>RxEvpU+S;sn((fYnOd>+hHTTcHA8Of3>72XwRwN*~yx~75oI?M@9cq;{c zX;Yk^!oHfL-yOO=*=Ja{MP}&9!2gjKoYN8uijZf@D7!1rk#Uu`e0(WEaf>GE>`~rj zWHbX+KNk zpnw$cb}Yn?TS)wT#Ng;X?s-6yk*?cP-KIFlJ|yRD;iZe|qJ3%zF{u}+750*8N=~VF zFSaSL9L>D{TDxO0Z!hRvDombU)QmQYTS4uN_6t;8WujE;anE$V2Prp*%UDGUKB)1DNHQ9~!|q5TJa?>=n*ye8}aYNbC0^Q;i|? zerLq*uh(6=^J5dXoD$4NEe$tXMt>$(!qZk4k4+HJYX)8#`uVO=u(8%nF~gJffs>?v zlPdjUq(9Yj)rk7`8!G(0@qtS0vb<->l39VUQRr*kmJM{-!;_klnY*Au#d1kI1lt_=^IBiU)aul4+=9`fwf-1|>GFM| z$pLa>pF<%Cc2LVScKoccsJ4y$SYb-%B7@Ff!p3Fpm(} z{sIc2&-IWRD+K%z_XtFyl)Ac?H8%>KDTNq}?^mD0|1$KIq79Nwzqnc4bq=NSStmaA zE2I>n#xD!kTE<-hY5Ft~3nhHg!f20|4LQy%wqciJG8SMY>A4ll`ntFr$9H(hsM^Bu z-o0dCLs{`I_aDT6bHewMrrT>qvRot~lFH4&y*tX7#lny~#*wecD{Z*V*0-2ClE&B1 zxZ4vQkk~A{h!ge;Ib9U62;j6HZi-Eq&*fw=cx=#FYcS&`V!>%X!?V&$}d1(EfK)m2~|xmS_f10RlHtYr^FRrZF1zwi*ueBOHeVtLBac zR;q9*3l?XD&X&1~{QfjdXZ0m6b?RT$k1tlx9#@C<97%*3C-*H#A# zXAnc}vxVRcY;?PI^AC!3DIChX2gcXn`2T}Q-!9%F_G!v)I{Vi1+-I|iBfo^TyNrA6 z*5Or6AZXj<84WLjU))_NCQO5t#P{SEr)gJ9tAjZ2(#{z8VU@;Mv%PL9-7i zn8zjBWthsmCeqyUL7uGKV7{HLSvYbKM!KH7w!V6enB=!j{h(2FLyST-nn~&BXg}#Om2)b=^knV&eI|V89f^uPa%QYElsamk(x&q4bUzJ_I^P z(ZiiaHcBq%(hH4wI1=vuv>V)v6+f-z zD0Da>C1<$he(m-%w=^0-_AhpVHrIg*B#*(;uzqCUo8*tEX4>^@#g~1rlZk~~jm7j< zNC>6=O_)OFScF(T?KakNfuYK8N%?TO6=zaOX(Thxf~K?F!<;)ivc|`5bBlvP=PjO3 zb=Sz7T@J=xzRH4Sdw-j7R^cUzDzc=Vzt=BIniuKJq|LEesR(+^!h6x>-HKWp?1wqz zb$TAF-~3sp%LzHG#c;m{vY{wS01E3HjrWyy&K>At6#Xai6Ahr>*+?e@m%T7hX`rKx z&cAFbVL_ZrIouGg!JQwRzZ0|9!nrl6io&^N)eMgvvV{W23TmY4jq-uRKW*tHcms_1%?Wm|KzEs=bgV|`vPUF1LHmlkz! zz%%yy3_0>MS}@Imx8ng+Mg22yaTZ(M0=#+bj~C5Ci0fl)CedR1H(?hsb$pqi$R${iZGh1l}W> z3kvL0SFoSPM+8DUwNLDWhPK$!(TI*Z>m_ftmY}B%dUcC3pnfg(B?HTXisst_rEpv# z5Nqcr4%3zozkbu16_1%N{b(_EQ<&^Hn{T8=m5@DtZ>C&^3JTEG8&WeshTMMIk4^#= zHG-Yw{10UI6kue!(=iizDtZ?ol5bmGun$T>9A<8uQu7lZBuiYUxXkOT6%ws)a=5O* z{CRI?GZqKzxWwD$mK^uQA#}hbYo(DWK{paOi{U$m^XP2M_q+ro_rN2uo+Dd*D|v&I z4)0ogxx~V|qN<^y;y!2rLjGjnz&*M0Yg2F(;m*Rv(2Cwez=akB(ssSj!lyg^Z{X|< z-#j-qDaDD~Y|Q;Q?)Ekv2bjecooNba(^o#L`KB>hPj8z}lAD`M6iKPeO-Sf)ezqZ9 zT$To{<7-#Y5)8Akm;CvKYicBhcYE`hz-Uvy3pjK@So^L@8A zVdk>ZSqGs9Y&!Pm#2nFDrib)XW%zV0YVB*LD%}441GqiFOYepWaEv;5{fZC)b$d0u*&s`zOivCR)US!*MdhA z*#6S=hL)8qcYY`@N)){Jz1ZJgD^lY<+*)N!8&2JkSb-BReO+?kAj`Pv@T5%{$Exb0 zneR6xQV81|MN+HH)XT6n8zxM@uRHKH@sA~S>rBjOaCU;AMijVVq}%RTt_1!GF?qNO~8 z;@?Zd>UEoP3xSLcpo^of$~E4BR(7tMv}3NtS&!se2fYAD^Z?NAZZ56p*pJ)=Bl^*g zMdshF8p-(NWF@x%LRcsta7pwFE%3A_n&X=g&zD0ril>?~ zldghHKs9*Wl3FCFDzi^})e9b5HEH3}F|te@cvJOl4CV*! zWksg%$j?N(0HdeMg zg@X6GA4yJ#GkP53tl%iwF~b;ETNB|JGh^+T3X-bE1x%Njtq@k@f9ZVHyNoO1Y$@L; zn6kJ;l)wgkL>=9;M_*9?Mxg~7)eiASuYE>geulnYCxl<;#h`! zu4^-ONenA~>4;?PDvrVvde2#IE*NF-BwnYfHngCn+*}GIyLf-1>X9+_5pg| zSKzd)?yg|J!t2~P**VWA-yKe$QO*V|kW>zoRa#QJ%Br1K#z(GpkL019R-$ z!=}OMPHCU+2U<0Z*@YKwemczr*7o9?`^L=ZPzgRGA3h%$DI?j#9{W|WO4%qE*dwpr z6S0q3ZuPAk=|2qbe|VTuF;UJw_RS2(DF4$a{4q=swLGGVj`^FND8*)R3wY(zPycUw zP2M-OI}{sU@FVf)MeARQ3G{JkFf4oB*iV*-GIP$RsY1F}p<-*&`{e+gyH-a7q_V%X$DbkP z-oHPT#OrEbwJD}UuaS^rfQEBzgzQk9tbz75FE*IK=KEY%}2 zH<1n!7p$3FZrr_VJkh1&^T5kh*GUxcBdlo2f-ipFMaCpFvF@?*PLS@cAzPiB)u}Q| z>-?*buo|#dMF2o<$JQ*s>N~Lc)AH+wxuToDIOXKD_ZNvejyDSZVtYGwoSNp)|FnG8I9va!ZB4V2T0L}DQs;%5- zJH$3zt%i9ot*H%H!IAk-?sDVmJjXC!>=IfeyIc77|M3x>NS*5fUgfh^RIz}L2iH}8 zYkOt-#6^-kP0Eu^Ix#XP*4a?%kmZaud92MvLOzloe~CT!iMfzh*ZREIpNA5U3R)N{ z6%s)op03N)nPDZ9;9hkr^^)pB*~5tc+S{2sf*JOaZ=yDtr3-dIX>n0{Q4Qnu7@3E3M$ z`X^j|IZaX6&sIV=q!ns(rKeosd-T-S?_T32Aj5pOo8$ynOa$W8uDz?Z5nmR*bX$gX zAk0s~t_tz1fWi@#we={C{2whYeNdoJknP(e#iDG6{2zzR&9??`Lur-!az<)_V`GJzFu^CCJuSy=~2F8Pz^y zUQj9VkHXwj$yR13*M?pgwWSMS|}HB z?^3hbwH_Nq>mSMF=?vBi*v232{V+2{)QNwpUX@PKF46k;%6`CYI2mGSNaF&JOu3~a zc%;k>{GMLtntzG^5;A+M((DN3o0rTd~9l4ewrJyz-STMqIPa-|Nk zwBr&0ke&1SvGC{(2k^nAmr>an;7uWENJ(=f9C98=kHkWhw&}_YQDPYQ3Cm9pI!j^S zhp4NPHi3H3qh*d_fWRS5h)s?M@2jxO5P354Jf2(H219nwH>cXxMpC%C)2yE`=Q&{$~P-QArW?uUEw zo?lQk)~H=;?j_G;&tB2!8)ljcL}x0)wBO0!`!TVG7d!DYcwrW-Hws2IU89B_`Mg^4 z+<%Pr!Ne&}Q7t|M?R}4))9e3A#}AK5JltF&k?NpMkXrgB#uvA&&eX}b2*!*q%)fSj z;8T$sd$s5wke#0Lu0JOBzKC!lINCD5nNNg?VWWQh&DA{TM+5u}(>PNVrp9=NG}$2X z_+76|m@cmVfCZJ}2dF~+HzFDEexi`qY-u-h9u6zwAi;0Z{Rx<7pz)_~!w`Gz?(memf&34Eo1OIqGxrq2S2isHQRA&fkNkF<9A>kH5>*$)#f(@i z%sK`Cz&2JNTVvH;uMJGiSYO&QUvqQeLD8Hs+s~Tv^6~-#{)m4mULj__L)Tn!0k_@2 zJ@{=mw;SskA&$KNkd}Y-ki0FrS$KrU64q*|tfp$*15btD?TlY)Y_6On1#W6c)?9T$ z0yU7=N5EB~J6TJ3CmN1C-&mT3zk0Mzv9(MjT`A*7Dj%amdUIJj5SHxu))2URbhjSVjdZBx#b!Dxzy>lEaQZz6Xa72pG%6RR&40`JLrc)5x|M@`gLy z6lJ$?P3R(SON*%NMm>G+<8T~lX)$3c;)R*n;Wa#OzD4YRocsE0d{D{B1AB<5%2;80 zzF-C)Zq7wR4B3b=;dq(J%E^WhUyco5;6<=%=%SU73R;IJq2(ix#=uEiLe(uiEy*yU z!UGEqzM##Vb+69EY1;?l*^3vyi}9X9T}Nhez?=8BuGBVeSIcgYhy4=f8hnI2g@xr3 z?u8MTlA=>Q-0i=Sf8W@vuUC()|GxK^A=Uxae+_vX4%q{{`BXEabKQ6He``FOgagf% zZ|!V8hm7w9z6OJxYboS)v})b)GubCzAU2_q{G&u6qZF+5u;_NnFM2l!zDBSD%X zwx`M%=_Fh*^!H|kPC4ugCUsO@%c22!^!G=bj5HBvkso{Hl4sWE%0dol1$Di~jtr&! zA~RYbT1Cygt^H`poTkTe0aIRymy9`)yo35HErG?eA#Q>(|(IRdG|EGd*V<7dm?{ zjbAk;nzgOU=EB3F^#m~?-rmH&Yr%zu&dM1q8jtUkoXMsZyjfdR zPFCcEkYy4Jcq4E)9V3q}1-?gjwV|_vT+2^g2xV(m|8bpbxU8anTc?;JWihy5I6dXM zW0}qjI1y33fCck7iRQg&v+N~|x8+r$11Y-WGqgxZf=q*@&T$~i+yxtIl)Qf)%x^2F z?2+<-$$Q(fRQoEpK@x7b=KR`;?+&?4M0Jmq=a>fyC+ZcSS5WG^%Uik(pD6`=LOxAx zRDrv(#Vkdpvw5l}R6TlE=R)UIHW;gTPK)QH63AHX)4X!__3^qr22K(0L6j~!$z|c{ zPrgb01d6H*qBF&EV?aUkPKG?;emC|q$$AV5AGG=4djPl_j?|#y`qp@QIK{!XR{$(E zHoI=j{+Xf0tAcU&Y8LCy&?pAga&_-`3Krn)c}?s~3g#YK9|_f*@SgOTgvw}y?1zq< za+|K$Y~I6^&sV{%&_WcYHEmiO)f8mNlBY~0e69Hwhc%Y?cnMkdqNXd*KR6sz}kWLmTVL>5P21$t6;slvp zB1Zn7AO>$hl9c*5umh?KDP=vK%O>L2ZQtAli8B7ic6~4coPfe66Nzf|zFaztMD~VA z=%(ueAFVY&u!(%*2S!%yjW za1iS1dBO6&9#c6cU66J4e)pDX96gV=0+3F;BdWvg;dt$~Cj@ObAxm9U z+-CD+%Ox;LHw9x4&WSGTgpWr7tTJ6LB?^pLh!qUq+|U)VI&TjW3hw5oCav}A zLU{{=zX7JP5E<^AA377I>Ag-<5++|!ZCcc2oy>LWq4$V+E~*;S-*$mhz#6p?Xsqp-@okV3y~-%A}< zi~>>5x1RJPpFmX;F=URxPG4MZDu(T2bgd1~A&tU3zZb@Wy%GlS{&={L@fS_mL21{h zypU0hw>{ZFooXkFJ@NFr(IP&>kEk%`!kSZ{BM;Ku^ivq6g89vxT@ayaL^{)6&hxx3 z^NECskX+j=r^J6ZkivK`BjClYL|9_JiXk3|9_g$G-bdq{AGtbWO`;5tbZ5DYiOGhY z{L(J`dewOY5d@-Y@443ZGgZyDB=}FZcS@&&HDHoX?T^ehchwW3++MJXX;!ixA{Av@ zQf2Z6omZLaE`TA*$arEp+t@N)L15-krtt|(OFj_vU9#Q+Lu22n_CZA%`m}1{=N%{JTcA4NpAt>L0GT|;6GSybkNOs%#EoBkv zTW95sHQ}%)(1s@KiK8UCb7&jv>?f@))%NsusH&YW1j6x=g*IXALiZHAT5u4U1isg5 zQF1GgzhA=r$NIuBBr@k>mgSf*K#GkiCSF}?B;Bezv@3~v$5NR0l^0K^bbTqoBEYe= zj^FtM}JwouuWMudq*KGsCLRIF;XrSHvolD z>E-KGjjo~6Ky&nYN5gMxeJhp5`}wB-^k>YD)f)~@15MWr8^<5O`f=P8rAkV1HokMY z?~6W40OphC825|-<{dV`W$dcZIYW1Rqv(v=HlmWDNcm(Hd0AMToBewX#MlVghzGq% z5L4|8EgJ3?b_+YK*dJlV&$`OExh{Mlk-Qjv*$!xiJ>QUSoU4wEi0-swBC-UHq#h=n z^=AyEftk^j*SMegcePf4{)OVwUSXy3_4sXC)$9XSX!ZazK-DiE?RXlrG~6G)A)|Tb z^vPH>*c(yrfFMZ+*(ah|B0zUVH;U#C9pRoTZc&pu^`PPMd)S{2gSU!)T7;QwS>J+T z@XyV&3r#w9UkPgOzjYTvoU5JXs020}XiQH_S7D_ss7x!j700E?9yH^LcqeO)8J<)` z76LvLScLQ%sTDcSU&p#LaS2+!W$bhq8+{NEnsl|l@WykC&389O2JEtV`VuG4Isf<< z*_J&;N9ruAvIjGxT5v6DH9ntXef8uByy|?DI`(`!bS$yDb398SWjnkiUbR;8v`g3A zN;v1vPrPY57mi}BU1oDIj2Sh8vG7z1QoVUGRFb29^FQVB zA)k?Lvv?YO1{3nUQa!I|#aR63vV{a=1vURx<}FPX!!6WzHy7kRfiTsS7JZa5=1Vq9 z&DV@&QqKb%Uyse#o*qXMu+GQ%RtSJLKRvn$@N+i&PFSMaOE!cm>xbDxZlK@n7-NCj zElS8NpOM9X%!3Cbuj1Q__W&0d;-#1NYnVi+4_?gyeHdz%`DZecC$1uon5j^wmStnOR z={R$B;|#XH7<4bHMNI5BAKuK1r64&+eY(1^~(X2?Tc;r2D!i+yziGmXJ)^+|(CN31%8`{P6s$bo!_iPLax0Ggv zUM!b4c=Q`h>-(xj89l9T7_1ewq5ti(`tr=*(HEoiWi{Nz(N^8aYD;klD+BD-1>p;A zGmMOrBPx73lHrL)Wc+3$cir5^-ZfUVit~>T#P5Pya3P+Oy_VoHEc8M*7z-vqFU&#d?mLEkCgxXN+ZbUI8 ze6^Bgq~|o67DNMutEreM&xU|X!<}#4tJ}3wG-k#W?N%B;&VAK-?U%r_c=J21z{z0-R>c|7kY~J1y%d1c27$|7=;bb&HI?s6)EA7K zku$UV5~i@Kf|WPI;I3e)0Rjc+>BC$G1_Y6J)0hT`aoC4{is)kU`k+!ZV~+ zf>qWd5YPEm+1b*sky}8;!k%|l{jrfOkp22NFLH@vJxL_DwsIJp|0?E|$4C^kFW=p` zwGRRpQYqUq4?R{FLG|^Te126w+GJrvKXk~3!?0Nqpa-NQ#3fnemTwB!%i(7GbzXO4 zLNdvyNNXU~#9$C;AxjV2h+g*9P`niJvZ5JjJ(sgxYrMBJ;Yanp)`dIUlip`k-=yq$ z3bITDiyPM*w-)(%%^XYbs&x}S5_Ub%Ku9zc_siwqt`M77T@E@%uxS<@kxo0?0uo15VzTWFj4*-Qr_*e-Vr6>6W7(+|2C< z)O#jXJXG=j1|}Y+eR~kW$#DLVl_u{@ zas)7V7EYW9qlRM;q8lJp!Z7Bbqq(^{QmJ$Jl#iqAt+VyJfJQppdt9>YtD9xzProhi zyWfu8E{iZ}DZhsTBROnHHNt*OI!U;vYl6Sgn)osVep-+X)b_C=b(i#$AgXmkc+6K^nOxk341-`*^xA}-S!T|AZbsPRHSeRygk0eWC^71 zH3uEGWbta+v14kFKk5#@M!#O2OcOBolfi!8MeGOZLUaPb$8=a%iMEB@ zxChRQy}mVrP{s??1*A$FCI(?8Px60|hA&duM+{?mArHtv+v9%p-uX#1fb<-0)t#Ys zr;apB)r%wU_p6B=neMWBdqb#*a3sQHXeWiL?40!FSI}xPoi_~C;>8L(NkRGXk&#AB z#K5%i4r)O7>-X(TQ85?>Y6+=RMV00olx@7rik!s8>T)8j6fa~9Ib&{wIwLn;={%nh zvAF`yaH>s;!#dbrTCrsSYMv=9`Xv9JKQiB1VlBW^jfBkiHGA4Tv<^P4`0fp4edHyu zRFdHR{V~9LQIaklzW?mJCE*D?9PBw|tyZLlD;tYvTJX!T;{g6{U$TwywSj~Gi5x6H zKOp#Mi{hdla=?E?AjN%2SG?SBFzu~+W;iF9LB>_dF#DC`%!0jpJ@>gHXghg$L!1zY zBPVV6;WwCbYj12Ex^?;6GKU3aSpXBG<%+ytZJTI5pM~)LzkjCfSfYbE)?g0Sk-269 zAHCJ8ZOYIr6PfPSo%dR{2Dxb#BU?kKp7~pWqyN}1cFN&j%!gs{lQF<6WvmNBVXhG6 z;=3x=0c$5To#IxqvFAls%b|T7A<`x)I&X6L(QBU3OW91dTSlVZf}})K)bMby_6S44 z(>$;2@4+I%-wzxRTje>^eG3n&yfeDixeUHDbhG|Nq6>peG+6^D)0 z3mUmMbSSx}O!>R>b!I94XsMqRV@Xs5Zsr}u_tyrzb(%R+5%Uda5=)z%7>a352tpO# z54S6z1$k{eX9*g!jLq_WGi`!Utv*N^_I_?xQ-5@sYU=;#O4m*1uoec=I-$)d%K48a zx#yLCI?LYpC7v=#N*j2RTkIj#8{`-d)RNZ3kPOH@TTy3U@5P+*GCV~$xZaDuUjJASDy7PL+gHV=l(;Rs&)VFc{PV7*v_03}><4oUal~Pt)@w2CN5edKJx#^j0p>D@kdvRW|MpOA>*xta zR$As(_V-J(??XhnBL}!mGFy0B$Px37&w=f#x3;!-31_shJ#blR;h8o#lC>h}t~YS5 zs^8s_6IN!iW{$Bm20Z9-o@gT{G?~3cagDdgPlX>Pad{1A>uf@fceEINA@i3_{sf+s z7x8a^!Q$xXgaLl1^;}_Lb*vX$gVDZe9f5(d`T6n?2Qp6|`hRv?>THRq<5hL&O)d1$+y_caB zAv;>1ea{Z>?zS9h3yEhFf3quj&l&VGB@~nOxS)IW%Ku5vuAIuS2;RruFJ`;Cul<5& z{6^Y}=RH)PVfC{ifV-t7ddlUKn}L4e~4dQ8srRTeqtr&1o*k$fV1t zA(M^AZ|}U7FOk^E&9&LVu)NDrWJGbSsxFk*Tl-)Xc z90=J5_0u^@eCr$G)7WIYL@KF6Up30}HuB_r=!QGrlxAH3?-Nvh)9aWjt3vs#?~9WLRSutf!FSbPOvhE$1CgO!Y9Rn5-jX z$IP*@Ub&$g}ZP_sr_a+Y5ohFGp_$sB!!=j;zHHGBymF(v(GcDf zv40Ah>XJ@N6bZ7FxgxY&eNCzStkkuv#tD=)AdW)DB!AThW<4dRl;7~xla};>sg#KW^GMJTN|;+!?>B995_4xL+NPD+<-gG zz`VvtFEl=vmGraKsOQQiq1J;OkWmvXxL2&pK3RZO1cf2+7w};=1By$uiHl(35dBN! z&KUG*G(H8h*~<|jv3L^~IaGiL!oHl7832d_v(*6?=q6H&=hhkSoK zqEqX=t<9U`L-T<~!(_d-YhI1WCs?Zuv+PTYCsr`V2F*tC&(bf2VSd^9EfF9W9g}T# zcU$&ueFKVz+atsx-)TO+nh{j6sQ(6LdW+7Ez$ui+GAX9Xo{Ol-P*ahev~PN%Q-0%Z z-cJB{xTLVsisxH~vQR{-Hv1qv^%BH?3fkJ-EDtg^Si@m3|AS)fa~3i5%Gwp2VLxt=HQ~4% zwm!PgE1J#ekB3}vQch$~fgADN8DI2Yv2mE|WS~%kV)n=FDr*+q%AFNK*#B=&d=N=d=W5d!;Jjz`Eowmyx9E^w2oMl@lu-vmyHSd}ho_f=& z(>@l*=nz1j3)c5y%MEKtAw5FKGyelcsi7%!d-1OT3D3st9s+&;m+=@?}}HB;zUjI zURM=wd;C4>OZ9IfW^9+clYVYa=yD00Bm$HT>qjp1U0@+g7dCdo<*6Fjkpk#k6s^na z3Nk8#H^SI^mCV*PhkX~W3kw?^xqsp(0a?fI-wR%vZX_IfuUt3hGlsG+vMI+uG~jq9 zoE`2AVrKrysazJfw1&I8XTJJFceK12M5tv0dwYJ{WMpL7or$%0_wx$gWA;Ce-rk1+ zDor*UHb+K^xSB;B3p(tbt!ZCdzY^kNACXxNV;v@URib>NhkxP6R9}%M5GM(LTQj*2 znj5QtZ-UCkM=H@^0VW%7;6w&YKe#dWP&~#DWloYU)t)T7<2Rq|D1J*kkrNETMRTP{ zi#Rd^evP)lmsAJ=N(!i7l0*7X*jDzQA@RD)=WeNS zXP7+AR8CoJ!0EK7A%JujoAUZC(_9Rkx@h%;H>S4yNWCaC(=DbMV9<2!(Ii<;%p~>1 z5F1nnLR!4dfD`0|d@qjxfB&A5xM!#=JV?4}I9C)2*%bhn7_v6?oK92c*v93$w%Ks5 z-AUJb`box?Dcf!Df%ZuP7zYf!y2f3n*{IlOsBR1SH>1{#GFR$+Q@LyaR1v78GfPQA1dXq(>V4tx;gcT9xLwsgB%^?!w!NLaTpi$;q1u z2xL7k#%ZyV)>S4+Wptpnu*7M$FUIJ3%dg}NuVbg)TOEC+Yv$gdl$M2|PA zzyRA+;0%=M1*TISo^K`x(Z2~8MW_CL6CDm2#L9*;lwoScQ>7hI)%4Q#LoUrUhQT?9 z-z1@T^+g5yWm4c)Bm$GQZXOp?Rbp-M5bF~~&l145 z8TUE1u_J)YrV+U4ARJ-_@+?Zwf5kl- z4B5lpncLfUE2c%06p^Ph=2Y0FC^s(mWuva%$jwyKv1NyYp-Q~Rm3{u&a);^wH~v-x z52y3w^UG@vSO`e)Q_ATw2GmDTe>bpz#XCTwv(RAg2|3!f#ono@7xFV+EW>v&`t+P$ zZO#%rfBl^_VfQ8;7-|r$o4x3)=%Ww2@zO$F*U@KDyYmd`F9dP# za@(WQTe*Av-aQ;<*U%@QlrO0tK1(zDIJJ>ea)Sd<8>B0bb`|TcpFS4f?|8YcJ0+h7 z=~av#=-W^Du?-rFxjOwuc?kMs8*-?R+w+|@>*cz3oiLmLH`+YE6kV`~=e)LwXv`=( z{bDLp$A*uf1_vb;*4XV!*DDj*V}eh5=luW|T?pF<)z|QGE(U9X3kg?A1GsR_*!~%o z!Aq+0mC@|Or_tqA%sX7?@d}+budt?JnUM_16l3&Tt6!stN;iBX#z^M=vw;!y8k~mX%rGRFEcb?h zyqv{jS7iaJuhxG7f#pu~g4y&1-H(ZP6YoFTq91ETuwqSIB^Dto%B9WAVLdA~p)(1M z=ujQu7Q=927clPLXHUB=>EZCNOLRwcvE^v;?QlDveRJf1MRs-^IKznC#A919>O&G? zNmeoRkSQSG3yJq(zwcm0NLbktb1fd~#L6V}Quk*ry2OURxkt0`In|3C)$up6NK2ng zD_9T{3+;Vr@$x#ac-4w^?kNh>J)RQ{5tzztAzSU9&<51CQj+vMy0Xhw=eFyllG;~r zBjrQ3+jzSP!he^cLDQo!JI7wk&nfG^q*P<=&m2vILttf)(>eFH?&)Rw*m-Sl-N!-P z<;&flBSI3E-Gg(QtO>4i^BDdG-B(g$wGiJK1?TGZw|jq+@750@3^rhP^EvFILo^{g zzqP2eu z+p8I?c`^cme1)B>Qor&qvpRb-U198!YExbnmLp|h5NIyxSy|_8Eib_#tque^;w`1B z;p=`a2iV_5!W1K#KR9yHW$>TwP*6@zI^@w`3#*-uXa#F_=cWL@flosF>F1K|Kx?yCwAVY`1_4Q~y))UZbtwr~ss>f^({*BKazm)bxm`0WHx&AYG7e}NzR~r!_!)d< zgC=TpbAdXsD0IM2Na88U?*AODLE>$`bmX=CIW<;B&P@y^|4v{dPgcTp4BDEG zp=++#s*y-vk~(4<=`EHzVm-;K)ejh98OD6pgYyJZ|6W)`<2~FBMc~pR?$jSA!0C^G zSOaAwy7)~bAC2Nnt#jnA$*YG7U*=wtj@f@zVYm0js^-s%dNyrI?)A{_aodWob}w~nb9gOZ9q7U!wx}e#YZh{(h@%isNDalt{B^Rr zrH{A_PY*>KXc<<~dF_>jgr{mubtp0PTXr|9$5vXflFoG+(EtC65JWGZ|5o?8t%M?^ zzx2aeHhE8U(E(Et#U@Hd>G(IRV~k7rb>(#e_mVU^dS*M>ReLnjO2Ge}m1w+!NWsQSj5d z{L2G5hV8ug_NDYxUSI4jZcF zLkH#E%Zb&ck67|531@*hGX=9jG(@cIbyvS*(AQ$`&4o-i2!S{$o7;2|`BD=}GJ2!S zpVkmOQ8tX->b(SIH*3y{BE-SiOn_PHY51agmj#GQ_v^oBk5w`r5opUY_cZlsc2S)3 zadY=WRn-1@>pBneuHGOOWG_{uyISP)dOsHnu%m}#BngSbw}K!wKInp0Z*`;_XKtYI8Ej>nv0d@&I}2Cp%bB_XgnyeFFbHY?wN_)c=l2Wg3IZPAS(x(VwYy}g zy?ubk%Ymv;`{X6v5lNr453=g#9kkZBu41#2z-qSRn>^<@c#*M5sTJNsMdd-_6cQ;) zPPf?FDhXJcXq#nfswu#C;nC}jaT{D*@~ZX-Hp_`PQ^)6HO7(NoOGsDyNMBT#&|WiZ zYq*O#XU*`VkS}+Oh~LHuA)*h8WI;{8E%wW6*;O^-)nWFZCA>p+zFQCc4Aznc8O@+d z#8)ejSgJQr4>pQRv#}MQJJMxTnE+JMF`b?AS}CyYQ$?80>i8+n787!)YzKM6B)lE9+@T)#F(U2|Kz-BeL z3U)KxO&x8pHzOE2X4pb_mCmUH-H+^@Ghos)JLo8 zNsbAgtLQG_9QJJPHPiqMwEn~ekhHRy{NCZ4-0Du z4<;x5Qb3;xo78}+ICdXZ#p(X@$Z~F9YvT!jHg~7pV7F|#pUMVxG;vsqh%jXD>j^EZ zB?aGRY2E(j&TOaOrsi^Zj0Uo&&Ha^k-7=ZV1FYx5cbB5jW{PAGPHS10r#CG8dT&=a zUV^j9^R#8GuyIZxlc7^~1 z1}e=xm)7j+E+BNs6UChR`hY2QjbIS)R>3^eb9G|>^!qp0b>?J~fufBg1I`&k6h>^~ zocg8`#Qq|^8-9$GQSYw}VpZdPS`OG|z|+G$H#%2d`oqci8kQ)otz`fIOuTdpjpoZfwIcf}9z6!0MC)3{G61o_T z5cO24FyF#W>N&J-Kf#z&8JZ@U4ZQfPV(HR-)wP3-SI*R4y?POFs9QGS4Ik1bCzFm-8Ebjr|E*nRem(* z0hCW&6PA!(%fW9x0*YIdy){ z)hyC})OU*fmWJ>?r0V^z+4$F6L&rKJj)`CX>ydyF*+iOZ|*JOqzc3)=-xYzZezOwEZkEciXt z+An`FdRVbjs5kv_3DLW0oM!WDq3S|kBt~pVQxpmeo;EM$=&A+!6mnSR0`-_bOVnAs z5*T-8L*_0) z*>}J(JC`3gJp~#%S?_g%MOWT!KBb=o+9*NQRBrmGE9m%*gITBRo(3^{%6LL@oU~Lo z{eMQ(%2e1IQiwOV#E!zY7YLdo>zzD{&&r*6E+vN)uf~lvYTn!a?AAHkTZWuu#V4&G z9=`k_!FE;?{!gsAaHbK~FUc$|KQ@OVBs&|vc}tyO_8Sp#Lof-(7S z?@eYcCgd_~MzSt=d=AbeLT)_>D*Of-&-L?M@ZP-V=APU9Ov`g8L)$q&@6370W(o=4 zw%lf(M%L@EZ14kr8Eu}naZZ>mcP2fZt(zO0*{#}j30pbToYs&tmX*b`<2h^-BUWBQ zdGqwxOv6A7@xU%kQa}@_5(B!9(cy|+V@9wPv)Re&P6CH9_W88=QfEpfU!TU43oC7Q z2v4b@i}xg@ls--o3xAJ}j}c2Cly0c%8yLAQoBXt*u}oUfbt`bZ{(@3fRi(lH`>NCyUT zDK8F^#Rb!0M5*FRN2(IrS^DPWNeEwjMQfg8$4gjfYkv#oQsSyu2Y0vaUZHcgArVHU zVNx_EGq#F7L_3JYR1CeWz8&uuu=;!YKf7qI3q!O;A{Xa1s|{8q<;TBG4A{wb`!ig( zuNYa(7EZ(Q&gW6CLA)Ruh*#ka$~;q`2ju{4rq0^-Pd{}I{m1inYQ~Zw!sq@mpe$ys zoKHG)>qdEDl$*gJsM#gyhHif;%KJQ^VsFgc1{>EuIT=NG+d8iCc!ufFa=A|iZxT;LE4=(lA)TPhoOu=}#3L}%QA|pOft5LAuYDw;=``ws_Jqq;tH?wg zFHF6~XrXjU~R$ zd;U{P(x7UTcC%J4N zrPs7y(D5g4gTL@4#H^y(>bT8G@bq~mZPQ6GZZ-8bL<)<=YGfm%2-K~R2eoygeP)p+ zh~Ob$U$U|hTmrt#(Yj$YbN8Y)a8&$WxSus@op6u)Cwl+#ZQh9-3;#5YQ?GK>a}7RWZ(jx5s@?FITvqo%1$m$&kOsEIE#1zXPZt+tyqREDNVuS~ zr^)Njg|Ir(0>Zb{S~m}dc3O=)r|Y8za#MKE+ zFpx1-;<%%pYHai~F2)hcruJZY66V;sO?Z4kSop%#9}3AHzG_v8=H zjOn?i*Xqv1bteWD{92Tg+0?9R&NCA(y=O*4-wXLaCEMNK{sTu_OT-Hw9LSfdGtMz@ ze-NZH_~cPfJFu^{(*kt}RcaD{r=b-EhvRg*&(5?c{i&UwE`<U#-jU1qs z@)e)Gf?LVCh@T245ZsjW*dY*yDy)aeRgf&Uc~Q}6qm@;G+_#29;h$+5E&(5}WTe5& zHZ(nqyu1sKEPJxu?v664IY`Bv4VB|(>^=zWQ7F#PeXx8>oU-BY))a4=&#Rn{q7*>p z4C(cgIUj0ZjB`TCED&W+Ip_6B)mFn<^JcM{W-F5jGW+hYSFAN{NexGMMBP{=vuI$= zk7_c+I}dt@t`Pme@tA(q7COw>Q(o`r{k2RP!<8l!B#aS?1Bh?kV`G_UiY^`h%94ae z+T}vlHKp!~Ffy;bNIXgY5;ay3@I&k?UpT#O(%A7CD?KOFgiqSV7J>ISxdE}J_;vbt zg;1-%XNehSN8VWh*qk`ft$>*xW2+hwyZH1wTKz@? zs46Bj?-9@B!On9so>4~QS0?U+Bzg2bQB6B~epk*+%XW z32MF7AIW-UT+p&%*J{7noOq#7!ZcGuv7>*2Y+1mvQ_778>;RZrGQ6_+{=aAWuVy2@ zq<6{?b@@fzv`q`f(8AVlw$L^aws2_hxn_&E-AQJF-G?Eo6nzlHL`Xso=PvsUz(Eb> zF=HR<`q%bb#zP>9=$x6tVX?k-bb5pBSS_iLZIt9YvpTyrbhU-6cYcKAm?U)ufqT0K-F7uvx)MmByGMRUab@K zIO(g@Ii9}PKR0e=HkMyfW4b(suYS9_v~zkAH+IomWD|HM5nlO&MW;}g(q3NV7P+3~ zSv{&0S$Sy(O_yuq*WzT@u_Qx_tN5r4hVD$pf9*B>z(P7ux>5nMUwBcoE{Z$gwyp31T^#dNl5eZ8;2WSdT66vT^1Q3Tu5Uvs_^PB!&&yMvfINe;2ZD#_79 zx0bf*(moW^^ZiDQy>wJ503Yyj2lIhV1Ertnno?7Z^-IgB?nZVb&Abr-cgc+08SMhF z)Ti9d`jAj2k(NpiLjc>2GS(#JuQ5l)0)rdnbZ*~#LgGYmBf=P}ywQU0}tsBUM!BI6Y*f;9U zEu*`T55iG>!;h5IiTEu`>A*EE817WNOJ(-@{k;*%y_t&m!cU7Nd961OyIB44c>4E$ zii0<8jp7jDU56)#e@8w=G?ojJ=eXvDA&Q-y>aU~Ox5hYeSGSq~9`j$}Uvc@Zx zwk$bcio&ntPx~?#lAOz%lR2c77jEt5vIZwG9$;ASwPv*<@w2kA}O%940ReE##w7UXK;eDk`gWCE)@Jid=+2Z7r(T6}ZE4=#OTR=&1+0$7r9zlttchbqk!;!^H| z$Q`CLbhVHA3JjD#<*cpUT;i=2aXPMsd{0Ro;rbT#Wrk@zDtjW|I#~&GkE51prm*6HkQ#ePyS3jcx<9?T^i(jarj*kA3+6;S-EY3K+TM4o zWv@2i^Nk_71c=TF808x@bbH8-yVy$vV^-Ck9$`Y#ZLq7L^hD~^v;NF5=MQ64%aX+MG_Iy1 zl%;}37|Ta=WPiLfGB^lmPo-sp$x*di~AyuhD^4zr!db?wgT2 zOV7#vJbBpQG@k8Y&P4s~iKixEXLR?fiOl~S!GcT*dP*;cJ7sZSg25;Q46We0207WH zd`&|#U~zgRwxSR|9JF=jz89uRYsYO-0F0+Z$V?;*+1notS8h%BN2!jwR8sUqPLHM@ zw}-oIS22I}DI_t`LZ2>7}t#su@9{QTX?hSsu~%eJy#TB)HBSZXw3 z|MPmM9a8O!dEr79;a2DYq7SR=!!cfNW{cyw07)uF^bQvn$M*VK4sIjdi~w}-TB=<} zM#7l+<@(5r6z^u@(T{*THGSfVj84-pO`5EysFg+l-$3e>>t0nB+0WNX=+0-JOwuyh z@9BTGP15_{+BIZXw6Q9*w7&YT`#70>dhpUQnvO$!#UpIqz_)ISlZ?yheXNUXlN>aM zU2eHF)5H_8Ye!PA3yxZxG!D&m~H z<%$qTy{8SlB$`icw;3P)+@32c{&Vx`T_J-O7eNC6`*jkO<9VSCPV!9Nm&w|4Q17dI zN@l=bwUk*DDVG;T`s-ZXl@V+Hi?VB%y=3{7P3Yf5k)wL+XPEQ*W$Rb&lLbYN;m*O$ zktUoT-X~{o!S*&1VGjaAAxTSD37AZ4oXN&ieqF$g*P@&ZXV6B6>k;*wcXEG~u%a~+ z3Kw*l0?P}ab4Flb2d%RhEhIX%&;-z4*w9!rEpI$Y@pJb9QRQb;J94i2a9EWR&7l(+ zm#Zpggni7ZNK}mnNe4vybZ4kjE))p1I9eM22$svRHu*}do%y3EpaQW5XoCFxwJKwp zpzjGjG1vApn1(5UXa2)#Ezcj$)_mm3u~6V>-b+5Ikma%VkqJ$o(igvAp8qLV4glOz zVeh+(e;%c7aqT1BhyC7TbMy&lyTo21JtoMfM;)y~6(@Udu^#H_>3eLVJ}57{TysNq zS1X*A5QybS=MGRzpva~WQ(xJbahEF0^V>UWF9I}PEn58t=(l5r1wosAqTkOkQ1zAo z`P$t6Gi0-Pq>noU=M#lq*FtBCdjf;?0gd(QpVnqSbXyQ-&prmJa*H%SFmD8)#WVfRmbSnCj#5PnmZIAd&2Q2E#af%u~ns2#Dl`DjG3Y$Vwmt zcf667yt5B2yhwzN2^fv;CC@e*=|RJhFwBg?uPpPoYvoNlV@9a-%&F@n5*%U zmI)Da4oC8^@?O0?dYdYR#~YBQY!4vSAk~v>uxyn#1 zzdZ`^uqCODQK%p)EtcF4=ZujTXZ$uQL88NpVU>{7B+^~G5PhDg87r_+E1s10-V5Dk zz|2benTp5?AF1AWC#o{h)!gIRFQuVzx5U$pc_P_Hd=i4R>_$(b8sDdkYOXWhSTkT( zDzfB$dLk_C9=p=3VD_4$Tg*t42Q_DEdvM$wDPJ&T-VnW$Zx_iz5 z6o3X&>I~$HdrEaJI6WMQNfvkxejJ(gafg5e^KzTf@x@-d(1Vh{RJtQ^T=x~p#)0nu zVL`agn$(QDCZ75I%lk>r%3P>`4>@eAYmf=6JjrXrFA1ga1h_bPT32Hn4?4)^S0gnP z|Cw4H4gQx)*ymr4i&pp65@b1KDdpSMn{o09;4nEe9Z42*lu{+6X-$eUkZi3q7hS1P znzVENJp=mgRn>53U|zDfkK|YWe16^UUw2xD%b_$QTqVqXZz%8UWx9LGK4iG%F)EnXb!NU!3}B)H=ke{ zXP7zMtSP25MUB5&i~p`W1yfc}2X!mp{=kr47gV#FEM4IY;v@Oww`(Fp3R91Tx>8ol zbOVt;LKVu;7JT@w4MI@cWO-vWm+d~Pl}NeRsG)z+{>j6a!IMoP$3eWk3ct8rAWcEI zMNf+3z54s63mDk;|B;d5GX|`hc#Rg(Qn98R<`qCTlKn&Qp3ksrS+(-J4Oe600PB9! z$&Co#0++37O4kJ7E??8a|MgCo&d%V~+S`n$vRF6k%D+;$_PhJNu3#hpLi(G+{nO{j zw%(_Bob~zV6?E`-ta%B46Jm8pS^X%e5F1`sUz<&x0J2udmfk-X7Z*&eJfG7_9x3NK zDg@KVT#t|ZkC_^mZip&PE^fzvjhQr8*1NXNpj9GGv3bb8NaIPA6DzsY?Xp;$%6!GkI3m1=OiHGa=yueQsZPK`woDcdk?he*WbPxlU| zN0{w{`-W3urcS$g@7unF_>Sz48*Eo?JbhIr0cB~HJ~OlWH1%keSy>cFq5nC9JF$p@ z2@XF@Tgt6n4Q^TSRS^P$yQN@?$A0WGoDjWU;a4Vc#AI=*oC=+`wE=oL3T!IM0;ajf zL)fk=@DFtywTGq2>xP>aROmE9*5^q-nZPr--)$H;HfD<>W1~y0F=ycT_lsx}90GZq z0xH0;4SbSm;)DhD7oMbQDbV$tH5fEObgf8(X9B)vOv>MC29b)~PfIEcLA>)+!`3mK zlA*YUN_B}*Q-9qS6<8rka~yvO2!`eO451wK^i=PtTUWb%F8X(ZT=Sfl+e`n-o0}OV zjvYgE9Tmz%UP|^XTBe>N*naItf{f3HGa0{=4wD%e%YHNX@&p|o_3=7@v{TPVtZz$l zE+4Vx&|sh1Rj1+!+S^47NNPM@^T60VG<;}hn(2VMj(=#Wx>vn7hqPu^Z&8*d{SKj3 zLD|Hx{{M4Adk9)kTKFG8U`94?E7J?mFojhHTWn@qOT!iKNzIK6iuMwpF8ew6<2|j+ z^c%}veks-{rK|h(k6)e^4ftWi+Ly-6sCCV1W7KBGAyV3M&)bj775aH@_fnlh)%xc+ z=H_(e#bB1dT~1{tE~(kBf0Qyv&X2Gu=8`5QF1LC?#6(PPRWw5n_P7j zzp;OD1vXtiztx}agk1Mt@}&qalc#5)@j{2`tWjk9R5nyF#bC*Af6A=5CpBqHvkD-Z z1Ij8;34_sMwR5G1-a+cORA^Cl&UG^HYN_9~b7+RY%ciu+mk>XNy~<@Beb@8EaG67B zeaGtv!b3%fmE$M|LrDgDt;N+Q55&?g`*e)w&`}{Y_oVgQ8$3%7I(VW6FQ$YqAGfsI zxFRQqol3o*Qzx>ka`&Hz-peAcG_ZuiS$8>%IqY+Ql3uRn>`_Y*MGugvV2T*O^3Gee zieyx!ZXW0pY(L2k(yraqOitSGJHzXp6u_J6Fj~HmA6A`fj7b7)gRVSOi7lh7Y_V3r zvDZeliL`tdF#osY|5p8HN}EOT{EOqSi0oG^`9xTr06=@S&V=d>NCB-nn%P>qE9)a) zWvpIb>#>-l%B@a+2vr_OO9?!cI&cE<+kMA2RZQMoDP3TjuG1Wn_>v!1Y);#GYIe(D zlX$m{HNcfVvT!rheUgCoz=JIJnqwZGbhUrsyI{r6bEhldn{GP{%Sz0)!|(db2{H>thKAQcGrNmcm)uJKrljVNLxZNE zqf9efpFj4hft6Ebp6;XKUb3tJ1L<=alWDrajU9+>wf*<#fmA2e1Uzi#Z*y+L5qYNJ zhZL;O0xZePB%?C zuABpPsTcv*TzBi+0I98`jOUUlYr(}8`-$R^b-wYvQ|nc?8#i3i|K#l6rG)i2CJoX( zCDhXya}cX4^k1dk+Oyxv#~@xko6m9gXvt&&pU0Hg`{tAv|KxknJ-}kL`*&sY2x<@f z_Af2;AMAQ7!B~ITZfU^Sf_2c-my%B=<0*u^-y4zD4?(l|Y3*qay(=#=NGC&r@^k6IOk`*1#VZED`EdsQj zO~ocPE#7$tFW}z5@}1njW>+w_p)qU780+v9nU2xpv+pV^5&vUH8YcC5tG~ zaRt2@ZijhSf4O7*mZE!(>3j^8VKQ_1n-y8E+|3Xzx5)(R8YjYY1g7Y_({`t}n%I9S zY3ySv1QOoi`bv*?N}pwLZNHtNQ8A{y#1vm+&7EGi`HbkebX#JL-NWUwrggn^R)r)Q z#sRg_D>~n;TP+j0sJlU$qF$|DKK0Mq^$!|ptt`!4kd)K!ePnBtWJ%4>1DAj`s0o7b z>-4SG=E@>gVpv>_c9%B&+w|a0L>t|5GE`^sloBIP(>zt%chCd`lhYe3d5QWWXUEF~ zCNwT_c`B<47Nb;HTD{?OFWJy%JKxcCA1wPG3(89DHG*wiBob|nYx5{v^`?^9`wsT& z&-jQpwcvZcUJ}`kk+bv##VQkd)vrv*(j2V1-Rm4uJ_5QUN7JR=xjNmuC0#}N)O#ud z*6a$(&le-IM?Z~u4VPwzO(~}C*C_g;1xA1i9p^Oygda&W;_ViG~HOdqwy7>WAj?CT3uW-~$C1W1RBIjE&^{ zwLs^#aWJQINfWP@M|PG@Wj}r4%JaR%3r&XPS*4_tJ0q5h>AJL)kM62+-N_gD@ z%MQ)&>0!hd>955YMkaFqq~fP>x4lYWN=ZuO3rBi~_JPn432$|pqUmGsnRT$yXgYc^7^B*?90NAp@+ zZ=clHBz$p9(ZNCQipef~FYpcasZ9I6;>u(hZLMRNB*^0!pYw2t8XM&P4DGQso{U$D z^Vmw%wejKIvg^SDPnOoO6dk(l zm~`QQI{<5!gWu$lu3*1ukv8IF{v$ZtSey*^w2o)D{F`jw(eT>|90%gFqaYx@+V4#s zkX_5v4Sc2o3s|)uvpHjgjAmNq1{-DSpOBv?XFLW9qVeF_0*2YB$}NX+kJ+dpKOBG1 zAoQW@l!(v$#v*zSPc-c0i)$MBs++ETUf+%RWB6er@3jA^E>u9|p|a#Ase@WRz4Y4W z67Ci>-sI}{1IXW~yGr|QS5?tDEn=>ha3z-9S0nz~d4Dv&pCFPb_tk0S+bc%$*(0ur zH{EXW!pzjVJyeS%4o_h2Js2e+6xL2Q zQkm(PWO?usv*L1T%K1)*$ILDV76HDRRn+5~Z6ZUTO)#FqxI>KJ zP{|^-(F31}6-#dT?xgR+@Q}`PO zZmz#&w&Xb+vtAA3tF|p}B-ji$1c)~fNcG0WY<1*rmYQdL0XiB4gV#n5Q<$++zXZ5^ z&4BEfn6F9jA}*XQc7#}R`$Itwf1NKBwxVzsJFou^{jiWha~XTbS&4Mr^sN2gst;Y- zcW$^tr3`VjzO*D})&&1?4Cmb0LyU;rp@Aww_C~plCKmQnbjrQ*oXx< zJ8x(U=(Mg!XpV5W=(bic+Ooa^)rF4Fzm3tGachw+BSn%7ocC@Fl?kYD5?eUns4bV; z#HjWfKSs;16Dw>2P^c`S6FmBh>NON}!^fM6=Kz^v>3nV1Z8&?X7yYNU|jbVd1P`5*KlRdsCdIYKf^SQ|j_rFet};9n17w8R*)--VsfcD4Es{q)4dV&u@rL1`bsgXj|U zr!iHE(!OA6R#~P1(cgz-@xw?Vte0B8C$uL%CTbp&Zfx0<$GetfezR(U9-<6q@xea# zCw11dYS)(Ud7j5Uex=1rJ6+q(-(=KP*qo%9A}BAa^H+~ltaNDK54K=g_C>8WXx(jw`dP6h4d8QM5Z#n2>8o9rx zIfZKm)e6K8VW|xj*>HNW25Hl10h{^xg04Xp9aJsyC{3%Cu*)jCzcI4AeTO5mImBx- z*#@nCEOR5XtkmA?I~{yq?OvWkCoy^4!ck2qLYf#TO*|RW=LByJ%*11#;q4wRo8dnX?@FiPhZS%ZIz90y)C@F zS$1azo?dy5Z^|kDxf%Td9TUzF__S$}DbIpbt@slI&De6vbU()G=!7J;R!}7C+4ZM1 zGh7O6+ph=-yW}KJjuohJI~MJYngt==jh+>o?dWwuFDEJ*x((^P{FyGFJVT8XqR*%4W@zDWfy_W9E=Ed^}& z76FS0>D#(~%FIsS9KvaBL5tT|ztS+K(T!cZOkGA-+u)3CXKYg_YTQ48+9R6u| z7^Dja+x=mG(zw=s>e-)nAJQ{xoo;unCG)CM2*kiEbN0V^OJ59@uCvZTSO(B zmoSEtAg?GpGA{W`^x}p>`-^SYH&uMv0`HNvQ76W#lNH_~gSL+KY0<8=E6Ki#HT(C0 z%{iW(GE=*3?tU zx&V91>H5eb*b&FRCL`Qo%UEq(ixL#7P>ERoBKevXJDDcy4xzDMbpGS~$^0mp!_juf za#xJ)9-W#O)7=t*i5q|bcuI6RS=&JSrf1nlk`t3vdq_SeK>zo}zzU3OD`BQ2GT zx8B&x7kEoxVPFWIKoveqtM_cux;6}BkglwB5?a)2UdM+j9u*J&h^z-6n90gkQEMOX z=Dd7MN0*sgqDEKgn{?XYJc~b}hb{e%NA{9}tZUj-{p66r?*mfp?1LBH-#3SUap@Zo z2irf9`lvfNiT}|u{YwYx;q9<{42oPbXYudz-}@gFconG98R4Z`cy201aTvBd+n8uH zuBQI+1X?fzl==r^Zf2#MxTCpW_dxuk@-D44LzHT?CRVV4kjdzpM&kci{L#vZcroF9TVMTEs%N*J z&SIJA(*AFd8#4ZLANEI~vjQWt z$EXuuMf&vj2k#wIz$R4e9_;h+Y-LEeP^S-LSn;@`TahTpYMb5KP3f8qiRc*qgG7WG zd!SEw|xw1ywA6+l3zvO=Xa3MqJGX#&_nntG#43*ph8bNhPbyR(2X0W( z52&vixh$KS?XQi{{Kb|p#_`Srb;IS{`0U@Xd*In1raMOFb=ut_g!|#1C(jVxwT<xys}{;6Ax&WK6YXJz_Y8pdz}kK=Oeeudbt zX31MKt20he_YxhqnKTnILJ$r)Gh?nL^3Ih9WlMbbybFym&vA>fR0{iNxp?W0{4>{* zA4yV6=Me#)np@#9rB&53t5YMFY-@g@kNTAP`%#3HiV@^kk!c*DW; z+YPAVY-cUI@B6QI%$=XZab_pyo`ho6Op{ialY3QJ?5R-g#xevJv(AF)W<(XOSR9Rr zp+DywtfaBq>@CnY+Nek>b73r6Em!b!;I-oRIcmq%u!8AfDy*-g$rnJS3db9Ql5OKqHZ>p4e2+a+<#aa!8gRV(Na_rO3pB}i#N!*B-^upLcb@6<4n<*-|a~UtF zI@Bb#&Sq2PLRxro@E|$j@z90b1JpTN)c@t7Rd5|9y%dPrG>6^$^hGM+xmbpz35kwL z_S^0WP5WJU-t_IAavaREQ@x~a(P2*Q)4n2ILZLdb9e2I zRls-2x5>B-h;~oswkVis3Iu7kd%3Ktp5UHZ|MHt^aentXe99Z6+| z#&Cv34RhEiKPF8x7PFQMSoPk5?2H``f-!b8yAVb*@0C^_N-GKPwnwpT$c!>jKAdN_ z)4Kg*BE1%msy2tlSmd4{DxRoiD1{H{)~8N}+{sd=viKo+yj4Lm*}VWk{V(1FHUmoHtK6u<;eX zK1)tr6{Gh>HXPPj2=Q&a|3Kl z)zZl5ou$y5#JRcXKQf0vWVLNRY)>}`A(5`NtEP{3LRaeOMmM)|PK**e%I(Br>A6&E z;8`qSr%@7MUfQpl!g6&))m&eOy}xFUX$5hbnVxU0c%x?PLx?)_MsKtf;c(g#xg+MR zWVbzI%|1mJPGR$s9Go=U~Azvp}Dj$hg%ftLKz0<6I#Nikg3usobNFjm;7mi4}WfO z58ysyMqeLhtTMYbeuE0gad6W0ThL&*iMrqY+wLjOD+ zn@z(Rlp8tR!}&dK^Cgd`9sjFLBs@K{g%3iE|4I_P8?8as4zjq&3qFNiwUNxZ=0B>F zy^fkXQLMp^O3E7m& zL%5;Z_Y>T>uIiz*+zNgt4Tp-Gu3-QD#pdm4j74}Gd8nn-(+&v~$}@g_`E&|WSTN+E zA6>}2Ur|>p_+=Z1%y$DUUUsl)>xUR5dQJ*U;`KpSxD-cA#xnjlJm@&sLfc>~t41_4TN#k31&^1^cC-=CxKuy0^6@MqO0d{4wHBth)znr)YnBZc$EdJf_uX1F zoku)RC2nuyKAND%61sioO0p zK+3#y+(r&87|9zXYOnvhky)EA#EWa8)1n=eF~rWcn-y9+^{yG5TVyD0Jv+wE%u?QL zNmlaLyUwNS3=?4g465G5{3aB)Z81QV0Ek_eK?M6G<$bBuNPcRV#eAj|YPd+9A0E?w zEc#JM{PKN@GCdOnr2Q`<`A6#q26w=~Q_K1pT=y=C9&bwIZh@P=w))`M7nG}Q;7yDF zglhqj1~bSC4FVm$4eUuc@-}FSRWk45NkwSLb$R^#A@FAj01#(Zr1?%uAE52UX!$;~ z$TVvZPF6850(vQ5YLTdAB~(WcQ8wI_JI#lgJ(O8BZ!&eXpY66LBeojU5s>I`+8v`>SkyxG@#YVcY88*2Uy#(*^`a#I{O7*Xxf^1*` zyBnQ7cO7@-@3Z^ox3W!|W1^NoO8oJJL8p7~tlMil2g*E0c?8;s(vuh@MkR#^Detlp zbgEGmhS=ga11t7}Z81C^jNEc00>60DV3;Tfy+X)P6C@-{~m9ZBkj!_P#;XDJ_En52ZafJl;^C)a4>DhB7Lj=G?9N@w^CNf zpCE`J%JZyhMS8%X`n?&-F9LW7{IWijOXAyrSa6&WjP#L;SeWKKkO>fe=2syZ(DJa&sGE;WIUe78y;=hUxc%I!d3B(WV`o`PdQ+@r zXkf~2+QPQQ^0Qe#BmIaX{PzuYbGS<85gLnh41GC(Ra^vVS8!dkym<#JZd`C@ku?Qe znc9T-Os<8$^QP2zv(33T9MgFun~r#6_zT4G(k;TW{0-LGW?~C3|6ylImKAw7El;=e zTZQSm+$Kj}PragZ>o-|OzHv?`3a!93?;e7m+#DD@hgq}VMnLHf*G^<=E87h=w~7~o zz@+Z6SCuiC;5vU!I`L&^sEb9VTu>nz%JUP05ct7fl-@`dQ-yjumw#$sR>47ufWLZ?p$f#)@Jdw%9&2Y=oN_ zr?a9FB-_w(G}P4x0mZIv8e2an{;Sq2rCwv30ar+qrhaZ8`s_k7;>R42)ZaJA zqI6(Z1Fc(mkC%3~Gy$*|R!J~9>LI<}&!z2VXD&^T!6w?@glNr`Pin)4+>kfnM(D>_ zaM_Bnz03)~%S#u?*CJdCq5YuabreYvP$!C`A=GVUjC90+rX1kqIkQfcNA<+Isbvu- zx;8y$8>uriN9Fu8=%|N%^RMZO`R!EW#`~8qq;zW2On@J;W80;Of!nwtK+5IH*>}uW zms;9@1Un~rnBRq0Ww?D6p)&?`uTd96+>YlH1lxY$9VTo647W9FdpG!bP@ztt*|$^3D==l4xR$g#WK3Q@SJuy zW)=vWIYm0unxzKTtH))keFDd5ucN;~k+wGf+Wow)M){8Nx_34sOy}{FI z48rbdxxJ9F&>cSG9ho7g7PQ%A?s~#uFOzkE|GVd*+C(%U<#*W)?AZ02{zfRghnwH> zOH?rF;U>DCcG)R1{%zC5xElDd_ae?1W8B;mxcnFF=vJIcVpr%UVg0~Fe9-dvjKn`3 zybog!qL7hAWZTT@OHF2e`kJa~X0`N@M6w2a_h#w#L~Qr-eG9(DfsfO#(arG)R0ndo z&&K_Dnpal`8;`;_wxQuIy`goeeDax`i4f zwmEzWSiS_Cj-$ca2n1Dy^gM6J{E7*3Y_q7-ND_9SneBl|K{j){f66=|@O1qBB0V}{ zb54^T*Tbs38P>IiNQS?E)tplM9bx#AY2nux$O|gBPXsgc25z%ta!B|7$l<{O;s@$3 zV#q<*rJZnzIDLeT?Ppm-P&#k~CcW$a`5Gzgk1c%-?=}^eGdu;)-)3|--s4eej3mX| zJ`49S|ALfH{`g^E6MPIuMqJwP-=+(~414I@`p413yCtH5iHK;Z^@v$+kNJD2^*hLf z5%Dx*`)Kb1JpD_9K#<5*RbDqwv-ew?PvT~iqV4X}+Y`r3b<^B13%kUF zZ~4H+B&MDj`)E>YB*I0RRmod+8bX-{8Xo@Ft24cZna>l<{I^bVU+pF?v{ybgB3g6R zac&SyeRxq@2igh*T8}Ki`A{ds2vCW5kld`-y30yAK67P8R(s1hSG$_qu?wy9x4(fY zh4&mC7&G9vuG-6O6Qe-{%V*nZNSESw@zDmb)1+p3Q}$AN{SKe&ZJ82xDQpSZ?a%y! z_7RCiQnA5uGr9O>*yI^cXX$J#U<&npgt7LQSI6Ve@s3yxaT}(U4cv%-2VVT^-|GdI zHw(;MK|K!9%GtHA4Xm+tv2{C0A9Gy+6bJHl)=kO6C|LawtKu`uLsJF1u+4XqGBLZC z9avif%}`1)U`_YZhuMS+s6<;lNc8ZoFSrfk0IX~_=Xqb_&8k*#UU_b;eT)2#wm3(; zldEdKf&`27zUB4e*jKnlthA-6*$HF+CNS44!IXpx_)VyO=}r6Hy3-Ti&RWf4Pu%-w zVQR$ahWa>JtdptJmqw*X4^*G)AqP(fIi>RM?ujdo`bhTG;+W&sVa)ty@8QS~DWqOz zjRHB=4K(>AxBzRwDbQu1ON6k1uZEp~ohEjtqdpyH1$4XU7ygD9n43DcG!}x9lpMi7 zUw~Y{x_JZKXh^V|c$QP>&K3CeF9}MU`RVc)$Wf#%Pxa)|+x})DMledUNiY`iay+~6 zWS}mu-$qakX+HsAJiRUOB!ug9i}NlFCC$}6oMUXum4R%$t4@n;8wSRZC9WrS+4tu> zmT$0&b~}|Pfc6JhUnP?@?5VwGQsCV{t3bF!!y&z$2=AXgBj4w!0?*428`3y0GEIh1 z2D5g@1`-w*W=?{}(C_e4b0by525i`SRm6BFzeR*f3&uZdW~>poSsPD5Tmj>~>$ib1%2z=JfoYp}>hQpZ_OGEndzAlgYQ=Ev!0 zCpR=A?r4i18!Ntosu$4n(%nyO|B0Mas0D+#HmU{WU=fjPO&S&R<`|wv>ZsCVd;t}l zLVHdTtZgO-E_hjeC6CLkD6<_4+w+zU>mexM>j=vGD!NoaHk+G|Js!9g2q2(I_wW)M zpt;xYDbM2U?G7RZc)-_0{U%G{S4ujQ#LJ9q=E|I}3$xNUw^(9_OgJ2+p{FgXk(# zw5Sdtda3h@d6pA(d>4}+gb-I%omh^USa09P;ULQyh^AvT$(rr=2sUXgw`8soDUum6 z851Xw6=r+iVJ`54l=ebo*{?>kz znGgFxty2&7a5IGVzE-Yfh_@hoqE2?O&a#~t7=beDyCJNOq{H4zGFIFlu)+lH-VJ%X6N4g}!iFJn>>b@mVEZNQKXoAo(;we%9B40fv_egDLS zQC2$*QPm<0;6Kgpi(T0Y&$2Ec%2Es+`3s2wVg=LaM_A@-`j$*cOtW6NEBY_Wg~G3t?##vjSSj$JJuEgf0fi}>+~MA}VlrBSp3;~!Fd`H0c2 z^7S)74G`)H+}W(zcW@u(hi)eM5MAC0V@}<*Yw(0Mb~HD!(>5Pmj(;WzpQ5>HU|KV)w$+aAQnQL(VJ;mtn##`1zW{u+p;AzHiZA6kCDxH`L9IZ7PAUchD(_Kr*6qmP zc~!aUI8l73<7T;oDSwY^VxzBRBaD`(%|hcsOhhxjPeL~*@F0`TWs4FvrkoX29%xNB z1ysdO{DZXxbjS0;?c$RG=qWvDUa~0z3itF zPB2}Z*87PHxNWG4>{<`Rn};2_WvN#1wf5a~C_*@MV?Sg6c|)x!BQ@HcySFx*CS~o`ubM(m`j;^6)qz@sMPu z7|G|OIYx>^=a_*a|yVq^9BUP|>yd zZ-L7b?UtB&wR}M2%Dg*&lATl5#e4Vs39o?k!_tyxL9rKNKvHv4i%9zS8W?@zh^ZeR z!{uu_<(LTjdRz|2JY1_Qnev!4L&0BicIaCJZ2lWQn`%d)jHO1&(*xlJ9v5%Qr^UA0 zk2OXBd$(@=DYLAU<8+nRv20%WJA-sc%ou}2Z#rvzy*l3}M0HQ>dA9P4@I_9-t?(Vj z#g&~bwLsROVe2dC-bG#ffGY^VAFYNXpgIcu}rwcjh zO_?&Qf%KM#D#{(}UhZ1;)Ua&v_+?#N_2yj8)Lo%7OEUb%qMHls93t-&UoUOYVJ`Fj zdz@_3l$@sSY9)+I1CW>_0~or-OSLm}`G{S72})7x95_Mpy8QNv6Iy;At@B9C8RSU_ zA_8(8&jzntF{JcFBBY~(k;GK}abh)T{>(Fe^A2YE7vVOZ0dF4caKr^e$Fx`}%3eMO z1&^ysvVH&|&*vfX^n%XIr&lYZF2i$!knPN6j)2P)SnNloEPKj*qn<4uo~e*>3zP64 zmpIzv>TdJASZ2RR_u{c%Q!r2S@Vk{1EFbSJjg$2vcQ)15f?H2hsa0Fd%xKn;2$~JX z0%oVzZP^cydL|H#4RvT%^jj2`X{vQc6Ox|s#!LIFdGyed(}nJjalzw#)NLDN9*L9d zq`)T6jS%3CIhR8rv@%O`cRnsJa@qGU=CtcId0~YummcEm3V={Ws4BLrMPp}HDn6)N zAt&Vymlns?bo;6cA@ANXqN(N~Mi}+>g@-JNu-Z8WcO1?3TLFER17%fE29IZZSo;@i zE=#zF_f^7zHv37Q@2tavyie~dJOm-k|Aq|}fgr=N_V#W+NEem@Ux5GpqvMflX#Iok zB$tNVx0qBc&7k&+r`9afGMrg4BX}KR{p55T8{oEb&2A_EJTL5nkN%Lo1L;v=RGT)Y zRL5(5&d#iT#~+?U3BJL|6R{0mc|~h&g4_BSLgN+3@}yN{<0K|Z{KY|;-9NdW$oj=r zwmzXN!ye3z^4;#mA%{=%<92?{oNssM6C_8QW z0=fWeO7vkU9p6+AS>FH(k}ydgMEj`FmlY0ozg%VD_h8OWITa^7 zg+|%{*cwL-vGo`=5w^HZ2Wd4nT6BHfsQf*C0_tF9r*Av;7b2$$E2J;-Z63UM$7iMg zNL`TEjCO3{##L@%=i_=H^(7AdHeCwlHfL3ixNjh7YGupdDKio_8iN#8 zeUbYP6$H;hx;-K`0QaL+&|#qpq{A_F$E%egu}3i9<~Ceg^B(lZgI#{zqv3)QsA=sE zt0|4)693t%ziV8~#w7-5yRektriaVaj>`C=vIhigH+-6U|mfc!FHa zM$%tD5f^*Ambw`%YxL8Lv)V_Z@{U#OO(|Z6AFv=B1)g>8Ord5WJMMgPimBzy{C~LI zMaVp3htDae{|E13^M5~-kfzX%iZ+Yd%h3F8a;e3UnJL2JAMT+bx{lv?4&G4N!x@N5 z*3XI)n=Ic=-1$iUq8s!J(ew_y*m+hyzFeYDoXH_Zhl6G^v&a6~5+i~C)}rIOv%cxq zm#;UIa{4iyt5y^|eEyd&B!69F)`hNg+U#ViR>31#SK|GU<Sei$}gIDG3%6n z781-)?B9(G^|Ak%8~Z=`7%PD{_8ZV6`Ft4cG&rEujCIhF5wNT3<%eJD!xKIn=IuZe z$kKZV_&+ai8g8eIL})z-hR2o39ss;$rm4{~ zT$+WhCa`T#BQWx<5w3Ezj= z!ah;49D@KqCfagR1=FiXbHPUUsOZ$%z7b35W9s#@2ss!~23EO{>^W~eLGLV`LmZwAR-J|8}U-_mCV+xsp1 zw?zx>Z`Q3O({Y-4wU#wOu))4<8`=Y+3OQ4dwl<5DP+#RE`{-RMlF8lXs;AvV1g?1v zq?KD(NQVbd=!PwBlui0P3KTA8SV`^Mar^fGxcXfC-~Vn#H?|d<6HeJ$J2`gCq!2bi zTCBARWGOv7qjW92;Ka|s(c+e*$LXemQMAOaUX1)M%6~PV%uDPWX)>zsZ8yXTpaceFt9_qU>vAqgHihWV@AmQ3Y#jOV8RXBS2-I!#0}DabpM(^$O(VGb3GE3dX^s;fb`XW(z329_<%qfn+bkz! z%!8^l{-%*isQ|fRuvJIMr-h~l;lu{S4N#iu+4_6BogdKOBC<<`jf!VZns?vf5|JFo zeyz@V_nW@$uqAu1bqMcJDQ9--m&TSPE4;`Qz*k)A%|npb5T+qTfaUKTG8dC?Dml0I z`6g1v_tMG-5dvpd*|Vq{qcY?$ebor&m0!d(F5k;9#W5I~^nU!C89rGtrxK0m;Wg^i zopoygXTV;U&|o%-m^$h7zsti8_)M)1DMqb-OyTQh1$B%RZh@y?7PWrSjs8|(&}^MW zr!&>PdZeh8DLT4kKcMCA`B3Nmg~PGiJj4J8*?U^$0k?W*C)jxVLZY1)3OW5jZ1vj7 zKs?_MW3y4(i47PCJ6>&Xk7+8w zMq4u_Y8`jxT{&ExOrPu}>g${}92TP1FavFCcBl2WH#K3zE6?Az;%x_79WsHEU@WtQ={7x=Np z!HBsN^2$OAxdr*9mTYXKw!I;N#uMJ=?eJ>N$Sx!^*Ss3OFtG#WHH0BvSHW**gmsqN z<}MFb4D_8q(qFuEVENY-SzC ze0d8NeX!?qN%#)-xrUN;83i73ylRZeI*}MyX)iCmJVPo1^r*r6e^kALU#8y|E}SOY zc9U&4O`7Z{+qT_gPxe%k>&dol+qPY&_w$~a@9+Ex`@Z+yYwZi`THza5?JHe+KdYeA zz{xS{f1z8uU&-P3_}ANo`iAAq`L8IR-f-}I9LHj)eYJKzMo#;^za0 zJ#824F*-yX%*$*q=)*-&NAt+B;BmfU6!y0QcaQu6`9&kSqWe0`tKHg-V7lXjjG$ao zP`o(NFLyC^lT`!ftAO;z(3&-}Cj1KHyj^5Gw3|!O*l|6eDfGva)3lL%S&|nax(Bp9 zAszILYJ9Jv9Th3deN~qGM7<^PtpDQK8u!e_RDJ66R0)TuIwJvKL<%>NSF+4-zTu&Z z|KJEL-BbjXpq?oMG9)?PYI7DGK~dXro)A49_Iok#Ie(5=k=2QImMn4XgWu&SLm`SAk0k1IMJXeEv7uJ+}cAUJo%Vlm2B zu~R9X1R+Bz1^a7r!KJYM2}P2WPwSO zPHuK+-gZ0n^;-_cCc@VdFX!8*39ARV17#ty{~A?VAV}K?HJPa0L9)2DLqJ`+<5hJG zpR2nx&4qX1d(A5?YZDVM(&@c)Br{*W)+^megj?K7Yl$$Uo|MaJ++<9!e;$n~let+bwpvRMuiLK)ho7&4q4XG(9=r zuOy>V%EC~Tf-0wWNydd1LGxE5M9UWEOTog8uo;Om9I;)yH703 z_ijeD60~O6@#}HXkmgYny@OSSF3W+Fh@KS_cwd6ra<&K+MBYb*#V17IHnSAD>DMwA zz#_b>(rA!ix9ZmtXz=yq_}b#CQ9>pK?uWw~Sb&OH%O@kJi+1EpsAeR6n&Q`|NAKYz zDPsg&QK>PfqhG{uF@`EeU4~E4OKq>HfLgofjTRl&Pkr-?X@woFCi~v#5$~iS+*0Az z4=}0hyQp#sNq;?y-_Uy-RxV9;+wV~fZR*tnj6FaavefeKAn&&|fL)z;*;SwFp@}I@ z(7Ki9QF2e#sBHMrokFio*W9oai*g@PaLYQp<{GjM=O;~_^@jT6DC0>8&zo5FxQf|o zsPu0FmlYzrNc+WYZG7UkJDl@<2kp^hDQEY&`%ZfSPcS#UQx9CXE=ZJ%C2oDvyQy2# z;BI58jd_D)cIk6rx%cK29t4bG{j_3(^Ow*sQh@F6ryHg)NJS=(oO%o}`8_rxh(edg zVEy;0Z3SZXv{pfE4`Bgm###Ijfr+U~Yv9jEib3pmOnRWSei73Ri1oB3XZ9C%a2wcv z|GtQoswnfW+`}dZ{o@H)1+IA!tqqw)_~Zk@g8jFYYZDUN)AWiyf%~X-O_+_;bNS5L zMJJsak3y;M0PgZ3N#215%x(M|6T0-g5nc8qKBVw6c5Xy7J~)py1z}6OUh2%fZaA?c ziyuSoOCFxD?%w#Ri+p z&F|3MKGS5kdA|soU7~JgR(0=c;NFq~h^8-DUu}T=nZ+0SUWnMGO{Gr0CI1H$fd@-$BlE7-yV(kTu19fRozMis|OsqMpxx^W< zj@06Fe!)C-@&$HPc7!mQE=vtS@pfad8EzRXGnTWI#<`@eybQOO6{@S>vp-$-itq&_ z_9l+0Ba^G0x+{Q8ryV|LK`G925oaxG*42&VY#w4Ny$p-+s1%x-lFRC$f3EH$R($_i zC!fN0*6VeJ&eI$3Oi>b8F(-A!e_jik8D~N z8FQtwdms?U6|;&#$1!&GW8Ev-Z)BPd-Q+Jxi`-tD8PF--5oWCRbdqO##8V~@ahOQj zd$DuCuuw+Lg}XB-uoOx_fM~ftY{F2I?v;w&CD4xZ9V9(&lB}todb)8%sGE&9!14-8 zr}|m`SKGw;KBiKsJBXtw`EMWS6!X>q)y}|p6iv&0bBDyERN_ueO5eKCLV|MxhLxm) zCK#QA=3s<3;zDXihQk;O^j$(flY^_QNC-8{x?6V-h&K44>{85Smk<@y6*vUC13JLy zEl}N%77KD>hT<}|Lk-a*#%?2Fi03sjq#*`lrO)^NXYR9xXz>iAX@cFnYNLU(HEi!} zQ6J>jYc4w?%y@U;*Kq_CnmqUfA%uTbaO?XN(^tS%x*LgumG3t}wnKY>$QhG)k4ScB zX5k*N?*^J>Z&qtTf8?>Fr9|A>oc|O%y(m>jDt&6w^}|f$!&Izb&hD^{;n1SNBztvg z;Y>r1Z>5lJ;>UcX{1Hon;e@=z+6Qrr$NN0U4{oc7`1+N}VbXoCaE+!Z7_|~YeyrBQ za|Zg&>K2~7FfxXLyegKgXu7;o2Ez{VQ^bzByATanb``HvDKcVUky@socBdxTio4!R zd%FjW%%1nJF%cu9!92kN5c>7tTqJM4QtrAglNSmGz_*$3_^5UXgi4L9r!h(l?xHiM zjZs9*_^sE9;!~nz!?6Rg*)zOBUJ}~|@p?K-n+3x^pLpVsIz`lG z*UoRIn(jMW$RVQc+mP&bGOaL;WBtTm$Z}cjxQJtxGc&&mX z9Z}=Fd}yr=UY(r=sGRjMQ1|5EX&aNV{?>+{5tP(L1Z0?;SUs?Ox4Q+q1;Vdlye<)K z0Q(rUUz?^%MtlYohW(%~#5n;z$Ilpj^AJDFN$1tTQd}!CP0%|DTk|8BYwBWDoGe(N zZl1a?&!*jZaJj63jGce1GVHS(D1<{VAvV^2Az+l6((Wnmp5vMaS?f}(RQKgGv z)u_P?$bi2Kj!@APO7;PYR^rdp7D}Ma8QQ-l6XzZq^^O%5;;6 z%@dP>tYVZ~2Xb3DH|^p@>fc>37lF0RnrD$>(^F)!t8SrAu4{2jL}GTSGA^Vwk(pxY zoT|k(D_p!YPp0yoy|Gl{nNWV2A=Y9S!`UV3s( z-Z;B|6Wnf~lwZfn{bPUY>XzWyF6(-j2r!M+ewsCo(%bN{6QSx<&AFt7m8mdsYKm)& zlE=ysaY5Y|g*6GBJJYDxrrxwQ1@Pp1pS|`8kq$F1slT>Sg_EY%x>XcQLpbh zcWj8`?J1AksB}pI8NM&f5Kcy1!h5n+>gw=}{08Q@a?`3Ccp_nOB0YfGS?X6-6`^?h zJu!=mQ~HAL8!QJNttHb>1bWa>h22#xIikFrvp8OUa=K&(vdo0y?&fIT^r+`&i!Ahk zbyM@_Oo?NU(c(9Ll**D|B(mD?h?Ex+y|g=BJeQ*v1H&qf1PMh3K0yt`Kaapw#C$hJ z#}C;g!a7};+&Q{KhwJ5gL^75IU)OP{nz0)*ce0@E`#jcJaN-|{e=L0)Oo#vJ;ls+P zHFN;$j@$5sQ^bv~*2#rsVz5wWjSg12v`D%kVP;B(P`Ji**uG8dFHZG-g)c&Ea&?ZC z?60sVT9Iy{_0o^AVM;Lj)0T+g5qD&Ah`)B9;wz5-qPp2pn&*mUheX9r@)BN4${j1J ziG*h_YA3kg-cskG&+(&_j9? zPx5&EdUw?yX7wRUdObWVK4Omf{9>!{`b%FuP1qYA+UXQa`CotfEOsXgz04hpBxD0i zV+vj2Bv#xY?(JZRk1b+*S(tU9 zHPW+?%_qL+eX~igo2q+ZN{I?xrmcQ50?vysqGs<^Sq_0%VN6W!pSkPWkI~Wg2nIIh zz#SAnANxoHDy}s;h7J3{hr^TAer2|MDQ#?}Hnq#yd)gSDh&HS8z}LH0F-CnGCH@FlhK$NNa8PABuIAzvrR0 z!pYU?VvE-7aBbqcgYs3**N~@PpMB#%Ha8h6EqJ6(B2)R;RReQ_a^0b^?>7Bvz|QD_ z8m4w5=*+%2QvO@VkP$8<MRIgP1eJ$0u*u5<``ROgpH|$q6Bk$5G?uMF5}xd3 zoT#}o(M7+TGzGB0)=ssW&(R>*Nimm~E>JlV_l+X zw!I3s2H`m_HB>R(6E^8{tX84WqK&K$Rab+nFWwq~g`d7I;$6X<-W6r0UWE5+? z^aV!X{8a!zcbm`zODA;y7Q}jWx0w3L=`9Y4uorP#$IF?$bm(cun#XcShWoLN3*=}O zSF{^}AtnKIy9s0av1PHs?V6_@8i>6^w`t( z#Cw`OMRTcHzEsn3ls)QbearJrgQ#WA8y-ZDh}QZ=3*W1IZG!4k<6G)Pe1w!8v1{IO zBq%|RnSQ^C;Frw9U=UFCK-%g2Ek*U^w!Ish-O;Uh+1ZU~!h}#k4Qn;5Vy&-*FU6f)s(c88t@pce%PK(U zZADX%H0!B~i1TTiL?Co5irs&TwvkJ_;1?8ZG&yZR_5RHVTnEs&VUux8qi_s!`ulkUSmWIAreOT}M1 z_@BR*a+=;<;}^BZ4c;x$TjTPtl9p(~mpO%ee^rA$;^kL^g<~!XYww_W`7Hh@{evC< z!#jp7@Bu@%lVnp*+#m2t8YdZNi}3i0t0Ja1{Thao5xB+j$e5^L z0Dkm!zg)@C^_LdfOL3WFK{i!}>^Fq7-s_-uGFhc@5BP@1Tv8+yUUJKnrO-Vwk4H+B zn&L-bhiBNez0eWxxjYrqU}m!#k;sHSnPsR~-Lj6d*$OWOZdUiGc~}B}Sw-(zi29}q z*KI79^CYeH9AijtMf9ffoinlL@4OGG#&b0l!7<;dO%%kqLg{S|zMUne+ z9u~=U4o-!qi=EbkPQ_Ij;ixjsgXWndaQB&oR_Z)0ajC4*q)};pHZdyAV)n@-Y z?dm|0&VEU2D$m+vY^LukZSnEC7TC zd@rVJ5uf>1vo^!~HZYz|a}giT8TMuVsGj+32KZF>Y7D2oge~|_#Mk=)pFB@ekz2=1 z8T`{>k@Q&Oizu6Zy0JqM`9m^Cjn*3#n37n);wulVjcw^`8!7-3P)rGWG-jKKDDWN z7@dus3TBTw8@U|%i~~Z%5%Y81o>+U6!T^&Mvqvji{yEKT98yDBE$7xtdyxU|d^Db^ z_l=9eetsR#``t=JPPTc4shb{<~2#W%jH9yC8sMf9syW1&Xbto0i5I^}%30A$V=Q6t4 z8BZ6}=)zr^iNK@RAE~>1qOpCUuW!Pt@de9n!L-A7xl=w~OB|u47H79oEhSF^#O`0Q z`Y}y+z};Y-VF4@m<=83bqs{VK6X7z#t!OUo;f$+qBZ;B(i}`SR9rpdg&p}$#+IGr< zqyPx}nBVm*O2c`{H)qfd3c++-sTptyulm+D^Ant*eFY%|mo}R(uG4*VB9wm*_Txvu zR4AcqJx7s@t5>7ZP_{z@vh6*%z#KowuJxvXWbq@)$smsoj)lEWwmKV33Mp(HUQpTB z2CGjM*Xe#9uog%MbD_3tz~Rk8qNtiw%DM=6|b!7chVX~*~fwu36U2@09 z)ha~nyTX*q?t$S{F_C2}3Jvdva<>$zN^ zTbG=OJ_&X{SS7g#8=s9}*3OyM_qkq;DL4TT5Ql*uBHxt%|K-1T=qn58NE+89NhyG$ zcSBV1C7OCj?4j>Fm)yvh9wJ&yXohh%^LXMK+F+!SgF0GQot#lroO-{d{ zaS_2??))ilf2~rIS+f%$MANpFGqQTxw&Wcm&O%cRr$G~y-axXP{l|g)&!;KaGr{js z3UI?$F7ikiK{k`B9|(*aGqI{79m*wqN_}gyVXpBkz5=d->x{1cB0Vc*NR!zZovg|n z3j$9TYwwM{e}6Ucd&g!Lt=>Z?J$hRtTSngacWlwSB~&Pp6>fcnxe#>&0hS(SgkSrI z9xk#tj)tf%%V-_6cQuF)?lp!)f=5THhB+@LiKlt!ba-9SB(iItnS};?A2RpkXfg>+ zF>W`D%1@ErQt=2?;omTK*Ni<6&=Z_EP%np;)FR6zINMpul&z!n4;K$`cLTY9^p~cY zh+3}zzc1@oabV^xk<}H($&k$I+p@;4PqVjYdS)cn9EVf5geL6L0Q@40(@+P^CqftGO9p7Cb{MLQ8 zb_p6S1z^IjMClP0o~i}L2U`f3>Q*Vp&tQhcbTSaBIJi)mcqjowy+Y;|Fvx29)~E5j z57kr|kORDl(LGyKrGd4!{l$r-W+`h)%|bpV(OY+`bN5vyW!$4NXwOJ?JsVQ#`LO!0 zxJAEdW*N69my5Oqey3cyEas=J3Q0|k4fo*eng{k(Q?~MFF?sOcl)U&-vTH5WkyZqsPvMZswic;>91Wmb+PjZAWO0PO>X~SPmo{jk&OrBsRIZ zN9F`hj0Sirh{WqrvNkA;{)whioZj|Q>$v6I7tj5Q=_zXTV(JMI3E6|DqMulp%5R*0 zNa@hT%)edk?}GP|J*qlquSC~?&XHdDTOmiD;;8rr;T2hcWt+9#*;&C2D^|lLiXY1{e{rwmzMC3QU3vK>IvO@YHIC9cYyqs$cP$Ry|I~8AA>vv%c|wYBJ#(mWR+!R?e>UPMm{?Y zI@PQu6Yo#EfJprx6J5WCrel3fYpIMb)q}!EkXzT>h9-fh<4-qhI~O*s!uvb<>`}_<0B8$OsG*RU>TYr`)@~Q|DH) zKgbiiUBp#G;z&I-h%@7`A!;Y8%EH|`2srl?BQ5E>5sbaI4SxIE=VqB~K7veZIhUl3 zC>0k%zIEVpbZfI)R!51)Qf{*HYT((oWLzmJYG!X0G_Y9uFW0T=PhIaDS@UT{?j38v zj2f2Z#O7~kbB{FG{gT>%Z7yl>cuce6;FUW1#n!5jYHq3X0t*cDy~%hy!8rGEo{P75 z6+obGC;R!mec~NPJ$P}yOj@WYv`GNa8}E$p-sjv)MUjLDV=D^+#5?l|dGsD0jDp{T zD@LgdNyLqHXWe%~442Y$)Uu7MDycsBZ^0dMv?3wykS&ei(S#h%NT6zb%=?Jk7MDs) z95e80vhq$V?^eG%RGwafX{8wAzDH?^o6_)jLe&9!ZG`6q*-*fzrCF+(-<_? z&Jm!gkHDMZH4bZ^)QxT%_jVsjSwox}kjuqPcp_Uav%Iso757i!;9XdEi2Ps27Q~gU zJm`{lYaXli@R(@dfIdmPBzolpQw9H3o)hhQbC-Nm0Mt=)tCqE`4f5Bq!rCHA2zn?| z@kj`c%5Jfd-@VxUiIRp&KdjmUB@~>!3auSphX-HY;%GfUlN-E$M_MlO`#UoCIUhfW z%{Ey|lm`CRXyfUI$E57i<`@l6SE*RJb1n4IKh*ytVp~-P)Ua@Q$Tx~KXyF6PVAT>F zgW8wU&KUc(F`Pd%DT3-Y3!mp{5rRbh?FoOKA%#FrTn&(a<`q>R3E7Kaa9?B4y8OiU z!3qOtIpyVt*!xpnc!ZtzIVs|QPH_0}58=Z`_ljjXYAsxs^aYoB=>YmEFY0JTV4NdK zD-+6A=d}wY4{qHlPqlwCPTmFYg@{A-)Bjf>2X+x$|6D$YesmYb<^#~@C&WhDsUWX=m0bS0t7 z0dv-+viO^bj%U>LJ=fW`e3Y=vKucAsul_qPHuYk<{Y^lj!GcH3VsWwi3gn41MceWYf=jq>8&gd+ zU^AabU82^@q0;fs$QYDB(y5uxznO}fjTb&@f#Xe=&! zpz`7Gw98L1_a4u+<)bXy9mhOBizh7O{%gC$F0?BQ=}+1(S+7jz)GIH@+J{yoS#1Qx zCnaO+;4Ox;^ne)Rc$mlD#rg@M3k)yTIVzBOcl12$CRDox#=E2_QK`o1bPz+``Npz>|@dG#i)1YFQ}R=3wieiPdk^M}2EDn)zBujY4(pZd_WejHHfedqx0 zvfF#8Cx+CxIv0hfENL+9H{X|q)jObxHyxS`%+Klksly#LkY-c_tMizBoPfMN18@+oog9Bz8Ng2Ip5|Uq)#at;b*_B=A+Lh_IGf%r8`8Du9@zSNC*p>cPu00wvudk zN3RMcQ?lCbML2wBI#&ECr;y1MmV4Wf^&iwbVX*4b%zEghj}YX)*hYB?_zJX<0|D8?u3eiwees6?>gHkw2{s$)!{m@;#>Mm4)B+K>bc@637h04 z^K1kW_u-D0GSeOg>`q0M(mxhvul4?;Rn3iQ-X`1 zJ9ZrRSmt9$+glgv!3<&QJ@}%Ntl}HaCNO`Bm(S{|Mg})dfG~K6h^{S-^IZ=sUadR! zs@x)w_;)-jKAtu!^E)qCt>iU93sfsb_|E{7q%ujHPK&QWyJW*ic86u+ zqI)s}I!JYaT8QHRMke-ljA^J(QqyhI+kc@%VwYN&16(#|;IGtye~mIN^hwObO{kM{ z?LDjHtk+$bSTgY{13&3MJ}%wB&S*VZPB|N0?Sgq2$GXeRgY($>b5T6J1&)UcQ$8(n zRNiaR;%UPcb9HC~Wm)jWr{N)u0Z~)`{%k34@RXw)^9hL!Lo*LqOHYnshuAPN&KSum zvO#*V;JCY`BSw!NjBX*DJb1=oHlg3QfOsp6k7Qk+f++p`gsP^h;tKah*?9>c*sg?D zhHCjH(rV-(51FeutL<{!;#LMUMhtT_(x}%vRjZ>4s5w1iUB9$X^+OM9-$U#9pQHXK zm3M53Cc3~bTaC; zI;tMGKdW@U-gFDRP;Q>91XFgJC+_(Cx?qX!W{>SPjtk_hzC1X2lKNE>QSCbf$!}ks zR7p1^a~b@L(51^sei}1p?{~>Ce-||Uii%W4Yca?<=%wMefT_(A zN^*BC*5#dDG1&G_P59b{gWP&!Q59vui;-_uQlnr7>wtxZnzK`6Fxl`+lirc|Y$luh)eP0a!l24(&nIry#i`Yv1;R55R+YQU#vTtWhpd-pQ0<$oA8Gh+=j;9)Y zNtgS20Cwk|dv>Q5*QTIBP9)d1bD@YVV`B-08Y7ZB4D+7QOSF?;6{k<9`RBI3I%b=| ziP=1TqL*bWhFx}{>V~;Eo~?@1;xj6N0M9MDF7tB^lGRFVDGd_bLRIsb1J5G=PjH3x z05#`zfi%Q*m=ZQv?srWZW8!R?0yy`{dEen6-2WwzOEniw$Lt>i`W7aDx~^NUXKz#^fYkV=i%4okgd3;$0F}Z z-3I>yPw0bp{3i~>(83a*I5(`MZ*{T`cDIrNx>*9Cn z_sALBi{`@D1`n8F=%RiJ3Xjn;aAN3GuZM(TZn#5|v5>YrUz??rmCGTQm9)@Ltm>PrfC5H&a535uC6THrg+WgGB-iBPxT z=_~o|dnkiqo!$Sl{PCaCb`Hnw?wLOJ(k!(H^Uu}^G;Rk6$j^rg&A@~P?XfS*udyaA zJYkJ2b)p5<;G!Umk>a!Skp9}UuMr$?|(Q}9f(lac5U^{y(oEeG#a{y%#T!xaAe1sa(%3JQ!YwGbD9Qw+twQCL+Zlce01d?7tzE=p=YCa` zO~SrnPxnOrs5xI>Yo9~1j*NrrT;I#>w&3VfN|yfj3jG+}H&L1|w_JW$5441mdzFIn z5^p~9c0yh1SZrybg6GHT?qkUFH#1bJ0=g_eNv^VQmtOrMw{XIHJl}<1K=&}ip>dD4 zrtXfVq$DHW=LpUwnI1_hX1+B(>9DQYYZDpw(w@ExjW`wng_^t7E z-t+5%KAa)oZp6mK2Y%YLzP~a3moP}pSXv9A3-5(^osPo_CR?O|k1H)*>-^j09Qs^# zq@-<4toiBcht6@)*h|W@!?zFjj^8t|bBE_ zr_PcV8)MFgAWTh1nQn5#6gb89HW+W^Z!NPgmFv7bulU_41ki|lG6*-pBKe=k>BIPa zROE;G4Mjg@>j!+RkyTv3q1&0bd!emfoM{=G;Lms)>H-RqKXuCYIDQS!Rg9lusxSmj zXJLT;dEw$}wgK(f6)JG+<}1=&)yK@Ic)!+-S5pV%2@B9Bfh6T-zK-#|mgSs9gDgz0 zX0CeuYZBtMk6%GddS696p0mwM9so*H6+_}moS-~-mU)#*nGP6ga2*wi)DpVGYVFw| zKGwIa(Nj6a1{~czslhOG9M*c=Vw`a&G4vWY)wcg?><8;Bp_sn;P0=jqLUvH|<#J)^ zMkk(bek;bo>UV;;w;44!Y~fRDzFZrmo#4fcyf5ufnJnmIV#CmmWN4-tsS?2IooI2Nxk+$T8B{MXok9H41={I83LN)>gA4wffQIiB(WW zUb;LIb3nls-_zfRg$$M-`}=IMUx5`z4|O{>biyg_TuSmruNqYw0SNV*3# zMS$pzw5wvp5IGlu4@W3w&3GT~4^1dP@6$4UrNp8>H?2%;6uo&>I1s7VgK^?=K0EgQ zxH-`B&w(L#LO$%|2>0U&-;}hSh}avR^Xk|19y1l#S3B_l>Zd?Dy9g3L6mCfmXg3mgDG~;8J}dhFPimZsYrgEpemJx$n1fMo zP|U)|-`U3s%WWk=3;*lMH}V--Rtd)~;rKR{;0V!2J<&apT*prvi&W*(ypVgK8iNSA#yYpyH=ACW#msOUZ(&*zV8a zTn@lVh&w>kYo_K@4n!EpYiPA)gLEH>9ud1})~9gJP?jE&32?LgOpjZ&AzshGpKtc? zN3fSE6Ut9EUP28SD~CTY!w(w(t$xWEyjgh63O4z_5XMV*>>UF2i;UYu$ssSRBM;W=uQv+5e*<&lsTcG6 zabhSPk`Fn+*_w?HTxRe74*^gZrf{Q>vLW9;$0`6_zDpd5dn)&f7Z7&d!&UzkW!I+D zxsFZhV1`TMCJwb{FzBW_J{xGINxrJGrVm_tHZ?|$d8$TAN@aDH?{%&QA3U=sL|T*| z>u8wp+_EB|ZS)3_k4mH9IC50F?6NIk5qLEzx_>^0vI^)~ebumuVd*cAyW?Zw5kkB z@140(maoeHNE#Rp!0MA6iZ(Y63LW8ym&+h`>ZPHv+?IF38?E%yB@qM==zu>pnGsh4 z;_L>D#q&wJ>_Rn6shVC|Q&f%F+gWu!1Ba+M9RGanGR}Eq+1Pw`EGyl;AzG)07_z&<|cS^x4O5j4)C}zfv&Ny5Roi`i@?roS9XPNPNgIc{j zO|U<$IY_+422~<7a9sko&x0A{2C}ornp9sS>1HI|(~Lx&I~n}<=)M&ZVTI+6*m^cy z&hK)_#>{* z)=eC8c-ee6i=oxJvPWlw>x=sILpX#S{RP*Rv(N#QOZXnC95NTGQQOu5vUOKx1^9DM zrWF|5%_xJ)Npzup$%)x<;9r8E*Ehpep@VIczFEt$ssjsIg8gn!yVh-Qo{K@iu&nKU zkw(}$B^nu!M`=iooh`i(RD3L!ffggZ66X$+#hPV%f}nn)QGaLPl%j8S`b#TpiG$6K z1O81D5y#*J-KJ%t2J7u^pkrc@RqIA)54{@m5>h(86*YO}h9{WdT9UrgV8JmF8Qxvi3}Eq!sjRp^rpxy= z%x0g=i()pFxb0Ye8OdE%-IvVEg0hy_|s?^wKH0>a*cb;&mjfcT|?gZESHbd*t zUMh2o%o$Nv4q-Cvigb2@CfwiE9%&S-d{VQc=a&&0{W&^iTTLN3B7Fo)L{i!IP>>lO#2=-hs9O@_?PwC>+6>^N%IV^E3Z|x zEE@$CFqd(;X;7uPp?-_AcT2gnJ|NXXgS5g$^Ay|V^Nao-zU{Zl&o=RUPs8C@B-%3wZWY|qk z+)iV(m-5Xm@AaXoR0d6s&?J-M1o-7i6@p(EEuzCp)QVMY;dUuFbC$m-r~!^ye!VP; z(O6*~x`{{yHWEP~^E!o{ z0-4_5?(MzCO3dgp{6KmL>?9AUY3~`y>dx&?TNdx|tBR<8Y|i^9?h%a#BGZh(3CsrW z@rVaMFm06rITA1k{R-Ei(B_c;gczv)tc}3TEQBLQxKf<6LUMW_tfpUpcJyJ7FD+FT`rT@o{iCSx zi#NjpqC0gx{p`g#>`p2&Msd=+F@{}#8c&7O;us`jzO_Y`d1EP-a$@X#A;Ggwl*k>a zx>f^#b+iuqB#i+8QwW#J52}*?=Gfgm*i?{OzJ}zvhIB{3zG(CFBy8bLC^d~%MU9nk zP@qCeO~&jn=`qkf#lXlvdjQ)#0m}c(MCF;0ALvIk`$%^MVq4}vAjE6hETEMc(@w1W z>|zfh^&i;l8>y`@#`!+7kGIwTQ10O0Yhj$wB$XO0zY@XlNpD1$Ki2a9wgf_b0*ZtK zrj=cu5>Twvk6$pa`+7j0E9@_nz`pT4;JaUA;+CaaJfKM0g|I|~8|@1xy}!wvv*9P+ z-l9)Y98zwNozYRL%D%bpUCNgRU0IH3ED@{YudFa|>V)}Omv||SRz+Kw<};+#>vXg) z-4@4jRuUkFdM?mhr5UOahL8@MkVVdajD__iL|G;BvW=x$7j4t4RYbeG1ayvoZcLDT z<&O%rVfz2F9hhN`>T@?>T^;{eRClRSRFvZW^?UVx;BEwP?F#m=FEy6C3+*;*?qv;f zvO3rJD1fz2NIYoAhJwDJqS&+dpKYTFGFT^$VG5i6AEv&-t?4)FTSY;oLV082Hd#>w!eExv%^*#5w&wcuwPj`5j zKkr}Y?9u@yLO*qwu*8UjjZjP)LBLg48C&YD0Z2B$M>6eHxZI(3@(0L<_jcDdf;A9s zb7oEIkfQq3HvuZO5)wqkG0&PhBWDsNU61kAnQNUNM%oc7!KYvEYq}IDh_Q z(t0|BX?K$okX0l7|5fkLa{~sSJoqKJet$3Z;!{;>?fCHNN3L=qYL(|ASL#Z~0#4)( zTp1|G$*~GQ*EJEtNUhxdEWfMi{Vmsv&W)<{7tO2GP--6WZ1ZmA_>53!eB-9$+*GSS zU2GSzPF`s{J*+r_Xv&nmAQ3~yS_@ne`KHck&m{2dGJI5CYiL;CPW`N6$Xw7BQahmP zw(3=09G{-qypvm-kW?Z0!hpPDwV)PF_*6yQkIe+jM_2dM4NQK}jP>qk+m3j#AOPpS zQzSD`bKOcW^{a_ENw?Y%E`*247UpmtqDY^((RAQn)CB#9vst8tCEg6lUe0| zMw-nLwAQ1GNQ-@~r}`$p21-T4_pw{eGR;e0f)~PYw_C7aJsxhC5gTXAF2N5<&j_4& zha`L%^BI9_BX;vi3oLg0RG|VIaG6C4%UyxhH)C=GEG`5F|L1A?LtHY72FGQxvObxH zx0)y^Je3`s+j?}8to@jH)0Y?Gkzu;8o4sTh}b zPy%5Gt>sa)`~k?r#qx6ezB%K z(4kK=wMjiG)LBfp>gF_B*W0nTNfdO32iG{7KSE{K|F}Bwt_1n^h<(XsIC`<(-pu5G z*@A%8{zka-ev9l{4P3jZ9!?ef&D?&1Mv}!;HMId(IR2d{;`cA!{?oc=dpvqKEpyF+ z>u*ty6n@u4m}!!P&{=+M~M5Y9dgQ2p6YfV1Y`PEpne zN6fm1kLRRDE9;>Mwv%2hwdn8cQlh?pO}n=1E)19AezJU72Z1Q81>{B$}X$8R*D8g(;y?^wO-pK;|(n2 zBL>&pq|xN3JY2;UW+A_VHsQ2NtyvTaX;wv^oZ0_sLK@Q%psDTY;4+~DWmG4cIDqtf zXX1m?89=4?lCZA}g9ID8-C;d(@BhCY~NXGC3RGw6Yo2@QkVSb968nrwHY7yspGsH{R#2 z9AzgPMFYutgl;DMv$%Ahb0#s`vp%Y@HEYEoLs=w&oIkUb0Z;eH_5GRx7fj4;_R%S3 z*Ngxf$F!M+_h_idHz)V0ucxhX@8g5QJuc$ST;%^ZBiagwI=Omn_jHPuK22usQrxxz}`+iQNh8@Zv8 z!GJ4?(?|#ipYtjXQ>*gm_-4vE`Fr`*Vs7DVitQTQqjV{!J~4Z{>8yA0qSjom(M)u z`4pzmP*1VMICUG`EM=7QsGeN`07Sff85y|)9Z}V{yy|-9H7{}c%q+mo^0Z$^D3U;7QUXG~7vV_@I9`GdQ-<8*&5^T8Q%9bBEG@im8njR*PuVygYuS))iE1BM z4sPLH-4e`7qh3ag_MDYxC0e%rl*iQM{YLKebh;9Y}REkvtC4jkOB%#Ypo z(AOW~k6f2odVVPY@RL)zV8h3Vk!@UdGm(j7{c;xe8}42YvawHMAH#}NKqEglJWWZ0 zhi&)0Q-3FrM2s5xONH2dFlcYo=xxgh(xzJeK*PEVc)ufZrZjyMmbeEo!@TsLxA~!- z_IwEsA^YiLqff68jQT+PH-7gElbjki-JHPLvOxI}nla0%SHBc3oykVUV7UyqWx1N0 ziC$r^pDZxyJix#zX8*mU2o739EqXxHr-9c{>c-cS=gdN+ogqIJG{s~x*m9nTE8cgU zbmn*qY}sa^rzfJJkEVBKa+r4QK9OQYT0XWH1$^GPJb0X|LEmn*03C&e)QsHMp>`UT zCV7OOm*aY;8-`ykZud$;9Z`1AO~-nahXC;z6oAZ+Cz^6f5Q6RTSne>0yY`R1c|>$R z`9NT7f$lpjlGR~A*LP^vSnf1@|Fyo1cfx7>P2T=uRJD6I@Ob7WUa<4B7$)H&`d{4$ z|2?Ubn?63qo^ilmJ>*Rr!=~T@TL(cp6-O6mTO$F@pjeZd*6gFyrhqE$HIulJprQxq z-`4DWb?M-d=1E`FNcKDtZ;+0vk7}B#xSXP!maiUW#+RHlp0B5+t$&?lk0Xzh*D-}9 znw!~@K#Jzd@=Z%i`q~freshfmEcrJa$!${HPf+2!F50ZeTX9?U>>S&o9>n!AquXNH zJ@l=#AA;>VsvVy_CcH{<`6a{y#agz>Va3afYUZ@1u-@K= zTUvBdxE&R0ef-uh5|kHsYW29>T?)T)u*pW-h^8?mV&URa3F5(z=ra|0DgM~uF1Nul z8-1<0Im}hxaNca0qPX@W((yKLj?5Y>lW?sBT?mWAW&2T<0p(=r0g=?(H73lEXf40l z{#OiWyy^iNAFJcm8;0z%&^4MOGK83`PvrxfcU9k{AK5dJ zJ-YKNZ>{3d3e?ENJzVk_JO(?VEo&WLvUi=x`=(X`nEu69@`;gqk&OsUN3%vfl;Y<` z*ok1EV%O0l#o0C)?zDh8<_7F8b+;NJ_d3G!fuVx5@OMFy3vURa&P%L}iUyx+R?p`s z!nD+YW1yq{k-?%t|MupOvkt$#)|}%`8~qv50J0-b8kx>yWfD<8+drBl*6K3@)6`-E zok!(oXR|XhE1gHy47;YkaN#%G@-FWDwe3AvDZJ23#5=CV^~q{Gc;po$d`*>|$*`kJ z_E$J(@c^f)r-^>26z^j^kxv~E!@=fv8pwOsm5EAR!4O6Yd z1uJTeBEy<>ahUffh<(%i`3JyP1grW()XWZUb2zoHAuXqMdX+bI?`)gDLx1Zrm$xMR z?^Mv8NQe?jn44fBcFz{dlZ}j%KdJi42mzv00u&?G93Ebs4i&)0@Pw?T(YU zA<-guH5*>X`-$~bTKIxF9jxnT45U@e0|0a%({cJ;qK^4TKt;WgpdX^jmPhO1poi!L|`ie$aZG!!?$T(9n}_s z)jK2m(`SYeY~QPYDu(>fr2mrVB6_x~DyNFWOo!41G!dLOgb?={sukPSg|bThEIJv| zxiLrnXn>?9#Pp_?psYuv2%2Q?)D;rf8Z>pypmk7_5k%57zCSbg;f zCoh-fbk$wv!=wZG#$!WfN}{tNQvi$iP& z!b^8+`$E~<4^lXwW^vY`t>o~3&TzyrE>tJST%}h}+8gCgFD&07((M)earRLg=k30` zUZfw185bfXgEoTxo|f67I;PH=bd>MPK&umGVTsiD6Af?) z0=VMnkSo8cwKWZ|CUMTBIRWI5HUZLPTuI+qneXX21re2FCkM6Pzs*Qu|MPp1709yL zs)TZR((4w2gls2Y`8H5@tl`#AMV3d^jN?AfEj-QB9f??#dV>RQGmLPPSNfZIX4udt zRazb%Jt~6(b??;~=JY^`$Sds=v|}O`2OD6QKYDnY`lc}r_$J# z{36eKsFHk>N}1Zz)DvVH%T#jvmA=0AY+9pUwb-2Iuq=G>^Ze~#0Mq$*XiFt2TqN+@%Hv4yy6`cVtW(USV+? zi-DTdq&_q2UyFBVGaiP+CO6SnGDRWXeU3M4Fln`pip#)M5L}Y(cq*-Q*REoY%x_iR z+ur)02w??O_gbefy-Jz5qe`KCEV7ZW;yBnaqFT&yFsS(Lr{|MPgVXf+Y;5BlKxAKO z?ZHxhOH;%%k)DYUGT$P;Tb1B8zZGc=RT&6?m_%{vJ?+xVJkHwGH+>mQV4hTniTm2! zqu4Pj%OlTa8EvS_BqkEaVBtb`qN%k&=6=W!QF+O$?Pa^YaU}W9S!%U`vP1=w=J``m zrXC!_8(M-D4ojfq)T__sPk%_z*0((G)3SXFr1gm&%hf{s^UBY%WL}hb`llN{H=(nB zG&+%0TF{cYqYLA#=V{7_oD&fIAN?p@{2RE)+oFCVTkb^^RN4Li=xu- zC`b-6ryukY6>q_m8u91f_S#lPs)K%e*9YcdRu8k?I?6kKTb)t`uakOg|C+lY*E5#4 z@A0q#(#*ZPB!q8g3Sr4N2c)zMnyhi%!@4UT-xTENIR^jek;p1N;F0x1*=T;p?OB7f zOmxy5ev&Va;!A!+<$yO18y@L_{T4A0TWj{aHmfZSKq`$w;RW<$j zg!A84#IBt5{;aOabS}{s*~ixA26i_yUuN*EmUtjMnwWn>>t`Rp$Yj=?Np;Dmim_Ze zSF&Jf03*8wExiDBNw~3YY=-1WUExGSLA8It7&UA8o0sM=^8PPvS;h*rRfDw}`BY)% z9pAb|!n|~(TV`RGT>pF?8b+Foe!mP1TUz6@8#D#+oZheRH57afYU2P4vjZa z_Bx=~Q!kV2noYySF&cMyajCz7C`(H-6L5NJ=ZxF zX_x%>X95lWf40zFzI8FnuNQ*u$n)gL%dL1y<* z*T{aY%qSFn!L#{(;$$(giPk_uYEb{JKtZmrBpk7{mlwz-r_@pU)I!CmwnI4BZepTF;V*hNL&-9PI5k1q(y`i zD-l<5n1v-e&ERQYa-qum?eGJ(hZVbFc&?Yn>pwS?dX6TM2iT(#i;b{D#-F`MTM;R= zk4C6cpc4XQzirY*jg&*#zGAm7UF|E`gz+?!^TDg#>WT(azAmrNb~maNY+tM1_v8E{ ze3(nqaji1Vo$`qYWgvMCtIz3>qz8*o_P~OV0HYg^jidUDuUr}~mi3G+bboknS%Wi6 zZ&XIUumBjAcSyanRxsynWX|=xig8H5%&OtB8}ba4u1L4U`kQuqGDprdTGitd(6Kp( zQm!T~IFFI-IBuuCz!Bw23hi5GADP*)X7Qjl1KU=0t!dQ z(t3_un#{oJ*#})Q1tzR$w^Ew}l*16Z6ZQ8W{Vv7Iz7z50Z{M6(OYPpMNi*rt^|3r# z#M(C#A~~;Y8vve6o_!r*G_%SW>f)%{{jk}h1D zx%RDy=pfp18t~ILSWf6W3Z5r^$t!8PoC2eckW6!<`*oRfYb{jhGKS5_0oQa3;;|`G z{OAlEmND4l?RAgZf4tN2+cr^{Qe0|Ei>$BN{9M7?Nrc7b6dH7D@yt)IQfq4Fb*|OF zPJ!C`5QlZ``p*M&pR(86f4a0rbdn6Io6U62Ea_s2i#OPXW3#;9bYel_y;a;OmFGcK zwqo8C%3-G+bT$3h%-+!`v~Ep71=9hIx(GJb5_Jc`WZZ9uxHb^{*;YzYFJx zEYc#s&A0oHich`JL70c7P?nBy(f?vfTG^~<;?)x&+gPq z6sw9M*N=kU5llr4)$9y+eMZiHxo7Z!dLc|i=H%fXxe=2^Mu z(Ef5r=r%u3aNL^U6`PU@W7*NH>L4l|x96zg-d>42k+Jid(6HVzMHzhPc8jO89VELO zbo^hx>+YShp0H!WI;jlGr(S(@--Y!c?5*knQ{Ez@3DpvhHm{{W(U^LgdN|{vByS=z z{=kpK#gA&q-2xr9$IV@;O&*^VoMC#7}FZ|_;I~GB+j7rdZlKs6C`*a^( zlhk@zG0)QwawN~zfQq#e)07i|_RNlkv+Wg0kOKns%ym=HkbL&A3yc0{RR-L27W1X# z9Fu?YKQO+nBAdENKqyP|4r&nZO^ z0=r}M@e!^&NYDzlflT5+l~~&1u}G!N@tzBLMMD-s$NQIhLP?eW84x-3i~-Q$G=<~|R>dA|wu-n0;WK8IeOv}^L8i=24j0>bThP3aZ(`}hty#T&euS-a_F&ar%omk7y!o*Z4i&!0ScXJK^E zTD$a!?&wmFIo+H3rQ-M@BXJ@P!{4rnIWGsSzP2wblv-&dFXgp2Z%Ox749O@pyeGGm z#6r0}bzxDgj4e1Hbd*xGFv1kH*0GjrcbJKjH6J!{kffA8#moqy#wIe~1g<`fE$GbbYkf(e?6B zDW)1{iq1Q~=?im%^9hKDn>N##W6A-SEe#!R$3p0ABJW*&b**h1DPW%!H;?#u6W!tP z^qf`yU;OD!k4w8GE7CzYp7nKZpUPlumDz%>n@N^-MA^V5L|debfd+DT)c4G4}x z;WSQle2J7uMB$PXPZN9aLy?F|oO+?oe!*klX7xlj$NXpJxJS2kyv*yix!IJ*9Y!h- z=>|N-rJ7uL)5wZj{@p#aU=bLIE%{q$(!#?x4s=BfdbmJLtmv$wNurHMrt@5+*0 zG-=vx@0Yq=Ldn&PT$yjqd@ZUkFeZdJgGtM8++Q7Q*9n~3JjlAq%QMWn;Xcd8xEXb% z=y*#1{AQZfECLAmXMRK@52?vaQdd8SVR=9z;#1OdxDA6s)V(u;8vH?8i`582)-$IH z09!rz8>{M)bJqu8YsWu<1G3DijCb>&tw2JX(%5!vv!}cr5++=LusP@(9}M);&QAT5 z8|(HD?&6oiDl|o>fCY#d`#jMCtR3{=SnJhm@`b;)_t-zDf&wTV+VN*i0|FzVd%=ru zO+-DtMwX@x%M7~Q|7ETe>GhCH6y!}@p`WDgniaDen)Uq#H28qpZ$`OW`rElg0nFrj zmkJ|h4#mG$4U~PkC=>j2!PQ?O;tFB85ujFA#Oj91n3i!S%vLX8O70# z_nY{zU5v|i{ComDG=L`17aKOO#9kUViA<$IjI5ubEvTY{X=TFjrrHp>+5}B!)dN0H zL}~dux-SK6)~s9x^7i#d75}%~s%ZE|SKbTagm@7=`O6}cve zJo$-%aJJ{<$$o(5cxuY)Bd2T-QSI9k<@%b~p0xc+&d~$c4J~ng4aujI6|{IPfj#Nl z1O~3(&$D*JV}tDaskLLMFs9^WaY;K02%0UWVkwz6JC`Sxx^1#r3?BI)lg(jQgAQ}2 za*at!%Wi_R)%1rR3SL-wC6fd&=GuQU+4w9V2A=ZnlW~crkUd_1jdJoF{`Y#n3f=)- zPhak-Lk%z4+86XIy_8%0t zpKx2w{nNR24cI9E&xV0dxy;sEZnkfr?z_!9S>aXH3#?cn42CmLK_*m%6$X+&Ky+pe z20d>=F4V)1`1S7WPKOp^g^0*H^lIjUoE+Gm>R1LaBn+vGw<|MXa5TzKf%BE1%z$V( z7mpD+zUKSEIU8Inb@k&Xnhf1uP9cvlz3huQuX$Pm>R?kj9*r9@^1=eUd;LD^s_o$P zX#KVq8@KxNu z090pG9P{9Md5n)^V8-i)|n@rjtR>CoMK0&A($Ur6j}B z9Ukk-l5b5$O7mE& z0{)dNv0!6RArh)b;>tj>s{KA)d6=RyD#pA@YC3527EglgfcJ~UbN+?luE6E+*4U~( zm+`Rrlw9>IZI<8LM)!bhp^~~`p3zEQ=kX+G_M@apEusq5x!QtdBn^IQJABEstxGlJ zTaL9dt06ECXby8FanJf}>k%S=>IfAL5YNjYdZ?m_YpWG~vr0!tl--I}s)sS|?+IGoXePh%9nu!*2CCfRS*VYQ4Bj421Z?*f( zVPW0?WIx3qUw$Rpt?89NtkTo|Q>A(7-^W5A&`(Xwp;2#0G0@I{&~gvDZO2x8F*>{~ zg*ERRh-p~9D1KwTLl~yVk*AXcLtFR{rjdb9=4~?;-3BEB~iW z2S*uTmiO3Mm^9vFS))}@bOD4~LPn7q+3|+;=hdg)BKKUvf=Uc+D zVQ-SGiLS`L6c=AD?Fh2IDKF|zgzYArbUoV?;wLZpKgJ^_>~7YsHdRCvJ3Lt#xLCx= zGsj}W8XUnf6c_qb(UUshqxze1431C<=(yE*?{{t@P}HX>Pef=H^kwe^J1{fTB0^ue zEL&!ze0+mtE0c%F;;pKRW#Z{q^IhT(C4Zy}{ik**KPC?Fz6F-sB^Ytc$MFwu*$&!N zvi?eSEv1eyEaswF=|gO#{x40Bl^&#yw(}g`@3uFK$1}bDX5KIH$iI-ySiQ^LHB_8v zA_cExaUlFt(E9uQGCL!n?=>Zxigh$ul>X%K1fsErTDsijv4@JUj&W{1?^D>-rrlr% z`4pKX%$DWd&E0I{z7$hoC3x|^JQ9>oB>zh1rH;@)c&EU}B5SpiDflTc1;`;kWN}`2@d3-v-M#@Ie z%vQ3TXyfH!*9@VjK5y)m(cpl8341r>IR?1mD|UBK=yp(ptKYi2`}o0wA6}AD0$+}w zz#W9RXsO@p36$zJSw>Ln=&^^Yg_*Ss6NY^aaI_;Tzl&;U)?4{D!tf#BeaxLEJU$V{!qrZ@H`)vRBIuavC zIm`G&{gT3JEdPiW8!9tkVJlJDX%jqs<%GVzgftbuL#;HN-@8Wy zYjGoKprn-s$)MQtv#0^fLAE~Lf_VH3I*pnzuSZRfuT_v>=!76BIQh}NfSj=8LkJ5+ zihH&I8lC#&ji!6Dji&>*!jki2cKcMd^fX;K%`{NNv8E{e=cLdRb!+`W5&m2Snms(#Br6#oY;?qk88Gib7g$?~_}iZn!RFz#3fiPhW1`c#?z zM3c&8W$8opB|k_=q#^+oGw%{>R4jYQ0Td_i`fAKN8WgSS-o}bUXB*WdO>lmL4(!_ zY@Vw&LeWMp4y~%zz_%Y57#T6V!?l&PoBpo%QtcQZtr)^S_SWqf-dC+S7%H#c6XGdG zO-?c5P2s7mqex>(y^?UepKv`=ZKQjP|8D9zqTB8_{k}`yih_QB&ih6w68d{xV!wMd zmu=cHP@QmK>Aaib;+N%5^?apoMKOHe$-OZL3W*NE#kjGD+p|f{H&_3v%`2j<@&0&< zCgZGobHRVVBtYb?%5uG_#DxFtsmu9sAiyAk?#fq}T8g1>!lirN4!9C#o|TBZGt{@H zwZ)N2sVRNfF*UWCvRB9~;7O!Wn~ZS6FL?Oi!Fhwfe}vl=dsv?^a8H*kZ_RyWY{?L* zb5h3#u~p}?b+pm)%-V?vx|5FB7iZbOb0?Fu@v^c(u$xML&6d*IRhKAyQ>7qG(z2oR@Jn`Y&>7!v!GF+Tz9df8gAc9CAS7d)iB zrNiKJFC^!=USwx$?lkg&B1o57AOUB()x@UlrOw3B6$k=?&rB6o^4;0!UpJ5PbNJ6p zxZ6*dpc%lB)&vVWI}{nqBO{VX!cndGGQaOc>@sg) z8RO#U%+k!^ZMCnCnrDh#=__*y2g9e%HAf)oF501@bh(|*H?18_`~outP+{mf2>NSJ{wL8JNU zWw1@v)%WY%$=M3wR|@d=>f~N;!r#v?=GK)T_GM*W>^o>*f4CQmML=H#GhB-Z_Py3C z17}i($2z_WJA{z^JtI^kJGEwO^W5z$th=-5UOO+3b}U1M)A^y|NyOXpfnFVl-ASu% zifXS=@T;kj_m|uJ#Rk2rmlY7~ta%|rB@du*6HT6n);%pPb-9!7O{w_6nI@5uzNTsu zu&bwC{e#I4*q62FGP~?ovQdt+(9r*+RHK=+mGTmL4mzSe^{VsUGy}_E#6e@u@qzVS zxIGqGqi|-@cV)f)1IX_1K041s3WJwB3|1GJPozbAdX^br8c-!?!e|f{-C2nYEM?|H zb4L&d4ASY0sXRUq)BPPX`qBG4-Ns>AYw6m}~C0A0m5P%$!R3%w>l|yA<{sW-IXAf~5_0NG0

X~dF|}Hs>f(Ivy!k@axGSV%;ji>rJEilsJ3ivi$#^|xv#ZZCp2^ZC!u$9 zi71oG8=U33;NCLpdM!A>q;f7tHc6{QTOo`lCm_B12?<0%5FkGky2Bna?%p)T%8>*9 z$dtrabgb?;bHYocbNsx%v3lWrdU^}}+JKyMdPt(VSS{MJOjG|UKTCSRPC>i%dL<5y zfy~io(a{_0i+7*{M*d&wg8-^FRMbh+xz)o%iD#190FM zGDN(yphj1s7F41sKB6&Gn6h-*Nr>@Xjf$+nE5>(}fj#a`SD90C zd(<$4va7+;T4q*H^0Rl9IN0Wp0J$)ls^n1$BwAgQ)XS6C+&+PXEZ&~uL&a5%eRrDH zRq-^_J?9NeE(>`ZT#aqG&*oi_h2@(UImLw|6|KBGcxIiyr)yx1 z;locjH7W)uVyV`tc`jWSWZNe$oFf7ZrjXj%Wgnz?=|vjA&=-{2H$O+VwR;ZNKVQuF z>$aY`+=;1MK0f#zn?v)*DB|36s^w3#FyLP9s#kt4FQRuDV6Iuz895y0ELPMJy0MBx zvHhnLXzJluGzYt2ND*M*r#A_ox-iIC$ZsNj1)|vHJju>YcROJt7mTkT)XZ%1uC~&q zd1U%`Q>PU-MXBY2Eod2>bFb%)nr`f62W{(H%r_m6a?p*;wQVfC|nbVw|QYNga zUhvWDNSVd0LMsZ8iT9fW-6Bq9woSE7rY~iR*#d0HA?ACCN`sZ^>FOhSsaGQ3Rbid> zQ3S`e1+J&<=WdNwxE~%oXq$C0u}g`ctE9!&-yy#=w_3C3;+ss9U71o|oS$)ZzMC%n zzJ`Qn!{xasCS7QTTR$PIhE}%BDZuC1A}tVMi$D=dAFIN~!E!iY`WsrWRpH zs3+>Q`9-a=*irDrjm9R9^O9eI-G4C9Q79Fhy4(z`44|eQCKFYjpS`xZF5D*5Q3ov; zxy?o0|GQjWzW4dHN0k{%ORnN-=zBf+onsN<7mfoyjZQVa^IE;|Yp>9IE76$eY#YsA z=n;@C)aWoAOfH?2=jJtLrp6oJXkqf8LB*-{HY1g)8&PBKRBLCkY2C-mlGoi`R(bl6 zqlT8YS}={}xF?R-s#Y#IA}OqEGO^|U-Y-IMImSVmLn4*FwsT4g zY6r@Nc)^Mf_WX42-s+rvG3-v>Hv+RmPi z6sH9^v~kye>{q|Qz98xsq;C95qlY)7pesTle#2>$>FX;BmJE_!Y+g!Df1^))6wsSA z-4WwoJdF{KqzD3QK7%0q@s26*7bf%8b9zuZ#R7;omvr7loicd`MGbWlT(Bm9#rIg` zAnhj70CuxA&{foZ94}9Z(@FO~3P+>(Ym|IhaaW%`J~4kr;}DvP<6;Kg295;0+NVI) zXb+Tv5G>ZB^{Lu!P9@jb8iJ`*$#k154Kn+7ace;e7N!8%Fq-hQU=D-zvn%x2&{t27 z6of#d1u))u;O646wa?8eW7+ib(*^LhlHdH!(PLyq>WZIDnh*>3<$tnQL2P{eGjMbR zkF3@T#A82X#<7M8?tSvBeyGlJ7|7m7@<~Q7b*<+zlVfnubG1&F-NlZQHyA5eu^yOC z269W8;(l-vCWEphKDC`i_4Db*3YB2D6s=G|JS)qs zy5mE~0jUeyj=pQx+?m(!Nhkz`YxbS&!p$8@5Dt~?(%OrgBf9(c7|WvS3Z6oRFiNeu zy%|)aGhadPqKA_a%E{AVY#@XVR5nK)5^(2v|L=1?r6FIBGiR`o*`mQ=Woh3P#&Bns zA*XH#y?B9%AKF5`Bef1y3(1kRV+tpOfJ$#~bi9zZ z9VYceHZ=f#X+C_iLs_a3YJzlt_i%c;CX@wHR14YCPaNiT)|Tt_UJbY5ajD>xeJsp1 z&(@-Wu-QwQF1nJXj-{zIAZ^_{8n8V$bO+qYit^lFCun>vvdl2Xh78lV-8SZmN$dW( zY2S5jD+?y<&e6Im1M4)pS?_8*O-_UpZ=7Af^A3d`DRERz)^VJoQ&R62r&npAfx8qm zeBnopF1+cKImA+soH({tdDL@@|6CKw3+Y)WeV0`W;YShSz(Z8tm{^m2S1+_5yf3ja zu`$DjtTg@%&Zb;JmLMEy_-pPJlCgz1X3(_)#WHy%AIFEw%riGaVIitgJjlHo#oy$b z$=k3EDh*7pPWIIJbRS}u+g)(qPHlNW)CZx(8m6{Zu)AKZKB?-Hk}>b2wo$;dsUid9MnIo~t(k%yRA54Y`im8_|xPk=NaT~znA^(y&BM>he6NgeR# zMmLpED?Y^_JzOPrQ>;y0iejL#5k~)lVWdwgEFy)XF~(r`Xc^C?qMR#7_gopKSahNc zcA&iHmGkVT_7o)m^LhV%7!x&?2*AnA>>sQ48?p2m|OGP9U!Ji%xmC%kmnaF_yx641tg-0*TF-5*Zi1L zO%s*{=*g?pu)DfP%@pKfP43=veR~_Te@kCec$;b8SqblMa^3L0!}>2>xW81p=Lgpb z3oS|CCgvA?N1|x+L2zCD2`TO=n zUzY5>1(};uB2SD(*$9Hk5KxbC#g&M#m3YsoU;o{8sX%!>$yw1^=51q(kBNzP#@+NL ze=)P2*ERD(s$);uR??bh<8sBNWWm%Qw;mU(#lh@4p}Xf>p+{#8+W?02c+oSYYvmQZ zg?Ykg_PxP=ZNA$6xlqYZng6)M$X^cIJcrPkEJfd7X-F8U>_rn7^|bcQp<}yNmfK6q z$BpxJ?a!t?Huo1yBn5V_uT|2o4hp+N2HB7+rB z>VJmAJG94SDPboXyk=M|!|f*F1Q zN<$74@dspK(N044u-D^AnB!#84G*Lex?JYz6>Sn#Wphx!a4hxY-uqq{5g}4q*yvqq zFAchW;kFWlQuEiwmW)%d(Jw38C4dUVqYBN`<`zhJHG%2mdP0rB?d-AAMVjujBK