From 65df698570dafec18c0d8f226e43f0d35257227d Mon Sep 17 00:00:00 2001 From: Cheng Zhou Date: Tue, 16 Dec 2025 16:15:28 +0800 Subject: [PATCH] =?UTF-8?q?Step=202=EF=BC=9A=E7=94=A8=E6=88=B7=20CRUD=20+?= =?UTF-8?q?=20bcrypt=20+=20JWT=20=E7=9C=9F=E5=AE=9E=E9=89=B4=E6=9D=83=20+?= =?UTF-8?q?=20RBAC=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/auth.py | 35 ++++++++++----- backend/app/api/v1/router.py | 3 +- backend/app/api/v1/users.py | 51 +++++++++++++++++++++ backend/app/core/deps.py | 40 ++++++++++++++--- backend/app/core/security.py | 20 +++++++-- backend/app/crud/user.py | 56 +++++++++++++++++++++--- backend/app/main.py | 19 ++++++++ backend/app/schemas/user.py | 19 ++++++-- backend/requirements.txt | 3 ++ pg_data/base/16384/1247 | Bin 122880 -> 122880 bytes pg_data/base/16384/1249 | Bin 458752 -> 466944 bytes pg_data/base/16384/1259 | Bin 114688 -> 114688 bytes pg_data/base/16384/24576 | Bin 0 -> 8192 bytes pg_data/base/16384/24581 | Bin 0 -> 16384 bytes pg_data/base/16384/24583 | Bin 0 -> 16384 bytes pg_data/base/16384/2579 | Bin 16384 -> 16384 bytes pg_data/base/16384/2604 | Bin 0 -> 8192 bytes pg_data/base/16384/2606 | Bin 24576 -> 24576 bytes pg_data/base/16384/2608 | Bin 114688 -> 114688 bytes pg_data/base/16384/2610 | Bin 32768 -> 32768 bytes pg_data/base/16384/2656 | Bin 8192 -> 16384 bytes pg_data/base/16384/2657 | Bin 8192 -> 16384 bytes pg_data/base/16384/2658 | Bin 122880 -> 122880 bytes pg_data/base/16384/2659 | Bin 90112 -> 90112 bytes pg_data/base/16384/2662 | Bin 32768 -> 32768 bytes pg_data/base/16384/2663 | Bin 40960 -> 40960 bytes pg_data/base/16384/2664 | Bin 16384 -> 16384 bytes pg_data/base/16384/2665 | Bin 16384 -> 16384 bytes pg_data/base/16384/2666 | Bin 16384 -> 16384 bytes pg_data/base/16384/2667 | Bin 16384 -> 16384 bytes pg_data/base/16384/2673 | Bin 81920 -> 81920 bytes pg_data/base/16384/2674 | Bin 65536 -> 65536 bytes pg_data/base/16384/2678 | Bin 16384 -> 16384 bytes pg_data/base/16384/2679 | Bin 16384 -> 16384 bytes pg_data/base/16384/2703 | Bin 32768 -> 32768 bytes pg_data/base/16384/2704 | Bin 40960 -> 40960 bytes pg_data/base/16384/3455 | Bin 16384 -> 16384 bytes pg_data/base/16384/pg_internal.init | Bin 160044 -> 160044 bytes pg_data/global/1262 | Bin 8192 -> 8192 bytes pg_data/global/pg_control | Bin 8192 -> 8192 bytes pg_data/global/pg_internal.init | Bin 27484 -> 27484 bytes pg_data/pg_wal/000000010000000000000001 | Bin 16777216 -> 16777216 bytes pg_data/pg_xact/0000 | Bin 8192 -> 8192 bytes pg_data/postmaster.pid | 2 +- 44 files changed, 215 insertions(+), 33 deletions(-) create mode 100644 backend/app/api/v1/users.py create mode 100644 pg_data/base/16384/24576 create mode 100644 pg_data/base/16384/24581 create mode 100644 pg_data/base/16384/24583 diff --git a/backend/app/api/v1/auth.py b/backend/app/api/v1/auth.py index aad10ee7..b0d8ccb7 100644 --- a/backend/app/api/v1/auth.py +++ b/backend/app/api/v1/auth.py @@ -1,11 +1,11 @@ -from datetime import timedelta - -from fastapi import APIRouter, HTTPException, status +from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel, Field +from sqlalchemy.ext.asyncio import AsyncSession -from app.core.config import settings -from app.core.security import create_access_token -from app.schemas.user import Token +from app.core.security import create_access_token, verify_password +from app.core.deps import get_current_user, get_db_session +from app.crud import user as user_crud +from app.schemas.user import Token, UserRead class LoginRequest(BaseModel): @@ -17,16 +17,29 @@ router = APIRouter() @router.post("/login", response_model=Token) -async def login_for_access_token(payload: LoginRequest) -> Token: - if not (payload.username == "admin" and payload.password == "admin"): +async def login_for_access_token( + payload: LoginRequest, db: AsyncSession = Depends(get_db_session) +) -> Token: + db_user = await user_crud.get_by_username(db, payload.username) + if not db_user or not verify_password(payload.password, db_user.hashed_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", ) + if not db_user.is_active: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Inactive user", + ) access_token = create_access_token( - subject="00000000-0000-0000-0000-000000000001", - role="PM", - expires_delta=timedelta(minutes=settings.JWT_EXPIRE_MINUTES), + user_id=str(db_user.id), + role=db_user.role, + expires_minutes=None, ) return Token(access_token=access_token, token_type="bearer") + + +@router.get("/me", response_model=UserRead) +async def read_me(current_user=Depends(get_current_user)) -> UserRead: + return current_user diff --git a/backend/app/api/v1/router.py b/backend/app/api/v1/router.py index 9697fad8..a30bc091 100644 --- a/backend/app/api/v1/router.py +++ b/backend/app/api/v1/router.py @@ -1,6 +1,7 @@ from fastapi import APIRouter -from app.api.v1 import auth +from app.api.v1 import auth, users api_router = APIRouter() api_router.include_router(auth.router, prefix="/auth", tags=["auth"]) +api_router.include_router(users.router, prefix="/users", tags=["users"]) diff --git a/backend/app/api/v1/users.py b/backend/app/api/v1/users.py new file mode 100644 index 00000000..e0b55678 --- /dev/null +++ b/backend/app/api/v1/users.py @@ -0,0 +1,51 @@ +import uuid + +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession + +from app.core.deps import get_db_session, require_roles +from app.crud import user as user_crud +from app.schemas.user import UserCreate, UserRead, UserUpdate + +router = APIRouter() + + +@router.get("/", response_model=list[UserRead]) +async def list_users( + skip: int = 0, + limit: int = 100, + db: AsyncSession = Depends(get_db_session), + current_user=Depends(require_roles(["ADMIN"])), +) -> list[UserRead]: + users = await user_crud.list_users(db, skip=skip, limit=limit) + return list(users) + + +@router.post("/", response_model=UserRead, status_code=status.HTTP_201_CREATED) +async def create_user( + user_in: UserCreate, + db: AsyncSession = Depends(get_db_session), + current_user=Depends(require_roles(["ADMIN"])), +) -> UserRead: + existing = await user_crud.get_by_username(db, user_in.username) + if existing: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="Username already exists", + ) + user = await user_crud.create_user(db, user_in) + return user + + +@router.patch("/{user_id}", response_model=UserRead) +async def update_user( + user_id: uuid.UUID, + user_in: UserUpdate, + db: AsyncSession = Depends(get_db_session), + current_user=Depends(require_roles(["ADMIN"])), +) -> UserRead: + db_user = await user_crud.get_by_id(db, user_id) + if not db_user: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found") + user = await user_crud.update_user(db, db_user, user_in) + return user diff --git a/backend/app/core/deps.py b/backend/app/core/deps.py index 45cd682d..d2ceca90 100644 --- a/backend/app/core/deps.py +++ b/backend/app/core/deps.py @@ -1,26 +1,54 @@ -from typing import Annotated, AsyncGenerator +from typing import Annotated, AsyncGenerator, Callable, Iterable +import uuid from fastapi import Depends, HTTPException, status from pydantic import ValidationError from sqlalchemy.ext.asyncio import AsyncSession -from app.core.security import decode_access_token, oauth2_scheme +from app.core.security import decode_token, oauth2_scheme +from app.crud import user as user_crud from app.db.session import SessionLocal from app.schemas.user import TokenPayload -async def get_db() -> AsyncGenerator[AsyncSession, None]: +async def get_db_session() -> AsyncGenerator[AsyncSession, None]: async with SessionLocal() as session: yield session -async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]) -> TokenPayload: - payload = decode_access_token(token) +async def get_current_user( + token: Annotated[str, Depends(oauth2_scheme)], + db: Annotated[AsyncSession, Depends(get_db_session)], +): + payload = decode_token(token) try: - return TokenPayload(**payload) + token_data = TokenPayload(**payload) except ValidationError as exc: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) from exc + + user = await user_crud.get_by_id(db, uuid.UUID(str(token_data.sub))) + if not user or not user.is_active: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Inactive or missing user", + headers={"WWW-Authenticate": "Bearer"}, + ) + return user + + +def require_roles(roles: Iterable[str]) -> Callable: + roles_set = set(roles) + + async def dependency(current_user=Depends(get_current_user)): + if current_user.role not in roles_set: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Insufficient permissions", + ) + return current_user + + return dependency diff --git a/backend/app/core/security.py b/backend/app/core/security.py index e81a5017..fe9430ca 100644 --- a/backend/app/core/security.py +++ b/backend/app/core/security.py @@ -4,21 +4,25 @@ from typing import Any, Dict, Optional from fastapi import HTTPException, status from fastapi.security import OAuth2PasswordBearer from jose import JWTError, jwt +from passlib.context import CryptContext from app.core.config import settings ALGORITHM = "HS256" +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/login", scheme_name="Bearer") -def create_access_token(*, subject: str, role: str, expires_delta: Optional[timedelta] = None) -> str: - expire = datetime.now(timezone.utc) + (expires_delta or timedelta(minutes=settings.JWT_EXPIRE_MINUTES)) - to_encode: Dict[str, Any] = {"sub": subject, "role": role, "exp": expire} +def create_access_token(*, user_id: str, role: str, expires_minutes: Optional[int] = None) -> str: + expire = datetime.now(timezone.utc) + timedelta( + minutes=expires_minutes or settings.JWT_EXPIRE_MINUTES + ) + to_encode: Dict[str, Any] = {"sub": user_id, "role": role, "exp": expire} return jwt.encode(to_encode, settings.JWT_SECRET_KEY, algorithm=ALGORITHM) -def decode_access_token(token: str) -> Dict[str, Any]: +def decode_token(token: str) -> Dict[str, Any]: try: payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[ALGORITHM]) except JWTError as exc: @@ -28,3 +32,11 @@ def decode_access_token(token: str) -> Dict[str, Any]: headers={"WWW-Authenticate": "Bearer"}, ) from exc return payload + + +def hash_password(plain_password: str) -> str: + return pwd_context.hash(plain_password) + + +def verify_password(plain_password: str, hashed_password: str) -> bool: + return pwd_context.verify(plain_password, hashed_password) diff --git a/backend/app/crud/user.py b/backend/app/crud/user.py index 28a36e3a..673851d3 100644 --- a/backend/app/crud/user.py +++ b/backend/app/crud/user.py @@ -1,10 +1,12 @@ +import uuid from typing import Sequence -from sqlalchemy import select +from sqlalchemy import select, update from sqlalchemy.ext.asyncio import AsyncSession +from app.core.security import hash_password from app.models.user import User -from app.schemas.user import UserCreate +from app.schemas.user import UserCreate, UserUpdate async def get_by_username(db: AsyncSession, username: str) -> User | None: @@ -12,12 +14,17 @@ async def get_by_username(db: AsyncSession, username: str) -> User | None: return result.scalar_one_or_none() -async def create(db: AsyncSession, user_in: UserCreate, hashed_password: str) -> User: +async def get_by_id(db: AsyncSession, user_id: uuid.UUID) -> User | None: + result = await db.execute(select(User).where(User.id == user_id)) + return result.scalar_one_or_none() + + +async def create_user(db: AsyncSession, user_in: UserCreate) -> User: user = User( username=user_in.username, - hashed_password=hashed_password, + hashed_password=hash_password(user_in.password), role=user_in.role, - is_active=user_in.is_active, + is_active=True, ) db.add(user) await db.commit() @@ -25,6 +32,41 @@ async def create(db: AsyncSession, user_in: UserCreate, hashed_password: str) -> return user -async def list_users(db: AsyncSession, limit: int = 100) -> Sequence[User]: - result = await db.execute(select(User).limit(limit)) +async def update_user(db: AsyncSession, user: User, user_in: UserUpdate) -> User: + update_data = {} + if user_in.role is not None: + update_data["role"] = user_in.role + if user_in.is_active is not None: + update_data["is_active"] = user_in.is_active + if user_in.password: + update_data["hashed_password"] = hash_password(user_in.password) + + if update_data: + await db.execute( + update(User) + .where(User.id == user.id) + .values(**update_data) + ) + await db.commit() + await db.refresh(user) + return user + + +async def list_users(db: AsyncSession, skip: int = 0, limit: int = 100) -> Sequence[User]: + result = await db.execute(select(User).offset(skip).limit(limit)) return result.scalars().all() + + +async def ensure_admin_exists(db: AsyncSession, *, default_password: str = "admin123") -> None: + result = await db.execute(select(User).where(User.username == "admin")) + admin = result.scalar_one_or_none() + if admin: + return + new_admin = User( + username="admin", + hashed_password=hash_password(default_password), + role="ADMIN", + is_active=True, + ) + db.add(new_admin) + await db.commit() diff --git a/backend/app/main.py b/backend/app/main.py index d9d20718..72f4d198 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,8 +1,26 @@ +from contextlib import asynccontextmanager + from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.api.v1.router import api_router from app.core.config import settings +from app.crud.user import ensure_admin_exists +from app.db.base import Base +from app.db.session import SessionLocal, engine + + +@asynccontextmanager +async def lifespan(_: FastAPI): + # Ensure models are imported so metadata is populated + from app.models import user as user_model # noqa: F401 + + if settings.ENV == "development": + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + async with SessionLocal() as session: + await ensure_admin_exists(session) + yield def create_app() -> FastAPI: @@ -10,6 +28,7 @@ def create_app() -> FastAPI: title="CTMS API", version="0.1.0", debug=settings.ENV == "development", + lifespan=lifespan, ) app.add_middleware( diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py index 251d3432..10609bc1 100644 --- a/backend/app/schemas/user.py +++ b/backend/app/schemas/user.py @@ -4,24 +4,37 @@ from typing import Literal, Optional from pydantic import BaseModel, ConfigDict, Field +UserRole = Literal["PM", "CRA", "PV", "IMP", "ADMIN"] + class UserBase(BaseModel): username: str = Field(min_length=1) - role: Literal["PM", "CRA", "PV", "IMP"] + role: UserRole is_active: bool = True -class UserCreate(UserBase): +class UserCreate(BaseModel): + username: str = Field(min_length=1) password: str = Field(min_length=1) + role: UserRole -class UserRead(UserBase): +class UserRead(BaseModel): id: uuid.UUID + username: str + role: UserRole + is_active: bool created_at: datetime model_config = ConfigDict(from_attributes=True) +class UserUpdate(BaseModel): + role: Optional[UserRole] = None + is_active: Optional[bool] = None + password: Optional[str] = Field(default=None, min_length=1) + + class UserInDB(UserBase): id: uuid.UUID hashed_password: str diff --git a/backend/requirements.txt b/backend/requirements.txt index 2a9f27a3..396db03c 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -4,4 +4,7 @@ sqlalchemy==2.0.23 asyncpg==0.29.0 pydantic-settings==2.1.0 python-jose[cryptography]==3.3.0 +passlib[bcrypt]==1.7.4 +bcrypt==4.0.1 +python-multipart==0.0.6 debugpy==1.8.0 diff --git a/pg_data/base/16384/1247 b/pg_data/base/16384/1247 index 8e65414d0cf5e0b86d5dc71e157351ab00fb9bdb..37c318b11ced17991c77fdded16978a44a0ca653 100644 GIT binary patch delta 512 zcmZoTz}^5vTNqgm@Ob!5W@G>Y7X}H5i2^2*gF?h6KCl=?6o-JE`ZXp{z`_6@12=;L z10#pR|NsBx!Geql3=Hw5#nTJ-Gg`ASFwEeXJWo`Ni78>SUy_v?x@Imk%}hYeP`!#k r(`IlmFmM6s|Nj}1of#N)7=Y3+z?d-kmXO(Whg*yS+h^Ql%wPimfr#5} delta 385 zcmZoTz}^5vTNqgm@N{eqVPs%nVX$H7ken!>GdU%;M?ADld*yg08CiS ABme*a diff --git a/pg_data/base/16384/1249 b/pg_data/base/16384/1249 index 9913faf1c40e77b8d4a2ac1c8a0519b7fcb0a404..2d790ada3434440965c4b23a860827c8e65c732e 100644 GIT binary patch delta 1201 zcmZo@kZCv|)6l}$!qmdt!qURJg^lF_&x<=#7#V=z3xfgEM1cz;3=Kdo5C=3XFdk@9 zU^D>Y$&QRNYS)-R%3#2p!JI*gfss?;|9^X^SONn>a_;ntpIMA22QYF^KH{N+p~no1 zo(d#AA)c6eXk?E%x_?ZuxGlLPbMiwrkbk%)f8oP)n-La0MfuYirNDZ);3}gopM(blS8Wxs3+-=+thYBz-PUh#9-7fQt z?TO?x1x6O0h%1ofXu=>MGhIM|$!Gh62W$?k_{b7Q4OrMgLfL|W9nE(31O^7I9)m;z zvd2LFW55zEkRY&NU_&#SH31kN&_sgbvFZNy%(8|c!(gt1SZ2Y%3Nk_yE$0-aCYAuB zHgWR7R8V?jnf^wZm20}+H)bIlMzBVRZfxeUU@1K OV8o)M0`>$f@xE|9^Y12zvqpLuN&MX>n>% zF_@h0U&*LC(ST2S1_xLHnBW4ElY!=gR0F}pMB&Mc66N$@hC}S&W#B+FoE4}XVsb%t zYUM;lGpvS!Q~?3hP&JsLU_qdJSA{NaEA)Aod|j0?B`Vt^D% diff --git a/pg_data/base/16384/24576 b/pg_data/base/16384/24576 new file mode 100644 index 0000000000000000000000000000000000000000..6d17cf9d15fb9f4a2358a2d079f3b8c755d005fa GIT binary patch literal 8192 zcmeIu0Sy2E0K%a6Pi+o2h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM GyblZ@00031 literal 0 HcmV?d00001 diff --git a/pg_data/base/16384/24581 b/pg_data/base/16384/24581 new file mode 100644 index 0000000000000000000000000000000000000000..2bf92b71b8a960d3a3f29617bac57ac18d775bf5 GIT binary patch literal 16384 zcmeIuK@ET~3#SyjClD0md z`x>ba!>Z5sIJ~hWK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1ZE24nc=bt n5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csf!_pP@vsIq literal 0 HcmV?d00001 diff --git a/pg_data/base/16384/24583 b/pg_data/base/16384/24583 new file mode 100644 index 0000000000000000000000000000000000000000..e95ae8035238417b4665554c4affd426fa86f065 GIT binary patch literal 16384 zcmeIuK@ET~320w`$t9AV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!Ct+0u?cF2I~L- literal 0 HcmV?d00001 diff --git a/pg_data/base/16384/2579 b/pg_data/base/16384/2579 index 2e8f4ab55b941bc3d8af2fd5ed6dea1882173bf7..1f883b0e94e0e2d295d5bb68ca89a2f98eb30a98 100644 GIT binary patch delta 46 zcmZo@U~Fh$+`yv1bE0wzBLfiJVEiDlSwP_kBlCwD3L71z#aWpc1Q-N1f4AUd2LMV5 B4JrTt delta 36 qcmZo@U~Fh$+`yv1qwphzkpT#Zd^3~fKQ;ikbqXK= diff --git a/pg_data/base/16384/2604 b/pg_data/base/16384/2604 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ee1089e88fd37174ae41d20472c8f67af7cb4581 100644 GIT binary patch literal 8192 zcmeI%%SyvQ6b9f)je>9BO3v1W(23Uu5uxa^iWd+>$e4=^Op}sKN{a}62-o^nK946i zqb_`cKVg`h3(1*p8zF=UcHSJ`1c}wQAeXA=vyX+ddSBG}D#ir?2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0ucC5;B(MayC2O1;flfLmT&{k^V+C3?s>Vm zn~cxzudc~Y$~4pwNpCc2f;=utW9@Plla$B%UD6h@r9_z`ZZdO~YZdA6XD-R|sj@U| zI>O8teltfpot3r^RsLMi$tn3J3zgMbO5WbVD~~4r&hNDIuLWG>wO(!2{Nu~X%`N$1 zmKN=(hkZ27BHER0+<&%iHgQT_>1jDvhHPH)k?Nu@($bjjMBmfNBd=}Xer}fZz-##H Ieyr#J0 A2LJ#7 diff --git a/pg_data/base/16384/2608 b/pg_data/base/16384/2608 index 1c94af706f7931b724f72b00a03a82c1f191cc1a..581c0e0c1619db5efb6a3115cb838baa650e896a 100644 GIT binary patch delta 490 zcmZ{gJqp4=6oh9rKO%0l)7o0Z&c;IU-&3q*8n2KX!9vhdj}Q>7y@8dj2k;WUw=W4x z&?U)EX6Iw_lBQuw*G+ksR{Ap3q(WH4@R7IiL;G Qfm)v*PL$Mg}0b!w|tSSs>vkd#4X$M28RK=7$M2>}uDTKynNWEMStE z!H_|eftgd`|9^I{00VmhkWQFfXX?h7GWnsB^kjv41-K@NUS)qp+)yk%57Q;R?eF&dCA^M>ju8C}ZFFA(nCTip&Tx01gBWbpQYW diff --git a/pg_data/base/16384/2656 b/pg_data/base/16384/2656 index e5244be8e5f1758379517cd979cbfaf79b853d29..6f6218b631bc390a636dcc5bedd0d064ae736cb1 100644 GIT binary patch delta 135 zcmZp0XlP*6WB>vK)hUc1+JoVP{0Dg!1rR&Qkd=W2NP{In^h8C`jdq9RSt2p3K=16cso8xmvy delta 42 rcmZo@U~F)ZWdH($wJD4s+JoVP{0Dg!1rR&Qkd=XDqNCzQyF>B-xpN5$ diff --git a/pg_data/base/16384/2657 b/pg_data/base/16384/2657 index 0f5e2d99f65c292ecc6002e432f37d31d1f56a33..e042a0b1b18d0579d930f18b796418a3098410f0 100644 GIT binary patch delta 135 zcmZp0XlP*6WB`H-s#6$2vj} delta 42 rcmZo@U~F)ZWdMQ?Yf~6OvTb`sUGC&zOJJT19DV4sGh}e0%!g6WgH)D0j@$|i~s-t delta 40 tcmZoTz}^5vTNqgm@LaG+W@G?@4yFs-+XW6VRxoXJ^5Wcn=`^FB2mluY4MYF{ diff --git a/pg_data/base/16384/2659 b/pg_data/base/16384/2659 index c4b6b751f3d1ed50035178c7196186ab3d7a3235..a9637f87db91ea0c8a388a2c152a47624c92bb59 100644 GIT binary patch delta 364 zcmYk%I}U@*ryoA@mxTDJbx-{UbJ85knY|dubT89|137fGwOW2)V*oke~X5B!@eZf88 z4wkOM-S}3GBlrm5&w%{nh)|}zKYKLjGO`uHl|8v6KfcAeBR^#$zj9kx`JFi?2YT?) p3w`-3_vB&#i>_P@V9}A?d?1UqT#{R|BRA#jhmYyhRD5^L+aHENI*$MV delta 44 vcmZoTz}f&rTNqg!cy8#XFfsta4aN@=n*|n}VBF{=CBFSr1S1za3rGS0Mx_kH diff --git a/pg_data/base/16384/2662 b/pg_data/base/16384/2662 index 2c81de59b750f96025e80a2c919ffca720035412..3b68991b5dc9343b428e1796b9beb406e2de90c7 100644 GIT binary patch delta 88 zcmZo@U}|V!+Q8z#{bSD*Mg|~w!?<8Gzr#gF?gKLv7&ZX$f*A@M9k+{V@G|f+2r#fG cfE0lMF9QdV&zb<{fcdOIK10IhQxRtB01l55rvLx| delta 35 pcmZo@U}|V!+Q8z#-Ql0Y$N&Tn7%yz*ceu#7(dm=e=1UQJ>Hx+N3-SN} diff --git a/pg_data/base/16384/2663 b/pg_data/base/16384/2663 index 222aab71a85ec20fcdc214565b87c99cd420e736..aa470382f5504ae3ed455f281f405fe26e87a064 100644 GIT binary patch delta 144 zcmZoTz|?SnX#bGQ14D3p9U`j2ZMwIL~}uQ VY9&Y?$Rb__R+u=%tfGKEe*jBnCcyvz delta 68 zcmZoTz|?SnX#rQ diff --git a/pg_data/base/16384/2664 b/pg_data/base/16384/2664 index 59112306b442c00c6fed0afefaed5604affc9904..ea4f7f6c82e214cc0a0561e2c99ffb4bfeacb45b 100644 GIT binary patch delta 61 zcmZo@U~Fh$+`yv1eV}g&BLfiJU^LjwuW*o&*`U{8^LfR1ZV@I10R{<&(&E&j;`oB> Q)Jg`1862D4bax2>03aC=$p8QV delta 39 tcmZo@U~Fh$+`yv1-ElaDkpT#HLuqkp QQE_}hc53D3S=wnL05=B_p8x;= delta 35 qcmZo@U~Fh$+`yv1z2R00BLfgzVO+48U*Ra@MyGR}n-^)vi2wl0eG94p diff --git a/pg_data/base/16384/2666 b/pg_data/base/16384/2666 index cc367ff4bba2bcdf0b8ba4a4509fe4c6750bf8b7..c8863b97b3fa7f95c1f8d3d35bdd8898730ac153 100644 GIT binary patch delta 46 zcmZo@U~Fh$+`yv1)3I&}BLfiJVEiDlSwLYABh!Z&n@=gKh_f;=2rvk2{%*m^4ggT; B4XXeE delta 40 vcmZo@U~Fh$+`yv1GvP@JBLfgzVPufpETFK5aq|U5CGm*?BAb~k|FHo8@-Yk! diff --git a/pg_data/base/16384/2667 b/pg_data/base/16384/2667 index a75ece7fe82026eb2b34490545f7c7f90b134087..5ff452d1eaa2f4d143bdbe0a0ad4f321e6256f63 100644 GIT binary patch delta 49 zcmZo@U~Fh$+`yv1vts)cMg}0b!T3R9vw*@8M&=JQ6gE0ai*qnB2mm2l!scHVZ0rDX CpAE49 delta 36 qcmZo@U~Fh$+`yv16Y(yEkpT#Zd^3~fKQ;ipD+*2k diff --git a/pg_data/base/16384/2673 b/pg_data/base/16384/2673 index d92e97d3b43d5d0321255241ec2ef69d4176fd8f..bd48d8b5ca7b217562f92e46b16b8074f2e05430 100644 GIT binary patch delta 276 zcmZo@U~On%-N4eoeIaWyBLfhquuRy@-%!ZJHlf{sVMY7qx+Wf06XlW~?906%vwMgRZ+ delta 80 zcmZo@U~On%-N4eo{o#EUBLfh~upHRT-%!Z3xuc1Tbz*?U=0ojHGk6j_v%#_lmB+iN??g|t)mjzld Ug99!KWbiUL!!>Mnd$UUz08Xwe!~g&Q delta 70 zcmZo@U}aJ4`l!XS2Wq U8K%u1kCHei1{~QO^k$tf06kk6oB#j- diff --git a/pg_data/base/16384/2678 b/pg_data/base/16384/2678 index b00642494f43ebb42ed12abc9aa1ad4a85cf8a05..b884e88df1e95b2a9504d8bc57d4efe280a906a6 100644 GIT binary patch delta 69 zcmZo@U~Fh$+`yv1^Wy3hMg}0b!T3XTvw*?@Ms|*A3JgD{Dr|IA7Lj0PFk}#5U`PO| Q00CwO12BKHkl8y<0FAy6s{jB1 delta 36 qcmZo@U~Fh$+`yv1lfjnC$N&Tv7$w9u3n(05-00*bvRTUP87Ba#_6eN; diff --git a/pg_data/base/16384/2679 b/pg_data/base/16384/2679 index 249a9ceb611e3ef6d02f1578c7f4a50a51de040f..982b9bc7299dda0c4abbf1ee6e929f527475b5ac 100644 GIT binary patch delta 68 zcmZo@U~Fh$+`yv1t#NG%BLfhuVA`;mUtuB>`+=zn3>&5@Y;@!nmSAQuWDsCrPXH+Z R0cHjRAfGj1^C?p^E&xh<4w3)> delta 35 pcmZo@U~Fh$+`yv1Z6K1$$N&Tjm@aJQSD47O(aA`7^CeR~E&!$~37r4{ diff --git a/pg_data/base/16384/2703 b/pg_data/base/16384/2703 index 9139a2209482e1cff5326ee5acd8cff4d8954ad8..fd58ac03b08320eee53a8c0b0763325ad7fe6cb6 100644 GIT binary patch delta 68 zcmZo@U}|V!+Q8z#-QhQxkpT$4FgI-Gceu;U-Y`LdVZsE3jgI|15_}BY3<3;{2_OX^ Rz{kJ^Md=>q`#Tn&)` diff --git a/pg_data/base/16384/2704 b/pg_data/base/16384/2704 index 09700963eb617751e63506194e751b263f760c08..2516a3a662137b10619f60c3c357261ad57b763d 100644 GIT binary patch delta 105 zcmZoTz|?SnX#_{9s delta 69 zcmZoTz|?SnX#HAVfBXSz$AO S11IBVnZ|c)AX%l3d*T2hP!{h1 diff --git a/pg_data/base/16384/3455 b/pg_data/base/16384/3455 index 954daff9d43ae2b8ebead2afe0d5f21db6759b45..d8b4e01aff5d1f7c7d1680d281eba5ee303875e6 100644 GIT binary patch delta 92 zcmZo@U~Fh$+`yv1z2Nc`Mg|}#V2RkwuMo(>Rne`$kO9OI-J9c7KCtQVGVn48fK)KB ZCxA#^1`a5n70PFY@);5~w`o_2005n|5B2~6 delta 40 ucmZo@U~Fh$+`yv1U9cvFkpT!&SUNWID+IEz%$ShCw9!$GeRG#~nFs*lAqy!0 diff --git a/pg_data/base/16384/pg_internal.init b/pg_data/base/16384/pg_internal.init index 225582cf6b907aa81667bc584b5dee2e7ce91168..419614900500526c938984fd9d320ee68d9b2219 100644 GIT binary patch delta 9677 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 delta 9677 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 diff --git a/pg_data/global/1262 b/pg_data/global/1262 index 091e5a14ff29dfe18daa5104385722b8b29fd6db..c67ed0fb12c06b2cf379af2283b3d740ae4eeeba 100644 GIT binary patch delta 14 VcmZp0XmHpND$B^ZIZSpH696QX1b+Yk delta 14 VcmZp0XmHpND$B^RIZSpH696QR1bzSj diff --git a/pg_data/global/pg_control b/pg_data/global/pg_control index db460be17922fab9768931efdf79ed4aca77ac73..037eaa80c953bf6f939b702202870c6a538f4f6c 100644 GIT binary patch delta 84 zcmZp0XmFSyVaO%on8^SH7w%4BM5aL;7zT-7X9AH73>*_ZM3IRN3s{a9Np0M0 M$ar3EvI8S80MXeJi~s-t diff --git a/pg_data/global/pg_internal.init b/pg_data/global/pg_internal.init index aab410921d583288d701f9d323fb977a5ceda716..3bb1fa45410a56f19602c1c254e4d258513beb95 100644 GIT binary patch delta 1935 zcmY+FZA@EL7{~9u8_--9Xu?~~Lg=P!9RxNfnT;_FFPbzl8FkraF&go8_0u}cCT^L) zW=2JaT}}emwws+2Atr`fj|Pk}b|1DiVMcHhI$lOI*r>Q%@q^mzgLr!X4aPL$rmzj!)9Ul$l428mr`*o z*=DDy9f!;u1D!F%2wnp9&p?BiB&G&omxhpA<_l;?PK(@(Ef-|vxXxQ1ZkN^mh!rw4 z5Mkqwm|6rf9R`ic0qfXN1-hJI6VXQu68&2Ttaj*I;MbMYB4pb((T;G0_iS&J)e!!B z^?Zc=>{{OpYjIw$xgwV~BiqE&;9`X&EwVow#H>89*oj>e{Z?|xNig*bxJtC$fOh{1 zwoUh2$$6%s{Wpac$tCMVKRi)>cxSs@dL8>P@e_DNY|0U9Q(TjqxOiO;#o6y}Q>%oGt#b*PX6}O7d!S>P zDj;T0jACmuD6kXK)j2Bat!9DUHs19_nW9w2`M{H3%4%QOa$o&8%${vDH3r#4Oiv+M zR|<6B0=+~(Q70y5P~`9o{8BkBhML|hHjagP!Be8p1l}Uwf&OF%O1_ z!^9L(T0qk>x8di=Y0)(A0nxOJVgAlR5%M6$96A(bKOQo*7a-HEp!XIs)n_Q`8W&O>^H%tbul6A@dZ{A8>@UOh$MzT z0>{pQ6T}QLn1w5*IqNVLdXdflzI@z69j!9fB|BVI7UqOBEe)Y{Ib1K fzVi(+e>Kj}yeWp!gMoX4VK#nveS^98txd{*b)2v% delta 1935 zcmY+FU2Icj7{|{!?4vo5(S&_8;ez@xD3}dIf{ih=D}hu9Yd7asCdhEg%1oflDNDSW z8nfP*l)Mp|xW&y4DTA?-y~w)S)_Q>!NZi)UQ9cY!Mna9O6fd;E1-?E1XBS@m@_(PF zeLmm!+*y$CEXe+y>WDV_?3pAvMzxd9`$}$}8LI}^P>GS>lWSI}-^}S&)4&{CTfA)M zLnR-Vs=p<5lWQi))|F-LNk}iz))dptzPG?YGpG?0#5~d55@XKQwQ398tOdEfhF@A; zEi1_+ziq6O%da3r{1*zPN|KlT+_1RAaSbO%qSSzYaX3M@3-l6w#1JvvSO{LTGSLXX zd_jxop*14i*JvS&TyTaW0Lbt3Qj_M)( zol$oE#jO29$aEK|EroQm=^<#zfi|L>=p%am4(aU(Jc3_eL5q;>>qR@dqP%}YovgOw zzjKG8Y{s&@8T#V9zv+rxz6ROG%fZDeNm^u&wuxDpaAG9(4IxNk7)*T!=7@$7XzLlU z{VbAmoQ3v`BDqA3=!YrBJ2!XB0+{t;(3 zw4MW9L=Q1QjE_z08y6gdU#g(R#--m78`lxxrS+mvKi(qu$vNh<|8L{&?f6P5u3x^N z6}?5j>(TRH;ujB!BYv+&_qIMZA&rgAd zY0ylx5$BI3pv|8$>trSD<^jcKr7+`WGN?s*n*vV~}S2T26? zgP{Z9EHOj$X*ky=@e&3mp%VoyqPzEto4=Uk{~qX;E563aL#IGPnIsv?*k=cCluF`j zF|B{!0?eqanmiO$)CFXu-AJ-uJF@oMkh8ZysTF}7ZqU6C^b&o<5Ha0`1QTuW%eTe& f<`2aDZzcH`hs7{jF>seV!mf8NZ!mWqS*833Dq_zw diff --git a/pg_data/pg_wal/000000010000000000000001 b/pg_data/pg_wal/000000010000000000000001 index e2615a5fff1142485b3df9dc205fbd121bb03367..674239a580d39ae894a6b169ae9b45fc1e9a5fb9 100644 GIT binary patch delta 19036 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 Kf3rZd;r{?X*cto) delta 795184 zcmeIy+4c?u7{%e0gd{^rNXbx1$(T7*2-QDisze%06%8~{eE6A4!igJct!~5xxD1Du z+pwO4cVED}_I?I~!KlH5>yd`_Xv2G~5shqAk2ks}8q<@FZCvA<&{I9##GYwV&o;R! zP3^g+^?WZhy%(F&%w{#amwLHZn$xSz?X_NSUT-wN1ubk*i(As0Ep1uLThYo^wYs-j z)7sYccJK6V>)X)A-fL5v+tT}e(1#86QCr*A_C9V$JKNRn_Vh`g_E~%TynXHOiw^W< zU-fn0bg)Am?np=bw(t7BV;%2@e(a}y?nEd1rCfNEu!)|Y#e}10u13fSU6p)aFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF zBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Ex zl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e& zNJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8 zAqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dY zgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo z5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjT zNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TX zBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{l zkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!H zLK2dYgd`*(2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*( z2}wvo5|WUFBqSjTNk~Exl8}TXBq0e&NJ0{lkc1>8Aqh!HLK2dYgd`*(2}wvo5|WUF NBz*WK9E=$^