From 4594519c9b17cdae363bbaf3d9ff303cd7d6361d Mon Sep 17 00:00:00 2001 From: shwon Date: Tue, 25 Nov 2025 17:43:52 +0900 Subject: [PATCH 1/6] feat: mission11 --- part4-mission11/.dockerignore | 18 + part4-mission11/.env.sample | 20 + .../.github/PULL_REQUEST_TEMPLATE.md | 21 + part4-mission11/.github/workflows/PR.yml | 25 + .../.github/workflows/main-cicd.yml | 43 + part4-mission11/.gitignore | 28 + part4-mission11/Dockerfile | 11 + part4-mission11/README.md | 28 + part4-mission11/docker-compose.yml | 34 + part4-mission11/eslint.config.cjs | 92 + part4-mission11/infra/ec2/ecosystem.config.js | 18 + part4-mission11/infra/ec2/nginx.conf | 36 + .../infra/ec2/secure-group-inbound.png | Bin 0 -> 122986 bytes .../infra/ec2/secure-group-outbound.png | Bin 0 -> 113968 bytes part4-mission11/infra/ec2/start.sh | 15 + .../infra/rds/secure-group-inbound.png | Bin 0 -> 155530 bytes .../infra/rds/secure-group-outbound.png | Bin 0 -> 113969 bytes part4-mission11/infra/s3/policy.png | Bin 0 -> 194334 bytes .../infra/s3/policy.png:Zone.Identifier | Bin 0 -> 25 bytes part4-mission11/jest.base.cjs | 37 + part4-mission11/jest.config.cjs | 7 + part4-mission11/jest.int.config.cjs | 20 + part4-mission11/jest.setup.ts | 3 + part4-mission11/jest.unit.config.cjs | 29 + part4-mission11/package-lock.json | 12669 ++++++++++++++++ part4-mission11/package.json | 82 + .../20250903063435_test/migration.sql | 74 + .../20250904044259_test/migration.sql | 2 + .../20250904070430_like/migration.sql | 59 + .../20250905090014_liked/migration.sql | 91 + .../20250909071844_ts/migration.sql | 85 + .../20250922033747_liketest/migration.sql | 103 + .../20251103043014_notify/migration.sql | 20 + .../prisma/migrations/migration_lock.toml | 3 + part4-mission11/prisma/schema.prisma | 131 + part4-mission11/src/app.ts | 46 + part4-mission11/src/config/multer.ts | 78 + .../src/controllers/article-controller.ts | 76 + .../comments/article-comment-controller.ts | 68 + .../comments/product-comment-controller.ts | 68 + .../controllers/notification-controller.ts | 33 + .../src/controllers/product-controller.ts | 98 + .../src/controllers/user-controller.ts | 119 + part4-mission11/src/dtos/article-dto.ts | 61 + part4-mission11/src/dtos/product-dto.ts | 90 + part4-mission11/src/dtos/user-dto.ts | 41 + part4-mission11/src/env.ts | 7 + part4-mission11/src/lib/appError.ts | 10 + part4-mission11/src/lib/constants.ts | 30 + part4-mission11/src/lib/dirname.ts | 8 + part4-mission11/src/lib/exclude.ts | 9 + part4-mission11/src/lib/passport/index.ts | 20 + .../src/lib/passport/jwtStrategy.ts | 40 + .../src/lib/passport/localStrategy.ts | 51 + part4-mission11/src/lib/ports.ts | 23 + part4-mission11/src/lib/prismaClient.ts | 20 + part4-mission11/src/lib/token.ts | 57 + part4-mission11/src/lib/ws.ts | 145 + part4-mission11/src/lib/wsAuth.ts | 15 + part4-mission11/src/middlewares/authorize.ts | 103 + .../src/middlewares/errorHandler.ts | 205 + part4-mission11/src/middlewares/logger.ts | 15 + part4-mission11/src/middlewares/validation.ts | 199 + part4-mission11/src/prisma/seed.ts | 164 + .../src/repositories/article-repository.ts | 91 + .../comments/article-comment-repository.ts | 29 + .../comments/comment-repository.ts | 27 + .../comments/product-comment-repository.ts | 44 + .../src/repositories/like-repository.ts | 252 + .../repositories/notification-repository.ts | 54 + .../src/repositories/product-repository.ts | 137 + .../src/repositories/user-repository.ts | 99 + part4-mission11/src/routes/article-router.ts | 57 + part4-mission11/src/routes/auth-router.ts | 25 + .../routes/comments/article-comment-router.ts | 51 + .../routes/comments/product-comment-router.ts | 51 + part4-mission11/src/routes/image-router.ts | 50 + part4-mission11/src/routes/index.ts | 23 + .../src/routes/notification-router.ts | 23 + part4-mission11/src/routes/product-router.ts | 64 + part4-mission11/src/routes/user-router.ts | 516 + part4-mission11/src/server.ts | 25 + .../src/services/article-service.ts | 213 + .../comments/article-comment-service.ts | 80 + .../src/services/comments/comment-service.ts | 45 + .../comments/product-comment-service.ts | 79 + .../src/services/notification-service.ts | 125 + .../src/services/product-service.ts | 267 + part4-mission11/src/services/user-service.ts | 122 + part4-mission11/src/swagger.ts | 21 + .../src/types/authenticated-request.ts | 11 + part4-mission11/src/types/express.d.ts | 15 + part4-mission11/src/types/multer-s3.d.ts | 12 + part4-mission11/src/types/notification.ts | 15 + part4-mission11/tests/_helper/debug.ts | 6 + part4-mission11/tests/_helper/factories.ts | 116 + part4-mission11/tests/_helper/jest-typed.ts | 17 + .../tests/_helper/jest.env.setup.ts | 11 + part4-mission11/tests/_helper/mock-modules.ts | 26 + part4-mission11/tests/_helper/prisma-mock.ts | 1566 ++ part4-mission11/tests/_helper/test-app.ts | 5 + .../tests/_helper/test-passport-app.ts | 36 + part4-mission11/tests/_helper/test-utils.ts | 63 + part4-mission11/tests/_helper/token-mock.ts | 15 + part4-mission11/tests/_helper/ws-test-util.ts | 41 + .../tests/int/int.articles.public.test.ts | 68 + .../tests/int/int.articles.secure.test.ts | 146 + part4-mission11/tests/int/int.auth.test.ts | 364 + .../tests/int/int.comments.secure.test.ts | 269 + .../tests/int/int.notifications.test.ts | 107 + .../tests/int/int.products.public.test.ts | 84 + .../tests/int/int.products.secure.test.ts | 165 + part4-mission11/tests/int/int.uploads.test.ts | 119 + .../tests/int/int.users.secure.test.ts | 192 + part4-mission11/tests/int/int.ws.test.ts | 123 + .../unit/unit.article-comment.service.test.ts | 323 + .../unit/unit.auth.localStrategy.test.ts | 79 + .../unit/unit.product-comment.service.test.ts | 287 + .../tests/unit/unit.user-service.test.ts | 407 + part4-mission11/tests/unit/unit.ws.test.ts | 51 + .../tests/unit/unit.wsAuth.test.ts | 23 + part4-mission11/tsconfig.json | 30 + 122 files changed, 23065 insertions(+) create mode 100644 part4-mission11/.dockerignore create mode 100644 part4-mission11/.env.sample create mode 100644 part4-mission11/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 part4-mission11/.github/workflows/PR.yml create mode 100644 part4-mission11/.github/workflows/main-cicd.yml create mode 100644 part4-mission11/.gitignore create mode 100644 part4-mission11/Dockerfile create mode 100644 part4-mission11/README.md create mode 100644 part4-mission11/docker-compose.yml create mode 100644 part4-mission11/eslint.config.cjs create mode 100644 part4-mission11/infra/ec2/ecosystem.config.js create mode 100644 part4-mission11/infra/ec2/nginx.conf create mode 100644 part4-mission11/infra/ec2/secure-group-inbound.png create mode 100644 part4-mission11/infra/ec2/secure-group-outbound.png create mode 100644 part4-mission11/infra/ec2/start.sh create mode 100644 part4-mission11/infra/rds/secure-group-inbound.png create mode 100644 part4-mission11/infra/rds/secure-group-outbound.png create mode 100644 part4-mission11/infra/s3/policy.png create mode 100644 part4-mission11/infra/s3/policy.png:Zone.Identifier create mode 100644 part4-mission11/jest.base.cjs create mode 100644 part4-mission11/jest.config.cjs create mode 100644 part4-mission11/jest.int.config.cjs create mode 100644 part4-mission11/jest.setup.ts create mode 100644 part4-mission11/jest.unit.config.cjs create mode 100644 part4-mission11/package-lock.json create mode 100644 part4-mission11/package.json create mode 100644 part4-mission11/prisma/migrations/20250903063435_test/migration.sql create mode 100644 part4-mission11/prisma/migrations/20250904044259_test/migration.sql create mode 100644 part4-mission11/prisma/migrations/20250904070430_like/migration.sql create mode 100644 part4-mission11/prisma/migrations/20250905090014_liked/migration.sql create mode 100644 part4-mission11/prisma/migrations/20250909071844_ts/migration.sql create mode 100644 part4-mission11/prisma/migrations/20250922033747_liketest/migration.sql create mode 100644 part4-mission11/prisma/migrations/20251103043014_notify/migration.sql create mode 100644 part4-mission11/prisma/migrations/migration_lock.toml create mode 100644 part4-mission11/prisma/schema.prisma create mode 100644 part4-mission11/src/app.ts create mode 100644 part4-mission11/src/config/multer.ts create mode 100644 part4-mission11/src/controllers/article-controller.ts create mode 100644 part4-mission11/src/controllers/comments/article-comment-controller.ts create mode 100644 part4-mission11/src/controllers/comments/product-comment-controller.ts create mode 100644 part4-mission11/src/controllers/notification-controller.ts create mode 100644 part4-mission11/src/controllers/product-controller.ts create mode 100644 part4-mission11/src/controllers/user-controller.ts create mode 100644 part4-mission11/src/dtos/article-dto.ts create mode 100644 part4-mission11/src/dtos/product-dto.ts create mode 100644 part4-mission11/src/dtos/user-dto.ts create mode 100644 part4-mission11/src/env.ts create mode 100644 part4-mission11/src/lib/appError.ts create mode 100644 part4-mission11/src/lib/constants.ts create mode 100644 part4-mission11/src/lib/dirname.ts create mode 100644 part4-mission11/src/lib/exclude.ts create mode 100644 part4-mission11/src/lib/passport/index.ts create mode 100644 part4-mission11/src/lib/passport/jwtStrategy.ts create mode 100644 part4-mission11/src/lib/passport/localStrategy.ts create mode 100644 part4-mission11/src/lib/ports.ts create mode 100644 part4-mission11/src/lib/prismaClient.ts create mode 100644 part4-mission11/src/lib/token.ts create mode 100644 part4-mission11/src/lib/ws.ts create mode 100644 part4-mission11/src/lib/wsAuth.ts create mode 100644 part4-mission11/src/middlewares/authorize.ts create mode 100644 part4-mission11/src/middlewares/errorHandler.ts create mode 100644 part4-mission11/src/middlewares/logger.ts create mode 100644 part4-mission11/src/middlewares/validation.ts create mode 100644 part4-mission11/src/prisma/seed.ts create mode 100644 part4-mission11/src/repositories/article-repository.ts create mode 100644 part4-mission11/src/repositories/comments/article-comment-repository.ts create mode 100644 part4-mission11/src/repositories/comments/comment-repository.ts create mode 100644 part4-mission11/src/repositories/comments/product-comment-repository.ts create mode 100644 part4-mission11/src/repositories/like-repository.ts create mode 100644 part4-mission11/src/repositories/notification-repository.ts create mode 100644 part4-mission11/src/repositories/product-repository.ts create mode 100644 part4-mission11/src/repositories/user-repository.ts create mode 100644 part4-mission11/src/routes/article-router.ts create mode 100644 part4-mission11/src/routes/auth-router.ts create mode 100644 part4-mission11/src/routes/comments/article-comment-router.ts create mode 100644 part4-mission11/src/routes/comments/product-comment-router.ts create mode 100644 part4-mission11/src/routes/image-router.ts create mode 100644 part4-mission11/src/routes/index.ts create mode 100644 part4-mission11/src/routes/notification-router.ts create mode 100644 part4-mission11/src/routes/product-router.ts create mode 100644 part4-mission11/src/routes/user-router.ts create mode 100644 part4-mission11/src/server.ts create mode 100644 part4-mission11/src/services/article-service.ts create mode 100644 part4-mission11/src/services/comments/article-comment-service.ts create mode 100644 part4-mission11/src/services/comments/comment-service.ts create mode 100644 part4-mission11/src/services/comments/product-comment-service.ts create mode 100644 part4-mission11/src/services/notification-service.ts create mode 100644 part4-mission11/src/services/product-service.ts create mode 100644 part4-mission11/src/services/user-service.ts create mode 100644 part4-mission11/src/swagger.ts create mode 100644 part4-mission11/src/types/authenticated-request.ts create mode 100644 part4-mission11/src/types/express.d.ts create mode 100644 part4-mission11/src/types/multer-s3.d.ts create mode 100644 part4-mission11/src/types/notification.ts create mode 100644 part4-mission11/tests/_helper/debug.ts create mode 100644 part4-mission11/tests/_helper/factories.ts create mode 100644 part4-mission11/tests/_helper/jest-typed.ts create mode 100644 part4-mission11/tests/_helper/jest.env.setup.ts create mode 100644 part4-mission11/tests/_helper/mock-modules.ts create mode 100644 part4-mission11/tests/_helper/prisma-mock.ts create mode 100644 part4-mission11/tests/_helper/test-app.ts create mode 100644 part4-mission11/tests/_helper/test-passport-app.ts create mode 100644 part4-mission11/tests/_helper/test-utils.ts create mode 100644 part4-mission11/tests/_helper/token-mock.ts create mode 100644 part4-mission11/tests/_helper/ws-test-util.ts create mode 100644 part4-mission11/tests/int/int.articles.public.test.ts create mode 100644 part4-mission11/tests/int/int.articles.secure.test.ts create mode 100644 part4-mission11/tests/int/int.auth.test.ts create mode 100644 part4-mission11/tests/int/int.comments.secure.test.ts create mode 100644 part4-mission11/tests/int/int.notifications.test.ts create mode 100644 part4-mission11/tests/int/int.products.public.test.ts create mode 100644 part4-mission11/tests/int/int.products.secure.test.ts create mode 100644 part4-mission11/tests/int/int.uploads.test.ts create mode 100644 part4-mission11/tests/int/int.users.secure.test.ts create mode 100644 part4-mission11/tests/int/int.ws.test.ts create mode 100644 part4-mission11/tests/unit/unit.article-comment.service.test.ts create mode 100644 part4-mission11/tests/unit/unit.auth.localStrategy.test.ts create mode 100644 part4-mission11/tests/unit/unit.product-comment.service.test.ts create mode 100644 part4-mission11/tests/unit/unit.user-service.test.ts create mode 100644 part4-mission11/tests/unit/unit.ws.test.ts create mode 100644 part4-mission11/tests/unit/unit.wsAuth.test.ts create mode 100644 part4-mission11/tsconfig.json diff --git a/part4-mission11/.dockerignore b/part4-mission11/.dockerignore new file mode 100644 index 000000000..aeea18e02 --- /dev/null +++ b/part4-mission11/.dockerignore @@ -0,0 +1,18 @@ +# 빌드/런타임에 필요 없는 것들 + +coverage +node_modules +dist +infra + +# VCS / 설정 / 도구 파일 +.git +.gitignore +Dockerfile +docker-compose.yml + +# 로그 + +npm-debug.log +*.log + diff --git a/part4-mission11/.env.sample b/part4-mission11/.env.sample new file mode 100644 index 000000000..9d2ea8292 --- /dev/null +++ b/part4-mission11/.env.sample @@ -0,0 +1,20 @@ +NODE_ENV=production + +# RDS용 +DATABASE_URL="postgresql://appuser:비밀번호@rds-endpoint:5432/appdb?schema=public" + +# JWT +ACCESS_TOKEN_SECRET="prod_secret_access" +REFRESH_TOKEN_SECRET="prod_secret_refresh" + +# Express 내부 포트 (nginx에서 80 → 여기로 프록시) +PORT=4000 + +# 프론트 배포 주소 +CORS_ORIGIN=https://내-프론트-도메인 + +# S3 +AWS_REGION=ap-northeast-2 +AWS_S3_BUCKET=내-버킷-이름 +AWS_ACCESS_KEY_ID=발급받은키 +AWS_SECRET_ACCESS_KEY=발급받은시크릿 \ No newline at end of file diff --git a/part4-mission11/.github/PULL_REQUEST_TEMPLATE.md b/part4-mission11/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..ec85f6f1a --- /dev/null +++ b/part4-mission11/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,21 @@ + +## 요구사항 + +### 기본 +- [x] 기본 항목 1 +- [ ] 기본 항목 2 + +### 심화 +- [ ] 심화 항목 1 +- [ ] 심화 항목 2 + +## 주요 변경사항 +- +- + +## 스크린샷 +![image](이미지url) + +## 멘토에게 +- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. +- diff --git a/part4-mission11/.github/workflows/PR.yml b/part4-mission11/.github/workflows/PR.yml new file mode 100644 index 000000000..cfc6235e2 --- /dev/null +++ b/part4-mission11/.github/workflows/PR.yml @@ -0,0 +1,25 @@ +name: PR + +on: + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Run tests + run: npm test diff --git a/part4-mission11/.github/workflows/main-cicd.yml b/part4-mission11/.github/workflows/main-cicd.yml new file mode 100644 index 000000000..912337d67 --- /dev/null +++ b/part4-mission11/.github/workflows/main-cicd.yml @@ -0,0 +1,43 @@ +name: Main CI-CD + +on: + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Run tests + run: npm test + + deploy: + needs: test + runs-on: ubuntu-latest + + steps: + - name: Deploy to EC2 via SSH + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USER }} + key: ${{ secrets.EC2_SSH_KEY }} + script: | + cd /home/ec2-user/my-app + git pull origin main + npm ci + npm run build + pm2 restart my-app || pm2 start dist/server.js --name my-app diff --git a/part4-mission11/.gitignore b/part4-mission11/.gitignore new file mode 100644 index 000000000..e6fe833b9 --- /dev/null +++ b/part4-mission11/.gitignore @@ -0,0 +1,28 @@ +# Node +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Uploads +src/uploads/* +!src/uploads/.gitkeep + +# Prisma generated +generated/ + +# Env +.env +.env.production + +# OS +.DS_Store + +# Build output +dist/ + +# Test coverage outputs +coverage/ +*.lcov +lcov.info +.nyc_output/ diff --git a/part4-mission11/Dockerfile b/part4-mission11/Dockerfile new file mode 100644 index 000000000..82c095d8a --- /dev/null +++ b/part4-mission11/Dockerfile @@ -0,0 +1,11 @@ +FROM node:18 + +COPY . /app + +WORKDIR /app + +RUN npm ci && npm run build + +ENV PORT=3000 + +ENTRYPOINT [ "npm", "run", "start" ] \ No newline at end of file diff --git a/part4-mission11/README.md b/part4-mission11/README.md new file mode 100644 index 000000000..54bef1080 --- /dev/null +++ b/part4-mission11/README.md @@ -0,0 +1,28 @@ +# 패키지 설치 + +npm install + +# DB 마이그레이션 및 시딩 + +npm run db:reset + +# 개발 서버 실행 + +npm run dev + +# 빌드 후 실행 + +npm run build +npm start + +# .env 파일 필요. + +.env.example 참고해서 .env를 만들어주세요. + +# 주요 기능 + +회원가입 / 로그인 (JWT + 쿠키 기반) +게시글 / 상품 CRUD +댓글 CRUD +좋아요 (게시글/상품/댓글) +페이지네이션 & 검색 diff --git a/part4-mission11/docker-compose.yml b/part4-mission11/docker-compose.yml new file mode 100644 index 000000000..0303f1f63 --- /dev/null +++ b/part4-mission11/docker-compose.yml @@ -0,0 +1,34 @@ +version: '3.8' + +services: + db: + image: postgres:16 + container_name: codeit-postgres + restart: always + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: bugloss + POSTGRES_DB: codeit-test + ports: + - '5432:5432' + volumes: + - db-data:/var/lib/postgresql/data + + app: + build: . + container_name: codeit-express + restart: always + depends_on: + - db + environment: + NODE_ENV: development + PORT: 3000 + DATABASE_URL: postgresql://postgres:bugloss@db:5432/codeit-test?schema=public + UPLOAD_DIR: /app/uploads + volumes: + - ./uploads:/app/uploads + ports: + - '3000:3000' + +volumes: + db-data: diff --git a/part4-mission11/eslint.config.cjs b/part4-mission11/eslint.config.cjs new file mode 100644 index 000000000..8c996acbc --- /dev/null +++ b/part4-mission11/eslint.config.cjs @@ -0,0 +1,92 @@ +const importPlugin = require('eslint-plugin-import'); +const jestPlugin = require('eslint-plugin-jest'); +const globals = require('globals'); +const tseslint = require('typescript-eslint'); + +module.exports = [ + // 예외(무시) 경로 + { ignores: ['node_modules/**', 'dist/**', 'coverage/**', 'generated/**'] }, + + // 기본 규칙 세트 + { + files: ['**/*.{ts,tsx,js,cjs}'], + languageOptions: { + parser: tseslint.parser, + ecmaVersion: 'latest', + sourceType: 'module', + globals: { ...globals.node, ...globals.es2022 }, + parserOptions: { + project: false, + }, + }, + plugins: { + '@typescript-eslint': tseslint.plugin, + import: importPlugin, + jest: jestPlugin, + }, + settings: { + 'import/resolver': { typescript: {} }, + }, + rules: { + // @typescript-eslint 권장 규칙 기반 + ...tseslint.configs.recommended.rules, + '@typescript-eslint/no-explicit-any': 'error', + + // 사용 규칙 커스터마이즈 + 'no-console': ['warn', { allow: ['warn', 'error'] }], + 'import/no-unresolved': 'off', + 'import/order': [ + 'warn', + { + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + groups: [ + ['builtin', 'external'], + ['internal', 'parent', 'sibling', 'index'], + ], + }, + ], + + // 기본 no-unused-vars는 끄고 TS 버전만 사용 + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + }, + }, + + // 테스트 전용 오버라이드 (Jest 전역/규칙) + { + files: ['**/src/tests/**/*', '**/*.test.{ts,tsx,js}'], + languageOptions: { + globals: { ...globals.node, ...globals.jest }, + }, + rules: { + 'no-console': 'off', // 테스트 로그 허용 + }, + }, + + // CommonJS 설정 파일(.cjs) 허용 + { + files: ['**/*.cjs'], + languageOptions: { sourceType: 'script' }, + }, + + { + files: ['**/*.d.ts'], + rules: { + '@typescript-eslint/no-unused-vars': 'off', + }, + }, + + { + files: ['src/prisma/seed.ts', 'src/middlewares/logger.ts', 'src/app.ts'], + rules: { 'no-console': 'off' }, + }, +]; diff --git a/part4-mission11/infra/ec2/ecosystem.config.js b/part4-mission11/infra/ec2/ecosystem.config.js new file mode 100644 index 000000000..610a35862 --- /dev/null +++ b/part4-mission11/infra/ec2/ecosystem.config.js @@ -0,0 +1,18 @@ +module.exports = { + apps: [ + { + name: 'part4-mission10', + script: 'dist/server.js', + instances: 1, + exec_mode: 'fork', + watch: false, + env: { + NODE_ENV: 'development', + }, + env_production: { + NODE_ENV: 'production', + }, + max_memory_restart: '300M', + }, + ], +}; diff --git a/part4-mission11/infra/ec2/nginx.conf b/part4-mission11/infra/ec2/nginx.conf new file mode 100644 index 000000000..42b36a339 --- /dev/null +++ b/part4-mission11/infra/ec2/nginx.conf @@ -0,0 +1,36 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log; +pid /run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + upstream backend { + server 127.0.0.1:4000; + } + + server { + listen 80; + server_name _; + + location / { + proxy_pass http://backend; + proxy_http_version 1.1; + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + } +} diff --git a/part4-mission11/infra/ec2/secure-group-inbound.png b/part4-mission11/infra/ec2/secure-group-inbound.png new file mode 100644 index 0000000000000000000000000000000000000000..b49e650e5681c21ef20e79442364211decf8d6e2 GIT binary patch literal 122986 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
iK$YDk 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

<4Fbbw{1 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

a?cD>@`Ot*BpMT0 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 literal 0 HcmV?d00001 diff --git a/part4-mission11/infra/rds/secure-group-outbound.png b/part4-mission11/infra/rds/secure-group-outbound.png new file mode 100644 index 0000000000000000000000000000000000000000..56b1491fd7ad0c49892d9aa53b18ff63f69b1240 GIT binary patch literal 113969 zcmZU)1ytS4_C9T?U_({sef0PT z7~$9e_CNkmKb_(e6MFW`1J|;lG5=>%i^?B`--V4ZqDK(5l&2a-dV&J+X?|jJiF$f+ zlZvH^zk?y~+@U~{OLFk9thQJz6Vw)S7nR(0FiH^ppKYgPWh8~i^_f*ZOX$m~e`?Um zr*b8a4je<|jmcFH4V9twPE3@D(WblKnfUKFU`4++V9bmBPaC3~@hQ%5GV`Nd<0L`R z-Wz71fE?GL0{djJX%o0%&BJX}0^!V>ky+w@pCiTCn8$B)KZ&Zvd-)*#(=&b#Uc^9I z`%5;f5XzggFAJH$|Fc8Zp!JeFQ;&$W^ zOv-??f7anGKPsG`Ut@*+PlLf$Y9nUHMku2}YppS)<;Hx$V2y~W8n#_E5=^;33=-UM zTqQX}4*WhVivQknwSUpKP_{u=e6T;8qReyrs%cPKLSz92!ei0v`=e6mc-94VwAN1a z`$AbXh*MluGkBp+`Z>a9WA6|e#JZ1)V2wq~MgHGyQk3A3NA%|0Fn_C%P!8vKSrs() zE$8z+;LvWcqQliFArpF2sF0=pN~ou|$6;8(W9c7S+lO-X#(=-|*u(4vjFk)vfG(h4gfYA_PAxTYi- zG>{LIyP$_PT9>QDP z&z-}H%+mes{!bG)8C^-+Vhj`mzC8LQ70A;uG4xi~alGEqfKh{ih21QW=eAfHLV-Kn zDC56CmT{oj#;Re~!z?|(3FHbE7_i_VW9;K&!h(+v5s)doVz_3en3yWQ$HVkQdU*X$ zA4;qDkLzzfEpAn^o^^N=cX+M*!pVAh_~cmab+h>}eLhgJ-f!IB!?I_zumRt{MOb{f zfy#@qeOvu00nXv|&ffOMXXw-}RM0-wvhbz;n8jr8z%nhaf$OU$UOA+gLe7ixkJ+8x zi=M%QYQ#vCB_u~WqV?T`gkt|nv#Zg0&mBIOF^Bp~RrjX#VP)&DCPzr`^FK7~W##;4 zjX(oH@0;!JYkh&}sJNw8dGdkWGu?#wrlvf8N6C7)kzq;9^wW94+8p+g8$ajlC-}Fw zeZla8xBAcnA7(IMZ|{P|M0cQ;5LJQ)RTdh9t>7PU|9SahCY?u|j?|ZLnl^i-cLs*Q zEc6+de3X<_sU94k>PPO+^_o9UTs~WhZ#;U%v(ptZR4Fe!RV2YVGNYOSXCJ&{sf0$# z6Y$B>a-rRuTRw}=Hpy0GuE5o~dOx+Vj7YS;cSN%?N+8!dG19=0h9b8V0g$%8H_7Af zprDPxO%Y%keK=o`iFthx(BBJ)mgQO}<98{geI_b8+=#fCQm&TVWHc1{eRvp{4HBxp zO*P>l?4zK#0R8yv8&SqBPQ7$gLAxV$D@IzZe1y#=MiI&j1TE6n3? zR42o7(bgM;wq-2OmHPer=J)I4eygZoV9C&!-<_=zjPAq0`l|+lLIUB@vg^uZ87tzW z8oBSmf5>t9<6ZwCNsq`HpR4V*m>C(z{9Kg!Jb6gH4-QxZG&CuDUgw1qA3RCm(%@B` zOG>ls{ozFwT>0kL?8#2E4KN9u4=se?ausxw&{C@Vth0woeurg})qZ2x2V5nv>TF|h zkr%MIe{X{+xw#Z=;Gd-y>p7Glj^wV0(#5WalkS5zT*3W>6?Mfd2gS;E7VD%caR&X? zDr+Abb?mUy<_15pxH__2iUX<*QDTocvVHJu8Z8eQnIdC}vTD4w7B|R)!{Nv17+G8k zg_cV+BcCQ?K>u|uI6tU45C1oV80#KhZ@R%N6+b#gSktOx#wtyhs^k>PrWlR`B~zq?;-Si|D80_GG3(LY4ODv;$}g`7 zp+G)u5f(NNi+WJPP{v9LeD$6Bj7~*WO{$C~4Lx5zzJC2WyQxXEti&C+77aISjjPC% z1ffXqu5xREfq^hntuJu|bF0~GOGcV(zO zv(6}=CKWVe{_fccD}L-a-tV4~DoL+onUNfOH|{H@hi+y1?k~ge-B?&y>2RE*8T@#N zh=|73%dv5BG3n_jAkA7c)KqT!$htZXm*XWho06EAn9sn9Sm{?-A#@X}Nl8j7Mp}=h zavIkU4DGQ~QbIehCyTb>W;U^`DCz2kgAeCF4MdVGbovX)XYj#><$Fy~)h`|CY;8En z!O`i~+a4;Yp~>=6qSg3Z4@nru@wx7tc};O>V$4>@U-^A+ z-(DWy_03-->O+r1m5n&(gPB-&_F=3o0!B$x1sgMc;O zb-?gntT8oKs+Ub+gHoX(8TmO-?x{<)}{$YpGX01xUwsUh6(+;&|79I>r z6R2WF_mNA#s!>jIP%wb_ISI5kAA1CS6D|b(pMPycom;8t_#!t54@tav;0N3ay(vrE zBN7_PLZ#*2AYduT*(pg<2>z(S?G^dQyoMLga5R6a@Y>wfi1+65JmAQG1k45|DQOM? zal*}I;TTcE1)jbith1Sawl?MLckA8sN_AK|m-c3&Ilq^6X=o)1${+FDCr-}XyQGgk zYa09hFVM!$g^;md9s3KJ$@;fW9e2-h&)TNLUIhz>RKTH!lL)Sy_|x>;dMUfP;WDQS zp@S?42}{x^1_x=Yi@&G;5pj9<7M{JJv%G8|Zh~@Q+&U?()iSd?H;c=@uTP4F;WX|0 z_pM(8&nLg0$o?@wx!(^%3ST}OQHnG8|G+ZP@n4O2oB15nq}i_1aKRt+nW)CDapgPW zgdA3wbsyjdK(tH@5_9dn+-tQbm42`^AsAnkgaP31Y%xWz9rNyz=ijk^Xz z63xZBjBtdSpdgcKG(RmyuS4#nF|4Zy9kTsyErfj`)XyRv9}SI>e6VB5Vd0?GBFIyW zWYi46cf?#a`0ADV<#cI)NBE9PR6qxvJ=8&F7N%$(%VYmQ$)T!J1Tk6IZ{_=9sbwbT zxNJj{yM@Q$&U=tq$f&8suq`I*tu;o|d9kzn?&%Ci_H)+YJ&9V~PsNRmDF7>G)|fRk zG=z5J5BQhVPjS$qY;0^t*VX0p(2{_tzH>j(4LVdcFU6R5ygt&B`yJ!B{gY0pQma;6 zOMYCF0(-vEY>ZHj$n_`Y-5%hO=#O`O-|)LJ0u6uf>l3AZ2=#cs1C~wa!30EFn#5-Q zM71c-_p5tuCD@$$nmxAp9La3Z|R z4#fA(l}Xrn@0^jFnB`f+eKT5Kzb4^(Rbme=xtZ63L)N&~$iV5H4m1K}Gr(Oax%`OV zMwscC-$nERjf8VO{bc#&S-NvqkKoP+yoFVG>u zVrsaccVL5c@F^zit&^VGBLB<;y~J^bphBPdN=c>4+3q6?WM@?bKk~R3cJ}U)n`~mj zKkhoYzEKy-GFon2^?&}Hl$mANxNeonx0e~4<9N4xGHK39s#>_)-zH`dx{+=Zglw_oXRyzZ9b#8ehOm! zbieH8Th_3%ySp`S&@ekv_y0%Mnd?M)a>xiBnF=NSB+-)QFRR9M6RU9W1*IcbG`wPMa_%IYYkY z)1qTt&0RB(GM;Y)q8kszQm2OFjwCXPG}TF=p*PESp-+AOdp z6;^3=`0!@>UTevwaiO9MUSV+AI;EHAR#joF*~t#<$O6s9n{tGjC>g@H7dj6~9PeUwv=?)*~NeA8$4Toc6c#fe$JP&f8XQQ4q+}`eyWJF6?D|4Fr(_Cvz(d2d>4HAs+3s zW~28oQ9^ep4bLXNXs>Z!8xCBTdz|HT?>j39#mC2!v2f#6p@w==Jo(synHJ!FcBa34 zEASsne&*s^!!Nab8wU-I6(?@_B_4n)BF0m+C@!odA(R(&P{xLdg>$EoVCznai8c4I zel!xmd;WU&&bV4;W|0c;LzT@hGb$8C?94orLZuLm0d7jODyvOkgW2r>CHDZp5rc}# zVBjAo1I?#iIJp7@-n3pTotOLhunDMyDYy?UuA1qQxRXXtXz3_<39O=e10Xj4PDgqL4LG zPGodhK;K!{+j+mpkb|!8<@ZI|A26hlwN5I?ES7d~Ksae)@6a!h`#(PEqRtC>4e*L0 z9dY)*0Mngwqt_VP?YF(`3Y^COe?4t*(6vMT{FZ&WAzsCkNdQ z&e!nu=r_-**ZLnl^=U?v*o~N*V2a6zlsyRmKlyRWd%2^#3|nJQQCS(Q?DlfIjZVERQL0}4HBtRU z{w@di&6`RXCsA>63OYJO>$$RS_jTXG#q|okR^Y-={sux(jakt|ghxk<+i?jZLJGG% z>HEhs5jk9R(Ctav@*h2Lu z`0La4sMuJnD3kS~u@35qQ)aX!J78hA-wIT=`2*s!J(&YNY?vib^^1dJCZFsp0Mc4D zcNBf1^fe!z{1a}xpC3gQ6TPAbwA7>f@|1=rtUF&S&9ZGDzwT8FxmI3uupRti-mx#_ zM{;uf##i4iP_=&$@CR@n7?=dRQ@psv?8F?XsA482@xSqBy0Iw-!uu7{xam(xV&?PL z@b3H+lR{Jiiz-9dZ?0R>L6dD_{a2=M<@0hL^aSH?#&qgF2#0 za(5rLs6MlkjVu8Md~2VT5g%4co88?m-nG*+v7muk8M| zONDX<$0I~h(HK1~ohIBw7Gy4(0Q#hn>3GmF`SJ`O|Fi-`nW@h>B-nv~ z{g8if(A4B%Q(HtU;h)rvb3O@ud}NSZZ5*&v6qk2v(ENJ2Hy$F!OeD1FIqKuzqKN_; z9F){JQ9zieE*TU?iX7CUp1Jv+&LlSemBL=*N&itm3z$~DlMy!a>4IP_Ju9nhrhS?B z<`9<*K@a$W& z>X+tG7-vhm4QvFxZS?>Jgkkv?G%5Q46WsaV3n~hN-)`0$pEn(6OVsdr9I^|Zd%huC zthF^4pn%4+grdU3QG#46JkGk|&zJ2xp&E|g-);ngHe9L<+PE?uo*zBsvO|x6M~q`+ z0K}M{$x=U-#!bn@B!`XQ2;2oApAurUq^xWo;Joy-4djNP7y!^Y2a{S<*hRo<2%4Ij z;((%|aJ_zApQ_IB)lrQ zDIrHkjH0TSIt>*EK$rlSKa5D?_g|Syj-U>p7T;#wy@eRvr&IqAbSkaMaocChU75G) zm8~;+ez1^fku6jJ8_-cp!u*jR;3x`dnThmzrx@n%D$Rw6mD4;gudChF1X+LfcNl z@1|-m9rC-t-P#fc?bNXST~C@ZwIv;jjVAEl&13RaA(XLNx0=2y23TQ3HF$fMpm z+3DUc?HC`dhy(lA$do7=N?bCJv$w2!84{lQa1~{qh`Z+QB2(Vo#!gH!QYI!;K&T5a zF5xPL@{6X{!I69`cQ;=!NE*GKoA@fqEsLrV*ucy(l}oN9tScYf{K_e)nMr6Uu|)9=7E(r)vmYN zJ@Zk2YdxI6pmD@z1F%oztgMriP{gjk8kgMngFOwH)CzioBSU_{kd!r`4$g@U-{>Ry zo=yLbxCKxRb-i!l0uLm#wmDD*7AvS5slu!c!_*|t+vbCWzJlpzOoecg2=}!IMRtUf zii!7k2mp*820L@yGLDRoih6i_UG9c6h6AO%g$sW53VQOXf^@i!&V7X->TpRHJ+7D- z2(Tex1D>yS_Ho*Cy(vJom7+u!vFO>Ie9vm+$y7&bAbaI`pLwv<0DcP@NV9nctV=g8 zBe@Xt4ybCD*@XD~>QYp0yeQ|y-D$nF41EN892f&yAPyPI*~kQzLb|gCEF2v9Nda?k zYccXG=)gX!J`QUdTyhRZSw^RkYzeI6f?%wniTdv|_RPO`W~@Gh?2p_TSiJhKyJ^L* zAtnkSB(~bxS`Mf*tCK5@qJj|R&UA2G>1q|`kMrv*f>aGn4;Z`f)}acYh2WOffqyOC z{*v-uHxZLgy=Wnkz36;}UV_GmI@7N@DV5|=T-|EZ8Oe!p6@7Dd=1rTQ)Fyhv?hF

t$`>_CdIIEZ1b2BC;AybeSA%L4mzgZfRrll1_vetb(U8WU` z3ysC@%)Pp@+hM*V8fK3K0a5jzc5@Rf2Nmnwg7Bo!&JX`1y3LT?bM5&s=$$+2U%eJB0k%U#e%IprnLE)26(4 z_@xvIA`~o;AlhcRL9SRsf%laT8AKOaTo1pa3q2~*tpkkjT$xrN08Xstk^t%vXo!-J zPa9kJo%uNN?p_Ip{hBVe2_)=D7xcyjltS%`JJ7>B%PA^gD@rU|Ic{99Sd40R-lK=& z-r~e&_h2;W(7n5xH}Ds;u_-Iip92y+uW@jMW2vf#nd)a70gIX^PC}g@m0~mK&b)bmKan zPH!ZuBsITs1{(wP^$}dw?A~uc=CaLCTRFiMknDlm%Uuu+hUw3%Mh3kkkM@j^;P8(J z9fHFTfSVs28G{Akhl{I?9F&%K?1t_XPscy#$lsg}m)2yzsbA9XWFVE2?EylLNda>} zq-k%~fCxe$mioi^v(vk`1I(A=!?E8|vv$n`TIszrd9ZLXH=W>8_mlC*c$J0rh{2l> zZuCCdi+{_oi4usPD=yB@9aH5*&`uCgQAI2)@B!1Y&pOzv2M}hVzgxm~yjK#;%LHIU z87dFz+`sWn{=`0XPbA1|p&!9eP66yme1OuzeIap`7B;}3hky0HUm`J3S1;&A;TYFH zc>kwjMJB1rv6t`heuV32xs_;OIl;&E>MBV%-Nkbf zX4_l*-?qR7j5J-wzl3Y{`(}AL4ZA>qpbE>61tqz3ZoXV5h+LA}bX9WTBK5e6ch8q$UrO|M+8T5t%00@@s zb}KyTe6G^P8ult^w3f>aOn`htgMy=?29R0WvSlSG-~|Du9f#d~d`4ES28d}*^?={1 zk;^1>bacZ`5G-wi(!86f6MsCkht=Rqz-5!H{2rnWZABCQKpc&Q0=#uzUFXyFa)Pa@ z=|>TXCMSymsH}3z5c%uvlqwgg~FE>&A6Im8H;m8{m4X zDK-`stKXxCY^DH#_w|u*rT(>LlPSQy(y}z3&Yu*OcgzB4k9Z}k1Vy#&>Jes_s63EV zO0HQEm0yT}nSdAiJ4P!k^_AKY+>9Wj7=s znkT4s%-}rU@l`>u0LUtS*+4X%2O!SWSo-A5u9=86uVZ?#b44)%bTrS(&Wq6GS3qpi?4?PJj(TYgfcG(dV#xVL0-*kTGKF3g=a}HM0mndh7#SSybl+AaZ90Md z*G<4|gaQ4km{utR>{qHY6}ln+Veh%17u^J!E30_r*Z071kEPjpJhsxkW22(bwGHOs z$}6q6V*tGSox%Mv)oW3P36Illsg)*21 zktdWI-#9FDO~PA>oi%jV8%T0LrT(|dO#Yo9)j5w?w*HLYw21`d^o%Kb&*m3H?Pd3N zcCxdxKX|?&CJx`&Fx+iV)vuILRK&QtPaWvhoiDpko%5Cu?^Sle+>Ml z^87rRBE5+-hozsx6wT|7kJ9me@^EzW50FpAy7Ky9AB}OI_{716I&`wyTI~h4D(nWS zxUB$5%=nwaZ5+c8i9~p-Yw#U z1|f{1&W`=>7Bbeey#fAz<(ardE;2K0){~TvAFswz zWxZ=>ehmZQ%dveA6Os%-pf*9@@0$OYblqtf&_7VV93|Q<0P2nsL;JzvnZtb5>tbQ2sdC0P>6XH84LJm6o!=Fd?o_#YM<&*xGOJV&x-0@F`X~393-_uheT2- zWSBMTD^z3^krQh6S~8gcsLhspR^B(dc814$R&4{$W;&ba{t@R!>d8v-Gm*oEZrS+d zbj*)BvRXiYkL!x^{x{(=Pm=<~!7s^|r7w`*pGFP&!(^7UuEmiL@g|Hc7IY9)fU(w%1H;X_VGzcltSx{pbx$<4)JMa z1RqKm+AI-zL;@3Tii4syM^i3Sx!8XE3Z9&tq>oanobMItdZRDSQe7gg25XO@1Xjas z6aKf+zmBT&q~67057PzlNeR5DE1&?NL?Qk)f0lONv=w0!6o@$;@3r< z{zp5OW8M>NubA7^ zG)SrSR-j%8JfyPs<-h+JT!E@)wwB#8FbWju1f_8Q*WDs=&!c?ixs8Y{ye#a)|GEX7 z6eWU*f0bQWs{B7U+}?Qv{?ElCQpcs&C5b&)hC1|Bdq4#ZqXRiSEiD{l>_Y5+{q^9B zK0FM^t6Y)KM5)kv74TczAb*2uYD`WlK?#meXK>AXeXxdi3SFrrC^P?N5dTUfTJ2x) z8Gdj#v|!1WtJ9PbMTH9F9%ORvfWoye^YFL!-nfqZP^kVP41sKL{r>FjKgq|x4!JGn zF#!zUx>95}Ht04QMY_f*aln-KpzSy6EW&>`ME#Z-WX}W>nO@!T<~2IXF=|~nh7Q)h zN(?zFi8%3LYj(hD){otH_#$u2DvkCC&qQAl|3dMqj+V4tN8I?6GS?Mx%@i<^1xWob6*R5D5-EkISd42L4W*o9ZWhkc$BuCy(n11TrXez08>HmC3iV}E7TcBxQyN1Y@ z_S+O!f#_gDI5_)g6?>*Kgq37I+{r`w1EjE#=nS3U$6V$3#5BWdRTxW6Ml9(Oxj`0s zF*iGM;5I!j)qggd>ylTRkFRh47GE5o5Uz)FloS-Nl$2ujSDI@V`Y3mfn{u7^(yZFv z0INp1-thc*=ZvG04~cTeSw1f+x09g+>PP+j+`&qS&;DPwX}$p9-*$F(HhvP>zb+M^ zXJA0y+}t#-9#K{RDfn1CdH!PfkY-UWHa7Sv-Fm)41PB=K!G~ebPY)quR$}7fZ~!M~ zC1AIN5%Ou^(@%ktVuPv;8PM4+enXQUh{ydz0FYX)#-OK<`nZ&`Vz%E}2m%bH}8#w8UR;Z$TZA7cmL!6YfHMid~!>!TC^PYpt$ zcwaYh`7P(mm|q>v;{ioH#%lFEg#7YSS|w#dz&nM6^m2lq9&UO^SUU6QoRfYWtM_9s ze`8t}S5m?pHDh<-Bax-SMnXo00nwh~N=ZrKaXU)ZRAT_vgw?1=bTq3I6eY+7S8G1eHz8y%EIq8;_IM$) zzux)g_k=+}U*G27;2;K``|?`5ceVSeKIG=@-5wKjyV*o$2p|`Y{8439Fq*Z!_m_&Z z&K*@vWm8=dI3r0$x0Ay7?_Ds=Chk9!sRL5hSfJaCtE(x1w7UK%#z+&@6p;VJzMp8h z--$v&x<7YEYayOG@x@+JFE)H0-)e$KUsyDsv8BFWrD z#tz?mw`a7!+^$Rg$nbCvgmx|}qQysnqk8+6l40c1UpJH891WBWaDJK{KFylPxSj$I zV`zswMsnqPt!UGQou%P8Q3RK?`hIuRz`9~VCeb#v-md3sh-Rx>Mw3V2-jU4nI54Rn z5UD=XQ%bs)0nY&pr z<^N1)@T#!^-t47Un??$&#<~2LOk|m62TB|eEShKeV}e)@18>fr;cMTS6w%uT0R_Wv z_%h@fJ81NPg%pt&2qCFlr&H%dz{8E|iRP6^xVh=*#I|3_x10*l>zew7zPaC2YME6` zQ^P&pV;tU9>)X>uk7xR6`iOVIOUiE@H?S~VG`%54ZH{JC8!0>)<2!gL4HGl0R_5S5<~YGxsr2`4O8#XAmM5y3{ z!`}#zX7IWGC9Oae3knIJs?9+S;u~oGD9}*Ut0y}gYrVJdc98rbKosh=xXguX0Q8(Z z`|(deXG;YOv=Wwv+kVxW+c&aF1JZ(rO(WX}Se37Uhxi0^Gn*-v!}n>xi6$~NeQ&s7 z8Tg~i$;#r1fVXk0)5doyDT|pROu*3OO#g|$0fyEcLn$$tCxs2v5RlW;BbDnkifd}( z6LMNnRg6=5UDsWkO6=tpSW#b!>%rM|ahZ>!a<3=?vWUxgt2{)dyyysc1p1gy7d{^| zcWC)6kC$9$BPX$rdF`HVt|M_wsq+g$xzR>5!BCmL&tkG3*Pf7F;NdYW!E8MM`LN9@ zLnr*5dmEh2MXcAhS3{Hm>rG$W!ug^6;o%`752xkpL@%z)ut5>!YCj!XEUOENi>Jew zOje-sP19g|+qr6Lh&x?{+fK~l;}|@N01HkrevaUGz9(_o#UWrxKZ*z6Z(MNy&^v-( zOyNa{K!A>pI66}NY6%zm5o3x9wOGD`Aic#=Xi}6BTy``{{M9AYxjCwUSxWo@$*}6U zsZciM3*AJY@ylB~GZ+i9`DNP&yhRfKSIWl~-oBE0TfaFMIuV8-LLPpgEuZqG=?Qha zrH&+bsggWr;a;kDp%Sk5_`S)PDC=7WVdwTj6!^JT=k-U0S~!@aQ;s#aXE;ii<@C@a zG-f|$o}|bt8S?#{lQ>d@m9A&8Am8>`&kIKO7^5yh^Egr+MhuIs?RPxiW_90Mb zG$@EKJ`_zTk2{#k@DRzs%v(eVKlFcn=--iTCpyD=q#%|WCzRXD=$7|8E!fBxYw~)^ zFK_8-JUw*ghb`tjS!X?dP^%ggqY-9Ks&+1Y^8)%*Z9ox%Cj2hOH(FaxWBz)vB{TRy zZ>_W{UVhwaPSX0z?5D7*i=seT@=f>cMRPCE@*F=gLTh5)iGqlvkHOga0QkIX!%A-i z5MYLYZk3}>Ptv5FeWD96V*`s9$B=Nt>K;lny=w^5{)f?f3_ou1IjZbSe<^kP>mTsq zw0jI_zS|%c;wVe$GCS=-8Tu-&F`hD0j;fZy8UJ7*?Uhm-sISZ76~elxP^b3e*^}ylpJaeXZE-2~DqAFhcw6Hw2UGe~0KA|D z@>FmEzA~B$5inh!7j3=+FsZGrO;J-5frW(y1_ma(tPBN^8h~--t7Bm6ISqn9*#69EN;>h2ul~=MTE!Ak`cs*L-hCwyj7@I4+M>qibycLPMhS4TF zKicSBu3xKvad{bMXEDF_#~Pdpb{he%C)GG3&!m<2xY6BR>*Vp;XDDT^V$ZD^-oePS;Mtq?5N}+u%!7FUfbB*WMP@ zDXTP#xIA_Aa$G6hS;R2G980QJ&h42Nw`+4aVPAGE>PtY!#LJ+eIT7U5 zn(C_R*)cn>*{-iq8CZMW)54LyqS4@6zVN+1!;1)KuPF9O-PsHE+k>R5&%q(BzQ`D- z`t|HHp+!=CWh1|RfZ}StZ!hR1^EjuN8gWcfG{k!CNH8^KMA*>Bvctsy0Y`R z<(N}tDY>{Lj>>Y~xcS8O54iuKE+N!+s%IWg+SqpPdrFDvwG^^J7M-o^D(#p{i{Rn2 z+EJ97!7f@Y1Fpqkhl1gZLoB0 zYGl>li4?RaEw^yJ6|n?fKC!=hR4=nGs5?Isw=D2L+dWLMTumAt4{2HJC_muIAP$td z$%`{BuX~b@-SPh5tp|`#TY~jUv;M~qHG+Y7|5{*i^+wviy4~58NVt>fpYOVMq8}_1q980?m6diL{T=NgybohER zRKF>H$T=i7(2>HL*!*aj_2crbgUk9~GcBK_;?LZ45kB4EF1cc#pBww2$kT}yC8GZ4 zT$A@C>w1FZoL#M5)^vhm%xSB`;{E)wzq@kcw9hrKAE}vb@}HgN!zRJM0^r$>w^=^Q z(o#~t;@g2t=G4P!XC>Xk?RHc?$*f?X7XVSSvx0_OvIImGFEwVV-aSe7~3D z3U1;@W3ba8esPuX@@iSVhv+aW37_o!W>EbUx=>ldcQg_j$c1Tf-Jg01$F=tYVJm_f zR(LG>@zOFf`BPKMf2Q(fruxJ1@_}5a%yOfBlCp|QKH!05gr0AIxIErE(os^1EY({l zxtwhXTTWyOP64HlG(i2FG;WxfZn?zFl@H%vCPwm1Tm)eydR81X0O=VR%I?Lt=m`nA zH+;qt(d(rz3B)V6Ti)(2{y*;>xJpk<-<^H*iy&oJCloX*(`zmTSKOP1T9MrxQT$Pw z{ZK6+Sw_0@Y$}ZtIIi3e^6z)*0X;Qn9K+?+A11)}kicqNjO_TT&K>Uqg;lRoH$GoZ z#nOGuX!A4D*~4Q}ezHNucT5X>(m;4%l3LEE4jb1e9(c-~1izgp!xFckzkB)_a!uRs`iFnhO3# z3AHljdsErLLitVWeLC_3t(^qgk|G!?$XD|*(C6Ue@tfywLMLI+8d^kLe8h?l0tne8 z7AkN!s>|~g>(>(QV6U&)NS;+9?8$d6PkbDK?g_+M(`?ILv;LD4OROsV0oepQ)ud@W zv^k`zlbMv(-eUou%?x&-5R9_>?E)nDX}2u8%+`(1Z;vMm8`^n_EGJI*5Dx1}!`z}} zTlF8jg=2~J!b&CrZ`bV3oU7v=R_(}2x7OTzgfzxBoeth7wM=%C#T*OdGrKsP>f9)> zORDcSbJf9c35j4SYI)GxqH-{*J6J(N4};p+~qJkuWaW2(sW;jd;i63{U~$wdQYwm zz27UTL21#`ozS9AVX26Ie#QIXsaB8sVXyPYVSz82y)4eDjGB&7R(;^58kl^RU5q*A zA+PFXoOj7iElUef{bdoTS_TvYm{&vfk63wVuYioDCbYEt~zP)^^#naYQk1X}O z@VKby?rO={z^BC1w^AinmmRsI4f;8!7Jh|ATf{tkYoXgNXExQ|XqKn05)(|-LUdra z0cr!4hxZk}Zi_dl`4Jwz=_K%fD>R}+H&)~qZZ7*ZMpQx$NtNI9ytE=HSeW^Fc}=f( z$k}wtwgXqQFs*gjZI@gcf4<#4S8?y)IYsgm^1C%E$5JKp-&~vZEtQs=r;dD?`zr9g z{C!lWBr92oO_nu-$M#II%9Mfs6LmsDf)oHmV}artCMKN*+56vV_IccE9wJ`gS&e)H zzdJELpW7;z`zy;oJ412Gc6JqY_UrF0flr};Z#EiC*i!mt=aPwux2;wJ_`Rt5B}r4b z@&N`1AdmXi+8+Razjt`ZfIFMqO6N_ZP?5Y>AQeYLnsozINK2eAeEP)d|NN?zPW3>$ z_BT@>g_x=9$^P@bs!P&3$6-W=Z9RBj2pd^kl)=8W^F8)WgyI1Xc9HW0ayn9DhxkBqV$Xj|;M zbywTlkw(H^F~HYi+WFIq(Ps%B5-s`-?uZotLgdheA~^I zU)9TCHN;zOVM$#>lot9;JB8y2+CfhKf)y0<~BcGRdoJFnP2v5I~F%J!{cx>F~@ z&7+v+YHNYf<6)HYseQ*Wz9jk?;bM{yV4aH?(@9(8@5~B zb^Cb_GAA|ciU;La(Op7Sls^>$;C7k36^3`|sK)INf!#ND+p{8|3kfWW*}86mD1XG0|;Si&BGg zRyRW9cd8vN!Z5D(e^9-W&@IHsx6B`S+ql?-lXJjTLvv8KzbGk)FxEi{VCSwxBwv5} zsnn|v25Kc&O?llIZ)!uIiY2YN@h3{AX9gnsHry;1+Nvo~o4wZiU+;Y&7N@_Qwl+8b zTNMZ)M2VCo!|5(W0nb@@bJQOcv&_tQCw|nEueK9BT`I;eJ6sKylRoe`ZdWAO+sg?( z{KC4DkyjDs>?KFMx_siWgw8gd0N5KL_-aS_NFFYEXFp|bJJ_$qyc@&K^)i3Zzk&%q zlWw_Iit3hm5hmH#ETw;MsNTw)$(24CqK{e^vs+c!bpIsk)9(z6(7TFVU^pDDX!Arx zFf*(awJ?@LRk zL|Y@P-czdj&ePk9^*=NIM37C{_}Q%NJjt?ke+5D-SW?i)OI2oIwhVoGP02OvS}Qog zP%sR1i)d>*ZLx44b;j$`NTd>CnOLrjzr|Nv8R)8wWImB`6j2+0nI@pa?;2;;%Is&R zCbsOp&FU2FlPQXJAEPG(({nFieRF5-%gb+$Ge75dPkH$45j#EcO*+#Np_6E$B+}H! z2Th%RB6;|d~pcCuK_&!I6nJtrRw4FrTRk<=;3qb3)I#~*w>G)_!9qepf-ta2H^)|#QAVW$HPh4V954FiUjhRi0o0IJSV&1l1#`UI zC^20ihlzvp4fq_S?RG2d?DA5?(ea&+kI!FGuhk3!P#yMV$fV~pG`t}ze&4KDIR7+s zb1!8#k<*@btD9as9JX$U4?%HpF(iPtYubdXZduxi%Zk}tk|QM`D2B12dfQ2(?){Z7 zpf~PSnF`dVw2@efer2i0Hu*{UC0?83K>5DkU%SXHj~tqhLw9pO{trfPhL+A^!XmeW zSMqQ0MnKt|OP<&EKS0ktzv_P6-eS(aUpvQmFR#M+i?~%T1P@cBu*zE}B+MpA`BTwGl0uHM-(DHE_N9ha4`i=!2#8$qt&GE#S9;|hv$ z=gCfNab)<2eKe9WEGto=2?vxv0H0qg+o^la4(uhm(Xfu28R_t&kvZ7;__Mtij zD(~QU4QezhlzNMkO{yyurDup$)h{ifh0ehxH!(t|#lAgT?t@myCP>(_5kyeVkzuRzh631O26j-7)2-?l5OUGhp#vxfU3 z>(E@#K3h4|UwBWgnv4B^%)ND3Ro&V*x)zOecPJs<(v5;BAktk@(%rF;lvD(zTj`dN zTr`RxA)V6QooB3P@BO~dv(GvIe%Ht4rPJvWr*n=u#(n>4^y}^w-xN-gATRnarWri< z-uLiZLC#Rwt=tp`vx7&3J&*TO{bdLJy{!3q7Jiy#yeX4!ypgfxxmNB2~)^JVH+t3ouY7G9$lwV2%at zMzDlfBSAFV@HA04fA3h4&TNHiI{5)CHU3AY=9CHZiNEO$ja=5P|M$r?*+)9a_;#84 znsYA(B==}gIwsyY{%$L|r=JxqSiww{YWa}iFF^Pu`ky?rp-Ada!Ms6sc6ytP)>=&N zie29_t2wogeA7F&R+qo!t(>1_zS}Rbq5k)D@EL$pOQ5bGjk3){us#GIxs78%u|W?A zG0?(_X83Hf0<#qmcp-ZP(I&p{L0xf{^>p7D1~OoZXD0F%4Q?CQkR-t!L#52yvc9GA zvS*6Ak$@0L6LCfBiKA0k8%XE%JyojIO+Wn2YiVw7JqCEHx8MUxsi$0HWrq0_#oFlI zUN%?m-{!&E6gMU0B;j>v~j~AmC10P@29J285AS!3)#2dxWmt&>+ z+@vC-z$c!U$MIxsU<_T={vEQgIP28u*%p716u$SUtVVp_mUtcct6iON-@w_oG_AXx zvBs@kQfzl(oKCyM3C_Eg3>DJ49uGYV`0<2EVm^*XSybRC)yX~&Z^IcKrQDgS?T~8G z+F2?WtCYjdnYg8FxWn>NV9hM-pK==4_)PtQ4QrvE$gyCY+sYh{%0Y93KX!JbrMVhW z?TVD8=_`CMvBBw**ui>4kHg~uWk+k(?sR0!7LWO{nSoP-vekIo)a~3^m+Lq6#KQJ3 zMOT|;0b|>o)8l_M=I0{h1$<6XV>23Hnd5b!{ryRHdc|3=N!idvX?^rcwyUy~yu81u za!GmX!E1AX+pgf`w$Tk{h8EQM;M#D8O{ zlDYkds%@g@)N9>!QR(*FV*EX);qIQA&VGWq=FW`Z|eu-=XE&f1o9ovWOgU3=Qw< zda!KGCMeP$yU_m4eK>CB)y?Vc?QgqAI|=8?MC_dDs+0QBJ;Uso4_wrNF`5kcj0gnr zJ-Q5g>%;Vun<-*aGTVNh`{r_yQT9;=;mHq+7M5v?Z>#mRzQg>tpW31!xi2J$J;=e& zIhGoIPN7q0p`OgwMVa-75hmx&EJ+k~lc|F&-2Ol|$Rjv(i&N@hk+amO4)vm4@L}PV zrmk!I5`OVa{;spfe8X9?#V=jeh~hP6Y@QOYLgZy?Lw&1XgpckwChizvMq!{XN1F;x z7GAw)N4L;C{k9Oj>00NKm<9^Nz4WuvA8!uW%>N>q=D$mlGx;uA=E=}hSmJ0s*T0V< z`s1{`yr9moJW;_E$0e;9bF!BH{qKoLS1F_K^=jYUT@MY47FbL;sS43c&nl+>!_sVS zCJ#Laz0p!t&kKhW@K5gJ108k`J;H$tkvpwu-q^}xpPwuhD~7;!m(4Kk}y&rta^ zTyAXKI3Q^GGZz8W_o&^>49;Bc$&A)rH#euD>!peL%5$h)*LHY+jQTNF=)8#$TZrb* z%@LrOnur7$Q_(=>G=L8W_M>%6t(fRxjk~{CkD_}RGpy8Kxzztwb&}F5bsy+u`c2#_g9|EB0dZdo+$(=H7+Jlnp!F)XKKu9*18BIJ;X{ z3x;{^0&%#d#bWSHQd9Ee$DjHtosM^TaQB`aF>KnJY<=+e)h49YNJbRixhY1SY+SXR z!&=tWkUXx+X1q8#4zL7n#*Ix<3EdwRRLxe_FHLNA=69i1x=>|BpOzbA<|t!a@zrFL zkX&hI4@|22oMT)>JJ{F#g{k%ov?#uApKbP~z@k+ia-O6)F~u%JT7gDc;%2)r9r{{5 zWSe!8ip;heID+cupVPb;|AV{bU4CvU3jTH74MutyCUNZD8!6?L@h3lB-ZeaSS3c!d zqp9GwR>tBO`B2T+SpheY4I*+_;~X@z+T|{ zIPsF&R-I`0={G(Y2~h@2?d9VudmG-t4hN|;!@a*c4Laut+fT(Qg6$1{qw~EVMe6fG zU35?z`6!QT$bn9`aH8CgYOd`NH-lueC9`2jPkZIUC8$FQ1GIMc?W9P#NviI5fmW)b zG>O5euc&^%q!#T#;g_n()?Uf2A*LOFo95VB4g%c2+MP*~v#{sW??l$gdZ$93P*vBA zE3Dsb{tDlYiDIk$+~T>Dakse^wG(ju*gdvd&~)TB(j+qSwE{>=`abdJ!9#zRvKM&E zb{V1llbah&?M`R=w7t67_x4>AgRiu%l2`OvNBn4~cPV;)iK5>;T@Q!(!%VxL2jGgd z)_SzkncKH>Xb%M186OYMJRd83y}VR#>6(3LMSbcxEN)yS#MQ0Ev|bc{RXF_1_u#U3 zoV#<(O1)Ci^+lf9P3=r1oDN+*zIVGk=#h2a4*o-RTvnM6B;{>8uy(GF!Kq0cMi!IJ;{{yhWG?pKA>UPonj{2Wfl7pheA?D0S z76^3yE%opK#O<;xcdL!qH)+Fzg990$C_+L;KDarXM~3KqwGIMkCj@3x9u7zpY&2wG zTMA`Rhy{ZFHnYmCuV0CQAy8`(?R0l`>%g{PwQ>OmXk--Z(H(jbav)GVy_)*!xz!}s z2bv%n4?zWs(b2Bcn9F%w&4i0fa`w3bY})t;ARW2ia>eOUKGx6Rv^%2<&arTzX;i6* zc}j!^f_Hx6OT;-@#@Am>LxD(B{hG>w&dtGXww|+(NW|tGKPL|?qyBWe@7j}IUw7xT zrNJCq#UqR_VRqlrz}Pu@cFzlw+_wJ>fyAQXOru9m6`mAxL6zXlNy2LVqe;@;&3ulB z=*GfsU_$#`SZD7ml48`on^q#%M=(^oO*Fqq*Ta5VeZ{afcxG#*UJ;SQEB@zcm!uMs zWv{OEcCBugd%Z22RIuxq4tP?$mRrxeEs^-}e zjpXWP-#Rb7be6nDjsC#z2qrS#4`awh_L>HLDS$PZb$`Eyx^+|1j5g+5J>{=<-d!Vm zD_FfrRa{tkn596zo54dXQN=#o#vSGk6OdrnPQE95Q-v$9GveAv=VaO{vDLJ>c|79) z5R@6Bu{GUk>HMa$E@?V%dI4O9%u3uyR`(9{T+TEL5c+=;u=7rYLh-kRy0w|L`P_rDstz1Z&Zev5vAnM*N)?Xmkztz(L9RW(Zx?Z9cr_mi@11dtj8 z@RXvh7V@X-FS~@QYPNR^KTE$k?02N+VufyOzJ3|9mN0v`SS`DLRY*|V!1hafw0+SG zI^8hZhT>eA-P>$VN4>hQH#P9>NJ)%KytrepJHkuDApgdhyhPavRbV4%q9pRDg0B(1 zTl+E^0bmpb>1)?!SL~5}e;(B0-(KQgxj`~+i^?<6ra@-vzo;?p&&2as(&*sAahB}j zI`qU_>q_J+aqX4~&X;%P+Ac0^i$zH-of#h_iD|=imTjt5b^7+YtJO6|B3OD1M%@Tb z&q~jeSDv-nQqhI>A0B4fJt=U(-I+XL$fj%f5^u|X8&E+^&YM??HA4CJEdJ8SX~i|W z$jX4a;;Y#=5%gEQM($Fg&6!2#O>xgt-n6NnOp=JKXCF@rcbZn(1PU=cyAk&k*io%w z4=NuuO_f#JwOw?tyTX3@BxxqD_;MQy0it|zA0GcpJiZjg1jNg-@SBT%QK6l<5u=gP+bnRmj9ZASeKASq<$VD!vOSLKX}N+&^DZ9n@AWrmC&D`S?K^9>JgYEW8E7>-9w5wH`a7h*pen zcD1aXaAA%N5{1IyOJn`|>QvR#nF0tqJ6DB0Pq7EmUH$H60>WqCi9q13?}e_Zyra5C zT}%&Hutg5?j@tYlG!%X2svKxGT9WbB-ZnN*C%Or|!CM4%{MH9IMlVtNj$niWDy;;C z>o2sIhPt}CAQA)(0wh7i2!#+J%R>?ph#8rg&DICA7aw@2 zSRr-Hp&W}Y^iaTB%O~314~bb0m5_k85K;Ag|6tty2G!W?S4Q(wAUph;DS2bq$meNp zZcfkZ>{ZjPrmpr;i#^SIlP8%5M4J#~VJ)*1D!0Gj!KBy@qIjG(hM5pn0S5VK_`CaZJTA*mA+WkSq3fF) z=k>w+)KUS|&d$yVnHxa1fQPno)H@{2y<_yMp9Z1zOkcn$KoUOPp0pJj4bRW}qSyLJ zoec4i>%q!JuXP^?pMbD*b13Q&z}6h{jb2JYie60-E;Jg$WDekYrX(vMBDBrCwji|u zWKiZRzLKh}pCWIPapQarl!qFfqeJv6n}k~iD>&Y;?jyBIYfK(Biv7YQx|TNVkD~A( zHkYuo?nilTILrKAxwVh#P13{2n<@hdNKMVVZV@#BZ!q>>bO*ucHvkBjfahdZDc9_K zR>lYHci=hw2PaJUh7j}baU*NlBhxk!C8aTrH7MXlBjlFDBc&rBdV@$@ATS?lO%;^= z!#?iUV@qr&WP7upaRr^ieXwUpfV@k-HNd}^q~uR8xam_d>cz+}mtmweDX}yi-#v;K z-|iTFb3wHlNNc+|TH|%!)Icb{czJoP$IEDdbY`&1;<@38R00#2*s=T zyUWnn(a58NEnqe4Pf7?Qg9z!7Rqm3c>fITwyTm|a45^=Uxte46Rvi}ky zpRlsCKPLiv^Q}Ur}QkiWR6%2COX3V#whj3RV?n1=3#s{?+SGig`Zm3xCfKkC23)hj)=a#_9Y1 z;bEo!mB;o}4c67^PH=fSHwaZbC=a~BQce{lNi}u{<2BJ|+i(lH5$N52S57qm^*Ax< zr`K5N`;N;vckGJWmp1ufaDY}r*bAG3P_!bJF6;DZmsAK}h z4x}I0kb|pIsd14$95rRImFOF=+H1qAbK?&?$v^F*brA7ay>8Rz(3 zffP=n>UN6%kf!7GZzye@&k@n-^;}KWRm9%S{+0(HIZ+%3nw?AU1Ch$K-hnhnSQi!h z-24=6eKW&gA<5taB#c9Jjq3b=_+DPpR6T_!$}T7|JM9ziPv19Ldmnj8;14^%EB-{E z6PC3WVTnCQf0kAc;kd&@=$-$|E)n*;92w0GJ?wN*fb}sB2^bYq_nyP-3*i|{@XBg< zD0Nm=5|rj2SAX)P92tan4rRk}`h&Q}kq?{^({y|UB_W#QKduejsL|XEh7=iY(tp@1 z!1#EU8%B5;1C0DsI36}MC=vpt-rZ=z^zG>DsO%A_PxHzA z=DWN|3lNt}S^}-zMH{ft?Mn$omS{kFg$8K`$roRO*jZTM`i{+^p;%;~Y(R$4D-tqJ zUyN?J4Nk@~fq5Pj1MS7-Es-!7q~Awexk@K%WSj$S=Sp4bPw?!~dt)OOElsv5De5H$ z>c}ho6T)JfPP0lA!1E#&7XyPd9sf~wFzo>~HAuR_r=h_?#JRnlW>i$$ZJqT!HM@v( z+`rlrd!PORSuq};mNX0mj^MnF!f7QJbV<_GjnrfQ18Ez^PKh(7j~H=py!KeBu8zYZj7(yt4e@ArhOX`wZLB4Zp4 zsDHJPlJA^7NNT?HMVdR%j`sMojsXLJraD^uuLkQJjX|TSThhYjcePVDQRhgZ)2s4s`XO zN7{O(sdDA9d-B$prHwnX=n8g60LpC!QepNF58ILP#9@;DmxxYNQc^O-gZ5P=#7E-C znjZ>z^uEvL>!-jLffhVb)uxW_$Ra}p?&gRLTcytY)h1NABB=@^`0umudWvf90?tOS zsm@#~GpU@=zUex;BnRm@P$QWV5BTeIguTd=+27%R%2CF9U_BAjw8)r44)^n9wx8< z%rGdfrt=<)5tD@jjW!L#ZW4W68PHP*5V=vM1(#5&(03chwphP4$?@B5)hg! z+hyd0ROkm((I^yPTLj)er4#|oz2>uw`X6kHq*#pKk(%2gqJ@}qOtwf9@^-5o`XD-y zLGnU1!SkH61UGHs(gQA8^4w0YRk&Z_>IhJHE+1(h7+zL4eqnR38|jV4zUEDYQ+(eez4 z9Io<~%X^?S763}#{lzG5HVXBrTKlL%_52)=wYs?Yh(S?Wmo>8I7UvUH=!3<1eh7E@ zruZ}9k-z23(62G(=+3RHfv@Z9M|3@U00x$`s}FLX8h;)iym)B`0y~szm081C_rr#D zmAtJ4UcA4}yM|c6gligbAVU98fdkEk6~=Hk`?g})GOA0O6V*wlRuY3a|6j-AO(L`# zPh!jE>`|PKC9bI%pL$7HV*iXs&9o@(em26*v-+Gzk(u0W%+V>8iNDFshy^c!r`PG> z$61~y28qwXEO9q`FFO6+^77<8yWnb3!!B}%ErdQc=vCUJqgf8hzM zdjx~V;h{}+LPS25=Ef@r!&--f?({LqPo$HfUW+md)q!tqi{i~I7bc`KWWL931#L}b z?TGEc_bjJ1IFOE#jf0LKn!Lm9*p|Wwqxys-dWKdEtY+_CZEeLf%2*A`@#)i_G-7($ zGMc=DrN17OI0$^UiX*a4FCah+{73DS><_seS=l--*1B^{Iy`yS65;sE_EZUVu`_y+ zefN`L?_S2;-_HE-XS9J+HRiPjHLCS*i+y=rT?#IvCJZ_{I-vSSGz_574*72WrnNP& zhVPTGx|UX$w{hM=9j674-V}py1qlT6oA&LS<@B&~-)mly7r0p}mm-4+8p5${q{!&PXeUwJL6mfSkvcwE;Ky^@cEKj&5=)?OjJpalY8769&t zf+7ysg899cVuTjf*1~~)5z+CSUmyLdv>tj;qFapyBCF1n&~Vj7OpawIe~|ES-jFKD zHMVOueg401j?+v@(r2%_|GB%3{27{-Z9aeP%#_A-_92+??GrdI5O4U^WtgZ zdxW`J@2_lIS?~-Tc`Z-ap4T3ed68|sm z)=Eg1KZG=+kV6@zkf}v6IW9@xMV3wOwbnmX`Fo7vg%Y;7TA<6 zkwli{ALF};<;&R25yNO3P6DMbH|X8K>v4BWAgoC+Ve$S~O%#~to`cF@yuAA&UqQwS z#cj?AHi@K|_*5o;92r>dk}V=Gj)_q4sIb!8Fw%!uN-AAqkpwo`yg=9(NKkc@H!`9H z$S5K&2M(9so~T3yIePo2r}7AsM6ouvm#=SBRO8C^#gW%Z=t{&ra-eALHhTogDp)3T zQN}tLKxY{G`dYnm%EDzI4I+L#C}#~4Nt&9Qf&K#(2-Z70JL!dmb-YPPNgqf`&h1Fk zK_;p_>Eh+%LRIp67=r2A6UL2$fEJ`H>JvV-oy0&>-zNe>YHSeY(DZ0WfxGrlMM*&BZ4yWv{GyT$ zqU-#AraZ#3to~*h#7jz)CDiVAjDK(b4w8?Y1>ki&j{o z%WuIE8#bpAvHbB4PQ`hLStyR@liqe&YVFMAP%yHSE^dXB$CFwrLurX+!iJn8R4q@J zU{r`N_0{WOQ~=ku-^e`RQjSmdq=H!+CF$RI_Rzy+NFVtU1~@`mS<^6R8`L~2K?Fb$-nd-NwU$X{-d)eN4~AGvffl8pB9 z0rEb3Wb6IODI@$jdV1UtWoh;}tFy3Z?%YS-E~Hm^WPI~J1fO4r!zi(%_nsMKH&G|P zEl+9iI(UFcrd(dpE5#{w?d|s3G|JHJ9X#sJAY^gT%=yviVZYG)Li5>N2ck?5 zrwbqlrrZud5yXw;zjy_b#&s&qP!SMLm%+!wlV>0!KS^nYhZ6f44AjHIK((~6v=kh% z@8sp}-DW4)Va<~@12WrQQ?wXu+*-w}u!sJrF*CR%41jRvgVd)dkRjd%9MrJ0fOrSm%Z&koR@)dmFToH%yu-M-%U zwPw!a+v59s4L=?)iZhoLCWo|u%5c2uCqA4f^uuBH&9HtQ{n6@Oj>108`fNQGEyf0J zQe@WnhK;zYR{nIOR~Kbk_G5g=yThPBT;y6m+?gR9o;5vWyk!ks!je9NgnT{cj?-qy z4@fIdmIY&l9Zi;_MrHH41I!Iony12zW{_`YiqxXkV)pEYrrgBh*K3vo+&67zvV~8O z0_H-R-oBuBTqJ`3N>#P2gkxYGGI2L)4wBF<_q64>N-=g*eub`M`$)%UH9o{ubHd+W zDu)*uz)ikpH0GjbKTpFU{=}~R!f1>pp7GC*sYISNQW>_P4!tw4_%Df~g!}8S= zkwOb5Yxo*S9IjF#JGD`>KK$q9x?Lf*o2Wz%a*yd)bXU7xk>ig9R>b6}q=XIJ#5j<8 zKx!R)f0(%dcy`j%#+5iJPdRk>^fVPid{~tbWJ`S%Dg7m{<2yT=c(p-zS0iIWa%nZcp#c!2R%jDp02>;wcVyIQC-g(_KR&1N}x)E;_9Z!~O>Ltn0aG;_SV%N@nC| z^k=wE3B>P+Q|ay;p=*1w7wkgg^gSW2Z&lWd0tlLHB~`VorrBAG&voC}{~(4i^E<66 z!)wc7<##w=Z7frtJ^5U(aWzL`RShY`j=)5BDTjRV1I7QdA3+W@L7AiwcJR5^P#rF) zcj#EHTC%&Y(1sh#sA{1uR`L9o|IvG@5rUSAtWL9_-I>?x1L^W_yO4~VamkQ!cqI3@ zIJh0uciIfR=?#D;`|h?Luil%G=kQflr=5Sa&M{owSo#NhNS->Uddvb&x(d4M026t; z89tvGimbe3*n)yW$KHS#!R4O{-voq&Z-9oO3HZbie%W^WNuH*r?Xy0bWZg*^iU202%#r07Hmy&y5m9e0 z!m&E^@+AfyUa$&!nwY22>!nyQhk->D?1n-fj!V-HioFBiE_nrlw3B#Wp^3V0hCq?g z7813M+JLKL=!-HH7)QniG0*dcv6Et%a_#gT6Ec0#t@IL2U%1hqg1CVX0YUZV`|?3u zFutgeH)T+UtW7-k z4Smih*FG{brEqI!v=Kz(+;8jCh;$_|e0kkXw%>4f-)qC|o!zSxBT`-rpt&Z-5W_h4$FGg+2PJpHNp*?P%mNdVz#3&_M#s@|3u!EO@*!!%sOxX z#$#b^=FpmE}KI&CIW=S|rDmpJV#6 zp%lemS~#!j0Wn7a&KLeh6VYlc)aORw8d})kJiV@+jQ5o0-vKzo9rC7wRwb}g7?G@h z`@!q{z@-z*xIZeu+-Qm?7jiaPBME z`4F7p1#a0Uyzg{UF{+DeDoa!p}Pf@XO1Wsss&7w`8Z?hI&J76PsC5@@f8y!%?^cNbB6 zGbB+(G6O=cPv#kXyWR3$P{#Ec2ZokxI5JqBhVQ?g#tqAQ_Y8fPDg_j^mAxt;encfh zoRze3#Vv&lBvI&f9e0)?XWrk6=j`nc`k8h!;crc=C*LENKeDv^p7K}@-RER8^sk5I zx!WnW*TkTu{ai^&fL;-pE%{Ere38u`X*1`WR8BSHO9tgmg_SXzi>qsCpS(ih*mA?e z3@;=gkL&^2_dI~nK=exJxYTgO%)XZ4i+gt#co$B}sh0)hPe2>p0Xq94iIbRthlF!N zKOal4aqho96WAO&+PZVC0MWc>L1g&^{Ii*n)c^@sZDrkfPUJ(HMTyN$(eG74ufgHmA z+`vY3$7=U$IrZggx1lX(5+Sg&Rr-Zyk^Sbq`^tvOy-;$(65U666RU&G{75Y9C>+dL z{=!byqHgH#-f z!1H-JmZ=&Vi-&kQ2Mc*N_T?>zh)<3x21Pex1*;6eqF%l3Iar+@u@8lF&N`IoypICmS0HU51i(dqz#I+Y zqUmq1k6yTK45QKooZkl;+c!P5zSuxZi{Mazj5Yl3dQIwldj6KV?1y_ig=jjNY$|q7 zDQAARcLd&pRP(l9cSuc?7INbS)V#_{=bkyZ3=X4h(-=v%b0=G|D(K&_pQ0vP|K3wx zN0v4D&K<5|1ygZ^tvnMshTcb<);Z+ApKRZTC~yDgYaAcV@j7m}?c;mdwV3j%@$A0a z%JZ{Ou%4Ym-r<|?%hhWWkvGeg1ZTx-d~k|vm^IoWhvy(;qe+*eWBb6@andBLaAfvh zo8kQC+0?Yh9<$I>h_Wr7s+WNcAi?R*T}TEuL`{C{ESzIz(RYZVM#rHksvac)&^I#_M zMgo&#WXf=)m=5}jP-(Iu6doOZ$AVApQIptv>#GqdrxYBhkf!D=e#-1K-gf+L)bu$> za~*+bE5Byf#{SJnCzCLE zBoJ3#1?^ob^0MLA78h4o8aBWod~J84!IpxY>WG@Dec8s$q_e6T=%qomj|i5n zESd^ql0=G{jJ_X?wg`d>o#)~Ay*BB7E$+Y1eU=J_2=D8|V)8U$q=zqVEpS#rg=n{q z-``+xe|`i&#r0sC*awjpCSY3`#EgRo75bu_x(H^Z$98rcz=%=dzNH01V3x-89ZQV@ zA&_(^ARa7Hglys@UlQR{sv>1(x$>aq<-S}}Qu39SHNZBha))+ko@{W*tf3P7---UD zKqug_fl{83Tlx!boml^NB}bCygo)fhA_Jd>4NN!un;-rQ9UQ93yX*j^kC|fWaCpeu zCpE<{Plh+NwG)i_K~uYt75vf)_NkJfEQxE$Zv*w*M<~=NKl~FfM9Sy_d5e25L}d>v zcmTrPOwh0yuKs)HlsN`XmI`@=6wU!^O`!WfdSIE{`@2V=uY)j4U^X3KFN|ZHkN1oTG6%aSpK~ov6`B7=-pR$m zIQ)SB`{|pyp$qRrL9hFrsAYCY@)de|?t zcuS}v9i+oj`qMGg?JXU2@?voEixMVQv3%?37SxgM+`XB`^p`U1a|QLsH!fR3JDjA` z*Y`wq4olUa2n2ZXAnp0%hjowkrl`ds-gLmg7;@ASk&=c@Oz2cjSj0)VGQ?)w++)5W zn3>pM?)*C3QNF<|V3Xs2@kkpr!F5MH2f_svgY$Ub-xwi)rjYBw-FdX-5^CglGm*w)ibTq76b%x1mgetnh2*2jgFuBs zfknyz2RW`$K%)DqE0RQ~&VdHx8h~J2wWXgtqUiuA!88r9A1d9DV8LsOXoq2o`&8r7 zFf^$;yf-Pi&2MFfgc{DXwF%gwt=&2d%|Z5?Su|35&s@XM)`Y z9)u|We>cB)@F2%F9mN(*)m$s@W$-?$D8T66ZeGA|; zYTWRjnV-3Fj75ecD;Tw>z-QrIE}%V9!X*8EnrNR+%QM-s;fVbeRnW^+Izaon?xr#2 zq`s)EE}VY@UM45)AgQW@P5cSM?Am33geGAk0EzK~1{%{dVjyUb97-9nc=OrrV4@(- zD@ZfuAQ?19Hpr4-OmK}aXptJeh^`YYy_X8xvqZX$DN4MZH;3MPRw8wE1u+`qUY%yG zOHx%e!hm2L--Er}%QIy%@;i8fh{gupX4rT0VRJku0f|WQCr<#V%&eRe0>;6MLf23f z=_;KBnZsl4?p*6}ZkD+kGErmO2Sndd&gY1+S{>>bE}OrN-MnLzF835$Ui(OVCHa-z zIdnwy{YdMjhF9rG+Tepv0esgVw(M4>d#!HgvK+7GqVKXGxbH{z6Bl!)@gU2{r{E3YDN;h2;Vdc|sQ02mutO zy68qsenf0Ah3GKdPT+a;Qb$c9~O3YILq2OH?Kzr zX&?n6j55P`^K>&gDkin}HpbM?M>k4F+%-JkY0?~5T98$k;8eH^IdS#rjd4(~50Q}b zL)QJHZuoEvK!(|z&lV?#K|MZD8N=-N^=O*z0lmM)y$?3Zxl2gyu+9Og+s==i zQm@*jGK0$F@F0K<#;%sUMQQfwT&mS?oa9tDbfI(l*xZrxgI=9#`1z5^;0D3&P5?|p zE*o>M;=SG7&_=0yd>3Vn>3n<})&Ep%j~~0)oBV^lLoC%VB{oHJC~WrF+y3^!zYaB+ z{y#Jt4F5Ns`zu3rGTP8g66#f!yzPG>q?`wJ4%tIbyJ=VnJ z&~kzcUWTaA$0uxJVpxH@*CZfvDQwc5uy}S%vgO@>g|J2xnDVA73EzxkmKc4*278*2 zki<8Tyrg+K>j{3N)9gZ_a_8R803?F{{X|{{n+qoIuMHTp-*em4%Ms0K*t?y%C{_p- zH2?1l&q3RonH-ryvYgNIG53`6i9jre_( zD|gU|gMM(ai9N%+>R`^T6PwnUA!}A=Lciyk$1xEtuIXB=vVON6Y;9VMMqw=xGUd%DyUgQ+DVB1)lddTD6q)Y{;7hn{1{ zcR{{& z8QLrIA#ABI{5``X*`+K9xjRH)3xvDG;1g!ijBr1bigewuJQu)$eQKI&8WHxlqZ{Vy z-^a8;lKR$;={om1O}qkcjcaRxhB{gvEj!3Q@bIJ!!_HiyKIdnyu%}F8pk=1&`S(UE zuEzt(H^NTBG#2}Es;}ms?j9S}dddoQ@rCM_K91Nl`#x&ss z1^S2o(x%g}DfdkBmec8W@P#bIjosXZ`A%!{o*H@K+uj|~4CrWB^zU^PvmmA08Hqy(Igj1KG7ABuq zW!WnT1U0|%D1UUqwFw`BUm_ZAHTI%os)J-J=rS!a6aLGXqvySg@%aVx2`bb61`lz^ zRc%n52LVKS^)zmOhi=SX=OSlh@NGT2o@NN)brLm2`=A`P*^dbgFK0d{AK{ zTY3^d|0`tr@!bdT-`5a6I+CT9MvCvokvoep=t&k@uHBOA8K8zd3CtFLKs#RJVAVf2 zG)MI?&2p}{%ea-Mlc{wqBE}YtPXA+UJYsD3Ug7)t^Kj8ggtW#|hkIV761=Pw@nxFq zJ!qsj!=;9aImCsYZAdxo%2LRhy&|Awv_h|JE~{J6+0;G%`i-cv|E8o*pRdw&vQAj@ z9^{X;udkSZJhMmnIl&sGd(VRN+x5B6m{oTZF~OnAgDYW9=*ipzOLb4E-qTLd1ZR@J zrQN|1uJojfP1Vb?-7;AKxk{6ckFQAOmkrp$$~UP6TjpvV4apf&`C&zvPv}EV-KuGd&P3~^1Fwb-mHQ1twWpw)dmDNw&QyAvji%f+=RGv?XNRsa{oa3VzFF#%ligsc^c*slc z(9jAf$+kPN~$GP(`O_`;w@Whk;!cwNU7uCfK#w zjZ5Rauz$buyohYLo;T%Dl)R2L`Ss0p_Bg*$IJkXmR-pRT(TLbivjcEG^xG%yDCK|O z)q*m92ez;Mbj(l03{xUMClxdpE zw{jWu!Pzsy{YSiN_=v4=vfvYm^tWF)2o<#aLo$D%xdGGN}hgm*@v)&~y`siR1|~X@DG^sF= zK@hz~MCe4L^6KnY;Da6m-qOghoqF~!a+T>l)Y;93V#Pm8`44t>3E}yyIbtWBvz|4< znY55+?=JcX{TkVcc*voJtPV7iq=xMYPiU$QIy0DDEBWh)c4^M&^{(IzFP@i<3%>SZ z@fc8h5wtYr5qTOA8Y-2puyy;v$x+PKDPp~mBwWsR~KL&C$Q$bOx#r9bk; ziSdq-bh;4PXU3hZ%+{R-2^oo^9>GR%4Q-uZU}JQ;mzK%JHSWsV<>Q(W{m)XA>wBAu(aP<{o$Y!u3{z!kTW~n107H)+kqnbGrqB)9uiugz&zQ z*cEW2zO_v5yu}B1Ej_o3g;ywALWk&x-N)(4Y zNMG#o7Lfpd7Z`JjFB6uLt%kCMte|g#CTSN8EJbD7Qu^u~9$Pi#XIhdvkj8Ojf z4h;nvhU`mJN1={on_-P5^Pv0Q%4Y_dK$U80^|kVw}Vm+2SY`e3iCz*MLMkEF-;*GrF> zqlw!CZDDeMI(eMf&g7WD2kK?_?85a$mrZt>`g=EoiC@f2f64KW*g0RWRRKHZR-}_n z2drKTxem_oYgo-PDmm|$vvT&9cphyu^J1EtO>^f+D2-h+S8iRz95kw zVZ?2~o+rlTzv(7+c*0L-7|K0H`{Z$X;9~YbqH$a<`q@%Gjx7Yzyh{P|NH^7c zxTtNIz8w^uCQOgty|+9l9ZZ=5c9+lXjNkU3=?VM# zvlf{jTV)=%5Hozwd3y}hcSqxy_3zXpa@wPWk4Ai`1&~V}w^5`XXZdGd4XOvsj-ds} z2<7+#$Gg<4waKXZiY+T@UgWl&=}D_^gDjoNv#m?#lTj>eKRZGVTbH;YL7e)U+YeRf zcXTppBpHxl1d@`{>oGmxLr*UG}x&Rk=(Trws-8P+cyBt8Yw^gSj(8f;SNs+{wk zw~v4AseD#p)%h4F;q(p zTH{biz>Ph+i!1lrzvfSakEyyb7)FrbE|k7wW$kfNI>yr~6FK4>Yn4~yN3cJZ zGZR{mW)-AS^yUXuylXIyQ1PRas2(h!!~Jf_u04kobj|}^D?J>U-!w93=Z|d2UJn)S z`CI?Vd@I4ew%FR57WSg}%E?h%Ve-+}A6#}_UlLs__wOV%KW+u4x=(!~mH2>9ruJq@ z%Fm|sZt20BM%*sWp+!AN7Q~w(6au@JlVVx>(?b^kd^Q-bUpkkRI$FP#hRm7T7WOaXVM zK+hqv8FOc0A={gd!GnG(0okl}Wx;*4Q)0yPCX-$5|XaY_gC3&CjZpjx2eT_OH!9mt4`*J#g;rc&d8Z)*4$ZCC zmtvMb(}Jtl2H5+4ch(%rBn(!ggB79DbOg-XJQUr z3Uo?{Ur{00zUKIZ;o^36KPwc_SnVP7;7Z9)d+EWRa2E-iH zr-V>gvB(w{cGHFHeIKfkaus-ZE1zHKB0F;#4-ge2o=TDO?X2vr;eU)QY)vQKTNC>? zHY<*|n$3cKt&}gM4m=+#Jb7De!y_L<9yT8^7aiQ_`M`a={CsDvpZt+o(nN_&RBUAX z$ct;kZ<16k#xba_QnveRbMN&V+(&0#VXX#)fg_Ss0>crNjHhx&fU8o{u&UzccRC*o zsGN8uP6^UP#?vFLhj3>b9-4Ij6!8*vCZ<)P4h7kjgEy!8&ZjfpwrIHer`Qndp_1f7 z*RyH%H$q_&e7%$qmtApifB{K3QSl1k1ApoB_qic_@Sf)?1e9Sm&-o~Fl1AyQ#Dg7} zmS*enO?N!+y54ZNz#AQ3boBn|=(4Qg{v+adxXED6^-*l-s4&^f^(jC7xoMN&mdLRy zLoptJI%YQ_c-7~-lW@(vJ09LS+`lXP&t$8GxI5z43y``u(45?y{hvfj`-8z}QJOgI zspZXYK4k{t1_ePOkl;2L91dx^zIIKL8b2yrwC#|?!-j|LX)h%|>}DN*D9U!P&TT8w zDuX;6XTH1}{2@M>ZAAu!kcw;E>~JYN;%FpnUGHrCt$^LlYvfouF|aYlXwmR6VVbBn zb>Q|TiIvI?la_CEPrfq2BS+F;DG$5us&Z}9_M;Dp9F%wuW81-~H#w z*?upRbkioF1nwGQq|N7XJVuPPD}Jf&=w#OrPOq?sYSJ__%|~~WjYq<%Teo*hzbJes zyG**R6PO7nxgS4DjI7V$_NZPCVPsBP-acz9?2h%4s1Sm+GB1H194CiFZNM$r5Q}s zu(6=ImHG4eeHMu1Xhhz7Ihz8~>Q|Ho;krIRe9$!IBh~gRh!vW!_BZNhSFo z$j>oK#cWrVvcyLnS0)EY&E*3 z%wuh2zscV_X#38rJ09Qh$RgV;#WGc%WVl472+O^-|J~W5c4F~*rHpy=mdQ^jRlsD! zS|jquje>`e<|Lq&a)!R3NnY;>%c@rWid}!)b=BB#52!KZpu47QYmS{1cH`D99FMX| z#oA}?BVR(h$|L`$R>vYwYbu^YNMRBn-tVz>S(TDrKenI5rkyZTs*X3mwV+?jA)EJF znbp{jr$6yoz!{V+)T|XWu=`&*iU^XG|0Z6C*KfIhh~y+Eot4OzaZ`H1pK_Rnw$jn| zBviK+-bB!x+zD5!f|1saPxA$PK7PbnP}oownTl5QwmZ7BTV#|`^e#o$h3 z<-Tc&W;DQQz=j|%U|X%Of^I(QcSnc?F{{R0?k5v4T2b*0BmX$g+?dXe4RJ_}>doib z)jx4K_2z&})Vhy9+#4bl#2{0A9uH;h8=L4kO6de|`{!ypJ{O0xp>gu?T+P&nTS>EK z0RJ?elNM{NtZQDmNQS6Z*pCImQM+6Cvl2}87o5tV{VD+M&}K=b!Tk+7=#h8u)yT9r z_NCAR4d@VFcjcI5EKKF=ID%Ig@*mBYzSV%bcD29*4#7Z&JdNkn0rHRdY?FUzWBDHT ziiWkJW{{3Inv}7}=P(j==0{LYYHvXyM|%0)bcH{hpfc;oM&&P?=V{wX02l-HdnA1G z*E@PvyY5`DkJ~t`Z%1`gp}Z<@-3(%C*Ll$)U@7bJ*{;p8U;H@& z1icg!nz!8GJbdFp9(0Qa*lspPA2X22Nq57bX%YFP)qiiDz0+%rePvxiNAM3vyeu8h zqQ?QBP@9)Q5>ErwhhV?bA42mm%gCg#dIbjh*a>^?1>z;A`R|{sPYLh-GkW}`?osZB zJfUmEce5iMZhTHMq<^nuERuXjjWC=SxjFd$laD+YkLv_@hJ7()%Krtzd<{jiBjvR( z#gZXq3KNUt0)`FDly!bt_%+DEs7)ewLaDJ|uBJKMVrXZTa4WZ9!xB|Evfoz%MKB#+ z=NcL4Vl_n+Ltw{5e1fgMicNVx1WL8xe%(npPEl`YmG zIf|qUW0@lIbr?&m(o**Dc^CzSmZP=30pTL8?`TsGKclgI-podiq`Hq{A(cebx0>*t z_M<@=CUN_G#h4tcvHGm0B{+fJgbZF;)D*L7^=R?*8){u-@GJ6{)el#B zR9*lasTeD)nl#yr@P0*1#Nr@3=1WyCR5VCtoyH3jUGP)0A@-SzU&=_vBOyqaU&H9` zy&++VMXpopG8&nPO{v-8Ti^OEUFMl9jyX{If{i4f(%zrociKbjT1$NpjrcvxyiIaQ zsV~k@o+AcDuDI*MuSUH4eu1OrE0w383I2I}waGiyVe79&6_U!i?3Xo`zAv5VB-vuz z$gBq|pR*-Xbf{$=D(KJ2yjNAKsAg$yGPjT&txVLov8&bm8mk=MsMmXgLioX=%tm>n z-qPiuAjE;=t>#<0B*&f!5gf64Co5v+LeyCNIK#zP2|*{NySCG33K{)rM=#Pkt2GL? zvZh;FR4j*rP6Zq=0EOKK1<@T1EJNjM1YeO+#Bz|@7b%(GyO&xb*+N4IB_F5@B=T&i zp%o*wvCQSoo;6FCOO%zRc$6<+M!harSI#$vih3=pf?Z$X@4!3^<5q%njNbgpw49G} zLG>TAgtM_^h*;n;M(zG2i_QxU_GmD|IL~t4LfT`xl5nrXy@!f|;=^m$Sl@PHN{u&QQ8N<(W9Uk-?wg^)vD3QK*R&4 zjEN|3YQQnDND9i4a{eaj)+X}q*umZb6=i19Ufc8uc86B=!j%LOSGT48N@VTBhW$ZA zJ{SK0`5x`_?5EV>12wwAGzuv+VLp#5l4Wvz!dnJo_P=(nLzjcqi`xU7AqMP&L!d1h zOpauVv}b6b;1iCyu6a0Y#Aej606r|Cn#=Jf?)SIGBK{PU`SQziZik;I{I+2h^dqdf zR(5Iw&zWevdumro%chbs34(cC6|E(!PHvmeVqag{I+Xi~8)8_tMp&h)MWj_W7s{qz zUx)k(;xTCk$kA88;so9)w+}z=esij)-52A7o_(=yFS&BHU`2kdq^lmV*5%?JjhN+8 zCd|lCrWjz}Ni%J)VNK7oYFPJYPM-7d5MiTks%Bc@H?2Ua(Wo9Rv!L2S!2RlJWxTdY zN|ZG7uy+n#z36;nKl|19n@4EO=14)Su|J=Qbe;YNUN)Na7X^nfVfuHzh>9lHf) z4V0sx;ImeeBi_}n=lA<4Xr;)EIrZbh1&?k%6O?h+j?*wBWc%>vPeK=8`Hz%DWM4y< z`OUF_91jbS^?TKdwDWn2j4G_mXa7j+;XS~ax)spa*ANj%25hZzU*U)^&qmcxoG%uE zP=CuBJK?z8eh(_R!9=yD)JaB(A=9s_GDW=Hcq4u;?I8Em*9!(D+pK0sng*j|s#oxu zlh9+pz8bC3lxUGUgmC}_yzt=ICNBI{L8_y-@!06jCl9?P6t2p8?8m`+-LDqb5u#&w z#6Vmfz9V@eGtfA4&;ckS+w;^)5%<}n)8&h|!Yl>d4vWw*U6P9`OAN^&Wp}vPt1n70 z+YCaOX}>P!)n)cL1f~@XHQoz$a}0k-9Sj{=FpA3t<3{f50=t5X+2E@D_7K?=8`jm^ zz*ncsORr(|)j~G$!8bX~wNv`+iL-ID57Xc%+X}8rIN(_Qwmr^7fCWU>w%E zJbn}vJ2nZNDr3b6pQhLOIu+(eIA9IxhoJX)fMF+1=$1pr7JBIL#n!}M(Ql_Fs5qm! zq5G>cRx#v7*}X($xQ`wqeK)z1YzKjMJh!^0T<`FE>7=&+Q;rCmAMlx3(ZqG$rza+; zug%9)7|f4z-WB!VbUeE0Kt5#NYO^a(r>CF@`Tj+7D+Ja|6Z|#2(fC1E(;I%K)FAZ) zDHA8UBKqyx=av;@GJ6HtAmwsSwhPETc+cHXOu3EJz=MTshG}k%aOz<0n2EaeiH7^4 zGE@cxDgW>Q1C6RJl`7Q%ZhVeYjlMfo#&gur#s;YHJQ!_MCs};ny0Xn<{l9#%mBBiL zb7`eElSO5?4inS&gu<0ygC!{qIIszpf69M#xO6DL;71+4`60#BRv{R3{m7n1zi1Jy z=|3-kS;%oVE`a-$nN+yBe@XauySu$RnCvS>`ONUnfg|gv@q_6nI~&A&WJpk^@?B3< z4Jm%s=uqf6J1sdrCRHR#&Df#6r1wZa-`rqmX*lrJu($g+HUSW-OqV6#kb1s{S8{GX zHYt2YB3Y4^b#eU5q5GkbN#)nXCsX4Yjf=!FhNM{X`r)pxovz!=x=<_&de~>Tfokj9 zk2&{o@;jdev6inap%uLK`OTgZeKMuCvv&g&5CR@BbtgrFDAQ2#v9{Cm!Z&T{&SO2E zM3LeCYmLsvGW+Z>K=)7toF!|WCYw&)w#GO2wP+Juh zjdEM%2f|%*cj22(FLeGZxZ+lJ>hw~gW@h8qlYk6ne_}csd!*bKhsO8qDo2H@`%Ok3 zee{FXR=dMYvFh>j(UdRytFhdz3x0$`kSY)_%`gxqsNu`+I^N!iwbZ&tZV8N(b8Dk3 z0e1psasOHHEgvB8ie6i0J07G@DmI3&2XbrNP1@>{RNbS;ZRLpFRXp{8Ux3DjRm_&p zQSaliD_N+8A=^69)zf&Y{l?dqGb`)i%X1wLOUz5_ju(Ka z>0vV`MfVCxRAMQytdHT*#CW8bMuKF)pWgyQ+Q-s*LO;zGaMC9`8y{!K$ZYlG8-Ych z?N0|6N;{`*lvke`W!Z$o^hRfn>su+!gvj3Mk8p=iFe~QN`Sr>>^$*PvruZ?6>5-Hb zpEY zSSxQS13tBVyv$l6;5J3|Vh2)RlqWIWsGawikK&ZujnwsBD!Zd0osy>j%xh4D3|k6b zpPMXQ+`GcMeMmKEBe89r(I%IVOY+waQdziT^%GFzK>Ni8>{mrCx8Jj0<~zNFr0bq+ zPWno#JXis*$D7(*e(#mJGzA7oTCDsF2W@7h=h=6EB+<~vv=1l$0UjmvBuAWM zZo^|waeE_ySE7M=`wtC>5;9$6AUqm0?Xm-rhGlDf+g2DoF~|BY0(& zjNNgmf=*TYcI{iHc{lpITz>S$%_Qcsj*40#kaIzwRss%pxX5@`g5u=2$uGq9lb!v*ejotsRY>yjR=GO-9X!=l>AGpZSKV zYK_O5`;T8Q<=sM@CBr7u;bWtulln)Cl(`Y+Q=8Tj{rDI@?Wf_aEdF_XPtoK8UBGD# zqV?`_*!`?I2hRgO^IG~f`ht+4P$DEm6WNQ!i@OJT0)Eda4<3tIe+E3`g`+(0YP8W^ z+2Or4*4<%wjJu|rcdg+n)%q>xa5`Rt9;je7D`b5>*`wpZ`Gk1hmYWH1lsRmGrNrCxYhH&(2ZN z>ZpK2_^&DXpOp-3)KldT5y=I6YVF-8qLcID*_%U#cR4nJW#dnz%Ddv-8--bd)TGw) z&7Hwh4lW!nJX2a_q*duvLoe4#4)$M&J9r1WeJ|Jd9JMoL9)cE`oImvbSgU|Bqd;Ic z=%wvb&jS*iUtA~&EC%~Hd5xxC&}(A2YJ;QHjY0f?h9RxX^M-A<2gaE047;F-XenLJ zX*>a72_{P+gMgERF%myj3yndKaw$1s_MKO6Z}bSnO1J-FY=X)c8c+v4%5wmG%gbQt z&95x#t`BM2DpxU^(5){TE5Y;E=#4}?APa?(BYnHtGeVwlN*u?`jR1H1H4XNX_N!M9 zU&)MQof|A6MAu!AC@hhP(f;6)6W+9^i!4)#6XL4BkJ}g;tb7?(El~ri7#TFAr%lb{ z5$Sw;-F<&CN|P5n4y#x!H)$kJBz)SxjlxO=aGApH2omV!1qs=3H_+V2W)Er%rYmcd zI5CaNCFMt0F&`KbKuK*jp%pv%#2VhX%b zB5nhwx~sAOjOZwW2j+NWy}U6&ox}F=WTWm}A7upIxaHc7KSFEhXuJ~xCZlpr!+szf ztX+Hr&upJcJZ$y~&H(w%L>|)`+=E@WDBM>mZaKDN*Kgv4u@vsQ$}{;{QxBiwjIgaO zvb6JUBjwgsAK*X1y|oFaW>T0+W%q7+bK1ep4gVXODt)W6zL+zt^q$8x2t*WS&h9lq z2~4d05W&l16s+AU1Ye`_BZ5T8;d)z~$60t?`s;U(^3b;aVmcKoY}or)Coy1aR4bO* zx%@rl>Rd$@GZoo%^_p6mMTegnDUAY>-5dMDx^JRJdgN)PAEA60r-$_?7JH=B7^8Fg zsl*{lnQ93SIKTxaZ7=2~@x773JVz_q?p?czOC1%cx7uS4YDd@ABX;ACC2VkV3vY}$ zWo2KKUge=p#ljSvdXaG13}!e-K7DNP(q^@$-t5{Mx|B43AJPM&S2z3hQDx0MtI;!( z@I%JxMtN2G$iQ(R{GEg~^UH^`@?6}?pIS7h?|yD9sU4NAMgtt>?%h9@l4T?^8qFPk zV=KhD{Lw}W)t8!=VYRVyN>460{rKnW@2-M`!OaoR<~tM=!xS`USm9pGhg!*x_75H1 ztB8l++E;kJ&ix^v-3hDk4{7V?=AGgDFM#kuf@$uP{Jwr&$$vs^Umf$^Odusx> zEV-=qz8ONVI!xH3TPF=JNV>E|q)JjmDSYB)uQ7ab>n)Y&QgKr?bgyR7{Gc`>N2P)w zhjBU~SxnIk$+|Q!$r?DnllF+zOUscF(+YJb_m_6yP6(4}#~C4GWjf3?(~?p8t9qWn z&S|SL;X{ zrGN*S$hP(6g4~W~{e{;IWx&-5x9~dY3EE&X#W+37iAh23Din*{DJNHA=0Ix`@M&Q` zP3rLF(Wi{`@XVGq;2L}>M}75z)Ad75TE~PO^(^&vC)O&^zKMMJia@@T%!sa_@=~hz zQ!{D#JY?jN67^=@YSj_Kqr+FttXdu^e*dgQV4Al@9h*g81Xiy1k}_la3l^5#72{-G z5@W(Ul@N(~yU_=K5Lc)%nyfoQC|4g9QT=H*SY&4uD>U%Pw8}j5BG>9t`sJCs_Whno zn{#P);Y5IaA~>*U;+Oj6*F_s;u{Av>{0pv$4f1S?0Ox(G@yDCe-IuqHmt#wB}bw%>+D?GB=TZqF1&uxw-9y@ zRKQaBa>>O>yU9g|Bn5d=3>t4>+rIbq#_1rxWSMIN0XF6dJHW4#PE)egD#K-VqR1g}=A^i)NEf;$l8RoAX zs>z7uy-{r0Q9j7}vmZ>wAFF9fi2o~r6cnaHDA{yP|ItjCJeK6@nc9ogv~@_~ zhHaoD%xDeL7){F7=032pB<85j8X@b}GsJT~K*np@H(Pt&EC|)iz^-Lo%VArp;v6M^ z73<%G%iHEJ#1jX1`kA0NJSw`5DqnnoaO2prc;uaW@oDAuVL5z@m?53juuJ9hnaZeLg?3qiqG6F!}_5Hjso=!Hbk$hZlqlhPXtXpQQfy-vI zy^mf@u=jORNPYkvEYLOLb=82Oe`D2X^V+^iC=;;w4#C~@{RZgU?`Ju=xeI_|YDNOA zMF(s=4$9ZD`4B`XwjBnl3io!`c(Nt^L97C9d(>?@nbIFP%Pzkw%sQg@%sH|6ON;Vo zZD@qfNKh~L1IKIACoF*33?6#LZF~JQynbdxS3!Ek*(5YlX2{~ESL3A5;mzuU!V4%*h^*B^ z3W~?6Hvk&>%es9xr1>NHA#ay*;DFdiE?IKAv9C}CeCxOC^K&mu&c5cLvoIc8js3Ez zFm2`IA70EeTvd8R8Khp7dgL?z(f@FP_mtjUDe_7rS^!~<0roy#9Nu%4-fnq#wA-(F z8dLt;hW9NyZQ1pqVi)PjQ0a8asWhH9ja1g754b}9`P;`7QW$p}zGNd0NG&Chh5GBm z-zyaV^AckN+kegj2hTr_1GoN93%LCZ*oNr8+v6*@|I2FsdoKOrmD<0od3r|c{l(G$ z?hSyHPtQC3&+iNwe^|iZ&~Mlf;Pn5rfU_PJWB&;MuYGv}CH~U^I0*UY|KFkB`aj&B z?~j|!$;2rU`>!MOXRrZ~?-N`P2X|L&R}N+jczAPPAi%`SI{m(@`Ypj6T8$SbnvHHc zoVvae)w+y#^&jXn$~Z%=frJ+B%+Tc97F64ss9KiGXAX)k|yFY%fP~Z!P|QzgoX$PNYWPRhDLA#;(D4mD}|TV!3gSqk2y2ENc(y z>-ShWZ@P|upX|;IYw~v&<^i!uKuNjO@^Q<7iq>?Gq!JLu^KZG&J24cm40$>Xm8YN# zivxYO7H3-`@HCzAySdvQh3KZvaChX*ur5?~qnQ9JSZyO*&c>TPZvji{<#W}HAvdu3 zA{dIsONt2^{Fo#&la#O~=`1`~7vxj%&o*b@b<}u-r?a#9fqxev?bZzA6&;eHx0PgC zVNB9V-+tI*_i8Mnnt9Oq2jR=nT#P9up8cTI!FVr;uNoVPtBTKO}b0!^~>f%_pl3lyn<|RR^4F_RmxmGD2Uz zoyOi4n_$cDuPpY-^jKXI!O27TFyPcNt$PF84f}gj%S=Ln%%)g!D)Z2InZ;_`N_^yi zgH;uG{@V+%2Zk6^N+&Oow9t*eA{p?3XG(EpP)ux<*jt@-3~j!H$R2xjlB=wXyvx5} z{nl>0=sVRku6~TXxBd#?NgvA&$)zQ`{T+{sJ#UzQYWF<3@qwvU+b_9)I02}FnD3hR zzWG?ju(1PnJApr!v1&O}PNVe;Hz?m!C(DOGDy>jy+tqcAOEs__2IZL1YP}n3bNDTf zLOn5#7&v{M%xG-7%tV)buHg6P>*PFNIp!wmF0!EoU;N zRinzjKE^?vOYzI*pqO(uwEhF+-qjn@Qs`c63i(yAaLdw|#DMhP2LIO4nhmt(CaBO@ z$I4f)w`hNcTiJOmRcolzfM!Foer4^)9BRMJ`DXSn>_bKOrnN>@ULy5}bKoP|U zF-$f&anw;lH)yu&g|2nyy2|Pj(sRtNYb|ZKE2pjl)(YNk0@1ebct7|Vl^sCoa_ydb zin4}wBYy%|x@QZfi6AL8pxeP3$G%E3Xwg1Cp`+uBb??9>{VgKknl zD1vjx&#G#@ckKz}>1p8S`}VvjV5fmiu0V7B{^Q$eYArpLW>x3I_24g@)Eo=h{RhOE z8`wPVwY2c3H#hD5Ri2L#bex}hKh9aia>E|jRV$1Kp&x%dWrK`HB~^rNx1TC4+k2Cx z!&d*1(ZeyKA7xWX#GP=qg{EGvVY+Y^Korvijgho$S=2miKVUG0X_U#PbZk~f*o~9| zLu1#PVQYyP-S<^knb#Z6#E{zbNTJxC`3U5`rKOH7k~^h8Op0aSFh?xQf)cZ2Y79Ew ziDUJ5GfoH+^KQgjb>kbmEn@F|H28XPE`PKcu>F0h8?2ZTW4o~hi@PtDq*XZAx{92P z-XL@dJx$w*cMigC;`!&NQk?8`iQa9L&&hnb^ABUTevkCEgq{%6VX^3?uprF?)dO%` zZ_7D>`Sy=jLxx;5I`xrkOw&)=Y@XY_xUynqaUv(m2w^i(?_F^b-LBJR zJqXUPCZ){W7PRXX-km++UtR^voh0{XMO)&ydy3*EPQYNduxbduL_9UzP z)*CJpB@z;{%PA%8J<1RbN_UZs^XN+JEmaj-c+m{9srG_oj*B|#D0Y_%W?g6w@#Fh^ zpw{Puk-IsvZf}4?aEtYSgo}RGfT4vvSlHOOS9-g25v-mrZQ|NXYbkCO+5NuTd;`U8 zo*(M)kEnH^!7G>hu3a1JRpPA8ij?zGPC+G|6PJ4sH^Xmeg|(%JJ?VxO83$*zM-#+bZ@p>MvC|gG3o^f9b9q%V0kNoO@z3j`aoWJ3ia^-4AvNWyilPUB3{_2O4-+I zN3wfqHq+se8sXm2;vnxe%Aj_|z1eVzH>a$tNj&M!Sm|rS-4ibh9b=WmOsnpN={?m5 zkP&?0g=6BRu&LY6nj+Z9^XCTlvfSUH&<RQo?pVn|tAoI$Tz7Yzvd2 z5spIXwy-Ap=Q4PT>N+=nusO=%qUv7!=saSOqZXrOw}D%Eb2QYxugcqh|N8a+D)Hp(4#CFj1wCbn<$ zq1cwAP5af_kqSq4qqxG}%WkW0>f@*I3cI^3TO;?xFs}<9tU*)~Nt|k)a={4qdQGI% zYH6XZfZ#+y<~5ob^Ay$4P~-aDK#~E?=1|d{gt=~qu?Eqms$pj3IH5)BZ${5~O|=qp zd&6rd>zBrw%hfC@gveGe^-I0gJK>qAg1C&1IkA;M4J5Ggg-?^xIZev>X)X^D1&wpR zC23gU)!%DTQ)LW_b9-5*&nu?o|-v8G^(XXBm?Lb=K*uX&*FGXNABY0Cj)YY2b|*2rikY-BXCrY=B_`$3drBd< znJjvXCMxXpJ|6kD*1-CIi}eheku(}m#kK{)w$?HnQih` zzFQNGEz=U8smR0^1PSE`EFWzw9vnM>yca5G@2E=07r1amKnfQc;8BhD+m`pX_9fC9 zom+_8Gu9vK;xh2scA%M@sYK`DTKZOgu;guRk>%TNlcYNWFEjU&M1Q*S{8oPoHbXR#00D z+r(Zc>=uwTeV%mF;?!erNe|ODIqxS`un$VNZtQ1kObuhP_Br-j!DEYVTfv0<-$s~| zwrJT#`A0UR4~U)eH|aXRg7 zDDJo^#{RS+N!qI1x(lxzJ!Hh!z}D3DJCt=(8R4E-yB5gJzqbs^S4;mk?BU49oz^=K z(|I>h6sQOy8=EQV`=5(y7w0b3^vkMzCmz-Za?{lf~LwUtDNtQ z?ap{{;`3OTRUAeLT0EL`p!Lm{oldtGCLLrC25dmy=^-x2AOUZ1QAFA02iB$!stf9J zvjt{ooLY6xAPNP#n(9PcErOak=zEH`V{WwF9Wyd_o`qKLuJs92oYXdRh?VPL_D5ejp;H2iK@o zPPuPNnruYwffe-#hoA5IxcFu67s}?aa3+)EJY&hjvmR$y0Wu%FMs9=Xq9^Y!zKFGY z`BpaWz++337A~Y~sR`;Y1+AE+iiTtSqVRq{Zb^R^ z9XnSsKUq+X+}P1CD#y|GY^N}*r|ivcvFF1}kNqkN5o0KHaxsws>G&M(Y|a@cfPp$C zMQ$W963Ei$!{X-F9Z{*KKF_m)^bC@&MySJFwhK~^W<#W9-9zu=ZSbocB||}IJ28(2 zo)1SOrYHKeg7~eFAgm0R*u5;fcGKR;l-T(s$LDLc*&Q*M@ck0XZW_ekc+L|_tE;nZPmLPd5ByR zsOx3Rj=uTcjGR?R<-{kON_u7mSQ#srh4s5LYj0mqPnTdM-Ws~ooOS>H`$t%(f_^Ol zjeBQq72er+!+n1xac+3@LBd(?2>at6=8nb$!)4-fh7;r{{{pLMaa8K{eS|cR(0Z+0 zTp%d7I(s@Q=-%U15hufvFL}=Lu+4^-IN=K1`TCA7sNr8Orzkw5Yu7=t3yo!T(5H4v zQBx*TTQxJbJ>XaTaJAM_*&9L5FXFMAej!06jqLH90|(jqCFfTL&6s&yK0xX4=*CjF z*W>f^w5L`AIm`vo7l`eP@n-+L&$k--@gR*ei2t{WO9*TAMPX-oDLGgg=brQ^@hqc< zl!=Ib>O-pA(V}%(llLJ<#K*EjgC!jZlxfo{#$zwj;l))5sZ1Z z>M9EZpD9)j_L5ogE;^hwi+Y|_P6@^*tx~WX9;HkbJL1(UZNqUWjRV#BcDSDB5&pie zzD*3KBaB+59RZG|FCwyc5?YwgiB)e1q8z1QZ+Uo94BQF`>3f}E-8NHm)O)beJBiva z87ylSdh6$67`>CG_FQcTh--o zERnO1jU?>4{g0sVdGE@&Lr``q8<=B%noyBA{tLeImKS#{N1DMK1zISUMeEf>A^o&W zMPmQ@r6D>PW8_#wWK$Cxdbs3N-ChS@AQsu;eldL2)^k4Fy}2fsP@#+1=9J9Swrchs zCIxDpYF~{PQk^GC(4|ddU0pkicj=E89Lpo7N!ngw3Y_&x$X)?7^c}itm7yyOh(h;g zlh&evye|L=(dtgsyq;vri73Tkt1aVMBv>RO+-daQMSzmqj;`oU#!bPN1P2cy`}*)3 zV9EXW;JUcXl{p@>jxQ~5!p^}_fJ0F3U|T(@r$UQ14ibAPOylZuTo63%ydIUxA+^g=6xxXA13? zD@bR|)P|Q$X7QzqzLoEhp7(RrT*sdvvpY7J-PUUbT|d4HwG;JQu))E~Y6oqT-qDrt z*jR{BrvDJW*LEo;^ikG@Yf*$>CN&cEdyit>+d`b5JF_5?+XP+Yvt@TJ zFTZ@z{e}A|!T*Va28;4>-*AElxxKQV)#Gc=Ghy0^Y>F6nPlNjSEH$&>vl!SDtV2(G)8Mxj;Iy3Xg|*ueA=M1G~|YVkTk3yqC>K)*>T{x%f7JV zS6v|!;=Vs#;!2j2LdBU#H)%Yha=%_{6)y`x-;B)O@*(p7{0mW0`#OIi9s5xVmM`jbZ829Zr;Rq1_|~m zmc)m>@+=aEp0%ndm;S{4*Dhveep!M0NE?Ay#55hPOJY5srj&;s-;%_zE7!w>A4F#bTh$Ia?MvM&~H^Ibz&4 zg@~*>xtZ=7B23l-h2GDX-aH6i31-Q^k(b!ko2GGe%)_9s4HW09;lmDh&wQCO$SG6x zd6Vf4pS4~1SO{Jp?g!WORsxxxH^_}tMAQvF{uYLSDV3SWM7>MuoK_sO--WlZwkWJm zX)3K4<@&QVe6}&XM)}Iy^&)?``AMP8aSRt_tkyYC+1aWpFOUObFld@%I(q4MJ5X)I zPR*DWru2^0Bq>}i!sCiu!&uP$GXY#Ntt64xb^jD;O02jNJ0N8PzkL1 zXK<$oMrUZ>Gm-$*RS&>En_Xqf90RvLI_tuW@yqB4hlBoOVcNBxqQKer zDymFred*8zB=5eE1);UfZAB*4;qvfD>71?>)y4KRj10E^i6_>H=-ipQsWG}!wA22^ zD{k}CAYfV#xyaJ4G%cvbRiMf~L-WvcvwE`g7w_q%aqpeRw4YGBx^M$`>#4NaayWRC zU%`ZPcgxGptc;FYryMLLR&@T!`{@4CCw;><`TLUF$&;@%9X5l83nLMW1bmr5i#efG z-r_U24Klg!XNnZ~S49#*Z+1M09}afQFEJk5xYPQYkNUt;baJw!qtVb*XSjk{l#5FX zmXvVzuEw2g{w_rRBp4ZS_(r3@`vTu&c@lRF=vm{{KEPOe|16`ePIRa)XP;y!iSd3k zbe}IPY%u7BDv&|DY_*;;XMz&}e1a*9x6u^j2B4>hg&i!hdkj zxB7v9b(v#9q^R%!()V03&OMx4OaPlafFmkPMI5;A)kY)>+kE}Z{UN3|YQ{x$CrLL% zWX)i9FSJe1+Z`|RnAh_pC&o@FAyO$e6XTRK+-;M4D`F^S18gLwm5!`meElM8IHnFA zefw;w7)&8?p}N-3ytjUUvgQ5h4;I?5FP5s5uI})pJc4}EuQY-U#Sp&07Fg?qv>FFN zC7nwl7Fc-b-4Hnd*Vsh-&TW3(r9Tj4!*HuV7i44x+FYAm>1@+-OLnE`#E*3?PTMFO z2-zPjs$qn5RYumzAa9;`H7IYlIIX13PDNolHVTbryRbVfGO-z=axPK)-`Hg2A5h-z z7_})Vw&FlG^83Dzd&21*H8!Dt*p&RXafYCI{7F_E+o;PFaV|7@d#6fyY_Y7E{V!)D zSj8_I#Iy8b}4tuqM-CT|W5Ce=Il33zy6=wy;*6IjbinqvVjI>M-(ia8b{^ zZ%&!lwO2f{{+=P#btA{U(lI2zqk+2^3yr;`A~=T2^1#Le5y(W~LL*qN;u%a3H-Q zoLKGXR3ax}o&p+W{pIX3bV=cb)KVJv{42If~fYVo@Zxf>m@8js3UC97slGl(U-D0dsLD#)E8A{RnC=kR&~ z)e`qIpaf;l-KgLmgV8=)JMjdhAIh z?h~p)8+^?NG}PGwBC0OcFoXFsYq?X%Eh1g^J)E=EAv{~gM>o{Vld-2aMdVxvKZ`s5 z#n^vTqnECDG{vOuWX3kg`h6}F*WTKWDNkK1dk5ebtvn|G=-5lm zgteM5X}Na_&Y!4O{c^6Vis06 z(;L^JP#Ryc6OBE9jPhbjQoN+aQ@tc#D=%#=W;^jL9siYw@%b48UNAWohR6nx(4M26 z5wwq`JCAb97y}Xgg>$1NyR&dLBAo3S?42$Ki6M-TUMPFM3HeUmo4W2@Fk{oY} zy#vn!b9)GD!6>PVHh@<_B2zBl@wYx)t96D}XP1?=x9J547}P4;n7LQZ_Gc(4Z2@&P z7++CYte!d!8&9nA>vT9|UT!ogP~ktBeGaF;Jnd!Csb}2GXmcS}t24wV949WHruDUt z0+Te;R9xey%`0RI8gQ}Et5Q?8!o=O@7ZfzHF*B=)h3cmZ7~HqJocchxqPJ55?ZU5` zu^@YkekjKKIIyo|#%Bn#Bv`o|I#;L$9NxKna!jRUrVAot{CUj7BAgBfW=W+V@>#FQmqk zuNby9?YkP>+(|I4qQ3rs>O8PH1f|gRcT%R5w3RcjVJ^iQ%(a&Te*{ndQ#--H4elm- zO#2Tz9{inC4Jb`0l_v~hC9a3EyLlg8k(HlJJJmtSXC;I>T3+w=5ibo%mXo-3yG4=2vVJjzR? zPig&%`(Cj$cFU{L&^w$z`5;VIvw`71ETQPU`y%WVCqMAt1GTmyEq_4%dqS75Cqw7a zo@1{ttooO0?pIn*F0Wnqd%A9bFGxY^Nihfn>dcXkQRy3oJAo1bXTRjHsA}f-7ot^a z?(u7Z2Y=lWl>T+s-mTWds|9qa(~B`NqXO}%6byBl zcG<|xCPvw70MEF15^#6lA2tKzYMS?ai z(OnN?`+l~W1rk~T@gBnRJ9Fkk)i;XqYg|oiOPH&oJ96z(EE(#}i-E7|VO-*DkPU~@ zATQk7>2v&PmFEA{p1FC_XN9wWDkO%6tiGYEQiY}^XJe;I!UQ*Nss1*RCq`$~5y}V5 zX1jcb^sq+nQ?E;dHY)D$^-H3!)pR+>u^%7PU;Gg^Qc!j6!u+vqC*yL_N(I`ow1wdN zO=*x}se20aSUlp5^!BKRf;cO)e)Mv8v8V1()urYSm2u>$XP^I*7V?!ACBL%-#miQ`&7Y@#`h&7|>R zrt($-^M;Px}1N*zJa(zN`JC&RgNCe0QFTEmO^{Y>7hIn82nVeeXx~ z&&fIxHDR`f$MoI#g-3_~8Ea(*z$Ranij8Z(#_CK?(8n$iJ;e0%bq0z?_czhbmn-xN zE%LE-KY+qNP5@@&b@=WCO!``W8LO>r!)_d-ox_?@U9%&JNj;9oiO$ZS+%RS=KPOXe zbh73>w1htT>JW1LwS2|ICOAHbz(seQ{!TG)Kvoq-HK9*?bEfw*)(v= zKHRS-_0_PA%=Wb5h>Or0`q{QJ;oTs&<*JB70aFU@zqMun z8w-%MH&02&g`421??=B4_1J;uEWew>_#)yj!5~EQ{XP zH77)^k(*WtY{i`UWQgzbWpT*i&rX5G-SA+$npPSF`g|w5l*w;88-SP9g*xREXS6Q= zWrhH@Yp0`(g0^#B@t<3v12MTbI?gyOu+X`iqc;OG#o^ih<=jkF=-=^~;@zai*sq_? zUP1qcE(bnXJ^0ZhwKi2wUc+co`wfLY>kB_qP4`gqh&_Qf4lg2ZLV)Tefm%yDUW&`@*2yTrbVg`5K?gQ4EEC9+I;8LfJ8Zd{63e}x1p7BD$wU4rKiag^ zHuYrtmp#PT4y#sJ^9Uws*d*lk?Bm#I92cQzfI|IK1PD16DEajNV(zV@qWapuVGut+uV%Wtw%o(KB|WwXeaP9S&! zW;wN%yOTHe7eM7hZy!dDUI6l~8+?1q^53E{>RJ$;reyg|1%EM^jFR@zl95#QMNJYX z+rSs3LSIL`qJdLYOwzTL1S;FECd=jC@t!>bmg`ifqZ*_VLq6az5~EefpnqvTBA%%-KmeilK| z^+vNs;}C^3n>cFlq->sQ%Y2SFSoETcwc%&kTuy`6Ik+0`+sP+oj}~)Ihf@4gUU~gZ zzD9*y%TQ(;e4bB&XRT66(*BthZLZs9mU=xSQB@X*o$(1z$M-IvQ!P`HM!3iN)lTLn zWd>;;C$0dx7Gv{~kAi&Z9U7V6EaO#&(H+G4*l?bJ5R46Xh#2B~Ox^VopT z8FcV!7cY3{_970=oT|w!0;6%;lEvRPwx$^DD1!#suoRJeXM~(cQaWnVqtg!Ew$Rdg zMBbkl6k|jn0xtj(zLhBpxIAh|KyL(hKCQ5A$)=+|zV z=Ec9%n^9-+ezm?-=5Sb}CT-}44FR}KMq9e2_-mthUB0L)d$WH`s;J-5-va1n7G!;P z7Jb&gMri6&cIs->rWX-VbEc@{n3>_*B@+#}*Jktm&y|e4&;C47B9yFq8-(av$Ajq0 ze%tE(g>qN)p;x9p{Om|1^#0XdD(etZY*;vDu!kp^HL}~B2rWT&DU;O^K zAZTO%H?|zS@{bk5IwM!fkydmx^@J@FU>d6dUbaEK>>#e%r{xsnv%|_Sbja~{-6F2| zx}Hk9q4%GBkj?I~^`|m}-b3(8m_D-F*O+S|*>sij^_8HpAcmCo;=F<4!}mTvyxyzJW#zej(IRa`2(DFcsN?Hjp|Apd6}w>=(F3!_(W?)a&| z+2BhEHI`dX%H65}_8jf9^bA>lqWO?7L8~@25HwZx-o$&zr6duTShs;FXU`6acNF!P zU(~Pw{*4W?czJk2HBiUDFqal^9@`Kgs1g&VpC@?Ez^ZMyPNddtN&h?4A}+DRV1zgN z=Z_I$7Ew5ax+ynHJ19(vvWOW*K>cU2SWNDK#$f8GsZGqLEMvC=OkV65<|aosQ7)TW z4YorNCG#A&xuR$JL(!|$&G}g))yPXZQ~M}w1=~<=2SrxCO`?bf%jju7wh6r`ltF;< zoZ}$v+syMg<<;^t@gPY>bjwV-B)y*{Kz63W!kn2K0xMHl&VpL~amqHKdnCTd0+)Zg z9XsTJT}Y}bpM&}w3)il60Ss;t9UeYfcY^QMVlNl%Pb(X?j4ITJw)$%|>n%nZ2z|I; z5>hP|E~SrbMBsZKN;6n$2$M@Cd#B3S^Ko>AJ&|rp3m>m~(bHpl$d^qVqj}BVDa$J5 z&_=Fdr%c>m_z3%3-?;}Bwl%9vN^CO!UB!L*atAkf1?=h6exVRx2G+uGMH$p+GfuUa zBquRw+d_0<7m#*EnP0oJP^iW{IrJAeBdYN0A*A%-aGSm=UCUCcB%*fUn%&s#E$xZ_ zkUKaJC__79c7VJ6 zq6?>`)l*tNW@GXV#|?>Ks+ZdA?)_gR0a&Sj4G9<0pSh~eDhF0~p{{=}UjHSn`h=Zp z{@+W<|8MZ%9>Fb35fe1fvGI{^T)X1qDC<_6svrHKPUW>tZ*^BurqryMaY&O^SfX*LE(6Bb zygeZdc_x*G+MD1?IVr>ytQc`aW+E;HRTn(Q(i-LkoEB0NWI1A-OoroJT1Dwtz1p@) zE^JC&39TaF`u;<7rzU-Ra;(U@P467|C?(X0}|) zGq0V-Xkx1A*workk)ZkW9m;HNh|k+7W!yKjxmBf2$Ygssr4g3geZG)mmUBXSvU1ku zey}(9X92NP*AA2=T#3+t6v(!8PCyS$Z4r7lc_}oG|17J(e&3*&yikr)7;pbAT*-ra zFaK#?Bnp-P@kzGu!b{8$_n=wE`te;ZKCdUQ0>qrNVJ(q?kmPD9Cw*buVitqm`q!V< zJhmlC9b=rdXxMk&1`cQVZay+xeG}l2 z<7JTI;H!QgdK8G*^i3^%=OIOE&^tW^GKKX06x&A52sE@;H$+D>Xieg4Z7GVjX&qnH7hR=IOk$gHs$MM z@Ar&a{7w0fl$^lXyq|$)6TM)!w)(RJeDwp>W_N{$EmOWTvs@>6PpO3nteU5ZWdWLH zF@kn35#bB*1A?#JHo=0eOJ?#yktNYB z3g^5a;u+5HkC>5!9Fdz-#se^hKRg1tX7byNiT4&wjw!SGhzRfQvg|zNWq36j2N6>6 z`c?6R9gpxX&~`S^e%zqjm1o0|{e2<#SwuAJiV0^n0Vm7n-ow^t)^9fOc{e|QlFo_u zXerXs1rJZ$PK9%g4{WMqe!HaY4AQbfxMXehL)#l?b2kY5^>Vg@Mx~1@EnM%PYp69i z=pI}+;Q0q+b9;Ix(R{O+zQY+^Z9c@nwbN9F^*~dG$csXXx|Vr*-6fE-)oRWOY0tkk zL_ueix&NIeJUS(hd|hny6C>0P?wv)>>$D9%?l>u24`Xwg?TF6Go_HUtZ(>5v9VC{D z)}MOJtctA;EEk>W^PKm4##bQ>n{-hhbHu>0CjOSdpLks?9iZ=aGJYC%Q{xY2S<-|F zdHRPQrCDsh=J$M{k_2s`JNq_`y?Jo6-68<0veqz?5q9wc;`I4tez;pdhQ`x>(Doq&oxNM`^vt?-AS`p=h2zl_YG|kV?*?+bA#`we z`156CP73yF&$VoB-3Ez(v#ZPtaB0wHzAya%*>et7rp=x@S_Pg*1O9j!P2+s4Q7qx( zGkQ_4gDGIY(}{r9%$m*T*W27%LXT<(B&r;Wgk&76lhRCOBkQR@(D;^(KM0XotDuMb zLAQuUB`_Y%0t@2G0U9Ko{2p4ZC?*fsdNEjav)FHb1c^R8?N-%Prnn2#3${*M(x(jU zyfD3l$m7G%rXxlp``4;MQ;zPU!}@b`{_Ld?mx)xfn>X>aydJj(2?(mD8;iysZ-Cdl z|NYZ&eTjR(W7YX;_c6>4{uzbI`fMXy{*K_d)4DNGDhvO!wQtiYiJPg5rNg(0IkB+Kj}L^y<|d3$bv-Mbs)l@)wzpjmU|P|TR8 zO>7}h1F!_%7pt8946Nn7n&OA}Ar6?mDQzNUqU3XE%>>GY;k;ui%X>UVYT9;Fpq_?GU6^bQ*envQfh*AIO*wf!0UtYuyr*_>2%YP83< z^R*k(`xF-KL()qWh~RQvY`y@P62vv!6U)&|LmboF1wXEF^Td^fUR3QK&@%m6B1GX| z0{M1N20E-ig8cbed0`s&R_k4W8Kb&8z@j6Qfa;jwGp(FjaeoTln>We)6>b<64GLzvqy zuV&n!)o0V)gr>*6uv7oF#=~ax4oB)B)dEZUQq+6(s&7<~{)_zAANV7&Nsc@&2ioF< zkq)Pti)|uu==0qY%K$MwLV~ToF9#fPiEl3B)z(*u?jNhWr{>}^9y8aO(h4ihm#Z#_ zsAuPVxqtoH$?SJRdoK?6iHesTKSXl!wl1QX_IV197ed%^|h4#;nBpH8>cQv=W5Q!&ns{%6K5 z8U}@m@W%fF(*Z(A_koaOFjWG%B=)ut0Q&N01pUt*QfY!a+W(j3oc>Rzf3RuJZX#a= zCBJ679qd0a+>r;IT9zdqWJ1niq@|;iTvJ=g^!Txapr9ah{STS2dfpdu=9~9DV9_j! zbnIx(>`&pW>`!7X1ug-1#d6-qd3hHI2?ddJnrJEX+Y}aMs}H45YS-IZ%)4s}Cb8+i z#Ky+{&*y2Vs6+#A`c>JE+30gfY^(tuA>niDKL!z&5e#S&C!?e+2mT}Ey6Oeo zxG;SaYwshi4%Vsb?us;ks-D@^?W8$bniP2r*YIBhR#B?W$}Dou2mG6wLI7(OA7IqI zwdv|t^Pcbups%#8`fuQTsYSQ?tnrQEI_&F-AWus7H2}bzBenm$9*aK{n6HAe=+F)`mOtRFW91YSWa_m0 z=Hd~o^8Hb%Soa=1D)BvhnH29j3%s^D4@M@DZDD1qZo5gLU12Z-T>IB>?k+W`uhGyP zVG_oK12Y!^_LoF7_VS3*(={GD_FY)Wcnxvu_UBpr1EA=1`~@f(vBR#EJ6{NwBaw0rrxpj_-I=mtIF%E_jsoe2mz( zht*iSF{1S=p6UZ$BppdTkD&$-yS-Y#-MYF+9aG7Aq1sE@Y4ySKxYEhC!!OTQB?iP% z@bz4vIjjhsTtK-gV4LgtecB0rH!JegWI$G$NiN>Avlx=lNJ*~#<0qZTgvANHfcN6koLD^X@!Cp1->d3-(Wpi;g@GbT(6{5Le)LSpf=*W@bN4^=yO5 zCz<1wKibJfJps*Oj4?6km*khTR_Pb+^ph1@P)J84O9-FFm6w?2YF1JF$@f>SXYUig z;J}B{_*zt__EP9cO(p~31vT2JGQ^SF0&?UG#0{=wiRz zvq+17lj}F&27j5B(?8ACF_+f}kPbYE7n)$APh!j8DMs2XU-8@meQzTx%z{#g+7{@r zD_upTiAc~V(`xy*T>NCvS5Orw3E?F8spl3eTUHeHdlO%yWZT;Q65TIf@pl zyBeLXv_x*@sGU!Ohp(m_w+1!$q9`fP7u-Ec7?_21@UJdDrO%m+IO;|Fmcq~PN9kEp zvJ{S8jD!4M6Cz$x3lO44ZS&qnMzu}2^t%!gB^2BoZwP@q8CKbbHmZjOae^%1cc@B0 znvfBR&;vr&`qA^NRFBc3->iQL^_B2FunBu!m1@KfUOCLlEr%LRmN{`mX#3YxyC(S> z+@PJ66(nZWxU#7b^nE4XaqQ&LRvh}CTK2j63?*pdBreGAXq`UXbhoZcQD}<1L}829 z0m-#><==L;XlN>#6nO|D4MdNJpZm9}Y-ifzy==xcH<9Ci*qqdXaqysc;J`Y4kuKCx zqrJfScmHEGH2`043943;M=5?0pX@YSoQm+2a?KRVO$a;M=#}OK2jz!Dn~hv4r_7Mv z$k!yoM`=R1PA{euG$N`nFJh9lPk;uE!_7%r!SLA{4s2>uuh`?p(f$2Nvlvxj@XMk&dZ{ z9R+KvP4lzqHv{)3lL`pCX~Ot+Z73aS`nxMv@+M|&jD51UVbo#PI3My!CcoRzBEg5$ zXy}(2fk7V=Rm}u`rS6|hhoT-;iNv)QFga5mJ&;qo>BUg@Y&*v|5R$5JO^ zvO2V2x^Q!`A)Dn`FTL`OmJlJhEOW*qiKi;DKtefa^5D#w9R1$oF9QU>m$?q#=67G* zFS`29F&S?9+peb0Wyp6tXrNB5ObyerG9sqg+XlF;{6z}JR@Os5)=MW!GKvBMUUB6R zYc=@@WGJwQTAyCh&kE!wyzl4LSe+;)GdBt*UWtduwUoBY$0q{)`pOgnLUgPU!?3C+v&(fH@Vd6*X5*0%6_17uKSE+2HeHS0 zW~gU&F->=S#78a;ud9z|>y)kKjKwNUTN5u2U%&)t;LYnx)bbkA^^~nLyBSDpXFGC= z7YaIBWy|}dZvG!U#8E_73w6|ro=I(TD(c86-DmQOQ-w?_WFXr%AQ9Fg1BLPh;HKAl z>J_~!j8y)+tYH6Zk-h8U_OU3)ez@jdql75Bw79>16Wq;en8YE^4n@@l`I6f&>6e5$ z^%?HGZ%^f)6(AxRv(4Lo!MS5#5@rsb6I0lQhIq$k=7j>4+ppfGi&d3VX7+2fm+(M! z{=P{f?%K_$*4T&x5}|I{p^H?dHB((Oo4f0jJ(VUTHV5yXZwD)70;j zzr*(-lnYK7EdK;vFP!7J} z@6rqL4>!#Cl`3!cs!bO#CyF^1AAn^-4%ortIL;^`^!3o=87!iau?zYkkniA zT8-bv4cx3-A09as)WmZWL&m19=+qNhDN8IH3l+FHDj(Bil{{CGN^43Fcl1u6`rso+ zX6GCh)+aFW@9(p8ZI&5zZW52qmfQiGONT6C>Yj>UnJ`{Wf0;3s(w-VCQYvX_tCeKD zIx(>;x-_IggL7-1Q8Djj6_c$t@fsnzS|&!Tqq)t0o@nN4>-66F{&xuy_wlX~lo_up z>IAWx>fMl>w&O)<|IR*O#RKp$WjYnxTn}-A6#)mN@4v(UBmz79KgRzC|MUMt)!lzg zhxGrz>%V$9A*x<$L&S`zqR3!LfZ0b^-oKSkiq;myDkJRHZuYGLG*n`*G}z%2Fl<9d&U)nq@* zZh&8``ijXGiI-;~>y^c}$({3GTw$4KMvC9TZjx+jW_-km^n10PgMxI%kRJK(WRv$! z&$}G02)TBI{%$@YLKSs)ks;AxkPgOfJC05?aw~Nm%tL_XOgLZ`TL4EB_+T>oGTI#S znFYFD_y|_A`acIO=@U9YU_e|(DUI4Yb>;+3FsfNBddd*=0Mxlr)b^={wj>h3ag&dAwGk&rWx{piPHTrf zAdEkGgN!oXFmd`uFOsj9JhQLmKbT~P%I)+;k##B!5e3$Vj>f{McX?gO6Vw@YNBsS+3yPh=i?_) zx9j<{>+YjLNLi-tKzF&tF72{G8x9`7rsk;P#@oFv@Gl1|Ph)##FG>xg;iHT*aS zdf1Lp;zyVuLQnPJIbkpT-cDS$IB!-tAByrz+NJa;ctykX?40FFLSwd`+a&3%g5+il zfzJ4AT`~yC+n9U?VsUEmw1nv}n!%~!PurMuFhM+1YcyzWEGFn+C%^txavf$kx$!Z9 zVb%A`yN6LprzGTMI7gN3voe^)IlN`zSbfP0!eJ|*exhmNI>z{jTjZAW=Eo7$>{-1_ z0rszqWTGNAC=^|;Nd%_yA<*jP4xT#OB1WHu&)F=5rGh8}VhT*3mm&lZW`Ppw_}VEZ zhlKzGkN@PN6t@b7(k6BJiLU1%#sya6pP5B9&sBcY#g*4}e>K*@Fis+h%2!goJqh=o zoF237yV0HS3ZH{21IzhAsW2tgfGgq&(|G(we*%zzb^dYh?PbTfTW(Otm2;(wd+)r7 z)hnKwAnpm5y}j1L3yWut<55M~pPFELU-R z(e{DFT|4UMErms$`YDyX0o&g7QAeH40hP-~#CO@zPK4ZtGJ|n#xV$ZA*$(G}Y;7ZB zRLiYE=(gzypy<-n{zh0*K31aBz?3~0Kki-o-jzd;VNkj z0>WX2N5`y~{A8nRf(je#17{|PfFCgr#fCI#|nlM%3Mx$F5YO6k5u^FMrk*% zq}!}8QFEfFZLTjhpg6k=e2Vw@eycBJs++pq9*B!V)|+S)KPf8y5bfc9H92^8GtPoi zuYdYxu(;2it{tIPZQwANZCSCx+I16z>UNkia}zq*BP_^?>axtYO3=F`Bbj_jhn zO_)=~!uB_<{E(fn$mC``NHNTUrBV#a2PMxS(?4}J3^ z!wOHaCWI`=n8l>iT37o&MEY2pl-;1@v*>mP`OxbulRRVrLFp@8ZzZT&?WaX^C%h3os3q8gnncNsERuKhpLu7Cr3B1q@NLY7csruS8>oSuzyFA zJUsiJGH5Q198u!8xw@OmG0&S8$i#QK%-Tvv)?#y-{De}>tMw`I0cWb#PLx5(2L_8C zmgkdtcS&)GR4Wai1H5OVuOFPoKU`9IYLhL7Gf)=8QMUh`bX;=?>%5;E(txlknfD4` zyU?DQS9^ZC%$z#Db8{K`2I|}E;FjKY>5nu){NT!u5BQP;CV8e~W+<3L*Xhb-AI_ht z8Hp^U@8$=Zxh7A)fThfg>23PnzZ#O`YiKd4&`>3(@Z?kBHx^zdX~-D5u-20OVnhf>EM@ZsX0!WL~D`eh&zjt#v zQDYVWDB$w$N*SItIzK9lP%+ZopcPf+xQcB+JM*DyH^P=l){F0%%h}nScJmv2s1Rq- z>sRW1+kA$(yxk!=LByh`p`@9 zJO?&g(pbxkM}3nIh&|g_7xkW7+vys3CW9)LmgWZ)QpE|D;ATn76C?Qu0=<2_;upEx zi;8y3YV1X7h-r*kYv1(l ztZGLF;8P;6iLNqzZ%bfprIAsw`LuTSKy-Wuo-h!0S0t#@Ik7Mm4YS*#gddpMCs)Uj zk{7xR4C!;TEz)#_TK9rOY|mw=V$w{FgN`%vqmM9F3&b%w4le4p^G-=NP4jo>8GI5> z>9x8W^|&4MI!0Fc%k(bA6f0xU9Kc8MCHYq=P;)@@4Xg|RPggyIZz!_ovhht5%duf0 zZG`J-J{LJv*sU_;-uXFKYNNwvAY3Sj2_u$dSU>!zI_-GrGA&kNF4nL}vM=NTgpC%t zUwKrZ%F#{4)o8E>ypb%wxc+?N;Qh?Q$8?zse%BMT%`*=WH@@a5+49(PblisXevek@9=Q)wCb@-_lIToyK3w~UxUFHYGUzaq1wiW;* zvq>d2jCS{YH6OiVMyya;`P}P~ow;Jq7I#2Vu}~0KW%u~%avwh0+!`@RtTZDl)W}1a zbHj*#&T5po#4p@@+u6mtpV0(+L4@Y!l91WpV@q*CE36+p+n}BZ&4w5f1>t(Yz}X59 z;n_sFZ+XYPLr?;zA*f`Fq4^2;EjBlsf1Xlvj99G;FO*@awKWYD#0~5)0<<)qr@m=@ zUM?V{t~?j0^U?OFE{4?Y2cN@vQ1ea4)FAu;J3fvWip{|pgpuOUOwesI$Qe;L8I0z# zee9u!W@MvOV-t z*!KEull_x}Xa{4FB&65&xC^q9=dt7fy{z4L{O-wmd7ML|>?h#3r;P5J`evF->0}k( zID+(e2s85dXID1@5%r?-czVt=iOGQt4hFDaHA03#M*Tk{KZnv~KQu~q*Um3~)K4)^ z?!2_;7gF4JF6JeeL%t{rq{+UIAKxQawO_w=OzCzzJOi=mYE8W#E5L!==WV7`KpI%m zig&2{gxN7#y=G?De~rKN$uPtE*JG|iD)E|KRVkl5O9m>K`b{>QWx|9;RgmG07J6AK z9{X3;zdxSE6K(RFLU680d)`F&qUwAb5$ZENPiq!M!N-ITgf*?}j8*yN7<#Z$^+`Eo5-_SNYl-#Ep>0l>AwT+l+2jA1n9gUjuHY zONWY)3aqz^)&s@Qeal9bAJ9v{!(?&$*oHqL(ExI&zJ*)V{ zYbjChuj8&stlJ&;MQzS{(HQW6>aTmyU}R=^<{0Km8;1SCOrLHSmdHV>Q*-%Swp))} z$p&4OFuGB?DYMYDcXq}f*Ry6Ja?RdnEt9Wox;$Z7<)@Qv4Tl>Rm|{O6I<`WOTD!7@ zYSCa+&H&rJ)~VHq(OV_PMmfEHBT)zj1bnv7;@&$D8WHyxzA?e~cWUw^JwoEbaMk=>#IcqX-YilX&A1=rbqL0TX@ZQ#oWLpW>s{Jp zjfOI>gSEESCFa%h>kJkR3}X10%EHiWR`$5!@Q#2=gZh?U0Ku69$VEQ`f^662bzhoh z>Nfl?c4gmhHzOTGLPAPyCt2_a7`{DHqc(2$)wUYB1UEI^yx1G4Y&o1#6FuL#fLaE+ zY|lv>x47#Ax!iuPE9ZyzUfYM{nFpENxN$?P#hn>A(cp#nV^>j9rw||Zo%ZEfjno_} zBPxkq=ml0VYlx52i?i1Qg6+rMf;7s__T??l=P0xkt~x5;hc;BcE`Of`Sk;d?fhfxo z2@nP%Wi$(4_r}IGWLV>a$?FX zExusqi-vDapR(^#bWKZ{CG%v-y^;s-dQikMth#QAzT2flS#9M*ofew|7eUNWYWFdS ziT;ppX?Qw}*&&ng^g0;VcHJ$YdK~~ZvY$O@cXf50s7ByGS+HQSQB?e_j~{<^QkBgT z_EOi^Pl@bl3Qc6zoORMCZ=!`bT(&(tS#ZACIllhP&RZ*iSYOG47O8%-!~G-!9%fEW zQfvN%p2)I-RU?Wwl!Ows*M9fX#IsGLE1Me>lfD6030O#F zp;Rer?47AHY9!LIvU+}7_hjo(YafD{Jgl%Tv=U~Ud+zwIg|cxA^LZHcyIo?}Q`y-; z7})vO`)F+X2JGF}uM+caBlFkNpqgcbn}?H`kufZn3-SgV`?^Shn`b|V{lotQ?cS=c zJUi5PHi$p4?NvDYwPD-iXiaLGc!%Jptg7yK84as^{27}-h3Mzgt4l(x9m2&|*mDA& zZAH+S5iMUB#n~G;UX(+XtQjpTSI{N&Ow6s$3{5%Ycps&g6S2d{Xm`diz-w}WmecOP z1un17rQ*WmC216A%yU1tJ4-mMIAjJ+A~l)k-P+$szZmWWk}>?KbK~0`irVwrM_bR! zkTmO?1%;be)A0WDUe~QTOf8>^1BC82pY~N!gA(N~Ygm~_7VhQ?%R(ZCLY8N$@_d_R z#TS=K>E#;K`>$Pw_-B{RQ?bbe?iPa(&{dA4s7Y8` zpD~Lek8|YtimDk1>r3o))a0ZoHa9h=f#o?!DvgNZVNGJTv)b+G0+xBrB?(WUCzB`9 zhAoAm(017nKXJh)Jh_uPcju=JkiFJTpIZ6yRQ!cS@bt;djY4s5=>ed(XP)wKa(5_% z=un58oAhcxhepnMZupCz5Li)n++DUSEWM*LBNOl8wmmC(+^vc*k?pmGXKxw+%jYT>z60IgT{U|y^ki#ZIl{XKq2rj;MM zxqyj>x~EJ9TEUTtktx_TGCc!c zz&f5H z;o4L`T&l!%I76A%^L^0kSzQHa*2fL0&jDiH1!J=98I}Wp6GV zmS((BAlmHBDTp=}p7B_KsfEdIvhEj)hO561#3*YNDhwaOi4AaY-#$FjJpo>_oVL7q ze^dgL5jiCzbx-E3WqDJ8M{7SYlisaCP<||i^Jdw4)-hNLy-c~QMK#%850>$_iZJ-m zpA1wtS!aA>0m4PM%lfFQ<8{DRKx`heJ>9qInAJa=s3o7YHSqi9yt=7{nXYXGC|9~v z<+vY*=$1ps3AWEgaw)t(HE|0Y|zMC(jLD6eM*BG-heayQQrI3EHp=fJw%8_=%j(V68 z!Vj21tE^cL=b0E~SY~UVa_vwz;nhHjdj{-KU4T4duf!QRNnl(bm1W4800XYa?#IMl1vcTwVzu(Q2kw8^w=B z+f-H$8zdJk9$)4y8V}#056bF14|IxU3-Tj?$(Z?Y@DaJ~o}!L;rYDi@KHRr$yS@WV z)nP(qHJk~$W$WKA$<=w`$R2UJ9{< zfN-HlWzU#7bZ#>Mju6+KTzh%>>P}{pT-(XK$hv?OqG_v(rl%XfD#POn3T{#EcA+C2iUY%UmD6ftb658dM~jgwbzDfc+$B)g62;am?HTc=ZJzm-rcffY4=3wCO zuV~cDpVB$m8f}%6=J29T0mpYbZDXbgUXz>)9w(cZtfJgfm>~YF z)`TmXyc)&Z%zKPxtm7}(_otFZmn7$vB*|h1)n~yWn@^biyF3fCgmUYe??amtPv^Cy zw;?6paDH#r99s{XIh8q1_#g6HJ*Xz9qhhU~wiL@gE<-gPhI{qzyrarGY~fKVI?nLh zURMU2MH)Je6e)(}-u#T(U%hjqSOn`lH%Qu)xJDvzVT}T6YZpJ7A z@w4f?TJfhzWi$&WTIz$o`L+oT8P4e}R}gICenDU>X&LqqH3|Rg6#&2^2t4T*J`>x zDEwo?O@@5QlZmRlu4kx+#4-F6Hv`hI4MG$dXOcM&`B_Cu5~GWZrhuOThcE@-_@}br zv7BV1{B1EGRs0}%5TT!jM!ZJ7o9z389=zc-FUGMAD;cMPjOw^c;L*rOkJT-1sNa>-asnPF+s;{;EDD<%?BgIf^S-B9W zGd;T|zQ8@C)b6TyayQz&!e{M%2!BRN*81z%8vYb6LhOX}(u4AFyi!ZUM$&>X#-Z_a zWvT;2(OUYk!AFgS%~B}mt5ynJD0Ey%oBrjvmf9gpp1NTh#34l>w{FJ46Lk% zemJm>dQ_w3!B{?8H3^H5Acb-$&xU*{=^LPT}os#Q|l@l1hrfuf{^3b(8e zAyV;)Dh1)pQe;oPU~v~)iPoF5rzb%ydi=_8bx2dHN815pKd(_?*r@%{^t@rLp6RlRq1?_(QPmSeC1+Z5A*%XZMLsW%BJW<+6&>)3z zhrbNhP5&iaPthPpdw9nHfSP|!q`BT@J6Xzd9t{UMe;vo`M0oa`AGHFfC|hI#t(8Vn z9fEJqJdXOF^HY@hr({+H#3#nH>)zFlu|Ltw^&&Uj%-EMJE;xYT4s^EzO^ zlRIq(yOp(hR)IpQ6c%R9jp8VW_MM9|yv{PP!x`pA4-9NZsnac17Al>lP(+lba6jGa z*C$VZG5vAIq0w|v*#krsrN&l2P$tA9sx8#2MNb>}ie_+pdLA^93wHPv_vQ9g#SB^r z_SVW;%&!3LF*RO?6aolge!wqLRb95Nm!sh?bAP2@@fg+e8jM53l+ zZFjd4JKPI1-n_OKsnFzy>4rhJNKNuX-&59U#-t#b_7({2pfRZ%IJ_@8ZIQiFyxwD! zJ=9kw^fe1Qz3&v0R+`d9nDT3$6{JqT>RrJv<3(T9Ost9Hv6g@Z zJEYy??(|dspj-E|V3a)(s8>v!aJNVwQCDcOS^TiQQ4oFnk)=eYgi>5Ut=5WIYsNI$ zwxX=_Q}EOKWz`i%1+OY;f3G<+ox++r8ueddZN%_E#9q+^(D`MZS0yBal`J+YdG*5- zxGao6O{NWmHYB0IY0a9QDn8(spUAQ4nu^YoJoHm)FS*+VT)roVAWnSDG$%U-{4cx9 zz`&7Rc*jqdaA2{Ef!dKon~fs=GG3W}FELa~?z{RKxXIYc>2c(kD%5tR(R)vwvb*6zU6>>}Bas zGu91jZ3?s=;!EuJVdv60eP?0Hjv>Ng5&;S|m}vVabg!DJ+_|r-7xkrBafx7E6KazV zOdEPH7jE38O+%!{djnNm>@#x8+lhg5UOypkl07e}S?3qKNT;93Td=U4FQ{ye)n|3F z7XIob1eao7f812SD>as7*{^%Jy=X;w_FbfcVzp?$RwI^0UMMa7DYJnYhFv?sEBe>! zlkuIW1AdfN&ZJuPq18-YL@4*dP!>b-j4#Tl2c(yc4{I3s)YHx=FGp0yR1NDFg;Y%} zn6}C%P8{KLsrA}RW%tJ>qMU7g8W9Vb^pciw-N$orBPTeQ~=&3Oh>Vk@p< z-WXn$)5WVr(~MJ=KOaalT)i-%N1F>J^d-t1lk|NgF&|e{+4d()L&#uN*~oeJc~k___dp&fa8w5#JPE82{#O>=exYb z$MW>SqEn?vn1x}3#ke9>JV9S|akAm60EZNYOtDrMzTukRL}HGNZ@`I@TJ z(B8SgKAK6z#?Pm{XW_iP`uuZoc)o$4xiz@&N6J+F<}nG@^aqjZBGT6a%T?PaTusa{ z(+gLz6l|ZfG5Wm=PJ$oZwYuxwWH+cQ9Qwy5#1mFL#I8O!v(n4xhVPvfGI{RmiNrkI6}! zEH9UUrg`qxSSjuaY^%cWS#?X&TEEL*FUdcc-aSX z$FR>QvPW?iJLtQqTKZq~_6ZLU$`6ItYjtzy_=^l=v_#FMPkIG`Ofl-*%bjh{`hH}3 z%UrSL_((lW%wcp~OuQw2roT7U*ibz;rE__;Z8PU-SnE2h%i}f#8Hr_>2~_Ri*-wj1 z_jGw)cX8fej!8&6B}We)Tn6Qw!ZOp!7bgjap%r~4Hk}+=?jwD-qlC2> zk%YaXzI8?(BdiOA6>?-Z0EOB^-+k*7j=iY4k=_fbVDy`2Oz`p zNn)7r44%uM_bK+`==jTirKO)Lvj_do))AZDZ{KgiK1DlKn&@9#1uVw4?Kf@vl7IvG z&M)IcT0N{~V(8+qQQ5yGyvV8cdMo;p#U12oSQOJe3cIpxwUgOQQ?O+_*z?02hiYjy z@T~Ty?BNZdAbXLb^cD@~WV4a#m34oc1=F>GMx)eTORZnwPJ5Y9^mIFUu)yZ zkC=>(;sM0-5ykbO0{t|dl-Y|D^v zJVQ6p=39?h{4$>Hy_EgtWt`gm(q%y*c_O;(XZ%D;mX%7~lVz-)xnrx}boZO<3$L;; z5+k0Xx+bu_7Mv=K`z{>!i?B#`W&1@cf#5-Eq}XyQ!D&PW&*p$>-^81~VDV0l+R=?C9Q_>sT) zL1H4J{`SuogxGj45vHz^g7U84L(=vUinV8oR;yJ~F?}WUifdxW15xsP>(yy=KjeFp zFOOooWBNW;Iu6wZVdTwvHU*o{!{hW%z}14kr_H!m56Ws?U)7T7d#M(6TGcU&RCGH z^o}E=3?d-X2}P+=W2go~Vj1C81QZ0M21Sq-LJb50L6H(d2t7a`QA+3p2rVQe_leHD z>$~6m?p^Dy`^SCOijpVKbIv~d?7h$4zkQ0`uw#SbS&i9>V`ADN0kFc|0lteKIk{CU zG4W8Ecsp8ib>UT3lvB~DNkI{xE%Ag^`~>9r2R-6GolC~wqg@}&4`^q~6E-6W{ocuh zmol#)g$aJda6C%2ZG(H!W#>PhV&&!;~+s}cIU#_U*HxII78 z#l!BQw;3G2KeDylpsmh>o5jn-ZdO*>Kfg9^W|WpC;huMjAL(~NE-ru(w=kMJ+_%g9 zj8KHrF`9Kv%s1Ixym{5EsI?;Y<})Y%&0c@kn{>Ms6kU4GQ9HxbHgu$-K9;E*nYp>6 zNpsBoFQJvhZ&I1u(`T8enj%8l1t*16#F)4lp{yWM)Kvk$3EuL@`}|?ll6g zS%0q$X?tN|SE!k>#`-Nf?O1RcgL9CUQ%1OMjS#Bf3%xL(~ zJcENT0*8j%)tw)X-w`G}$6xbZojlSryQ7@rzg61x9$G4bN1P+-iu5el3HyvpYmXzg2>MZf%v5hh zg!PsR&le@|UdjyV`2c@)^eZG=cg0ZPJekgRiHT^W*f~FDTrQ7X2p#0ALs;mPQ7x_Oz!>q zWLMdGtx>|!e^MJ%Q>WLOReg#+rqVVrHqtX;f?YdqKKHymhtCm#E@V4t?y3To69pQ& z6bmYLGg6|PqSl2C7oH}e=l{J(p6h=USHnOAbv7!mH8bDl!uJUs143eX;RAoDf`wYT z9)4`sfI0tit9m+L#jWXrv~K3rV?=O^j;;wiBf~u`V))S$SM?7SVEzd?or=K5ckiov ztB(Ehlvji|#(Dkw9YmJ8N426BjDER3;pvxyY^Z?bM5uo0$Dfuf{VrmUGsJnT|9*j{ zQqk$I%Oxl@2h$vjRoCo1J^!%hIq3^ighW#SoE_4h*Zs2=@iJ+4T@4O|RzNIDpvOhp z!}`m~^Ka=5bd$p^BQIrQm#D5sbW>;leTp_3B{a`2QgsFEd)=!EWe-*;Wq7AlhcT`_ z{c=6^MQ>g68u3L}F(cJ5JE`){TyL~rxA|aAB)XpL-#(#FFjtzio4kzr$K)TW;Tl1! zxwF7tIZpnuGrOHs@&nLyc|>rA=?15_b#Am+TyGQwLPjo+>H;QrqDL(AME984Zjd`B=QX7swlwHKI=VuSmsFS2)*l~mmXEK_R8 z9hlrKvSB<%ptjuOto;s_J$>1OR~w|~`+DQWKPJ@x%nA{9?T*>(!g2?}vpmw=&!BMr z_D~qXO4QF1I?NE(WDN#jLpMf?$76bEdo7TSYkXCK8tl?`scw8Sy|>GBW1O3^sJUrc zOujde*AvO-k}5zAtsOX_wtR1H&W%Iyp2hLu+;TTWf}SUy3vmwAzNcJ8vL{Au7oDd zOxSFfr18$!^q-;Cn|#`9ebXlG<2h104=yBzav%))&K1W@b5!iVSn#bG?(Em%%f^9V z4(*J=))%*pXk_nuRv&3$#*zbB=zpTQzvr#Fhzn=o{cn={-wOLrHEsVOBUB|E%N)C% zc(=iLziaw^izC#XxO}p0?JO`az5h2NpCXBJ?Y<|~*QBqUs3|1Gd2c%e&lBNiA4A1j zS@G)UuVxpjaV#8pJW3XAIAaIGoZ+%PnRgWT#f}YR`ax#G%&j<)3QCW! z`%SpZ-g_<^)0Ql2IQYTF3=;8SWzt1v$d(GID!BFmB>gvuGscz6ocoz-e3TOs9Ct!X zM0UX|!Fq9%7c^YBD>B~~++0){?vH8pbf&^Hl^yCEaOW%lGc<|66nN`-;n5RvuZ_3k zde-)73k2`NGhdu}pY1w+y`npIs#3UZjp9y;KgS*(7d~%M$zyloS_^YRZz=1;9%M}F zDOp|^nb_Rwhw(dY$Dxb;JyYco{mX_?j3p%aW;RMws5uje(yPp+j2_${MI*3!Qe$Q) zPktD1G=`hZ)LnOkUi9ysNeED9gLXv0@fT;U@2y<-{ycV)WFEajtmG&C(v?3M!*4ia z&~M!L(mQOaw9Ds@_}MW#!%On+v=j)v%4w;RnUrs$({m^}QN8IB*mNeOg8)!&C!l=f z8|9x}gy(v_kNU8eLfD^0cW4=PCL2$-U0P#6eMWv)OduKSN3R(F2<+q;`@S$)>Xn#s zwn3Qi&V6M^qcq^VEkNeM{yKFMFGIM_`bTGzym{ArahN5$kD%j2~?J;gE`6?1CA)k5<>-V)2#vP3`ratWn-P}*kWACAs z!$_ZQM=OS_o1FU~JF?9I3mE{qFEn;m7V`NnbSURKBNNZHg8Z{8fjy^=NYiZz@JZI2 zu9|*-a+w0gui){c;yXSfA_N|1*Afrsh$%$AnYl|I&Fgy1iEputhJ*EV?vNQVLiU4s zlz4_o#L^>nLyGL+@DE)-QE)G@qQPq7RPWxnJK@%ijHkuoy1Z5Igjur>a?UD8+d|I) zy1G(LW93IP(w#g=pPu43qfW0pidq?a_4GIbxCPZ_Ldk}SX@;u>Pfp$|TN#=DlwXKL z?{8Dpg=HhIK*B!g%k3B$N2)Y}$5`9LyYb$KcZ@29ubelI47s-kRP%;oig+OC^b9mD zLlnU*dXZJFcV?MAx2ejWek>xX>Fr>`ZON>GZDVqw zy$>h(?DiwNLNSlxf3my2f@6utu@BWZ^LgfBosu8K%?}Tg)ZrV;+^?eK+1WI{in+Y8 zhOj)hb8GQz;jxwhK!hb^r<*?d-eQpx&V&SW&*O#fgjEwS*BlEM7DSHP&*^%LN)43s&jGotaJ z41Z*tiL`ELZ?eZ;#^IM+fY5$?B0OJGczqTS&WKn|%rz>eC0`ZfLBxbm-6Ud4P2!{m z(VqAdXQ~hl5h(-WU1m&-VTwQh~Y z9z-Bo9i*yB#!02V72Y9iwC|AjbXSqP$+9nZUo2)-X*C0iDEkZUP{eZqx(8fWA_0QU zbHfL^?=AnmKD{9M&;Lw?TKeNZCz1cZy)AX&rerm%50tN%EL^h0v{c~Mq1hvH0 zaU6q5yW;q4Ph+gM4Zcp58hzTb-)?`$B3b{vCoR&A4~yWo92i-ehkk;|bR)0Q_xUWj}3 zkHFM64=bYdm4pB&F#qde3n3Pdy%4Q(V3#^;$CP?4njdqgQ+8CHvm0_zyeI*OiSy6E zHL9A%+zW5rD7Ugm4eyeBiA01sS6>9il;41Y%k5(POHUo&8Fdk|_ ziyOQwY0P+yW7^fS?nt{NB*QX<{oP-=5RcA{eJnym`_KYukd=qr_Sl5ktjq={k^8To zNLy&kg&byy&g;MhjQQvHrYsaVG%&mY6fd^REep}SoD7S+z4?R>kE+Cl2UYtJ4m^9a z_}k0lTENa_a0(X|+WQ2%ggdUWEZXt-yeN;n!TzGF!)W2d%;D@O%B&1J{IWc^p9IA? zUy|jjP?-ci=K!U@`h-cWO75e^zXGr1D1MN4)^4*s5ef_M>Gul<ES`QZA{>^?w6fzEf40MZnj{l*~86*LVwlbsaD`E&QYsL9I&jIMOnIjGStEiE^k z#?dGUn5@FZO+&`R$WNd(*T&DKOs2(#Tl2iU`0g{wdYVjwsGzmDD(9xNNZ%khoI_6C zZBb_$Uy{vj&`JM6=CMGA>wo?xqz|(XOj6Wsj*3bShegnVI>;uJun69|4?NSS{}Jia z8H=M^R+}6J*T|=vD@=JC4ZSBPgH14qqbr$4Y>wCBNmvHZiy6pmvN_)rF>>bD#WtMm zt&{g}LaA*=tT4qxzcvDE;rmU#vw4h&VzW~=@9>YaJjp87i*RxUH6M$Qt6!wgt=R!o zl~{i_c!5#&$;LVWjN9>(MZ9mn^s&NZBPE4%7Db_d00708PbG!4t&DSoAh8}%y%L8- zDN|w^b`B)UD6#R#9m+1I7=XJb4>+o-O*aB)PoE0`8=?tJtw8v0)y{-{QY55_n&dNV z|D+q=x6xRs!}&VbzOoqHRfQ54W@+YfV4biaIXA9P*bd0@V=|-jz$KYz4CO|XIz!-> zcGYZXywTfL-kCtPg{D2C`G#upc`&!y+uD89Lmgi_bw8XSy&e)h{YB8AN8e3-M4P@m zR_}>8{1*hj7O-imh(>KnT&z`c^VX-^XS`>Ov1@5aBA#zzah-wp2=g1Ad~hw)%`tG! zYv{m})cf>+l_?MRJbG?Cg6zavBp>M6gxYKt<9p8gR}zvC{3Ii+HetsKx{eI(&O6{M z*(vPUq#Eh-!`WN)yFPZR$n%7j23oH62lrh5esSl|Nr71nj_Hp9#oSDaJ0e(A9Qd#A zt6XIv`%asM%e3rRK49hxr8TGx^}w-5C(;i7@4yMSR?zA$EHP z6h76QOekqLpC$8_Ns?R9EY@7u8Sk$vT+S|-WVW2<<7~2pV9ceGJW0)TtzQAhGe;C2 zdrJ+!nw=YdC$)lL)-aWg;3Ih8{EE5SV7#X39&I$2MOVLB-l;W_({O#{v9vD`2MGzS z2K|MWL5ua|3d%T4#5w<5NFYQD_-(~jO3gFt-1s`V@OfHbZKU03@MP*C;giII!yxO4 z8fef_8RujETH`pyARRD40BDqSyhn}KU=c@8^E>yo$Lr#*92Jp%eTbw0Bn(v1yX1!q zL}8Er_~wkI#(o+>1dmL|t8fo4I51Enn(AQkGbdBe%Z&q*g1;v@y7Tgg)?XU^#?IRt}&MGGorIBkxB)CY_VKzg~4h z`KWH{d+;xfuL6<2R`7KMJmZjjOJmIavm*@DRJZO9$=fOEo@V1KKh^t2Q6vA({-)QQ zzpU$yMVvJ9MGG*PLIyp&oK0dlEEisizqmp~GhhipG7bYk2`FqZ6#p7X@(8ujdTqWf z^WL%Ok{MLDsG02u>9E-P;eU=BI~GiX%HiGa6uAkv+~3u2(bVVu$Cx*;aX9T9eQ%`L zXmc{CgD^aBmfVs7<_6jg2Acw=V1@MEy%|%;1N;lO7(c}`>(%2yNAzNzndir<%ICD` zScENR9S-jta1~gn9r$;>U8xP-2b+bjjUBG>n%cp!_9enbY&`k|g;Ow074afrL0jdZ zYxQp1X_>6PWzX*CkyOF+VM7RMR~2AZdX-b)|AX{Yt8p44vFv=O#KO`vOR~&Gz;LY$ z{4Zb_KvbI*A8@)4R_8S z|Iw#6Gd#T@x0~pT=pko@5~fXY849Dg3}7~#PgkE;X&eX{@3ZhIE{t1spvkl1%(r+8 z&l-E5y!hAb|Cs*&t1cAmaz@?JJ}WOAvi8)2Hf^FqdyH+sgbAl3x=Q2Knl7BB3^+)OGe#7u24R_)uWoMZp#|hGSX$)Q;F2gas|vR#+?5KfHBTn2!g24y=7fSUEz*; z-}j!2I19j_vTx@^3Ml&@&2qx`DIVPd3KzZ}Y#yY@rTPw~bUR%TAvBwdb_1~NsmYQ% zcoPwQ7yyavE*xU_y#K{T=iuKkeqn;o);b(Jzo@Ez5TrgUEE=NrR}DhLuYf%1GWW|{ z5*tj9Q#6dakco@C1K)kxt~rMi7EiP-R0JDe!gD@-#m=rCuJ!icq_=WX1!J4w+WHj; zCD5B+YSF$uE19Y1Jm2W)(Od7Ai0d?cgvUv3t{zWd96u$jU{Tx)R}?kjxc3LK2>8S9xD1l_mDoY}UcnVvz+-OdY*>pqziZTTzA#~z*kBTI zAF{c|`n2?-8RpxmI%ZGZ+c9cX63ImOCdjK;FT6oc;WU76J>=)73>HB026}?m1bhRE zDbkbtUh)`V5*~WYNaGcc{8Smk{Gt|>UIXNrTYxtkF1xiDC_k@_%nL^9??&~5sQR*j`|KVqx7zcTX)5k}VRjGSnV~{*qkgZQYq?C3ozUa; zAA&ZG`?GlgB>%vJEM&fO)9*IW<$j>vj@J!xZwA^qf+_@&pqPRnCIPNyK|d;UVT*u+ z!d7T`t5@oOf|*kY;P3!EdHbX_?CzD$3zCK#Nmjo-Kc99~Tiv}DImHb#X~5W2Hb1!1 zSvi%u8~v~Us)-m$J{K3Z^mB*eR3Q#Uq{@9SzC={eIA?AGCG{NB0Dc8B7}_xXh;joE zeeQ?8Xw=|XWDiH4nTe!5u&>k$5dc}2KB&O-zjwo2qK9)H**Jf;|A6(eJ@HhtITV!H zVEnyk0d8{zz5Y4-_QNlKw(pB6ta_+d^l>ECy2qX!*6>};xQVE8E|5)nn-o8eo^Mir z(bFfL(#^@fa8i)yO3(8gQ%3@VAf<-Tq2T+y)~@G-9aN~gWCN*))UT?b9|;&7e>1)Q z$dw6O+UQ(}==WNO&D;M}JR3!W5;Z$EgdC<2{ImKqFYFQvn|<&$sNUo}!jANHKcJU8 z2-=)+k}`|emFP`f&v+!j(2@iv4UAZ>zrgfVr z-A0>>%LKA{(w6Nu^we{4QlPdoKsx~hKj6eQtqjGZx}DarnMz1PW|IM71y}$Ib+0Y5 z->uDY%5bHXL|)`h6@Te`dw4UV_RDuWB2=~ePnuB7)3?GIYUV*6hVv4Ffq(e%o$ zCQ2o_=eZfwUGB9l?NuYSpS5c5C|a{9c5}Pys$Z}nXdlicQQAqY*>Vv+7vfIa`Od&A zaV6DBlg1?pe;$sDO;M8^jTxCyyIRs=6^V*auAip2i}g@7?PCdDQ< z^48zzm<{(%97JPk_LQkJ60rCJ0QJYeHaWba4*0=aO1j)_>7ft5WJNN|1vps;A!6Xa zA)J`M`f|wz;Ddv;VIaS^W$)!Vg7$G;#!N#c5x|JW69;}1h*=7~NsXd1`Q}_!?8Yzp zz;5)39p5|cp}{`@vhqapV(tilLaq8X$R}-epS8m|i5(>a0K?}04Dz@a2$`XqMExNE z8#}!I>g_y%9Ue@uHomlr;H?W_I{_Euc{ED_oY&fT#|(~zS$d4^HHqshJ&5b-!vX6U zxnb-K0IH1_fP#WY|3-+{_}s7G{6?VgexlaRHyU2^c@0K(GNQLe4t7mbHT(4H0r(!a zTM6od1!?U6 ztq)Ghjw!@RJwFeiaWV!~Hs6ry*uDZ4F7+;O67!EA|AN96I_dzdY-}y`8`=W^DmL$c z@%Jon^E)SmZutZDDq(xI*%JWoJicLDfR{(6VnSl~cc#z)TxIp`0VdrPgb7wn{@!h4 z^C9Ck+6SCn_2i@X(f|dxD=hcmiVm3P{Vj|DygL&xi($%WJ1lzf?`qlAUCHIgKE7xH1&CVg^`&*L_7od>nq^iSap{lDLWFn zRGK~x^p5})1gN_UBA39nP8injlYR zk?|Kl|J6_jfV=qshc1hnav$ta!T8+!pEg`4g_^GYcVm*b^TG5$vD^v&T03ZT?#q(| zpY<MJP(aMUc5j#u9*2mTQxeEah4uWNZ-xjKAd1n{&7-b0rfHoT=#n&p3tS{)n2=r%9*C z`KdG3>_i#(mZJW`m-eB4fBdw{UvIw7GxQ)U1L4_mWx2jIQNFnxhcx-V`dacc352FX z%QE7Fp^s509-9Cz6|2<%UvMs&aW+X3g~{+1w3;%zTb}>g;->}Nii}C`f@|tFAUJ8`jXPNtZeh`D`vaysw;p=is!2xqieDheI{9_i zUF-NEq6M);@qy>7NLbW)jY?MNq6oYdDI>c}=) z{ack)Y zkg3gwok)e0^85j_E=#c8+#bpRuIr*7ep@2>sr#;INPdE{pFgaKQ)Z3kglFl$J=GQ0 z61jr|T{fJdj#;NS9IUl81fddl2Z80J+U|xK&6ReP={QG;@6yBX~!XNS*cM(>F%_zScn`H7e%% z-^w4!V-M7MMRi6;L1P=!O`CKw5pfV5afM+YTeX0C^bJu6Xr=u*r|^lWO;ds0@`J8) zRmxjUQ;p+Y4$E&9M)BJwiXyUc7e@&R8y%~oi*pShCSszza>Px;{dXffW^e^dmj^zs z+6`?sL8KiHK&uC&9mevP7-kg86amI{ZofFT>=IDYxTfj=?{@udgyl`SMbs`GjQgF6 z#BMf4L0wQ8LlZq&X|815iq5v*K-BU=O0`s_qUvbm(kh`QDE#)2MsrjJ1@_`}ByhUL z=<`A;jP3c6%CjekRMRqh_OaB`IPi}p2->ilA6&H${)Yz2$|%M(%AtfU|$!8?&5o=91FtZ!L!msELo6x;F7 zse2tOFXR!RVzp2=+O#rjY}ggPS62twSh;D;T9Jtw-g}Y%z}L@s{YG`S8VE^ztlURl zn6W0@1!uh$b=yv?pn0g&5i`W_-E*hNeIP=PGS6B8-Fecc)cqx@24RKgBNv56x{b>6B9Jyq}mnY909p52At+VO>{x5Rueu(3A@b-@stx!A!Y{d z|3*I|h5@FkDP+09ZrytD<7KFa1|qOlet$KT`3Zty6uZ6rpb-bFU8Uq7Lt^bX`_In1 zv<6#bNOU=AFnWw!CryGXNuRy2nBh9yPgx^@`nq$EUywG;C5WTbxE@Xv$qHNGT=z7P zHBv)M)I6B2)nqp(iNfGQmrk^#;z1PVYXEas1ybQ=|sys({*W0*Xs)FB_ zUNyZLTA5QxKmNfzgN-##Gt~1mw>OZJuraK0u9%M;(g}*|tCNvySt4~vX1~bB6gaSp z@Ag4Erqd%Ct^>+zXeEUFDA(}Acnmpba-}hF-gW3*O)$6KC7-H^9Y1i|K340u`*TOo zO+(^MD3*lq);>V7H2q=QJ-Iq)?RvShNg3*~WqM_0j4r>#RVu?IQ1XJ_;?jp2?$Wbn zOmuA5D3*fp=qi5OQ|&gqg!6b)%DUh<)oP`bYtFhLalC#MW@sEUk^`biL@YFa@Y!-W zu3QmYkEhgo*UVyjo7Puev<5N3O1X#>k8Q?_eC}FQ-^TRi>Pwn(%@re% z{>tf1Y5Z}J95VzdJx*DJju+-d48DPFoke6xIN|MqgyYH3a|G-u`m02f%}l_fXwDOa z-NA00n``^Fi`N%%DTvwt7@N-ohRUd>?W9U)_Uz#MsT(ABaSudD*hoXvLBIa~bZ@g# z7CcTE-mjAX>Xbs9vb5>?9G8(lo@KK03dW0*aAH@t=!C1~zA24PA#SmcZ{|qT@+S8e zbKxEDf)&NBQXLw6H}`D(2gYoCKN_3%CdvQ7fUV%%c!+YNTT9*kSk6xGcubhu1NvKw zR1P{O`U0&=F)eiOt~i-*Z@s_z;wJ8nF89oug{(){yar3TVg9kcs&cwQA5KxCx4Fez z%rb9)dv_$4k*4znll&1yNo_Vp=jxAQ!3ZTy z^}JWt%18Yo(=7w0LgE1L-WZ9R3w3O6TC?fv`&^5E-Njq6%R-PpO(K@JZpIM{yh_U) z`*L3su!^j~kHX2ye)E>B)ZXTbq+_3qCuLQ0ggo?68S5^(K|e19@?LUkdet*RitPi| zpUuV|*9c-fHZouYg*Y)BV_4|p%dTbittwfy=TbcCwbBgNqiCOwH27~hAeXkbo88_X z6kRS7rq4y9BiSui6K~`*%!&?Z?sTZT-72d0m-fID?op$y5eSD{6<1VGjwttLL%l3A z)SFe0JHEf4l=Ws2h5VoZRXff&uPN?Sa?@acTEzqAtHI1P=1R|CjW(R499~EqHgZty z;X(=ABS{ntgO!BGtV`Ddr+JO{&vZE!vG%)fa%kxmiC5h8tL)mPDJ1fcPJ`Xo^ zXUgCb=Uv!C)NI)_ReCVe2<_Zdgd(F!OWVz%LJcN(9kzNVqpAGEd=uW(R3U^LP@If> zNzP=+t}fK?{_%}*eMFo%zVw36XsABFsjUBMo2=6)j2m?g^fumAsmm}hS{+@1Vos-3 zRvN#k2D|wyyS$ckQm~`btuKB}2K&TR_Tq}yuNEzb3%_Qz<2BS$bdElrXm<1iW9NO5 zVPorN8XLyU5~(j2kLp%(SLj+f(gkqAi1>E0rn3aX>=t~q<>gX?OpMMIcD9^VuzoZ6 zu6NCD|L4e$vqkC3+C))oj*?V9@l;9+b|j_JmT78QC?DI@DJ&JFIbR-LyK&&zgTo_V z4xH`sTN0s@DYPan&Cs&-&;A=EHh0RL5nhYWEme@u8bI(CxwFl7HQS>(8vYK|_kpob z(j{WJC@Z?1tq+;a(cEC-bM)n7Rl_UM_ID|-$Tiw5K6x@2%71;+_*X(URb$2w?K9{E z?%6U$gkR5t!9%$lTe-Y$kt}HR-OeAxO08_T3LiZ^9cOIf6Jqr?D z{qz;BDmjlb@UPp7CpOqdt^qm8o~i253y1oLpb;*cV`*Z2g@Ju7m<^HPV?<ro<{M;$4q4I;I zKB~hO)t+9PK0;bqbKmwcRK(;um#a@o&rnr`&; zKB%bn!kzh2>h-mbsDbE(VhaXgiRg+j=B{h6^VLBo@1-=sG z-sD&pX+#ZP2WpJm!25IPQFHD<{#b z`mr%fPSGaf%RXfiM^sX2hK$ML=}qS!dhn8ilz+U9J6Z35!45+9=6utCuqdK~M_m7P z4;mLb@4Rp!-Sv-)q9Z2$1Nq^3t2DZgz%S^k+;?2$VY$&tFjEvPEMR$5KN%ifoa~aV zU{IBklbn*GgQ=-on0^u1w5Hl?;aOT|wNoSTUPlDeN3MW@D0SGq-ch%wZ~smy=k?UY zey6OHPHT%xOzakscmc!v`8K@Uo%rNyw)~PB>0NW$vou=TA*-2_q(7g5`!bs41GaS? zc~KC|iCBcmCCqp?U&ADA^N%$|<9OpaLO7PchLYrce5ML-vwpLlKl{i$3{lS5G+cMl z;s0vN4$vrd+xgnz^7 zriS;bH!D2WPgMohXN{V9m9^8s0{ls0g4Q=DDUDpd_{hJZai%9XVtWke_kar$DKk0_ z)XI9}ijc6b)hts6$)dv#7OmYdwe(xpK-cVNugrgj_gR*OGwI0E9S z>-eS@X%GL$;L0O+5U0X<93x<2;M4a>H(vIsp#@%AOmM5)gEN$^PH!tjp{A=2nHIJX zpOAJoxwph9J)L|mk;i*|0!p70|A^t>Z=KnlC1Dqqe#1g`K7@PKhE1U-u#G|YmZhB1 zTq$v^Y3}qRUe^A{4N@_1nBx)7Dz;$#AJM~gN54jGRg-Uws>0uR9$ScQ3#53T5jQxD2(a5C93r z(8SMMiAAHkb}yx$YIL-_kG<&V)5^iWsc z8Z520^lHWEv3GqX+lFYaEG_)epBP#l6U%&eeY+JOSb0kl#G&>TJzU-Nwb2dgs7T@@ zbUsIBxGUKI_z-gps|)WGXuJM#jgX0YXvAg+up>Wn?W|@%7~uCmtpUPz?p_e}L>eYi z1U)zDrWfL7ogEFA%Y#CSRh1%74J_r?rw>Mdob9UYEljK=Rdli^xP3RIluui#{+Mn$ zQbwO7fldY<`iE5F{gRm+NrT|PGFS~n7Mqnz{fYNnNJ zQ|EcYW&Ki@BfC8cnHLn~hBnBPH`s=i`}NI>t!22-^d^3A`@-d?Yk!Wa^uD-^@;svy z6dC6MgEQ=#qM~XskNd>PEsu@o4M3}$SW5rWWPlkIp_(7%L(KS{`eS+Bj=fymJH5)L zV$NnU6VFf`(mIZ=--AzPGNI!j`(yWkyhcmb`q5j_b6>9Ozqi%e>wl%cQE_`&dah=w zu=<}>w-lSh81IW);Y3s1g}#+;(WYa8akbtZLr@jMm%}+nen>sBkTXm8;Hnx6gfFR2 zg#GWcUd36mOfc{E?tj?2AJzTkiEHv&&N<84&GC#v!%Y`Qx`FQTeH+4g`HSi9fFFDA ziN;==-_t?U!#kE4d>)%|_PA?n$0ayp2-Ug$S+sTt?eSW|38rh8a9%PB4zHR13Is8; z;=Tqg$@3o6y_bFzgPVO;V)8c}?7!Zwkn$4PirseyzmCUhq{T{)0wI?q59{6DqxK&tV9lCY4xdYeH4n=gQShtP~Sbb zYRpvTCnB34?2=AV8m9@@B29-Wnydgr8KE)(lh?x2qNoy;jeTt1V!2v~nd+$o zosp|&(zEB)gP3<+oRozd{Mad>#7&&SDW0Xq-9fhGdfO`70xMRyny88B8@;)o!?IMp z8H_lGM9@VfBZqWvpf-lzn@}2eBJWHA?rXZf#sLzqI%KL>I{bn2Sy^-Wkyp^Q=9RK5 z;JDs%s?ElMyen1Qg4V5gCkS6hPBbkPJekqK#O*6Nimw?^l<2WqEr-V5rEK0_FXUdq z4VtY?Q<CHT6aIp4^^x@$+r9UT`jWv+i)h4-Q zAm-e_1$j4XOKFGv=6&AhuAz2(R4k)u!1?lll6N zik;c%MZ)Y7IkmP!t?81A(TlIdcSX`$B~m+Ar>0HT7LA&MgOkBblhP6B)T8CFrS}04?z7v$znwwFf@i=DZ!#-{D>3w~Tnj=7Tks$mFsI#uI=h-#|Um;>$Xg z385GF7EX4wnb$IN23u|~Gs_2~BUwREZ-BY6HAzf{*O?OUN3YJgyk>V)`t`NwurAQ^ z*_!3`5yP9bvJU?cB~PxgEe$W0K^aS8<{~k`I?=(V2FXt)w@f;i(;ZHJ5gV?zjCNhe zo}g>p2Oik;SC4L#1(=?2cVyGHYkJW;R2&59l#fmVV&uV9gIF@rq+I5UUi7r#=JZnL zKR=2TNC0z;mjY*i!>5|e^q0Aai`JoG(|;;T!WO!XF!w@rF|EMaVs0g`RgJF%#IZ~R zCmu(^9{~G3*ucs)C`9Il{xzdEcw_>AK{5?w6Y%O#CTM8pZ72 z9Ssrv#PPqv`bX!ZgPeMu)JnAX*GDl4@B&@L;ld589C1}!6#+DHq^d$jW0C6hs!icw?!Vrh)>0Yr~y+o0Y&YQb&d+@5tHiZ zc`n`+J)`ebJzdbl9?%-zyHiaP9v`VJa&TzfEs21gPH>sesQgMIw?rwU6V1|t1_AU_ z3a_3mi?DhWAGkbL6To(j7w43I+O^t9nt9HtuV^NxL{-vH`D3`SsruE}r=Ob0Ic_KZ z<-o2C@z2?Q9a{SPSUVHl)b-9yLz}%>_fwWVDyQ2~3iPqDm93+CB$B!^y*L@9j2^;L zbPQW>P+phqN{BVweTsMK-_gdQmaooeSB^m3rRWjHdb<->v!v#i>)g8nM?yx#p0b+e z=JQ^f1!a8&8ME5fvph7(-cn ze`H^7fcDX{KznrT`{`)U4=EopO;(G)KZPzDmPhJ(c95xoZ}i`O(swgHVGjXCbwWm5 z4VI=`97M9=(GHE|fc@t5t7lYuqR+Qc-I6FoM@~s6+W>VxZxs{U*SR{n_vQVEbqvWo;D0k+#mk;?I8}T>5|1D;#U0W>q!PXB*HSNw&;?HMZ9R}xYu=!Ukg(#YvO|L z!ct{!-}~*|VWjWkWH0PX_syK9@}lRq=9&ADao4-FLr;#1nLCUu9kRFWNN5ZZ5tHj5 zc_&P%R^YSXPP`wXVp5cfdyI0gN5dtmQ zyaXBMkik%%w#n(x=5da(vve22T<*U{Dz~D1NZ>nBnL4AjoBgj?Tw`qLSJB#gUq!?D zXYqs{e?*$TyipxwA}5@nVBL4nz|~StQ*pfy+N@T@erfX|^7CFR8w|nQL&(^z3 zOdL#(^s(OWAFOP5`9L<#=KyY#(Asx zpz?mN!sf#_gssWg=spMcs|z~bHM52?}lZpZAjG-FoAW(f(bF^1n+d8l4u*gb20 zZP^q|&gr%>K^?u}xWYmdh37t)ynF1hCN zV4YCbS(iGMto2b~KAj~CZqV$RNr3>#4CY5N1)~J+(2`e*Oc`Jtem*UIRjlGo9>FPv zg!}Yl+IC2McAz{%eBZM24)D18)-{kEW3FZiiS2(Mm5_ZOy!^-v6~$?Vt7$6Ku?jvI zPC|U+PjFnVm#T{iLH%c`zybzQL#=k{1TRL&o^T)ePu~XLk7w1zRJ->}U9S}@G}cz`x0>K2YM33 zY$ZC`y1PPK_dKbOmBz?Jnu8p+w%=o19|um={Fe4SJ-i-Bvnd@5a%yLfb#C7Q&~*KP z@p%v$Y)HTBAY$@S2yFk91D&|2<)MAU`Z`^%>nK$sPONMY&b%aIm@G#Jf)aSM8mVDthBL zLAx|kLNafvtjuk`r(G_bOq4^PnQYvwMWj7r{`^HKMjgmXhpzD;i^Zjr@2;!%`0`n6 z6Q86zgcFP2cFGfvhmwyZfeY&+e2U|kJumW|iogrvrq%}gX6$aa`-HuU*1Iv4AlI1K z*qLeRuqoMt@Q>yIE@6>D=G<0eFHHyEOf^NOS{_yJndk8&#v6?Zqw^Z``{ORg4DYO% zu+&u>U!ItgU*{D1oW%v}yws1;F#Sw^-4;_-Ih6P!XVh=YcRuse8EFasPG8R+u0jw; zWxQ1{Jk&L3NIeEYl+Q57n-0;cbtvx8@C>k3%|ZGk;(+8b#>a69pOn%@*A*+DidAkiQuH{y3gaEE>DKW_UXU&njVabhxY z5OF7c%5^JHKfGWX$cA|=Bw~W6dvn4*)&O5}Urw_rN#LYBP;gnj=5tO{yfEqMTSkJX z#jYB2Qpw6P`uBA2!05dBJdG9H%{abY7OMdO{05qTa6`$*q$_Evy|J5nLrokt7H(CL zz?o+8(}TkK`-3G(rU#*ZD1D7I9xg|2v*gV8=GQauR8%P&2#pE?ID+#R1nDCJ=X3GuyC=ppEs8zZG81-jKsvt2t;o#<$2jaB0=y)9INqICFK- z(Ral+%TpyElT4UM?!wp`If4Q>uwcUzjTc$KB)amVHpT?|WO>dF4lW}$udk27xNNIJ zjmPvAK5wsN=8o>tir!L{-WXOK0FhA!eX2hHR35$|5R2O}@lK~FXh$Okqb?P%hNBBm zGlewDc)lR%Z{waVnP~a(1?I_5s^~~}eV#JH2E&hYX7j3601yG14O07P^FVlqT3^=lxTp^iz2-VfrOf<2nYc}?<7(} zAe2A?gb)>GcATV!_zED;lQg6N)vWem^!^o>NLuAx|XkE!?mR?Ge|VJ+mLc#e!RZi(u%m z5=kzkIIMNYi@USxp8d;52{VoLtCIrL;dy~P1;eFsEf+=ZQxn;>Igz@vNd97+-aV&i z8LbN`AcIp_LHT++eaA!{+Ov{Y`?l(DZo3=GO@bulozd;1lG>^<@j@FpL(VuLs?;VQ zX)QR5jS2$K8@$CulhJcR3dRwvIEOwGTOJ{kUQFft7WfcO&7!1IPMO4!KW2z_(xZ0s zEy@PnyoW@hhN8FRt^{?lo&*B(YoGk*pJud|DuO3Zi1X@K-beO!uFtAB^k%}wKEP7k z1*!g$&Y5r9VZ6(M`LC43?uQ6jhZzysp;khtHEN+7?X)>qq)zW%Iyy{>qW)L$tS8zT^>xO+x=q=}3MDMsd-k({R%6O_zVl1}3NUA@jEXTML{oaa?&1ItHHyCc3y zKLC*hfHe9;C$Eig+LWc1qgz#+k+c{v&Eme3-9|Uq-e}I8R2Gj>#vu-{|%JJEqP{O!zLwiVTg!mIwggd4(>>>zu_|3%8X1Ase*O>gaU8r^WzSax&zESUi~z3q7XQ zbOSSZ7orocRR5tjj|anhg-_suvs2^^bPOLDaK^{w4ijAwE>2jWngu_7_N>^zmo^_9 zG;Dag+KRDlXjr9rQ4@jFPu6j-QUBt?$xcRU7xgu zx|P5@)&wEm*c#NN>g5^G=y-5s2H0I^RLr-T0P9>P?GfcO(2|CgMy|@op8Ni&fzx_X zO+kf}rj^nXIuIf=FyRG;*E5#DG^uc)GEMVrc+H2%@su{@<$B(jsuzz^-5s7_<;iZ$ z9S3CGPe4`AIa6avKFe2XcS3KuwuTM_KI$ii*92rtd2@1(xI5S5$6Z&BkBs4%;hwr@ zJ5|V$u&xhR){58DSVJmS87CN=GG%>u9uu4R_3kal|GZsVcPq;jttc-*{m-zv zYs8gZ0NX`O%dk{4boe(4aBQPL5WcJvnCS6ueBS346uAx$NmX#%$nye(RlYoJOP8jX zxQD+Kk&lY-SHF}26xm9btyXE4W5lCXQM2fiD?t?I433FTX! zb^7fz?C66@!HTuVfH_(GTb}#nVD07&r@hyh@u&0&)zp`XluaD~jj09uPrjW8O2E)} zya*rzt7bP9I-WtTJNyfGuZn_pl4OF`reOX4e8f zORZ*q(2=jaW#Bs>>iq>R{qhI^y8K0d=j$K;r%8JMKXk$WrFureQ_IaFB(Bjwzum`+vjfljaqTgf4fbJA?poTfU^q>{0ZD9N!hAb0~@uwec{5zx!Ty z^AkT78*J9nATscPO3lB!Y1nES)Za4=^`J`%Gqa4X0RVmxuwnA$!IyN>IcxIlm*8Rd z_8y!2vn3qS9)R@)2)g*B^WM!n@!9cvJc=Dn1tFrZ*TRT)to5F3|Jp{=26rE4LDGoKYYOne;lfVhCtFn7?c2Sbbhi^M1X{-(*TgyN96+ zXtpKQaS5Cdoi)*#Q5qjt&=svp~Q6H1%9DSmW#UvUl0ER}upp4YCKrxb=t43+xIT_Z>T?>|}n0joI{5XdwRx?SkEhe_V~9 zerONqjbdNl!W~jNX#n1qX>2KQLIytxzOS> zEB#;e{bXvr>gph{-8F)4!!2B6vN6B~v}mDK0xs1+z^K?~od5IhU{To@g`}nRC;KJA znUv04Cx1I^a3!3uY7@zIMctnin{orbvJ2q5R(o&a_UJ@2bM{i%Lig&sj{ZRsP1&#< zm*iuRV$Cx0!Pc3vA*r?(YH}}62{nHuB`OQKYX$qRmY2K5>3LZWRL^Ij6_A}xtZES7 z6Tpi8D$NcUh(HlS!_g~g>tj;$OC`rhW)t$c2fiucJe>Ocxr@7VV@$A_SIvJNkRL)+ zzAwYcVS38PM>VWdmb$~8-B37HWljCdN zuQ<{i9B%veHJ_`u2(U5x4eI`osgRDZsP+j_bI&r3phBk!R8VtX$ei8ZGZ@ZO|Rj!deT*c8Sz2Yx|#LwO)t zm|A7jZm6`f zRLXC?y^sUWm{allBwo03*uF*w5@_zQa=rSrSowLY;)=l`GtxVNQRMCDvAWzj8=f^^ zjtr{PLItN09+;q`xNERhn6raXPiMPx#_%LW#@0b8rRmimtIb#>=v5<{&-%!2^Hd5x&4L9x;$0mW%2O*&ILayL3drVC( zc}3z(q7mDB2PZKT_SG+V^fPzd-;bEgVGBh`$SD3hr|rh>74pR6Y$x7r^xVH%8cJj1 z_Czdcz3%`yX)9mS1h+w+at*o@GF=RExY#dS=DDxca?sx7W~b_~OT5Wez_ zrP|AGt$8On)}6LhrHF@wA@1dLWlgCU-N+X3eUE8*cWyd_5|ZOqarfTKYv^Ur4a`ZE2W1BVrW*Gg12-Rr`)LrDGo z51m-8r`5UBNq>{dnM&&OIz)RTeg5FZ28YUV0iam)%{eZ>3+3z?>a?X8nwqC1)h)6h zYJO~k-(IfEeSNRKt>Tv8m32kgnSK2ShJ93nr`4Bp<;ntzUri)^AyH%T?#mx_Jm~qx zi3-fdAcxe~^B5huh}yvb6LkI&h|l5s%l&GgX8)TZl(64X|2na^E+=VzHn@5M-4l{w zBTAOh`x&&dTs?8)>ubhUC?zb`JOOzhy?#?xv}acVzWuqMh#W0DlkV=Pd{D{CF{c&U zobCuzsC{1MrMcem&$qTqo%hFcQDWCwh=Rxlcf7Jnr||7Yy_s`uQ|2>cNcT)-Sx?;2 zPE&{sCT$A;?DkUIirBI=V(lCEBzF$vVF>nw=f&UkY+coqIv@pDNT8LE%+Tob_Q4n_ zVdUuBU1-Ms7lx)Ljh2onV!+E}BAb3JSqQpw$`s%&`(yFRw}q*rY8|);-^=;KI=A%@ z{WmOCe3Dv3X_$)*_~iI(ZB44*Nx|OxzGD7sUizOGt^!^QL)7rX{K zCT*^A|L8;#oH>aK{|gq~C1QA~yA5+d-b=llwfgs>zrw}bc7E%b{C(G8KcT(E zECcQf4aPKAi@L`0&hMB<%iSvRbYz2PtPYwcNjkVb%-gO9BJD!iJ{HvnMqyl4DR&-p zhK0*xADFn7D)@NMelz5Z9enWQ@>y4xihpEZN2{dSiNcQpbyC8>3NHK|y?c&r#P>X# zU3->oWjaq@yuKuvuX^)&d9+2(j!mgd>x}b|G!FFEqpYO78-eeM*Nq=~iO zd4082hrow>NfJ!K`~!)OAH2VvN-nn zTDmNhHd~>hFCq^CdM1f7dS3H}OdGWp;$Lx%=RPkR|32R1RO~Zk^LZ3OCrx0j_4kXI z=BmM3bN29MLiKrRLbZ_u@YE2!3#n{oj-Kt z5be1+suL}Z>J*QWIID$A@AG~58mM6v?`1tU{QUJBh8s5q=vHRa$)#WskXboQli5~q z<=43yK(f>>ygV-`hvjc?v^uW2yfKry1M_~AH}l)3b!-1Yny=Mue8L4rnU+>CvO2(r zXyc&9JfB?%R_8ZQByNyStQ@?gSEAzs3@_g#eD-bJR%rwm->sYbJd?9%-HAEi`B2=05~Ke%+G(&$ZPP` z1bU-;10s%}c-XZKrz%VYMCk8-kx9J+_5i)?#JA!3q3>_pBptU^lNjy)WSr+Z?}@mc zsDQr$BK~@L+4PRWrdPMhJoHg%nX=3VyCX7&`LC=)nwEx_4Lkz;4`1s3Pkq6!g*_pM zSgnni$Hmu&wgS=@K%^KTF!lS?m>~b+gy>SrU6IX>y|;m_LLq>{m%-glqBt`+fE1## zXPh3u+c!nyqM zT&z|KFrk7ht>03bUGMnY;P2l;*a9KL=n3~ONbM-_V?5}eXA|!hLg`OA9)KZBnC}lt|MoCIicA)e z)&8_`F5&BH1wd@){59(Wn8Bz2W69yK{`LLiZ;}AOGR*fj`O@9K+sRj#|J@+Iw!?SF z@vR-c8^m{m_KA1{Gk@ZA-BcLo1Xx`Ky7WH?98-92)YC(Jwd;^9x{?jJsI@~rr8 zzekC2vLh_4i-m^?pGt`5eZP=1KlSglI@iJ6erdL;rNjngj{K#+SbXeir zyno-mUtfHi<^m$tmuCL$b^iA3-x~JcFMjyFHNM-%_nxwE-*;E=-4%QvCcY1vKp64e z6?}IE-(A6XSMc2x04?y{75v}h3L4{iSEj(ojm}d;OJCvEK(eq_0hW3?Kg^YXpt%J9 z*Qak|kAWgGNCn>}#ru9V{cmCFpVz-hgzvlb=;ObIeGmTg8&GrKz8|mu&liVCbDlKd zhe5ri2*W17V+&M}>ort~OO|*j#jY91Ve;jmj6};5R;FTgdNTbH1a()$CPUPRQhf&G z1c#nfK*T^l)#&p5 zjkI0`IRE7nUGHnQ=;+BX;TvzgnKxa&*!Bwi>bllYDf)Suj=&nF;~A;ieH$RmQWcU#X+Mx#en(Zi0*}%yMoDN+&29uHRO0Y{2hjx(} zokRLJH*bw$+D~R>>(>8lS*T#%Gn&+~vKs2`f%NjYw&F0;*3S07fx%7H-@yjZXA{p;5?QI#sBTw~@$L4<=M&Pg5tao< zeU0Y&oQ9g3@A|j9UOX1d?yb)o*tN%nMY&(INCQhbNO5m2l2y*P<((f6367}BTQAz0 zby?|lB%Bp78q>qs#g&i?xy|Q^(USF5Q(-Q=Dk8ml_j96p<2;W?0aEDQEY>4S_KjuK06AC(T6#-E+LUQ)m8>-8oCefgkg24O>?zCCat~stYmH3tFA0?u0 zMYqE5+W-Z>AnCuB8h0_wZp(;6m>m71*|oz`BjG&L;dTYW4M>>4Qq6=j|BO{@e%&1y z4ors#yXH9P^Pbz!~+3 zs=pAQBiR>1%|6Wlr}pU}5Y$+Pygn7v?Js?&swPkqq_Q=EI7 zJtTcT*~Ot{G_pjeMvu#yBs}mCEp>sIlaF(~ja@yW;D`ci{Zl3*$QlGHG*`79xykA> z@*hDS$~y~`;mrX+wcI?LEUTE6*|B#5Myb~MzHN@xfSYd9?@J0ym#4o;3~YBL&j~Pf zuW@ZkP>*eF?CpfK-Ag%{*kxSVtq`z%mq8JmSSkNsfq_n~KlQQbkd6Y`qtlk)07!wG z`%)cs=dLc2TgI3g_tMjdsWs@?>#?lalm9p|sP5Ad>B!km$GCTXeiLQ0v=WR8_0L># zwmrPh<^m>kh&0RYMJMF^zL~oG^s&TzA-I%-V0LHQXq_Bu8vH5In$5EP57fr$n4!EC+IeF))NQ=(F5KPSy+d0E6s9nSbZUp3ESFOE z-ByCnjJ3iS*0q58I&yCY@3YSZd}pQxG?Ox)nGrErr5o6`=(FWzAIg}S6h3a%MRtzL zT=d?1<^Y$qVG5YomDbDy`ZW;h+{6W&FSL>sUX3C>x_4}V*94(t@ zM6@*e&W--ST^>C?R0?`074WX;vDv9>F~{3RkM7RW*|S_RTtx#7I@T+bp?o{T2S{-F zxx4dGB&1ud!~uUpiVk);?lh@6+qPT7+@Ch!LG0=3eDpXxr9Dmxa7(m{ukUGdv=OKt zuK10sutmo9J!S-BlHod1lauvo_#Lv*edJiph_*sFy>B;nMx;llJW5Z}NPD0Y&jDIH z{YFP7ZDmBf;1%4Wu1y{GNffyT0$z-p2ruYOX*(`HNYBW`GfgAlx_VfIuXoYWhk8b! z!gy(np-765;Dqyz;Srr16)4x?*WxpXk&%V_P3UK74P%Mw57?a%@U9!W_c~2=eLJB6 zqaU&CDTZ^R!U0xs9w_VC2~d`QP7!7JnRQ(E$7eY`A4?o1&RR)k?C8jKe{i+x^jE~l zg@1rJWGOtpMo-wlMB<;b%jkE_dKw)NX=q|)M)Gk*G>-y`1Ea13g&+dtd zOs{Ub%_g_EZ^yH7p$W!owbOlKe~e5>mr*aCk!M85NoVgyY$gzY)@SdWK4O0L_U4x$ z1{gA5rRlQYY#_p-q=ZqH4YFb0XNBBeZ{B)JKx<26{{t6e-k6$8_;0a-og~fd&>KDV z3uVgAjVkie7mNT^uQ1lfI0iu#pB?G~{HIBi(x5tJVrkKm+k^7jnn{lh=($RxG1FN$ zTX6|-QaZ}v23S>VrtU9^sA5Wbf7vgmP39iHd`!Ap6@Q`yZf*8JK6%og9Jh@ zH^Q{d`8T6Y$;?^(c%wsw?fzrK`{Bw*ZYRnTc1lBoyU~QEiQb1p8DqAIgjXVIxFBBJy0BF2-xtO84UywMCm^@ zi*{p%>K-12iEC8cR9gYXIM!pGe_uDt4g)iVWf8vH13oh;34;wbmwEJI7m~8(h(Q*g z?3_sUfr$dlHV~8+7^6_>CyUNY(Nsvus(H+(5}g0(x4V*`0tH+%Q~7i1MWdXBMlCO9 z>co>J7t79FeGILw5|UXj;heeTi}*Rz#a?iQ;O#g(MXbwr^9*d99-l-G)TV)WGhO^0 zyvD2$#s{x;GAY-M)PEKcxUZPQBI=?%8b>C|c;Lo+E$sU(a_KBqWianXtzt@_{4SIzGfYdk^DQoXr@%Ah@KUKqGKet8#t;qc(!A=9KgZ*6#-o zFbW6!fFZCpdh%ja`_LEi={u3m>BPWWf-^^a$1san5063SYDfRXYKJk=ESuo&n7zA@ znt8FBkt#7vD|P_;Z83%ox!vY)^^UubIUO0&BeVo+vJRzDTRIAoGCivYs?fwxUG|=uBPP655Yt&Wz@4Kj|6s5yGXB}I6xP>^CtpT>l@tX zQPFVxT(mj4r>kv|n-N>tW63t_Gi#yY=e9CPq;kA_YxPp#^efYAS{{AD4$z)@iFtG& z-F>l}-CqYm$8|6JO<@YIIuyd*i`UOh9?^hObOLGgl9=HUS|7yMyfRX(bH8c8T$JRt zJdm_C!zg{{WqyvO90Zc0gREB#Rgm1ScZBWCi|f*p+PVxXH@Rm_jnp;ckI-r8K(($j zfEr@_2(@c#IT>YL)DUNhcJuCW40AroN405c3xZEZuy>ro!eIQpVw_>m)3)+~GR6_R zHoW{uD_C=oo+bLxfP_cu3|8a3>1;ASzgR|MLyxtr%n#x6>+iUz!mbBwcPZDeGIlLz zB{XK0*wsPnW0ENfF*#ZJ)XbDXDPpQ5BrD}06o2Tjet#Ivr#`apgK~4l#*PwbV0q-l zK^;iWK?$c+^Pc8kkoXgviC`Z!K*yo}SM$TR$%?RjXNIeHx|C^%VGz)msy{4)M$LiMwd&akQfNLG6{LAP2 zoiG#SF4C;hmFRi@;pzkr%6%=Jc3CHXttamj569hTc)j8tu@`A;*VIe>K4J-0H-e=t z5(D)O+1KEi;n#eXowo`XyJSMvI^Ap(nLaHu1{>RN+-Ns+m!Cf2a@VkW&42IFuQi{E z?*`-M1_y|PXFrd^!Z)vTyt|czScGwS&dv@jZIrV(xmMp2*qbAt{R0(9o}I(DQLWIr zPPrE}pL0<=T(A_M_Tc_v-5Ft{Ry=o+>XOVf8qjZdTFWZq<&Xkq%Zh!V#$o<;Ry=mU zzm5U-+Rlo8bwtkW!0gLgZsjr_aRXy$^pPN=-#}1qdYQD) zv%)j`+G3;u`&!_;DmV#~&=Rk(IAu82pex+DvKg%ajW{t zr9D4Cf!)dw`oSiIw~{TVMBIe_9X0-^2mDAV7WbK=`v)Y*z+^Yr7CpckitdBYDne7X zKtaCt&>$(bB7y;_Cr7825T}=kDLIi}?PrmJ{H?^iVfH+s%)@$dE&`^fVLmLTWc?`E zehWf;+gW4O}JJ|e|239xvyQZ9Uw*4SJNN_Si6+TCw6qZUK6kMXJ~n`CU(|g22G6j ztIgWx@{^dIL})&2@q-hW_JeLN6gKdVsCR0%p}ad&qlcsmMV^bz-pz|Ms@CcqoyC_1 zgv@rNMNFeL4L2-UP?2P{6`Pcf(_0;}))8u`+T|>T6D*y=1XH<2+^!%KeI$dS9@#k> zgq-Qr%#6I@(NlK{6|DbjyM;xYtoARF+SJ4}C?qLOqr`)`@Z1534(vo>H=uqP&_II) zh&_6Ae78k2s;Z{ki!&jkmGmL{^m%fJd%3?^|BHhw9^(sl>Z@lj_xVd`dJI-N&;%_6 z=W%?Cq$YaqeV17TsW_q*Z+!yaW|uy1P&di?cXF>bv{k* zNa~a)kFeyNwQ2m~dmiY=?MYW29ZuHpt8uAz1=cDm5L4aEb+*z({Md?FGP!s-Kya#= z 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 literal 0 HcmV?d00001 diff --git a/part4-mission11/infra/s3/policy.png b/part4-mission11/infra/s3/policy.png new file mode 100644 index 0000000000000000000000000000000000000000..e16a94b8796d61557f00b72b39193af68c0d8509 GIT binary patch literal 194334 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

3jCPfH%mS9@76f9uENy@D>* zJ_6+H0N;%GR}_#vAbRHpEA@hFEuIVKi?e8hf=z*|J7vH@1--|bc12`7n1q?ph0+!U z%y2FL>Ad6&%7ZpBqCdY|RV$JI91!Ni2G4tk1w5o;)|J)GTAHLw0A~`@ZPhpMOwz2v zibh9Oa3GmJn&DNn;yk(&=(KcN@_cP>p3gTV?p7peHzQ$^e5j_SgQ=dhRE{6~80)1- z4Ysqt7!oZsGvr*LCCZ3ggn)t|eCUK66WccO)d#E`QVH*R2AjC|C@i43YYzf0M8fvt z+x5Xz390pH=AP>S&g|Ai0X6zFNo`UhqTEtOF|ma$clNR`VtynpX(Gpz0#2o<1%=(+ z-DZ1pHF_<+HOhyfEL3~=^1#)H0Xm>_2UGzkP+XW@;wN=d-$ktNG^wAKm! z767j&Tfbnns%nAle`Oe1?6Sp%y}y3U$XIh98!>Q|C_`^T6vYS4*R)MY!p{CTf372= zqjlo5N@zFMwot0Wp6sKmR+B?4TQ9z{R~xf7F2Ida`PZgl4_)>=W;!j4WmG&rIiq)M zFU@V2r)I%t@>}mJVUQ@rJc|tue!JEhfYXb=S(KL{fGnUq284FlvazQ_o?VJbiv8Yq zG*wyOIVY--n~tT}-ce~iGc@XqnzoAssWJnPVqn6yR2^;d!aVC*!*RlakOWR(_6L^` zHkrhH?|KA^Di2TS9=v9PnasTIsX+*@CTQiYZA8{FYob&Po(Ped!FK;qLH?}P* zNO%1kU^MvQpxHH@F#;b6@{>|tjUjPqQRj+ilqu>7Ok@F^b&6G*GGjj!FC`wDW(K(0^By6xl-LXZ;QfvM5=K^s_c zKlAxABAzgRB5RBW?MvlbRU&tdR#in2fUqJ_#3S>qLgFb3@J^Fv*^tM+7M5bZvw9a< zN{U@I8w-&pc#MUK?TDFS+8)B|_l9kQ0DiTvPt~syCUqFmuj@4gLGTD5izOhTpxc)0 z_I04s2K-G_z61=xN67nyCND-tMro{`H`)b{h={@_3RIu%QCq!JOBqh%Q|u>U*qJQ) zFf5E@y4)4@N#2y67%r8TcF!5x@X-)pjdpYMWYf%g& z+=oYhXmT-|ZBtJTAUiC_SJ=Q;sAk(30?h*G{<f!L48Z}($jZV{b?YhLt52wGAd1&jOB;F?5yi_8&DN%&DWmn*8PC0fM?h;J z$^7@inZ4#K-3@sSUAb7An17IPBZ&6JR3G302X2C<>+C-J?mmzg$}P^~CKu$sf14-r z;Y5J_>~Pw-*{Gc5g?rAXoOz27Q4_^fxA-M*$jZJ$Z~>5P0ljsB@*+TKiYAIe8$oMq zPKw(Ge=p&7WYY6K)7$ptL-2>G!`DNAs9&2msI(1%g@~#4dC_JKj@At}Csyuar?=JE z^@y!)-*yq&p!|sk+JBdC3Ew$UOJ9!{DnOz>TUG|mtmeS{9!7X zxY#o~u%k1>v)UFG{{U!>YZCc4VI;yIco#Z0`aTq>m-DZ|@FB>1*ieD-=bPeTzG9{W zUR7~?U4sJ2qgC~cv&@V0Ty3OQ7T&ua=QgKa_~e4%r@$_oiF`zRZfuKyjO=ZL+g;d) z0-kIEvfX^;aY~%NzP|P#i7(FVsGz4;xZQ^hl5>TKLcAq)-=h2Zr zu-Fbil^i&^9#&j6eP>KeRDYF^d0LC$Lczs6y@GqS>6Q-?ZI6;%iX=4-jr;j|veaehPkViXsr0n{F-NYsrTK+_^ADakRE zorFy!NXICuS7qqo&u@956ZNF6U|t+&%SOo!?k z`;TypJr!ow*%A?Ep5D5CCsGDirAoxmzbg5)B*M6e`|O+@e?YJ)oTzE>YqM8j823H^ zH6WkC_MN=>0E$=ahq=wd&fvv+cROiUZgwWG?c=Jj>Q^=?G_rERV0Sp#>d~lP*EzWdJFmZ&&fZQg`t-(Agd^ApC}=E) zOo}zV8T?*1%LXetQNA$Ucf2{c7ylWxvh}jQB3FY2L+;(XsR)&VDlF4t5}VZLkF&FL zs4OP#RTt)b{P3Swsvw;Gu6d0GQJOWa2q4&4HI2pV{a(2Z{tlHu3Ov z`ahm+d`kNN1g`oXy?axVl=XkGf+SFu%^8l)w~9sbPfkwM4Gl|0@$vEHz3W$+9(f2; z|NQyWK9J=>utU0xeT-w5YUEp~a(N%CC%)AUM2tkV-FHJ;pJf=`Lm?k*U%Zs$n&aDh zn}uKAdlg{v)mV*;?j=ygT?GC_f~HJW0DMX~n>!9c6@`PID&!6HlVMMbq zGqa4n_3YUI5jjB3D-%2@o!9|wB=eK?;Yf|Vba;&esZN<;6pff~wrZ9* z|6m^vFYov_1tMsLGz-s3wQTgyet{QkViAR{3AuqAaMo8a)PR?msG4Xu4C$SmIpnV5 z)DHqoA?~5%p(>#&EK&t1?!H(|s+P7*&AZA#*%F&|*u0SN*+Z(ebL@ju38LAwv#!kd zV81X5=t&UWtUn1?Wr&u0IfiVROwdg&O5OaNvO#HKjDsSLx63MM6nVR6Ht?LDrevs8 zEXCYer5vZd^>~1-is51fuqwH9lAJKrYIYhB_8H+K#5Eiii9;zfpG0VbF2v_*Re$(p zd3o%ew;bFlo;7^a$=I3xh|nJZK6)p~cmkk;qj}yH0;-3h@81)kVnk@&Qa=p6yQg>? zi8*sWx*E+gGktxsz7#{ezK4Fj^>wb_U|$hoyC@!(>+ zsl&`+y+NKfNaG0%G`ntYZ+4M|iw75KJUXLNs%4FZeD{=~g#QQ*2Z_p60+AqxXR)($ zPyf;2H7dpW6j=<134qo&!7u|dGIF(c%3INoQFS>Ke3Du+g7KMxxE6U#opN&Fd!~sU zrf-BKcS|66ULBM(;tQC*8F=U|G#|~;mMska@*=X?1*>xtCFQCiQsrKk_hGG~ z#;xo77k(!TasHhti!+GcCIaAp`u_Tv70@~-?h6{cD~Ruz@s}VliUJbQOz)t0t5Z-_(% z3k>8y5m;JTS#uD*OCdE0Fp&V_^_Y{1q|1>1y48wl0hd~K+3kYj)nx@w5SA+yuP1^k*_g& zcxzEV(3~joM{dv^7hSSoMymWn_5@0(O0^|~Kn63k|Fw0-FDaH61$9bCreEH?fH5JQ zOr!&d!?hC->fYks4-Se+k1<27eh5NMC_o!pAeKT59f%Vlklc!gSwXD?0*n6GPR&Ph zO;(Y22s5F^Z;5*7cItG4HI8Aby7OetJSPa%3!%9Mn-O)f81$7DFqi1!ePN9zVkD}M z%!=smx04E#67#5qqcsagepe@wi>HxEYo(FOMaC*ZU<~G`O~MI=Ap|;hE^S*9ERAcNldQ$=trIGc?oz#D-p{k6Q^VY zSo-~+$njqf8s3kZ)%EQpw4)jGtnye-=-R*L`xDmxIj{lJJSiVzeY+R%1~-0ab+p)T z3^lYj$x~)r*#F$o|9ddf7sZ2fQGlk?F`F$CWZ;#ey0LLS`x&_jsuM)gTTd)~Ltgbu zwa{~iC&E1^~OL%F>1O_y4%nqR+o62hpO&7M;PJgi5;(9E~Y z?636MSCWznsqK4${)XV+$0qW=IR7SS_h(3K&h=eIS_q}RlvD@ig9no&x-p!!y@Vh& zm)TLoFtVt?lGBx#5h`GX56t{)Q)~UL^|cD$YJrk_RmM6KJpcE$nM8h~AwQEU;QxqK zT}Nm8Ln%?~T&7~b?se#Y{|vk?!*k+wR$H)G$IY4R9HRU$)x3<1yAa}E6c2kw6?tns z{`D1jqc!M@bQ>;Qza7s`0HL^ntdbg3u2!+~00Eg1!`j>G;GcK%5Fy z_}3qMNU=b^N=dF@E`{ey_U?pqq0&88gC#|Bu!w~Vm>r_~Y+UFs4SsK*qsE#1*GU@Z zw@|Z91WXU9+dblHYQV*tf?r$R&9whg)*f|sLUV_rR6~)T$Dsdw!RCDTuajz>%V4px zA*rlEFnEF&@sWdQ%8F?NNxAM!wwWR~UE7y%kNb|Q+6_z~5vux`_%Bh>&r#Fl9Sk1+ z_hgQ*ty$hgWco`D z-RWP(V1$(>Z_slt?lZyz_qs^7x^X^mfhsaICX+QwsZdK`H(zk8={=aABEMLSk^JeQ zeVX+6YiaXC(wKon6SdI!lkPq-lh~Wkhd_uaukXY3SV6<<-$R=Mj{0=e+9Yhyb8md} zn}_D5ObQ0N^LtI_0QE=p+)%b`qT=mW1F?NgYN0v59%yN$(M4-ZQRJ`!{l{DI!Kx9f zltOBSz0`mCAXvQd*ge#0UKMZ2dj}he&CsX?E*Ee3zR|uoxyYh;K-rpbgY%Q`qxb3> z)?Jq|c|iCEee~bMMmSXgewVM7dS6rfY4iATG{eB)pt_n`@Ru)CK+8r6c+$es(n!I>nPN!{IbEH!CE8Xq4AC7V{{|n;;7Gd}LiXNED z4I9@obZ{|CRF_XXx}R;?TwQ3${4|v7uQ2uY4E9^8(a-e%eLIc9ppVBWAwdh+-3gsb zEhi@qKuK12(Q)Ef&b#jR02WFR7spT`zN=i#*?ChRAefre& zIfc5ueiRUH1Du-!>Q>v|Kj^n-%FB&*qsJ}0Kg{96KXaKeR900bCRG|5tPus>o|1y^ z6DXbPr3|!7NZ7Baut_<7ksv@s!1Y;0lcc@*&$m%8m6fMRnuv*rG;;&Q1IQ2e%G-lw zOn;3PyP8;za&3Cp>PhGsDE+r9xOWc@56c22Ai=|jp$DzkWpW*l%0Ru02jTKQH2u3f zt7))Tq5mv+3KoLlgkr4nYkE3XRA;`z0>jcuKlF)l;3ZQQ{Oz5nAzOz%|O zM8n#hyuRXi@DUlmHzXXFCfLVqaYE;rlJ$7W6Wua&o0NE&I)R`mk`Jn1x{uWbR^m*m z*JR)?JCjx$E}rNb>|@u=3TT@^X;bF*7ZtBR(fPnt`zAikG(KljQ0bXh_GnvwWIv9qUlLsxZD;!N>-)be>WqzeU25qFV|AQ4aRLvuzL_O zD|LY%)Wn#aeOXvN82b4xCRy@fAy24QFZehyEiJk=;QDtgehG@Sxw(1radPq+8LxG9 zrJ;wA!NI76v-(`&pnr`qg!S1oX%`o6(Eb`27*NyGiv)`x-iC)Wu(9DVF);}S-HGDS zh(-nnLy|v!lqy|kdzcB#_50LGtxl-GYK#lKS*V6W=n*w_95C{)BglgJs##HBdWO;k zFmmN3N}KsTdT@nS-d!=2mQ7B!1oJ)Z*F5I$AM|zbqo8}$KKwm+ef$%TLXsi6Vd;%4 z8nc)Ll2Ow_c-ewe=lnUmdw^5dHvI{RcJIL=Or?~***wPaz3KFi7%23cuAl1c%3vX7 z)mHs4RcgfzarHLt-ZqqNm#by&GG5tK;am;OC_wS zaQ7#61B8>|(1?;XG&Jx%ShA&ol9LiM4GNkmgLQDOI?>z~a?e)2aC3A2<0z700Fz=0#*9V+M2QNg1z&`{ONZl>oC&(BsNg}ozYM>~EJo)e6A8!Ind(8g zuy1i)lJoHqy1BW5Kmr2;!7?%c+}^!=Cm47mSk`vu`!*tC1&DuHIXUG41zh_qD;0zw z>!Hs@03BsvI8TD*q@`uZf*|%7_CH?U_UP{FVokKDIkH}16}DSwJe`Uk`!(k_bnHCC zuWhyVD8HBmZz%nmCNtnpR>}L!2eFG@-^6fKIk$(2m+Pe}a$il)m?;~(_IqdUt?2su z-eB!s?5Pf}lwkFJe*SRK!G@VBhvHRd_#WZrntk@ObC%Vbtmq<5_Jkwox!E00?;`&M zKU7+#T;xwqog(;p$U~5II~wCU^6t;C_u+rEXI`3%>j*W-6*{d#(_&T!m&m@cpKxJ! zwc_?|=lNzS5A{Axm#i1PdG7p(t8Z?-Xur>7Yqw?Be&Czbe?sKFrK=1Jqff4K-GxwPR)F!A|1L2 zQ4ZDwBApp{iytC)0OuJPKD3|928l~}(w-!2P9x)qn)T3+$5=pz6gJx9VRc-J6W^0q zQuQ7FhTq9};`CJ#YFJ0`)#(o7^XJ4ltPGDIqyG8xXKc&;Rd^gQq2=Z77)1KGxxEF* zFFb~nbNV$yNdE^DSBkD>Y;jz8;SNxO8lk>nGpxr1x#DQk!((#{3GwPOeK!GfzQ%c8y;+;*q!8WLY)<^PZ!`iCPc~rAB?u;+j9ssv`r;%Sa;X1`Kl?OZQ zNrn|?@{`B+UeR=fXN?w95*pE*<;Z*9>)Y3GJAt*Skh71VMqczmgYeD&KpwBAI_DpC@<}Ra_O@ zLGhpIa6i2Sk&PRS_z<9QQ%7W!IcNo(3~P{|xw^S=TMZBcaULR(cLMg~V>SU~bGC{_ z{A!aC;bH3P>c1tu3r#eCJ$NbV#900t2{2&0Us*#Y84o^;`6%??57ZFfUJjfl#3IVP2?~?#q(qsCb@ z5G!?(phwZA+CI?TX=eAQi?cizR`8vx>D;%Oj&sHf&$AGPJkW=Ffw?Hu-0?~*W-XVd zE3tPS@_~7|_X11r^0yg|>ln>6^h;cnw^>GwN>y2vqPz}N!q?)=c_MqaW+;#Bc1*O- zOyPX!ipY6>-&DvUO9bBBU@w+-yB0<543DMt)BfHWK3rSfHDMAEVy2wEn}GkTB(1n^ z;`UC5*21GLlLlkBG5IX5)lpEWycG7j22W9>&{%a!+_hrCUM1n{y6B6kok2Bf`91Dx zp`L-e9}?(4^ru_lO%~t&{52fQ98C+PD&5G`4_b~R*}i)|12Jv+;3r<`t6YOek#DAO z{8Z0a1;ssRTYsM1stWO?==YXprH{?ZZrl=er1{KDde?KYzYBcnccdFs=>pZJT zSwQeY>4$^_b!o(Z3fOrH0VgWov)!nUFpOtbRW_sOkmkdm*so>*r;JFd{(r~iU!}5u zNbu34u*z4^6?~?Y%7eDjn;<`$DONM3@`xBEzy$ecXb5gqb9Y9=U)5XT zQ@$X@uB?KO5GBksQ7s8kzH?fd8q3|&JANSBC6iFBukw19L;H%NC1 zC?cgOATX4KbPQc0pdcmP-Q5l6VSoGgKi}Txch)*<9oB*wnBkpy-+AJ`uj{(6+gzbX zV+-f#yuyBJbH^xWd|2oF=u%*mhJWj9{`5#dyx2cBZm0_!$lG%fvm2?mp5jo2N7m8T z;&r$&n5>`5`R8~ff4!jVTW`SYW0Cy1M`h^-FOJ69SL(deY>{epsRIgG;dRqyE_ed< zVJ>{~F3S#auL@O8I8qq8$8tsD`5pu)Jl}2?`~$Z3tOx2}pBiO7Xk)GU^R>n$OG$A5 zpy3Z0_@nw)U;3?&k*~o2f7PfgHApktk{${eCv)#|d=_8er+3kR_@KDThLYEB*)DE* z)Lwn)U@|H>e|^z=NUY2*-lp#MmA@*+eziJY_>etpSkX1Hbsqy9&M5adQYnCDQ|nAS z@1)S4_Pv+8h~34nDFL~oam^0dG5jHS-3#>{VUJ>UzoIPzA=#vtE(O%31+B;wd!zm9 z{!~W33ppP{>t5M2fl(^Giv#&rrD9uqYN>SwpE4I-))`T4Ddeo=W(gtP3EY~%X=RVw zN=_@ETuj}qyIR=wb$6x_^z@6X|I#hU>6m%$t(Dd^?$6uNHguMB{CewpYIW0Z$mMu~ zQ?ud4mVc%2j$N^AP1L~F$*f=7g3FI?FXOu2%8Q=<(!m5l?eGv6HN&*>US7*39XaTlwO2AQUyLJDGpt!>zOfC@&I}#=wlr2D*^Z4_-Dm*H?dTp8;Yi`;SrJ z=UNDXSRZMfIVt->$W-c|VNZ+m!@Gu2DxC{C;+G}LdYX*;?w7l*LTibZsUK6lmUV9D ziJ^V6Fz=Rv@U*gpFtPoF?roI*Cy95OVjb~6C@R|2^acaqi z^V*H}S@ypy>(8WZ2RUk~(;P$H1C8~hZv~V^>-GKiZ`biJnMM1Br;#*%E2C!jR{6~F zw{@y$gzYE<;o{I8maeI=j`k{dSO1tX3=uHau)6LEAlSQH#Xae+1>cFGBbjj zckv6<FqthNk5s$)@)JBe4ME7SXqQVJI?DW2zExEb+ zSc!TEES>UhX>$>fi>p_vIJB0`MFst49}UFP&P()PO4)11!0|6+bt!GK*SR>F7x>Ax zHMG*@Br@!Q>VMgWq}ET>s+yx2;uhw!M4Sk#Alky%1#lou1s&0T7XqVlniKY2SC2Ft zU8)Qlf=;nK6$OoWRxY;&G<4J`GUav>@}G?rdzun)>GjaeFPJVK>c{k2CcET53Tt=_ z{d}V~#G7XreRMQ+pgknEKK!j}@_FnhB!N}(EE8pj1w}+%YTIC*`Xje>4W>3qEgWGLb6_Wypz$LrMEMQ9#ljH5WU5ls+z7a!vF zHa;l7u8q;zve+|gN8y`p&+DIc+ZDf_%sSEXZoZ$}Z+!Di;v!7Kw>WrdY*fQxpa>7%e{#Dks_bZ#<)ei`96H&YWtn{jm*>= zLv~KOhZw0Ta)DDDF0y`9?CSAm^f=qmkzEIxjB^~l$hJg~Fn&C6zGXQu;kj93bv?DW|yRtk?>KqWA0adD(_NGu(Hb~jtKOGAQ%Esu3z z%{NWCy-qBkjk0R`ox@+>Vi5#?mYOjL%sASt%*T@Zx0Hq?D%CBW_dg?XAw`l3z5dQ8 z-)98k{9&{rS>x?`yy`}y^MT5B?BoK zu%5I_WL@OHKj5!@A|JVoA56@R|8O8Em)F4|g{~WQ>Z@UQ z@R9;xa?v-1Ha?_Xa!Rm4Nj5QoCz|?Sa84=Z23Lv-DL-0E(w zrhSt)q9M%g9O={D826fOhzIp;?o*lER3V=fFTu0?7w@y#)wk*vYw{(~IG4=wzJAUn zy36ipO|$P?d0=8Nb7ud!SnRlyhb+NOR>sG>M{okE{ey2X;ViIQunv3er(A0IMT7TB ziseeIO0@_FX-|(<1#J+(F?2q;xp350Z!gt$t1UblvJj%_@`?3MN(jx$OK|Ja3%-|p z(0|48DV;L#+g9;oou5Jh&* zK2PDygV*`V$o~zy9+HlqAH*(-E!EBoF>!IhR~IJ}Xx`Nf(Kww8q0{T5rKkW%`q+%C z1!7PLG72Tc{5B z5KX)r`i5%iTX|he0?_1J#DbHP00h%g02b6m+F^lIdGb{kJ0>2U?8b0me~F1SmEbEF zaG?OA+&g#fR3DGq#(w$~4#HaNy24TbmGG(mIZaXt<_FV+!wV8FK4BQ+8c7_Cn3adj$#S^KZ|1KuYh!fd4C| zWFHD(e-!fJM&;M{05zy@+R2flW%dt!iaQW$3eLl8LMhZ33Ku>W)+bA8`HFX5Z1;Sd zxX>=Ex-6r)+u)P&2yBCnvrpS~F6-0Lw$;oVOJ*GKJUaRwCP*ZM^tl1~al!tv)a9{<1gGNjWdDW14C*}k z^0U*8hh#aTu4M&%^?FdkID3oE$;=hj_X=?}HMcIDQ~5!-llMw+Qf{bEtR?A4syr=Y z`$suG@{zp`cfw0g&6>yp9PX+MUVegC0--{YonX7QFVpkv{WV)#zVInI{4%UG!tFpv z^e&as(^q~cO-WtGF{|16@W)g49WRY!@ zISq?}dCdr4dzm&mTJ?juBx5}tTV}Kh_Nyysu9L5>H#B2<2UOTjrpbvd>{nNd8KwLC zsZ@3}5&(!xpk_Pvp(Rn0O+0VMb1k>4eA($EHuNW78Jo78KCOt0jQY#jO>2n=%6-Wd zB6vwSQ39b?f-I&q1`@^0u~Sf95o0NFpjBLjfi;EM?$U;Jx~f>02Q z`HoO5;z}hOHUKsS2M70+n6xU;RNq4ESj5cdW|zKK=Xm7YW}o*(n3D3 z;PD9BC5xu|BJU|=$TE$kMu~Ec8n0$p(mhq|IirM_!AT@_@X!zI@Xm=hKD zI(-oy1aen4nhl0l$SMDnqUez9s|`N&WiTbqMQ&%k%~sczmm8jLyX9<0w`Os=bF|pc z)5Cjq)rN*u2V2v77MclUpE~+%0~VfoD^z^Y`dC9!{9F9F=2h2*Clon=2_4Rpw{d-E zXB2F?*wd=gm5=^$Fl5Cm*}p8&0Z=s-S^Nb_ z=eKtjCln9pz|PdAiK=;#U_2D-c`sg8>cUfBRmm@=$~q4yH9;JNhV-k>vYDz8pSz!2 zcSOuJ4^U_=4E+ifiOX0`q{q>Y-t!}UpN_`b9t*^1zgT_|>`?i4$Ff(?aeNZrffPl; zs5!oKgAo+McR@!W&OU=)ty8tJVB+Ranc$F5;jO5L#9mup!y&rS&&ji%9%XyDs_h-n1NBgh#gML1}M;V&AkUr(`>0*j;yN7W_ z1Pf9&_ty+P;A77lzezgzJjx>1dUL%0=NS4%IhZShsISpPi0@k!9tgk3y#)VePO58SH+#)>? z_#Mro5V`-L@WnRPi4JYV`_%{$^ufd*niH6TnIA zmOut?2kfyHDMo!|pv*X&EIG4mech@d^ZF!2(>w?omVciW6$7sY&{lM%6H4yUwn+PK*~3e zSRW`zW42w5cXBvooY?t8jT9Y&g5U_PrNM0HF=%kuXzf4bcE2zaO(Jl#>lWL?OBH)jnKDJA8$E3# zm>ewo?NQi~kbWgzeBjtCQh1$Ptss7tN^9rd-A)be1i!CIVlvh%+x2BI`pas3&AVbr z6%vt$jDc}^-`m{3Rf~if*5O4*$qik5qIoLz)W_D4WZt)jXl&#QCGd(qp>Xez6(eI? zDc^cj@+Enwk=bRSgg~=}j5M~o-0#KE2k66~pkd)2#+|n^N$biRXEhBP53UYk+?&TF zUZA=>~P@k*mbKmfQT-^Ft|*p+M6`gWi|EFB_ky)l(ghiQaB=!w~!~ zgqNm7_$$lPM%a+SHP+LZ5y2h6KJ7$}cE6f98y#`4&n|5B)9{PM+6p?jor-Qrcg!ya zVvIe)>yxjrA?$S%^+oovs9QVBBd=UUfK75;reBd8cHp8}LFdN%J>{~bQEKsx>q@)u zx)JLDs)6yk-b1=bm3M6xUJbP4D#fM`i9D3aqqn{C*WASbQmc}eU@b0npj$Dq5%qLZ z(1eZwskPOyxFq2?L|1cMPbGEN(tcI;B<&R&qPY-Ld|}=a6Ji(_`=uUc?SP#59s*`+jSvCbnAG6F z02|u&{?Z3Mn;x-|FCT5acBg0KayI_fTx2N7_f*G%;M09;96CJvuD)KR4wn*;YEYgQ z>Y|?u!TSQ~e=#FJV@y6jGPNi)3jnI%cCcxdT1Ky!R{0!jbDIcYpXTDd;_3n%JsdD< zV7{i^hs1Qm_z7BU=8aSE^ONIR4dxO8`G6C^aORN{4!80F;795VGB6+;{M>B;iW-2w z4-h7!gKFg4dWZc=6F|l|ly?n=-lDDNUU}fCORy2=quJ)ourwY zptrg#pdzT=Yp49^m3X`9?6x5Cky|)zYEnVAhKh638W7`V~zh~S= zg7B)Stp6Pm$DN531iYG*#n**{oQ*19Y@3|&Ad?94Xu+tTKrSaR1(td)>68CO{a zy@Yq&YBae1-Y;i}m>l1?oqn^E=*+pml$icnlYsa{L6DmRI1P&*wd5j)Q?)!r5vD2O zY0KSmFE~|lma4f2#~&RfesgJxukxh%TYnV0bIVVHFuStLJDoS++ShKZ4DH*CG0TwL zA|Nebx_=)Pf=)p54rxE}5(F(z<>gyq=%sJD>MaI$;O@XcEzeofnHVPxM_z|`7{uJqd@$x$B4LKv_)ER zOjM%YBrCmXasywL9{HX+;ZpEmGCp|+ft+4kFam-UgMj7-$W>xuVggG_xPah*o`XYq zB1Pq=4!?-#O#NRP8?5O-)abbk5 z)#87jcGgScZ``A?9Mq!R5}kURssPKJLih4~2vRtJTyzAXVtnAfEyyz-#s>1U*`SHQ zPw^F%)3Kd0g9G!SKYyMBc;x%c4F4P0`tw3`$HCWNg2B*-=`O#aFY-eL7s5C> zh1k!Onu!}n-!E7O5jyH!UoQ&M%?WkQFqcO}$}Vw54&lu9ZMfzdal+9Xb}Tl4_>VBw zF^gTHJ)cn`M8?Q`&v-Y?R;y#S)OT8&N5X@w<6_^*ZPO$FK`O@oKt*~$NWs@a{2nm! z!wc4m`HbL#d3kw(K)n#znOCvUyl_)`*|4ZNTWix3$f1tG_tP}*)eF3%-+0_czh`ef z)!vPGcakmSeR>Y`K)`YP<4A$O=(zI|KD9%E`!WvumN%5{@c}LbAx}J^NY<#&3AsF5 zN&771#tPP(-IcU}TZRW@wAH|?aPR75MmmmZ)wNbPnIoG+f3Jm7!)G}Fk8KK8VS|3T zBdd_lq>U zso+aOBG;wtum4oRQ8Y9{Mk~5rF`j&1@79%)5gRo1B<8|H5j+}yO2;<3-+pzDq5w-} zWBN%OizlVZDFA``qpvOwQbAmWpy2Kx4!(q02>jm)M|7DyRwqWb|B@b#@S;!qWv~V= z%v2Ys>+0hBm5gAU})!(@cdw*zr(!$+^qh2D(rA~ zCmxl5+VA`S5i~0B8)95~WZX0VGp7zdVW>qRM0wfj-)hZev-jq{J9{_U?H9Vd_k8@H8&|AH{}P1Xx^ocK-fxo^=j5untt8Hg^H2euws<>VDRkCF2YQ#fiGIvItp@|>TN(Ae^m zpHx;$0}?5Nb{MOBO)OoK{zk8V`5?T^X(-u$#YwpmpDw5@F0FuhE+hK{6cXxjEv7?PoiZIy^1P>XGg!v;DI1wn#0em93ckS?29J8g zEt?z{tL!B$^WtUB{GLp8X3Pcf?Ckx|rMkVD)&9Y}b z4ot{9(LT$R|51iRB#G$IF;~eZ?_@GuqSX#Ny6t)0eTg39xFJX!(=Y5j6xg?b6rxiODukaN&Y)9nU4DS zPz$VNiUXNG`+?PFe5gXyzsY*$<~!TqU0rmfq;!a(sNJSzA(%(wos53Wlr&nVA$QNr zoALY3$R8AD3)$ZO^rIrPF80n*K&(sSbFwYFGu_Y+phNqkJ9Ej7jV(YA<$S!UqYo;L zfy;@k{F{3M%wXdNOD84)LC09RrwKyON1C@&<)+>)QFjrl3zubr+ z_?sOk<70kXV0t$om&{eD>(gQOm?(6ZF`cqq2NKlA#B5*LzW-yE)Upn;cuEWTV$RnM zRJOs-Z*Xd_Z~l;ud|vxO|H1bhi6n=5;7QCHpjNc;GN;U-trg#|XoD98;C^?Dwu!X0 zJE@u3TXbx#X!BeQv)ucMM+}}fY=1+X8;TWBc>(%&tn|5z!jS|5T3F;fA@7*6tQN!l zWm9$yz9k~vX!19X=3M!9M7_;)WVxkRM8@(!q%^c?t+72hpu4 zGS_~h#=$;(fD$Oekeg_(;L2dbWFbl!?DpI)fn~lDpkM>F@8HSogrLMz)yiO5MKm-P z`KgfEP|CTL?IIsjnyk1KiB)#^I$q#*MfmbAdpLdpbj4>8OJSd%eH}y;O+RjwJU6Cna1FG zlM&JRjJRF=f(m(6hMJ+&PVIH0DLS&|R{d>+`m?YP^P#t2WrzR}8iNyA{+$@o7D=`M z;J(m)s~?e^jk#uuZ=$0+fRR}rNHn(Qc^TycOHs^CZ=xb42_vp|?3#Ovg&gnUZ;84P z_7+a(u(!8X@wDb9CtF9_%HU6{&M&)qKfPn|^htBEk`_c_sbz-#6jdsa2Hws0$o(Iy zX2v(ks9^rzoMIS@E4GnAy4bTUNrHs)uSM)1sVYFJ=8+hIWo-Yse>46iqTqQ)M>-#h zfH$o-J`t1R8%n%#rul_QUTyR9J7El1%)ej_#x)@mY>9LCPt(g%L!svrCG%l<<3%FR zb2cs-^LT{?DxmF>WG@h5x*#)f%(VBa27~YFrk#q)3LiBy8=V!byT2czt zORYYuT%ntZ;y1WrF2_Los`T(Nr}19M$;mO!co%}jMzT1>jFkSUhS1X%hWHdHK0q&W z9q?=!PjD5Kc%T5Qg(Mn-_)laC3Qo&4r7Y8@?7z{L`ohojFqYUEt6u8dV=+AN(_qO4nW(xD1!on%y{re}N4B$yLO;p`ZBPAM`Bo7`) z8XBf@+dnfjqyb}IIaTBh;3PA^!Zlj&RgQcZt>|OPoKSd5#P6~8E(n$O$J-Ad1)OH- z*271_=`gFE(joQ}72iwfLrRw?Do6J&(#S<^1Pr}RGQhw7Tv?4}l;e7}`1BGuQVO`O zlT3Rq;K4937W(CAWu>H0#LgCp*>uWaph#U7q&t4`L9H5CmdN9)Tia?Sm~Y7&TV{u~X46$2ABW<`f!`kQb)MPc25hFsM$ zE`{+|8hB+XkBls+8BZ8CtCT1jy;N#(O#J=>vU-?cjbYp{r5DFGkf`xY;w4H+cO3N( z(}@#^hY0>EQ!|9_?7{3TmhmtCKn)8WOJmGkRU^cfTQems3Ns`FVs{05x|zGxe-B8h zbazs71^h^bAf?@=@V&(WOe(GlRxW8GwPSPa-%X8?ec{Kb7Le-^6oUasia9HW%9t5* z%wq?caLH2_p{%b_kX1UnQ7r2XC?=R0H&=u|bFnvxmi)Hp<%#GMJ|L`GDZY5UVuGR4 zonAmK2;*2|gAoJJV2JvALT6gPh~0Ek`c*tQF1k{5ksx+o?zh<}V5Dj{U4Iu0CZO2A zbr}R+1L4%d?g-G81JpR&G6~z&3-};?wIw_0Onhv)JC0+-z~{<_g1T<|4GPI#T5)bU zM4R?b#4rxvu zYf)^W5<;}N|!CY(j0@z>Wz{vcnlpHoc|B_9+1Of)8w3-^>a!(5I zfzdB-Chv!>;&M?7M#Smt%w;v+J?7nfM+{h9YZ+pFvTxx!6-=c0Z-m89W%U+cxP=IP z_)W<`cZ$*4w4h3!G!@(_yk(=i29`)|JTI7xEoqL!?9bz3+R5NWBy>pv)n#OsillB1M#0P8i(}ICe@N z>{oYMJ7srTkcJK<1yMD5r*P{Bj$3Ubabki5cKH}lmI)~|p3rLi2a%tu^EA<*36ZA# z?*wyhDoZ`*wSl4GGwEl6;TRAMWrz_Qq^JoWGpf|=Iu{I^yd~`68CO>luxHYCkC*_AP}Jw5upN(o=>VA zrgniUq}h!7LD!2&D;*jk)Zh1yGdXznd3_He3Af!@5Bhp)GlA}PV)O%j1>uP-Gu+n z32T!Et#{E4#F!xdToRTX-=*<7m zqEW?fV3{o6A%wDVw9~BHp(k&N=&+~5e`p8uK_rV&nXtZ3Va0rJ4Wtb~<>r8RhnUY$ z3qnkOiXaM}3wrODO#?FV^~Q@9-*l4aHTcU?#J|ZD;gL#QWN*31l1w_kRb1*B2e0Yh z`|ujPDKuZHWy9#Xoz|_v;?DhuIJ_S z)pYXY50k9>-tGW~uHJ|*qM&D3%c0<0FW9Y<1j78-X(FomxUE_122Gcz zR5?52`3sYaN#YzA=r7D4vQRQ?s5&7XMd1E3gaW1U27~cXK+r}KblwYr`0?ij7`R7q zbPyr=A3OGOyG=f1^HTbhFe#ZD7O9^iSo8->ow9^MLQqR-(?^Z7?!G$i29+2tOF>S* z*mSS2oH_fvh`8oa5tDXal!R{0)xC6gK(UxcmjLxZ|LR^&pYabXnTB&AT$5OqGe4io;rn$D%wzVQG`{)`YJe~c z`BPa&1_mxwMVp~KP-kEN>gn6Ks?fCZxuUD6MK&SH{ln;}rUr02I|!@Z{E z@+c2=xi>z|p`Nc@_ckR`t=^L-6oHOOof6#F{{W8iUA6wyL}OEzjlZ~G4)$M&QU6kI zQfrMXZwwP*-`Rren0$diIXNEgkt#jKp4^<_hc|atb()BuIZU7iq_hah%61PPopaRa zDxuJ~^lAkCUR7rCS$KRpbwYOugT}cj4yeFq18$mP#ILD0`FW)fs^!-FcI1VAeus_- zH+2avi2CzDb`18Vm)%b^@5u+R&7+Z1$V!rtqWF3Gof^4_u21>VUh4748FwKu*IzyU z@s{Y6-|=m;JGBW1M<_?d^qr4ht;E~hE}rvsLjmd5uKZNpr_iN4WR*ki&pP*=E)SV2 zA{uaviYN06i(+p#3J?{6R#*kxyoySo;~A!ewa(qnu7~>QyMU*8`xcwz&L?e4jr{2g zMIb@i1v`N0V6NJ2nh#Pw`!XBwq#BnMDH2)V>$4S4Aj<&2KYp@UJ$(lJ&KydQ5pnPr za&fb;NC9H~u*fhX@}rN>Q0Si~uwcgDWhsKszSPn;{Lu9xn1cs9t`yiz8ilV78gZqZ zg#Y>%3>u>tff?~#&i*Fyfl~YI(eGYkR`HOh z(gMeyQk!R`iA{(K$L`qV7Y&oG8XZ*`Q}@9jAvC9MoG}8}o~!b7jKqPbO>2}g3HPq z)5X*(^f7^$_$Gon0uG6T_BU`CwK7#vi`!~5wZ~+T9IYQo!1dYvX|EM(d$-CTZM^7A zzy-xn#zvRow(px+Su$Un8Mh=HwmFs@21O>$8=Pmp=-r?5{lK_ zPKGJ7c=B2B0%{N-O<#wbrTTx1Xlgt@lgMBMl4m+TFT4_Z@BFeJ2YY)QVL_AEip#u7Ses1UPX zLIYQMs~f7I-YNHT^XO(yE)GCaAq%|O5;zR<3-c3_h1_7SLNGM6g`o%P&YP#s%tB^!7D(-djnxX=xl!UYb0`x?&$*f{?Q8Kl6+!o~n&M*-A z=9Ob-h-o9RlxT+!*4yKCTw{xQDrg6CRAb=yMG zWsh!yu96Z}z0K0|sCSUS?>PRWF+}0w zmoU4#|IqaF;l3@ofSG{um(vNN-{~W!tFw}PeqK^yIjAToPA5|y3nNAWZQE0Iw^9Hz z3yTc3%qOQ{L+Nky^8s$drV~heP)*<7%|D~xumOd@L?IG!zcC4HUe~?6PsdO}1vN?J zdTl|U>yQ6+hLfHipG$`mdUfY$jYD!5^;uIIipw!H^u2y4Vq2Phr(1|R*c(@N^`|VC z<(AwS!7unFd)I#xCFjx$wdk?q8RK^}8eGqZ?odw3=xKa|VRB)5pWY2t zwW^JHe8-Y-bp}&N5<^^?#h-2R4IbG|C;}(cu&-6cGEnu(>20mSOqQC2j344T>^G4y zis}O>vpC{8gjJ^N;F)cTPFaOL33@%(vx#J%H`HL^g(-SVz;@R$B%J8D4!maDa)RVl zAdVtvFbrt1ud%i1AH4*50Ht)Zhu~WcX-AhBW0^=2UE=ke#5YY7;NhlQ&C1-Ycp^Nm1d#I99}4;m_29)6dh^-+nHUuvgnEQ%*+ttlD_? z_yd~{$vN{LX8qLz*z_^UVd+Sw*%%|s%)U5;Svgtizt$eDd+9#UzZ@R?QM9kon@=jH zzpADF**o$=Fq`s%C3J$gvW@1!Oa;ZqI;3=cOitk|*46Zm*_oO;!Hi{*%!|C0j`<@>%els{(=&qjkP}*eEZdDO^d3zqE^Y36 z5phQe_L3N%3p~y#*L6@SFZ+sfi5qQs2fos(3>}?2vErO=&^e`JvOGZT?1aYG*l<7_ z@VQol5E67ua4R_aEtT;i3PCMjRALwjgJMnWaD3+$Rkl=DPn^{1`lvvORi+4A<#)ym`DKtQqn{;RGQ zJh0~g)eMj*W$OG9zIDKGU4{R)=q)P-I~kxA+B1LC_0%8q2;X+{ytQEba0if#2n6Kg z$BzOo%ebHmV+2_HfI-YWNJgZTmESATrUGH%M`q%7v3*z>Q09IAVcEyTfseH{@xZ?G zA#2}4kJzovhAS|!Ty++nPJ2x0j~?Q9SAPaLS2H9 z+R7L$5_}ts0qwAN!^ueMV}QiV8yhS|m>mhJoZpRdPR=JiEcViJO6F8K%5VxD zxoJH2iaZY;?ERV!zMriuvWX5?Nl6m?G7HndCoi(acuJ&rA79&|W`6)Rqb8p{Fzm*J z?Ua~dPyRtixg)n^lS?`~N$?Y4xi)edM7e<@hX~B%BSkI4<-S)(3M@MqB%{Qb1}< z!N79F*JrDjmumit5Z3op5^ZxlnAg`_GBS)6BMrN@lO!3SQ<+WIbHX49{ur z#X<~A!P<$DeW@1f!-u6VE6Skm=SN2eBOM(iM)IIVOd#B$;fFI&f;djDXuWHgOvzMo<3OVaMX zjl<8cn9zhIqxl`kvpyJDFV5mM6V=?4#Gmhzb>+iU{%L;w2H=n89eiofS6Z8WH^C-<)hWoSlE zj~MJ@JG`T89I&QWofkI7h5kCf|N5~nv40S46)7@otKqU*@%rC~(D3-*uEbwfUab?- z|Bp8`^p&5yFU#7+wejr5ZELe{Z#eQm=f}cHmL7+=SKDPYS+uZlLJ$2v+1v-@|_ix0u9<6ozrZfgLplZ6hHtNj8w@R1rs&K2W|IQS_+4wH+ z?e$te!;V2NGF~PWv)YJ~N6$Dx(h7dH7iR9rOlNS$23!c>t`XsrTn2rRO;$tLIP{bH zrTIa+3yuh{jM`I1tR~=^XJ*#{6|%hU$2%c>y-nxq4?%1@{s9V{$CP&aqzT4898nBW zoiA^-PX82Na#a79JZDkCz@br7ohV{8RK|5JDT2d*a$$Z4gATd=-o531>BiGXN$%C8 z*?AbM-atMK7bbWGoI^Jbizlf?w~gqe`6JrFwcr*-}X4Y>(QV zuNr)r8Niq$BcXj|yvo`;x4Ad)Q``d|ZH43eCK;rmg%(|9rHJbj-HnFO`)q2dMv~BT zlXNajh~2rSsG_75+(wwgD9H_$sAB=+!G4`KY2PCMMWmK&P0#`s$}3Z%KNngv%cQ(H z6Ztz5<+8PvFl&UT#6cyNgX$=ljkAbn1(UmX+#yYn4y9#(IZ+`dz=rmiwlkQp1@jy2 z>Z@l22e0D=5*x|FRX$13PQs5+s4I#D!qx99XUbGk_Y9jhIuYGhSsC3H-{KpN>E;m= z+rKPVc@VHOSu?Ok@&G7kZp~m8+M_;}^){t;{mV>IM&n}hv19J2`H+=anwPXQm3a3R zQ3r!Jz4Z_F+>?{4Q?qVp_OW+(B0o>pXdwYa%1LP^U?DZZ0k|*X8&BOdwmneO96mIB zN9D;FOnq$I&GP4>Hh+c8oo?wMO^wbH530I%Ql;Iv3}HQ_$BcQVO8;bGIJ|?Qg#+Fu zWz9*pnv~fw%2a`krs_)+;9w9U+5zm;=JNeKZCYImgf)f;1}_Ts1^ll!6{w1EWt_NF zb@kr|4u?D{IB~-)F@Qm04!SN*Epp7MNrS9}JsBK|-zq><-#3l;1=2=;&PTSkdA}1D zZ!0tE$rFZrp&41v+xkrjw5f9D=GjUONoi@czzV5Y#B%vxg0p<$<3#@aFXv}Cn{u2? zqI@J%8Jq$=_4HL!yI9x1F;vg_J2Qx#w|Lpv$Aopy7ODq+Q|i*Fol;b&SOr6D z6W;F+hwPn3`1D_&JL!wOf(Ouwq2IhnAvCBI@>%lwNwEFS=lrC#&|sqVW>MKJl{Z83 z;y3~`zC1*mb|g|D$(;f^G8J~L6vEyWDR}DA#{V-H63Fty!~V_r&z9|v;tY>-DbdCF zU{gYTGSfX%0;+%D)Q%CaV$SAq{f)}7bdG9GW)~Ry8a~o=sGrP#&bupQK#c!oEDUIQ ztcHFEULKfZYHYQhkLXnuE>yx*c4U$1j~zDLsn_p9zMP{`;_FLHKzkRiQ>!xatO@Y5 z3?#0Ow+QFx3J_c?RJw;0uj{;zB|1JcY>N7#pZSkus7G>TE49TAX&=?yBbOe-C);>q z+h1dI7jNE`@ZF=;~|^orlXsGGC8&(1X*!f)rLZdm9GRa((0RV!y|dS zTgT^zIl2i8Fc1eJ=3nDfVHnoqEup4OI}(KRPNo-6o>})G%}3SyNvquRSW(}qX`mp~ zU=*tm*bjORl;+ZSflQn1Y9}Jg-x5w;FCzM&R((YLJdocVk7EcR-L%aM(M;)b6XaWQ zr1OGVg@*4$mr|Sq{)k$!-0iGH*JOj_F`-bKhfb;5KNYTp29eynWF1f--Nv(r7=4tGJVFN=K2mDNkFwOny(Yb7Dtjxh zk<}}u7*0wMwuy?#S9bAXva`K4>kphn^i-_ZU;36F;TEk4W1Un~z{0Kk>Rvr~Ro(;I zgFQ4aRZ5x*l5Djf&l@_fcrd-rn=km-QNMe<%06nlYUaJIo_?fv`Vo2c?S@9vzvh}t zrb{q_tR|guY@*(pKo0Z$-xTdWRB#qS=&!e61dc2DI~w+iAWV9z2}g*o?5Bm%Wyig)AUoR{XtVs~@z}+wl)rB|j%={I z*Uq4=7w2}32gISN=UsW7)J|zT`uC9MtVw zEsf?S(kmaAQUy5bzY{-@?#rJM9d5>({oXTl%AOD^k z5Ni?=n0j(pjx`z6RmAhV-o&j^md<_a4;rveg#bq&_H{xW;)o%0)dOy)C0>&dG4YqJ_k*0IG_cRKfM zXW+8j?aUqb%pVC0_Pn#_yS%Q(uPf>;vh9fM7TKwqSQ#!lxwsNE94WFr6Dc0i+pMmu zQ_p;&M8S)T&?%pQfbtTPiJp}9^uL45d6cCk8d)!a=zS;r519us`}b9r@Fw!_B7-8U zHA4#(d(^#JQ)}YF(s_H41=vOPCVBg_C$mkfLm7cStCq-vDKbjIF$B)lxf_>~+slVO z;u~UyviczoxV~k0n!iBx2NiGzG*(!ZI=(nEo}Hm|It;gZ&So%_+|RMgbd%f^8{d8L zs9>VIX2CYGx0icZekn?SdE=#6PyEL8TmXjM`;}Ztm z^5l8Hyua^{nOQTe#j5JA>gwuy&pl_Ky-(fCTjzjv8&U|=R|$2yOXtO3GPaUzg%_C4 zu_uLRukp-Aten@|SrHxHI6g_eyzK-#uHL$l%rwWPj^7e^U6Q-_8C6$vV3nr#f^4KK z8U&w^lav1%N;SR?INqMChq4>X(AV6Vv%k&x!QH~613QiNYR!6r8*4*LOH1kKB>%za zi|SQM?7z!FyqZS>XzM8Q>uqF1y`NwQSd-42Uhn_-Y%L7AK7pS!tP zH_Ha!UXYP}to9#Z6}W3@8=i}H<11#a=*@xMbh)Yx^{(rbHk5{k>q)Lfvo3ZmXgSjb zpwqeSm|YKs?sHg??`wATnG{dpuBQ-;CJwHWZXhl?mKr%_+6KA7(L6cdEN)Je=Qc29 zpj9n?H>3O~T)K1B2X21S{uA>Z*rcDBk#eN zPX8mR8n@UAsdheN9I;vqO`*1;TSl;!pUL^TtZna-&3)F$M<3HL87)f_cG~*_sjIol znZh=e?wKxn=3^^)OFn8Yx#){fHm{SDzCpH>$QiD{kMO zB{%#1E^r_c=N0qmtKN3!uYtDTNRk7;GLPlE9-h*qcD1*&6@CyZ>aC#dwBijcFyGs= z!v9u-&SYpqafpMLr`VqEQ#uk!QZ{I8o%M zy~EC8=Oc}x5KGewZgBYz&g1Ug=2AT^zq>mnp0fg$rb*_jGVcHJ-Bgua75<5c@^ezo zX7{%y3My{u-9`E?IO(1BCZAlnxragN*ili1d#a>CQ{=dvDWs9+u!>0UR$1b}7!!}C zrUn-C&&TI#%|=v@g)S@lbzDWKD>2Jl!x+!D6@Wc9EL_?NeeCU(cM@f#YRie@g0=ze zo@8uXagUfVAwUDSWy`ToJ8ZTcsg-Yxcs_T(z<&8HO*nbSRQ9SASh5An_87zK113n_ zbH`4_(g`TYzDT_Pyc@^qAgBpx9MQzFX@7A<{z;`Vo#B(Ut8LtsCeF@IR`$`sN?%ve z8|RDMY^Pm>;~6|}j3J&o;&jdj0fR!qo=}T#tK-ncA7r4SF*m6nZ<4 zN5=H#{qsA#md)!+(>yT$8tgh{d=6_ns1EoC6^l6^0HwP}8`olyZAf=5z_ZOuwlzC4 zsYESBe2aQZc8m^K_Pvj3Z&317P8Z?n+6%&|?)oI!)Pmz%PsfYZdP3S$%7ui1k5-t0 zI)E48>%;dltJrt~SX*#y^Tf>hT*%TO_A$D?8%hn>&M#qFM7Vq#3T@oV#L z&aSz+ZYxr1*Z{*hub}+^So2h^Jtdq$t4lInyIOg89cW7p%JegpK6oS(>r^cF8G)=lxQ*OYgY5!ZS*GoReg6gT0+~a_ZG}SqOOTIVwwjC zeXvTC+veq7uO#zGp5bFK0TOMuf|JEID1$_n)d5c{PUWn|aV{t;io21Nh#wOBfYQ3KdoUS0SE2AdSpeG27lnE2DiPr0y5!e-r z9wmFz<=Bz!ys(q8ss@ABRb?W9u&S}g&!pC9--Uc`)hA{|x<;Bq-tA^@;!Ecy)dd`H zuJP*B4=SpN#{btjKz+^$#Cim7(h^JF*BrrH>k?O2e=i6@->k?ns?!4S1=`#KA#JAGB4|b zx#e!h)5h0x#D}f@@KLDWB?EY1PF*TvmyQqXaW#>85(2y#u_3JhjjbRh|HYcieW`(1 zIcX~4%c5$Ywj5%a>u4CN#)nQo^+$|V*NT(hap^)p_oz zp15xGRJhgT)0`Hsr-!f6EkA$$p|mR9G9dkFbISxya)v!e*=JQ5P2vtuMY zm|)AF0KOzLQ4J=U$$>@A$HDb4T+7eq8&4C27BB;ZzG@s}e9MF2CZdj3oBiQ(Yvu5` zYP<&~zbkIlD5to5Cr26)I{We{8jh+vu`??bf5ip7e$ub>yf=>^05eSs_8ccVituXY z&<%$x4(P=*{kd$Z*9lp zBae*!6toBIx3yJCnqw(2-)Y-Ry7l@ETvSjXo`!fed3V|K!#WYfkLSGo6I- zB`hd(B_tXjU9*y%yndAEZav&}U@jFlLO!&G+RSo>kHNTDZppJ;Q{NNxUrA$I=?CmP zg>?^yayQ*1XgyBJ-kue~i)^zoaY|R{KG~kBi>&8&n2)o7oddlJ^x|aL6fsff_>WgR zP5H?2?PSgGERDCSUfn0Y!2S6%wSITA1vs`UE^}Du8rZtgJifGJnz?Za_;QTyyTkihUHu{UpU6lj`ElDRtJ@X_1O2HBu#q5siyH1 zot%XE2ve{bu|~IQj_D&G!Y}-O#J@UO%O!#Pxoj`<_m$pz%th`8+o=kW{N>>G10ka2 z+$Ca^0oj}7kUsY>Va5s5@_#nSetIp|C?~faQL585dO1v;WAmlDc}`qCKhSxDsh#@W za^1qOy$=Ai@v4>Y0>W)!$nY?@8(7G14G5|}yh%^VA?T(L9-NKjf?e@F>t`&J&%lq| z%I%1Nn4Dpe%>*DM0;ulLLmI&lgbb4#7oTv4IXKLI!` zmJrz$Uh+iSZK`#Yb_~WgbKv|*llm69I~podE<|y4x#5ZcA;X5hQBL%Lm-AyLO6*toQXT_NP(DCTJYNrDtGY8nR3Q84IRGT)Nw`qSZOjOsJvD;8~Zg?_)U|RmIi5WKi7DhE>@z6 zl!$MKlaIO|e9(q$0F%lr)71&k+r*Wh})e8%%l}*wtQL1Pw{H9=zCW?^Xc~u9q0inCrJ-v`s==qZeEy@m=Ba9T|(tCa+l>D(YLwkeapzKVUWW00v1s9tq-zjpaf>sb_ zV|#2%0)sdS`3f(zLKk`5dKI+{T1$#n!M9%!Yc_!^0etA{43{@4aGbIn*sEK(FDbvY z9!)g;YUi?QoBhc&F0HX9@mz^w-`S_G`nv$^U^)8(!19yCMDJgFnMgc)Ufm0Lq8HVO zlA_zbDnu>VJWJya=lzMes?{L_H@(65)!dFfLzz@7HHUQ@u|laALS02KaupkS8v`0U z`P-+X8jhsrwD3f$Wp|kETF9CcV{u2Jl4j(Og3t_p*K3x=VbOM8RYqeLj0>pl-cEYy_58q&ii!Wh)vj% z0O=)zvG^!$gN9(=k>i~H=r_xX9PQznKe^CT>*uVrJxncnwXIAlz=VY&NWefuUR~4g z9wfwxmJ-42v*W6=h%Jq^@AJ7ETy8P6iu$>23y_pSqdnW9!;eFvh-n6}!**yXR6Vm` zugDl=`Y`Lz!fNr$`9f{7)ML{jV8ujTg)n`96myIs-+>OD@HMJwy*>{64rzXJquz-S z$>%YLos8?-`iE@V5#kx5J1Ro@;^i##x&yK3Ai7vqJjG56cGF+$$P`y!K7vnj%ig$Z zOqK>~!%1K6@fv$SgMAd;Dcfe|Y3Nn;r*woHmovQ~70!k|P%WKS9HZvHd@*mNEmhoz zmoHtc_LP0$v8D+A|Ry3bJ2eVPC?L_ zGicW(0fTc1$U|Y~ctBqBgE3RT&l-E61lzy7|(W`3hUc2N$lA zQ>PR1)S+00xFz7Z{DvkL?z;dhPp98JZx0J5a%c@hW+2?vt$P-7l_h=t{Hr7CRDj^t zuVqNJ)fU{6;+qTAUco@&YPa+z(sIdeel?-s(qpbGlqSa`{j+70P|pV581t%s`KLiO zI(}8l5*_R+3pV$ACo{En;JBDfW_|x$J{L9pM+Q834tELFT`m-!%!=W`RE-m8SYS9? z_B|~%br#%beQ|lArlZhx7#cj6kX<<1SlKJ&wXY1}v-&d7RpO(>a>#ugpma?n%QNIw z6fl6jzVOER{?pjbs>Ba^jD+K3=Pvi`_qaHuwejEUC?||R^7Jl&C$bu; z-NcAfGxrsi4WCkfn&v;X7D*#C?rP$Vl!&2QGr^7gwKDGPbsGcsC^9l{UZ{9zKG-xF zHG8Jh@X5Qp52ZC&{1S2KE3S8;*qk+1!~)1^2CY#y0`qb{w9^&R z{5C(9G5&l3jSAfg$?4R?*RhU+g=>wkHo-BQVL(A-scE5neS)DGg3(>-awOF>Q9%o! zo-t12z2$`p{*|1(fZCyjtFK5V+YkF_TI4VoQ5y&LrlBMxAz{Io>zs?6WKA0k(5%Kz z9NWn9KpiGG`!D}HBbvS;9Ep1m!8XNS1#JR2MjRN4K)Rxq|B{esf}TlbCLM{8@apAV z7K^ky7~k{Vs$Jz~;4UB1xiMx!f-~y$`1L?QfzLwd2f@7>xa%XAPXWLqpF)QOum=x* z9J-yIUzB+a^a`YfFIsi->S86TW{H$G2;D)el+EXNnUgg{x(xb#ZK-5PLesrnX)V%> zB)?GMOGha~j_?vA0(x~esE$V&e-73DJ{N)5Fa$9?yz%=XXMaWk9ESs0P%&?duF@m| zG*x8mU{{E%To7*3Q#_7XAttHvX6^Fq;IEE0kvZXXPM{Ug1Ck(TI%`!F z&o|4jggrctShd5rRj!@p6;lwh+W4KmG(s6mEb+~`+>cII1eHZm11;uv#kCMchw~+v zp|vZ|A&$=8#pY=Id#c5vcQ_s?uo?0~-Y&?x(-V$h%PBRZhiFRP!?exTqou#VCNY;@ zn?hv`p7tm#gqL^&D0mpioVA@d49!rm01tgOdRmIgjdZd-Yphzou6{W|<-7!{g^N|G z;cxd@@g4VM@lqa!Rx{-<&Kn3^;>|pH8Y%DSg|bBIrrb!<7Q#HF7dX%mGodKMmOpVT zK^&7~8hZ7wYDX&C8itbUZhBpH`L$Y#Tc9to?EyEE17dE#u}@m$bGM7|n=Sqw7A#uM zAn_oiv-6c}oOJ-d4haV=V;ZYwkpudNgI_fnswNSX8)51gfOa*mnxW$GiJf z3ai2yU9*1nsb{`uw(>R!ep)||`ugm#UB6>vn$4)Nd%xK`*$3j@`G%8565GAa=37!zNu=^U9VMszJ-bAt_>} z6BXVgcR=(<i-g_U5MP4rr<@v^s1)Te2fGY;BpRDHOhS9i?}+JR**3 zK4neT@JGk{G~BiqftmT~AJ$-hv1IK)iu?e`D$aqN(!l~CiN?_h=#^uVP1ERa&FYBe zvQH`RxFP^`KJfI^5qbpeLx>=pbJo%^Ja(MT-~h!z8@)zB^`to%S$wRv)&c^SeVPou z#CZFoqhT`8ASFAOykke*6c%3$3`08WN@7~qxw8Y~arZrdi8RpG=_ukXC)71(&RuPE zHkomC+q-#5jqOQTUw?BCn|~Mi8VSHHaTw{_1y6 zjoCPbm2L(YvPvc3T%r`O5kHByGx6_RBc9G~Wo z=qb)2jRV=n2~6?PzUQ&!jsdo?r$wGNC3g{>l3>n`+SH^b8(B>5_KLS;_4J|OI3wX( z_%~?Hd6u#Oj~$MVyDpag1At!$5yxoSrM7I!B}%?!4T7}$4BQJh!iaD9EUkghdY&+M zwEe5sDBa_TgfnCeq{4EWNwa>wH~Tf&NxyZ54|}iq05&uhis-}vD1a47{Cjsix%n)9 z=eXF28>Hw7@a~Q5(E`A%vmksw-Vx7%>~pOEo4fS$g>C1I&gFnDOl`(8rM(~rLAC!$ zb|mm73PJ#?m+0rJiL?>$pXh25>D_;}RO06RI}|Q6+8f#1umiN9dIdT$=OxQcA@w$) zVDzp%yTrS9MM0|=DFR6jCLrh2e9|xW!DrD#C+=P7Ag*8ft9uu1QP;C_Jb3#j7OycK z=WU34#7zvKt^!+J8AWInpgm%(a+SkHv@MLS)v?|E8>9lwbcpAl%;FpfRuTZw?YuM~ z4)A$QqXUQCE`n_^T$)MgLV3-i8qtN%D?%NPeJVEVd#U3lN}ATfZBJEFx_yRhd_i~N zEavu_`OzbBAd2n-vEdVp`m<0Y`90f@ZA#w6Dk;dThdiIsWy4py1UEjQ1=lcqxOwOVXc`ws zJ2A!=&ou4`SOBQwF=@7rt?BmR;FPTd??q6m90~xWD71kgxXFGnQaO!H$*WgsVXrLm zD6xzk^00k%|H9L)O@+Ct^HLvQ@xk76+ta|TO*V(E%9YHL9)XGJkPrgzUa}0t)t7tB ze$lU4Y{#45t)T~z4CctZJr#62^IVu|Fu-@e{>AG?vU!ob99WOaHfJ@%%y^ct)-ds_ zaQ7Li8)>I*TkUl&_CVthZqo`;Lo-B{8AvdrsMg2s`IxmK^5Y;IMk7tfKmRyiq9c_)1-;G}_vAP^@OKjbOdhV004mN8UT+ZC4tH5v5 z(|zXyZiR&wdXx#Knrws~c~zrjWF}V-S%()$#=oUniR+_>5TXEr;Z8W|`mGZ=pFM+% z;Uky?sEPqbC&P&?+ADd#w9h>`cSkAt7&LCX+HV4`2AV{ybTm&18dxXPQF~--K2tF@ z$@nKpqWY-4Blk7%@D=vjYhFI=r?h;16||&*{!rqZ{YR0^V+(=bZbBW^ox#}H7S5=< z#@bP71ZvEw3GID$wA8WYtNo0K<9pqUgmD_Ok?dv;9?vGL= zrI7nBF-ty3IQBIl$yI&$unz=+J6lP;LEbkR?JxQjz}Q!(zuVD+i^O3{sJnf)Dl#os z9~?inne%_jfioIdl&bb}=8d;seYXk_=J>J?-+qpWrHL2tds z!3g2aQQS74N??G<>Urei4?K4 zM)m?U-HiuRR`zrP@2xwj(4g?#{fu{aKcl;z@17MPv?uYpj^Dle?_X~eA2y38Y-oGB z%4f}zzw_dpybN{zvXP`|CiI@9r_n^!`-ah1At9?uS&cWeTMAHCr*ZvNYzQiWdDZE) z2o7EKVy$#4i_;j#O*wDKI9R#FtZ%5mwUla&%d_XJQp+s(%=GT+2kiB+LQ;*w9tI*# zEU8SK)fTQnSOks-vuiEojT;|v8(@M%)vN#~9i;EskGhJ6Y)iAZz=chA@jO@y_C0=N z)>o(b=Bvp*SGOWotv%Vi=Sp>IJ`oJUvtqGRTt8ja+1-ui<%{OIv|j2om?FJ$C+nu& zb(+J>>};-FI&~N^sw%x@Mn*=7#hT30$3I+?^?&Q`pT)#E(hq&d&JP2V9h4X!e(HN$ zm=|5OCR)Xh36!Awa;E-V_`$)~R5Chg^6Sddg)4Wkwq|$A{L%sUXKbMQSmr@34-m6H zS(<-XOOeh=v5(RT>yF00b-=bVcIQdhEsZ7pPvmO@;jiq!Em%Q#b2R4WmZ||gk|Bn5 zYaicu2@V_hV{eNu{;Qi%6w>zWm$k*GY6{W7oMJe%iP$E|* z39Mc?c0i-*cW+AyXXk-{YstTgW7b*Kyx_h20^s1Q-xWdse2M&^h59ii+8$+z8oQ+t z_G4;+{P`}&&iO{9Fr-XBT*KbI4um3O+UsQCLY z;~8zkpDKm_Tv9&xH$p9=y^1f@`upU&ee?w&x^!i|*#fe1y8nI0)c-%yq1{YLw+ODz9(h>&1k>3&M@9*V#N<;)Uk7C=&^XJyq zv`I8>m&K#4(6eK^#u*AoUF@XF4%7Niga6rCX;XRx!BDk|lJyWWHfO2=Hr-w*H2*Q| z|C~P|7#H~as>SI;AgJW_*7{*y%m3MnE8!Yz_ij|U{K?s?2>PxpHUvN(y_4JWsb~`m z3H1%3{|=XbuWC5%J?UF;xghFrT^E;;@eIk$-Tjlhv1Fa#8PWhUlt_iP>crE#5=htyX;_+N64fIqCNSX}ky~W&@ORlD(v5UkGz4Cbw0$ zZy#F-tJB8g*_U|>F4qJ{M)FVAaiT+ZH;;DV-6-Cu-L0WDWBVM^1-&tP_DSIswEn9K z>_L?#_rLkaIX6ZHa%*}v$$xwNsAF5G3uP$a!R&^t61bUO^+d$Na?9zleb{y8d|Rnt zM~Crighoxan#F$`tR@Wu9{1H1F^k9cC(FhaqopTE9>Pa7(b+OItgKU1cs!bTb54f+ zPC&zV_nSo5rYk)LJCeO8)gievgc#PP!iZbeJ@I<4fO6gLF)Zt^91ROmwW6`RP4gTz z-n@QtNu3GN8*!>lmp-MnVrjrZn;kuMgMZH6x?0-q zWjXG;{^GR@62+9fPY%sepktFn39hKHWzcR&0ybR~6XC_!Xm3EaoknUS_fac2QMfhJ zq>^{TUf6TPnKb*`4C}2mC%RD>E>+KP1H;@im(7pp@b3BJv(I}5 zwn{fU6|zIjbzhu~YgigxO%5X!-0Z4jb&yq@#02>3Fi|`GWYPD$B=w?IFy6Zf{kT*j zulLAuW;hRJ;c@$c9~<%6sPWH{>qk0-AAmt2Cc~?}yh)MSO0^J1j%7p)Evkz`utysX zPrc06Sy(E}{c0d-D85>>^dP|at)y%ln#$UtcFNIllayv+F8q{BR%l0QtWL^g@q^6; zUY-+SwIWXy-YW_IpHH5~a$k+u>QMQFs2R3Lmf1D^JA{94<*N#TLChi>vskbgP^bZ^ zO}LR2K;_zs#qS%X1ZMnrFn^Sw=&(CyOyV#=l}&iJ9T-g7qP+FRl?=In-~pa{|zwlp1Jf=EP8Rl17a79 z^1`}>P9)tHU11kOwAe3_L)=>=#zRSzmuz3`6XE(*xVC#7Q%G^;ysj@}86!(c2G}r% zWVpkG%{8@4fR5sYn$t9%F0e|*29%u?C@F{02Y>ktbR;>=7 z2ds^`o5}mA9N9KxCqw6YoD7RNSttr{(1oJqwZJ=6xLPNSeVrL=Uy|v9K{ zk=J|7K5n@_ods{}w@*aK|h4}0JA7_MweOE2r@e`_kz3*DiJ_wu{P;By(M%|8zD0LqtHq=F*TF!FO! z^HmR=yxq~!FiQJS_vB2GYfdY$5Zg7uRrV=Kl+5-3o;aVwBZ23<2y{+Jem`7R>*bXX zh|{*{OA=!6$PE5t{0afThg^CP8bC@en??!sGxR@k6JJUoeaQ7e1IxB|Jn@;q)v zd178it)Mp73(HCocg~jDI`LjTnVF8m{xJ6zST$2%k2&kKzQ<^*R)4jrH=FfDFFlVm z@SqiVcs}6gf=<~)Io}-bTFEMd0Aw*}_;!(^dB$Dw_+*^a}=I+5f}s>$qEZq|!ad*T?_Qml^q-fm;5U6(>Ztp?4A(`IA*taA{ z&ysf$23os7+?Z-KCTGuOn3TLLJb;7U zrn9e^&XgQv$3@w=Q-tUsNkTeTzORZFciF@CawP2<(&;dBMD|E6-|aNLF4I$#Z_MkE zhP?X)3;SF<5jF~E8g}txCfenCvEj~)YLzhLn7B%5a`0MWP~?6U0kS;%M(wuwj(3JO#a=F| zK?D4A#_1MIJp}_W@5kdw*)qU!e3JyCE_!l@eTAEs7O10?t4D2 zDv}XTqLlHf=$@}d{wI!AD{jY63x*z=Asfe`X7NDjg?M0V*x>_i&4HLT=)!F9+O1$@ zkgvu9rlwf`^XE>_MzXNhyj@yW9(eF$DDltAx?<0tHkvmhS%tfoW_wT1*hVY?+R*?% z`HN*ZZUUG6i;=nQ0gD|gy-Npub2LN6?_*yk;<@af$)dQt>C$1icBq%0L@EObbkyYH zCh%O5xy@2A9)Og)rZ8SrVbE1y(BNjv7-%+YNz zbEW&fDOZ?lk}k&X50^F9%*NA{r2LLVRUcjM&|`1> zzM)6rGs-wWZuCWbn+(-HrTqyMAt5>M`I9UOkhcZ>$g(PR`E41wa$o&@rGDXwBRk|7 z6Z!hG+}1`M5qon~SH(1RUW2S;8qUW+1$BC#N&ngNH?$;mzt&rqUP+&mX{N~L1Y zUS9ipm1PHF;N^JTcYbf7)$7Ig(N|eK`+4mRxk4m_ivBGX3;}L-=tJV-=2F!}(JL}P zNn@O<(m?f9$?4}?J#HS;SB2B(pbLC{7S)gYU|(AO0*sK0Ryo2WOeQDd;PH zq=}SR<@!0+V|7Ax4Eit!ocOClsA{R*qR=fzt}hks!huC8hlj8a!bNGyftev!xOrB! z+4t5PY3uJO`*cPgCU8TYh>BzY%{N;vx_ym(D0I6TvBHg!q$3*Q z6T$h#Q;PKckDsl6M>YN#?tx;+bd_5J3WaWa7GrUu8uyZnRP4~N@cSTf-d(4AIp@4J zjNhUVsPF&sUCVsSTU*F23pH)<%c{G=C3RH6+0>ocx{tv0Wk}PNW&;3<4QuZ&A_NuH zdSbZY^eX`xE&y(GSeJ_PX%#hb=5n+OeM&d-=y!x1-)p@r`h~|;BxdmA>Ro_&!@C#> zl{3?9>B^Are6eq`haWk~@V=kVc$avqn?z0J`?)qZGz(oLaJ=;1y8aisoqvDRd{GIy@S=@ z-N+BFDdCPyf1Q5fC`Z5pY77QutXN~}bFjtdsk@;B)(pbz3U!ZWEq3p?@X5-|Rf8!8 zy^w98RGC%J+HfdiM!xEFfn5Vo`J%mx6Fr~Het+5?VHy6DjO zh|{)|&QSMr&XMzQcVB;3bX9oElzo5xH!x?td16S`2S&+n58OcU9)nF7nruT#3hhwh z@uz{}yGXhnCt2WCQdg>9uIgT#l5MFq9WzOOIDb*zpZ;Cc2>XyU;8(-o0-K!vPA1 zV{w-owMb6p%O{@@d7%*L`7(EOTFxc((IQ>)H?OkjxX1KnEWS9m5>m6;7JC(=z06*5 zT&vaXdfxss%{TOI@Nz!N37%?Vk*&=Y%IC=hOd6&#hMuFEZk7qf6|3WOeDUbZjbBfA zoV-f+utTW4T)_nhQbMXs^+Of>yIS z45E+(1ooGil>;Da1}D-2`*Tu4Q1)nwLi34YvGDEu4EvicADRZJ|$xtUs zNZjk7N$j0fEL6v%i_bTInK1NU#8I!mCAJV!%VH+|+4axVt{s89Z1FA+hT2Q^wJ{Um z3Vb3gZNA28`I^h_9QaCUY>^!wR@TELg9oCsH8RqpLTUmfi(~-%pSRd>-bR?i}REgsF3d zI8y!SWtBdUjOpr8SQDErPj)vs(cm}_;e0#+WFCUHs}KszJxkno3ecxC)y4Xq5wLUX z9!=#NtQz>6%c_*uRC&`o)ynpH(}Ne*rp#s@GlLQIDy5x0c66Q|&GDaqAl~_12a=C? zsXP8$fMhx5NW@p~yEBMC__ZJ-JI^8PUK>hIS-p20*KCE8<6;a_k7_+<@Zyl6PF~uM zM3_fZ&nnRGm?%8uk?z<=$#O56vqaBV<*5tjN+Qe0<@A~U`Ga(_I*Jz#G44BktXhU` zb(;P5qkT;|GD6S`SD1ye|A?eua;L2}^e@NzE<=$6+x$bZXdN<(^QK)rQg=XQ-&Bc1 z?eYF@;Eln-=mye}O9nr{C#hXZv`^cE#ASE~J43Qur?Q7K%3M!{%sfr}xqw7^ZA^~h z%h2enJMQFcMPHkUeXcH?^@kjO?aPLJ-Ez9Fto$OL%h0ox7YSi>ho>`BkEPu5_x0bN zoe^|LQ!Wod=h5h+YB@2hRU#Horir-f*0je9`OC!{-4cd(sU{VpS^OX6+2sucoUmAa zh|0YVJ2W?6?@4UxgbGkF(S>C}GU87oUl;PK8O+Ir8O}=OM%K)3a8#erEY$M^$_Sbr zI77edNcO(_((0Y@EHNWb=~cP&vZpzKlpmA`FK?)0&c+l9f$Vn z2%+C}v(L<=mmV}~fOSYPe=pk`+q3d_ej%$i*h)~sQ^X>-=lU?opm|nJsfEdhy*wQ=f<}pskZu8608g)!2l0A zbp-NPn#jLTGiUP2oJmWKKy1(|-AGzCn8g3b;Pdkdj97y!nStff%NwUcTgjwjNex})q)BET5_Sb&Tp6v71eQ-! zde`Fr3n^V3iL7Ve@m%2YWbFt$M>Q)-HnxCpQs2;l_a^{a-kvLuNEo3ephJ=y-KUBH z;_PX5V416|rP7oBF)kx1sGD@QM6F%!nR5`6FL6Cn1M5z6ZbM@gPYiwVPS_4-{DGJ> zxcsZnj~}GKT%m)LnwBv;=Qo`fwZi)v2NWmNM)TJ#&GB?8CnY+VA^kM96PVku>jkq)%ugLas^F&kV^V3oA7|9Kwx-$swLX)ioPx}}G>T|chEc?Gt{(mgS z{Ug)PKFtqB{M~SO`|=MFFu0yMT?H`AplzVLUv~*S9SuySA8>-$<=~R!#l<_OC*?;a zf);zH_cv8jF2%R(qy`R8PFh$QoLtYaKFxZ^=qGZrRp>gL>LD3wwww-sAuqh6Z$8jo zF{=@Ou%f`=;)2sa)N}GQEVLcH)9xzJX|eCYsss1QU%ygJEz{MA+lRg@;I{^tB@MLu zz4a68`?)m1CC>b>`}>MzvZwu)4-&cl_HcLBx?Gp}|3M9X_NO4~f4+(K{r?tgYbJrkI?t{ShY~o= z@KZf+c!8C6S+Pq0x8&O4AIqTD2F$4~CMk*hoRKjMSed58pa*B^*SRZdHMN02*l(0TcquvdO->P1iz61TrIntT=TC|@R!osWrzNi z+Vj$^R1Lua<96RWB9b1&V$b6zBeuFPF1S~z)jbUnO6hpm<$+ESO}tl_zOT&chZT|4 zo|IO>?ZEr&?fM?`l$m)Iy20mk3q*XMEk7)NurtfTTpyApvu#dqP)MPc`nPAH5oFRq%t|@Kuv)# z4*=<)Df{ybv0c~M+BCiX)l2KP#mywk&*K#4wPdE}x`TgAX0Vt+b{5qZ{3w49YT#M$ zPw4ZSJ|cv;XsLy-?03-mv2pC0!JHcVzpqMB?8_~gjl48jc{X=-Q{fKI&pt1(sMv7a z9A0jK*&WpD>fiDwx{`eWqV5Rv9a=N@x%Q#J+WMJb`U*SyBOu?Nj?Dug-H<;guG=U5 z3G3i_abBsO5lft>__F4^NFSz}=F@RaQr0`YwdYm?IEBrY^Y%?z~bT45nb|bv8?3z z`53s)H9nmdu>wy%puR`je8Kz zyqCxqY23K}ZpOhSzNiv0^g*1KLq{nR*};7}M7Z0rpNcSmQ z=nm2ga9_nVaKo-$SjJW-@ABKBlt&fhOD_n*5qfuwSBcrc{CY7gh&M`aqSya{{)$asF;vGt00Q*OxP)8#@JYiwssbD#J4M66+tD{=)A zk%{??L!xSXvC3-c2m{PMR$)7a1y`-4lm!9<-tLrf~R;aa}D7N&Rwpo z-?UNCkHcrXh8koTvnKL8h!44v0<;-6l@?0&3Eu)*>64ky580E`Hw2j3UGi3}1=x$m znO%sECrp-hKVqbf4+UrMUwc?S%|D)OCRjcddSZB9ka~qobLwVt;q0WBkGyhIsDJ7h z-1i0r@DkkQaKJgZE~3p<2&8=cJmgDi>&(vgIcVH$*!Qf*Hi#{}TtcriTX^2=+;yHP zUM2ooQwjK(XT+KI$u0sH*0E=lOAh@LJ-=oF;u6n>%AEu3&GLKTR8xJNWpXJ>?)R>H zB~yYa;AfBUJghhHvm1n%Cz4R)6UWD8D0gRc1zVz*sILu#OD9wJ|6=W}!=mb+zi~hX z1t|$>q@}w{MY@!d?(U@DXv{8rEtIjE#S_5Aak05oc`ba6bdk9b zDwmdKH@n6HDda&&r}UaL5t&OhE#24G?SAe2*wcb(`q8J(dN4_b)F7^_3$qmUPuQA+ zML$gA6TQtQmMw-*v4sJN@*8RX?ZX1~j(uq!cDnCRqIqhP<)RI`?1N3%)sE~l%J5;0 z5{#%ivCJ(*4c`%$I~q+s8{vM>A*kWOFXqEZzByC zuh#j3&hZyve}P5-Fak`Ki7a6~fjh~wfQJgSH1Wn4Jl~-7IQ`G42n69OV-&{c@1V7O zXg85+Q1pd0k-!+~r4#|PmtL1L&51;D&y-)#^WP1<7Ku|+ph%b%T1^H_!zwXWS1)m= z$yKCAL#}z7U;Ol0%;*ByR2J;#rI0I>;b-RFcIjT=z?~7=82x<1qWDCwHug_j_q3!g zP@rm%t}Anis+2==DCPtY2InMuvb(3Hax(e3OYlx)t6!-&Dx+GvQ5U^pv67VBVcVd` zgJBfWIp|wCh^Q1&Ochm7yyqABvLaH)k}~dYXcA0TMsC5_@Qv-zPt`JC!^auvtwuEy zqpUwy&nBI0O*n=?mq-hA3`Y`Ivi-0WUL@6(x5znPI30;^jKx$2M(dqqyuD zgO}YJ;^<&3g&yp*GRTz;g5>ra0&(@ZQopbR=So)6TA{%MdcWt|lreH1_~kZKee8rc z&H}-{KJH;z7$y$NJ7Hb6Y%Q1 z7EeIl%kN?@-ETI_Cc5l#mPxaZ$hMA+rwF_C9F7!<71mGf?2f!%C7p&>*_fnLue@I8 ztB$sygk7ex{MV!`Qr<%^smbL%%(=4fLC9a!ZV{4v%k568puSGgQ>kxs3}Kn(w><0T zC|JB|E~aSy=0<1=X$L zO%m5`eLky>z^mh^mZvwhLzQ4U>^WOr`B;YwRyCijeqqeo?C%C&6ZMFv=)5gHa8p>W zU=HQU-_C6^LwIfa&bJ_6h7x&yLpAzi0@0{~_{^Y-i>9upF2$6E^0s(!KMUle4=x@` zw;p@$3s+eu8eY0o52!GUX%co5<(3OyR?#Dvq(1AM+!ECj5#lL$S!PwdrZ%s_+-Z6n zu}Ts9)s zaeInEkcJbuX8fXk$5a>$fhj<7Q=~k2 zg`W+Xt<{6sW3ls-flsl8cWj=^w6ocz`VtohPj=cnR^%AL8JXEIqWs4g^{<9t@K>G3 z9h{J|c#U{n#GqEiU8VU1mJ5r8&cvZEo(VdD4KQM0kAOlux;Uxxh+OM+L|bHCD1;G{ zaLoIhdu{I~(D+iT^_<^CP(0j1AZqAmbF@}xxi_Z%lYz-{uS}rHkW2(^*cA0nM1_LJ z%JI!4+f0hZX1t$hckA`-9Ag_TAJOa9^DoW3)8zs0!U^pwULKnXtZtGAwY+BwwppVA zbfTP!)PMbi*sZ{O|3-=D;zWOwGsVud`KM4OPcZ&rEJ0h?*B5U*F0d*_2-4Zg;pfik z~)jiN=>Z}a?*_X>ULpTwoU|ghqNUTA9aPz@60h%?0o&lIWU`Y9J#!=oLPkS z>atvtUP&6H+PxVhl<{o1*hEu540ulx5>9bBLh5u*%w^+>Vm%W_$MpVefvoC|(J#@r z^%weFMeb`%vK#P{9WVHNKZV~-pFauDr)u0PcuEWX01ta$AbDu@8i>&&DTBqjV&mTIFkFb z)?Xl)uW<&Q_R(ZBj)A16s`g;1cOEq& zbL*wOKI1(J1Pcl+d#uU}fTAvDeSIn!9!f>JK1`J`3537#tAdNy{ zSRm~S-j^KD$Csb*q#P5h*3Ixcex@9?hX8_`}r#O-a0x6p-)+L?=`K!WdyTK zO6AL}jrn~$T&P(TrdUMxU-VI>k4U#;Y5=bqcko0 zpwq##)`?%WFJzSgxYL*lYxi=b4v8_-*QID7v_$of$Z5w=-f)nVeLaTjMNXP*CgKu* z&0tHA^hSjQ)?h)*KX5CN0nn|q*6iS`&E3Z~dRjo_*sT~*OO17Y>&|3WjB|%*B z248R$$BemykC^bDyk~xRC7TSP_l$3?>l3C{QjYTqMH5KXy<65Lb}UJ zLxQBPHKJI?sn9WVc~r*fM`z?d@B@ALUoDjljG)v@m2@2Qk)1EP#AW#GBRkaDb1(VX5+;vrGhV zWXCX|ptTR6b{`Ol8>p^%<$CIz5HhCny5sgo8ibv<|9#cg1vI<=%_Cj}^9f`3tEq>+~4_=b?VHHMnXPxqZE1+9>J8+Bcv|PUd<0I&ORQJ*#*qc7Udx zI=Grxb9rQKJdCU>R~;%r(21qF4qjK#jxxC_<2Ua1>0Wlt=e(HNgSqktf73e*qAr|0 z@`Y!SNh*O`8qS02{K2PPVD2QEEH)VpuNi)iTRIW#>C2K0c&CW*JD6je5a|#&RG0)l z@GV>urKDU6aLoik3iH%AeZBpW3R^03fdI1j4JnXiq9>)C8pe8Q7H_ zyCYAFR$hb{vD!L&VVBzIVlcY#p-sP~TP3y9A(4}hk8UGvbSsh^5Nbp3bF>+}CgZxs z%OtkFnpIH`Iz!6eBP2LILA8@W!Fz}It1GHL@65DeV@5Z}yDA=4E)+XLXD93GOr|0G z>A?-fos48qm}*{uV%Rem$NhR?Gt*gA>X_Qzz?u3)c=fg1Utv8^$3Kx*pqA|aicPLM zLQe}rD4c*e!}H_lQ{XH&xNm5==e4%ZfmqSYx_-Wt7HJE3cT~L)ujqJ9XF<{+LH>7p z{ci0p+EYk=T7dNZ9evSsKzu^$OwOZ76-Uqp`z2~W!q-~7+pY)|5kSi1omHn_KH(}? zQ%V_qFej{cxX7zY$X(4U&-`F9iQU5kHCmn+B3ytSagWL|dOxp;C4MNTcxj zby{LYdd7?ksA6V3eb_NMmG*KIj7p zXYvKULlrHF-l@l%0xrF_5etsj<%-jAnbeMzE<4Z2M0+2b#?;d~@dK`pT?OqPGB zJB=oJx=&n-H420Jm@A@YVf`_eV;-i->3~Qbnk9 zmvI=?uAHme?CGLfH-MZz_7bda=tu~9>A<$>e$&W7ryE$Xfp9ZdosZd%$djd|OFi$2 z@dFL4eaB4hnP*74nC}0HIbjrP;qImh-~*AY%+a1JxFp?T4U|eT7ke$8JS$ME2b(RJ zQ@iWX^UnNx{8@^Z`W?R1%Vp2X72!toX|#)3Yn6n-m~Z@L zlen}GIXZ^to?;M+LJy})Ul-*cp*#K9yzFWc_-O!LGVdioLf`xB?x{u#BZ4FRCLA(NCo1IGIEIc=G^!&aO*ryZ2es#x zBZmHTxJR-gPp=M67G7oE!dG6g_Bm0-Wx+bEjc@=w93ih%%I7hc@yjd_!0}vVa5NRUIk}ztjJ9@xQH)8{iFTlm#@F zZT)&8w0eB9YHk_-#;0M*r0{5H{p{RrS$LGqNl}ED3%!MPqf1C<*YMpD!7n5*vmZ@&MDJNtm#f$nUwF4iQorDjBEmf?%FTRtr5$D zDbFoGfv#3NCy(h&uHWHAAfMl%$85r4wp-c(18h(W5WZGfs?st zsDBrt={U$itPu8Hz2xEiq${(L5cC!5M`#4>cgj z$+7}+4@c_?<2L8y+>&oON*L|EsGxI^<@G)>-*>FWNs;zVJMIiqN5=D%ZTWHu;je(J zdHV0-u5_qyC2^ZG*=%_b?(W9xGE(efh+kKZkKtL1T?KKn`z4>5<7b)3%h7K!;=Rp! zAp&Vn#)yVz1p<3Or`FTIVvpvBzcFX*6-V#57IF-dt(;|C@j1*M!*bqh3Dka5OblB^ zT!TvS+od(rlrfBc+skNZD(1r2h5g*im-mj``vF!v5#Amz7c`A#f^_W~A7xj*Lbu)V z;2kKOM6U%UOkz44!^>XX_*S^zSygdhfEKr>u&X>g_{|PhLmy42PAe-9!Fyx`>pqEu z*b@9Zp~LrEc(w!@E28OZUCk~*>q3stbIxYP_wI~ex3<8@j)(?|mmKodEXM5!B7ISf zW~iUCGp1bMl(ua3V$K#d%4cZ%EcYomsQt)&k6%qMdQyHk^u(B~9lBNpUa< zB~wleeuYjtJ%HG{`$N3(VX6%X`|g%3?>Rl+Jyin{tM;iSxK2BgKwSL@Fh!bOR`E&hB{CVBU;=4D0rk- zF9_oOf*%} z(80>XABgX>n!3plrr2z57*>HVhToN%Xlg-w{Grdw`MVp_#OLa%@9IK^QlY6=J1Rd? z!OC&g05|r?-IB-Aa}Ak|~ zF*VlMnpFxk;TQ>D1BQG5ee{NnpxG^7{~Qs|<9H_G?V0w5V9aBvp`k!<1zHvggdINt zFdQGDFon@>8Fb6%$@8|{L-k=%ZO62Hg`tzn&f_2QaFkVgsa2OVN##1mwHkM5QDd&hAG)<}9EhO5^PSP|>+*7TVdCT*|MW`@&DUE!T|S^YN}dX-KM zJE$~{_QSyQqiGOD43qgvF+!Nx3+NHV9%*%6q9{Mv5#Rh|l>z^Rxrtt?5Iz!!OkWFvOS04;M2a$N>PP0M zd(|WtTWpf2WrkHIE_hnOKi5q#Y)98?L&m6{`ZLk6DdbN9GsP{^89K*=HlgkvlzC^> zT+2uDyJ5_AIn@_yUP00q`3S*1)rN&N?`V-8U8q@=JBMLIS<3qc{RdH0*BV&xLar`I zUiUeO&Mdm<2H5Hzvx)8wH=u6!zU-)xEtM|&*hmpT86Zk>Vfo2F43|Q3eZx49Cp;u$ zvYfR~WrY&BAI6=b7rlJ2Y->XWl@~)3Fx|&=92T4NDQGQrA+n8cKkLyLRsO-*NTA5Y zneCbE8KGItx`M3E-|F!6X?D$+ZuVX?_zjdk7T=z+$n;ym&s?AJBN`L>_I_^Kl;K%r zB{3l|2^02Uw9Z#xOJv(HW$`OErZaF;ADp8mZFAAdJDgTHW!FbY-rVI>qBT#YJ!^=j z$}f?|kB4FxPwC&*`yikrEPk2v;u>Jdi6tbKSl2xA2XAQ=Irl_LBVyE-n&`aXr%4R) zHj`FxRcfQ$LaMk@zyYguRB5^ZF?_|!19OSlbgl76ix?TEA9^2g*f73_)k|3x=H5L6 zUEqDKOP98kVIaoL6@<--D=80tA0Fmk^}KyPFfC*@k?ch~h>`xS_qdj*f}&1DSaUQ_ zvi4H01%1({uPTVs5Qh~yH7MwcHy2hV0t$t}lZqgGD>5KP-}%p%!6q8epL`<{PL#rD zs)io5vd2#aA2o}Rl$UOGA}qO~EUM|v7vYnQW68yi7X36p>DGpMx6^l(_?t~n2}S=G z)87A6T1}8~qjDUZVB)@mmv~}&ZBEo`Xbu(S^S_9#{wSVQ{ze);6=#Y-LV2tgpK_IT zwmz}plShyzufgl{LUurpPvi<}E^vOST$yQ7pEU^@vOb>{djDYlW#t{~5Z6qf{7fpD zoo3lI(BAL+j5+&G=1hiQ8h5U#urCpOHqEq_H`lZ>dwgjNn97-UdUWNxK0_OWe3F(H zwQ`!rwSG$aS8bPz!k5 z)q{Kir;O^MykO88G2OH<3Xq}@kL z@vA2eQn&nwa~~9ku8*8Nb!KC^Q}rQcd9dzBjLLU&Iq!s zw^uCl4y=3TMsS%u*&eM?B+hi>;XZ5k_PJ`j z0aLnlVVRGM8G(`RO~?RQJHgCE`JU`4CTZbtU_IFED1iKx+O7&K-WJqqRgr09E6uKE z{HeJyx{fiKs6sEu5f398|EYF)xaxx~Fxl0dOcBvCS-1(D+57QKBkEEytHaXwhkW;? z1wd(T#0;g0LOjZ5+<}2n+^p@}k%n9Aon;B*gqs9XX`eAZ&L(VWJ6_5qy~G1}2BgmW zQKI#aH%h{Gi~UG9fgu1<$D}YFVrqo?3WK;sxH}?EmH(*uLY=Hk zYWZ#?^yT_BrZL-+7tOf(ICyukQSf)UM{q;^w2IX}qf>Qozm7$O;A&U++0;aOZ_zWW zHv?CoC&~mJHm_^4g(G3Ou43zL;P=9e*kE(cafj0OLrlqI0@Gq`gBF;u*(>;_o5yZZ zN7@jA)qZw&c^Ap9OK4^wkOrluWXjN)vBVV>dLL(@9H+EiUy5XfTF3L}Eqkf$yq5b| z$j$II!1j73C0y}P7P$?QQ3l!%aPRjMQOU-p^5GG^g{|f}#v54kMo)|U)Gm2oF0@E@ zbn0suaIw`skf|rWsaKI#pmED5cNmRB@Z1Gv3!V|FAxX}man(9MG1%RG7>B8u=MhT7 z@AEtyd5V@MorF^-#cDE7r=jWeE{gi1!ysyVu5ZPqNL7}R)sr0y$6?Lu@Bv@y znCswyQBGeHTIVfmWaL%!uAayeps4u~@ABos`#^@}m{ga{Q6``g)s*Bl^B(H>XRSo7 z!UJm?*m?J(BNgg3=^B<(XcpH&k*!YI>n3>g&*hYG>qhNZv%L~i+k>y&{)rYbX#?Ml z#tpdY2jW>oR0}p%q!W=uq^-t^-pco-2<-BxGD9k?$(`!Q{QJ3}Ak*=pSMw{f9kh7% zx6W{jxQzA)ll+i@UPOk~qtMK|YJ?XzxPv|!^6|FZsWXjVs`-ZoGju|ER9WI2V5((E zpX!-e^ill*tNm+eSAK4s%_Gr9Jd(?__!sTaAm2ElGIv~K8_HUEZlNR)Ld0liz4xw7 z{Gu=1i^b~X>)Lyi_&W%m(pT~LxFE)JGe;=5EDMVi0sJP#rk+ZpBSNY_w$~&GswKRl z#BB#1W#ZPxvHYeq%`q0vtLm`lTpxqNy*ZJ8kfF2gVnzk^i4f~A94$}v=n`L}qf{!4 z${n(BLdpcv9DMY#tD*!rDDJ8S2o>~`t^B$qzR&cw9KxcNBXW*;eoCIHm_&JFcydTNDW6Zrz#R+h4YF@iLGD zv97PUccUCK__`w=rFK*wtcJN;#yr5pKaMp)6|1sUpVY=~JI(W2ur<6IcS0$JeaNe` z59F+a!a1^%`&2%M@;Ys(b#tABIv?Z)d%j-Ni%lybE??N`GL|b=u(zbuNy@6&s7)NK zu1oKVz=UAWerBi;+j<8rrv)r3L4<`Sjw3-Ef$huUGJFCt%+T?7Qa%yT3|zZAAP>9z z()c}_@}sCm3QVYB8cVkV01(B1>}Q*Dy*4_wfu#A5B936Ri?qLDvp|#}_IvhcK?7jN zbLUZE$S=P`Lxn+|d2Q4zEPX;YJ>rW#e1j2Ou73W7z^nw##2T_==Rt$s!b)Q#ZIQw6 z&KlGc#c$_=x`t1MW++%L(l^>xNQ`P9=pF+doFc&^u#_Z0ks~L8f=3y?YC+ukO1U+3 zpOQ3m*?hm}>rnDEd|bN!kp*T1It8fMH-&!gn@P)~M_)~+BPug~v!gUac z2Jrn)>wJZZ;jTeb)Oe1cKrAUc@`;_%_DjF@w*QV~@v9KsZG7b@JMkAhJ`ENx_3E>^jTU`@lvfnZ;esXp4c7k?i`-*R74Rm%4EbMZl{WY z&K(pDvgcpgYX9^zNK(e%MnCVJETPCB8-`7fTMKz`U1p6cYHIx)8x#t3V413I0a}@? z$f=B$Ic*adTeH*`qfwjHy|2upQ{5H-5{+??(tAc>5o$pJzsdnnv(R`EW%xtN(vl~2 z7teg&re&=NfRn!nKYTW%A#zjYsS*_Mop+!uut+YQVJ8CemiZQjs-;i;?}NDFM&?H+Jd&{9u31C&;i(AdCT8=%wgvJeXO)ptUC49g=$<# zedd3C{f}GxKGFHVbwK+6#`*n!Z_t#W-Wi711A(vuPRu_CeE)l;<2UsRzY2|xsNW<4 zLozZlV9qch_|IjrbxTdvaC37b0E=(`rd83Xm88+F4eGJ|k8guywY;jf%urZanvQq|v~{Y|Z}CiGkb7 zgSg@CU+=Cke6%@H)_$-=_wVLLyv0l1ib^d$qzr1sKnJ^uoO?2MT|l&=&a-E6s@}kk z{e5(3J5y0m5Rzy8=wgW#`n?Ou`^U#$eQth`2&et0{oUVJu>d^v>gLk<;P{x!C3HFa z_t(n3`bfSuXcm+1^%M5r@gx6{jdm#ok+zE?LSPC9&;o|!H!)kg&;p78%mU+gKa8mO zm+FTLx*tA0I0)skAp*_{lDQA_g6I_$6>XcUpMXG;s-OP6Y}=Q=e$j=53-*@O@(erC zD^dRrC-wo$j7@OP8$~YKndM7HAt>1WXCJw@U*W*cFAR!C+h3p4BR#kaN={A&g-A93 zR$@gzq0sngyOy?=!yyEOyJP9MuT>I(ksIY!6C%K}{fiVI>p&wY7#t8_?6NZ@3G_X# zyE)ZT1&M{_$_4WRX`dzhXM+*cMuXMZ*e(xiW8P9mkY32#my_4Y%TPdoRdRTM`glLb z{Ya~)zu#~TB1|IWma@EzlP>70Yw&k?8CdrEQe$A>cj4}F@rw5Q^9C-va4}O;`~mRX zn^zyRKy^~tzY7>ll+W3Xu2i1`d7`{67EXP8pu>_rhH$z8mnxr7TQKc7JDayPLXH;09QCGsza{+X_6o2ARGnSyw$+hyqIXePLyeYA+ckbPM`cE9I z_7{801u$x<9H@S0WB!&`fUepS7sxB)J(W;~|C^C(OJPRfjl>r#4aHK{f;uNhw#!b^ z`weuP>h!DfAy<_ckud#%x$Yk-eOAJ>drAOLVa$%Kf2IlafB5L3%12^pDF`3xT&H2ull8GVo8W+Zl?F#W!B;8a3#s{gak+*dal;l^0Asf6o$ z1|d<6)EeVQ?~U<7;=J-en-^37fa;2b6?PCA(V&BS$@ADkng9${e`O0Wv7U%Vx{|ZEyxHj_k`o zob&nfKML_bkEC>S@n_4!6spu9_KkdK;^~xpgD{}hlKPne$tK4v;N?6{K&S{!wn6z* z4(>mTtGN-(+mHN|M{U5of5BD(gB6GrQEYgP{bU>zu+lV!LM`UodtAa2-^fib4$=QS zL)11sE>!+_&&~Mouj-Tg9|h`?7WiTvKJ6Z>uK!94T18U>P=6k3uO4Msbg>8u2d$uo zYd>MOT&KL}qg{l_6az80(_9=98E%=ZLjvy~c4Twl%mPU^lgl`G?#7S4 zE`xgr`S`@J6`&MPl{f|s(=k-ga(#T?+?A-kg4;$R3E-gMwjdc&n`=4c+L$OHdkauM zTQ2{Yz4@O-|EG&wcu3t_pw$adhGb!VKaKLAgI=;!-8b#uMt$kK@;$--U&pe<|4UcG z|DSDg&;QO<=tF0qTYFYeVDU9S-|^N9Swll(d0876wfN7^#iox3G|9){V3e^!_r;YJ z@qx5im16ZaJ~>;d55=MbY21CK-LbJ$lE7d^pj8cEz#W_ckbyu*Nci<@`ttdK^7-X> zzFG+pP+uPyhR3+Lx@t=D7s2(nMxfQHcL+>RCt=a9VX-h&G$2ubqEN^mePtW|>+>-hDwyEVrsli{vO@A*ueJ$`5F#44D z=xPrHbUPGRs%a-am^&Oam~$9~?M66X^W?c;QV7lReMV^M|6=w2)a*U{g`FLfe}NkMv&N>Tx{FmXpI6;C-r^MrwXlUqqX5h; zv58&xWZxiiP7Da%9rGPiuUnCgoO5|u>C6?|$@3+3VvJKWP1A!)khKU2GUsB;O4cLW z?n!3`b75c{6RU_wY#MhHV2%G+LR<4{tBKEmK>{`pfJzvNhHmX&w*r8UUsf&GbamMv z_0o^s7tuSg*B223ITVBaeGM%YuEgDwY}n zv&JeV#KyJ(@XG>L{^?(EW;qC2ZtwuWAq5-CU*7?${k?IJ48fhY8&hpzSIqu1MIEKp zYYs-cu}Ep~hR2>xS1jNpGSIA0%Y%7-&fHvHng1dE*dT6T+tYY#-pce!8zoDTO>B_X zKpIUx6fA+dbdSOaCVFP5b_#79PZ0K7tu8*G0b<$(m}d}xa)3>=_}8k}8;q6e!~^&+ zHs0|UjK**cFvPeM?5mg+C5G(bS^N^` zTA;S;wYkC{6qF{imX<`#%_skv8vEB`cLV|Q20SY*FVE=`3aeMx`@VuqCMWxN;h>8> zifcL5y-x|MTXjrv4DuUb)mBBBX4cEyZC z{IUv)?SsP)Kx5QW&y9@@py_lw>`#mC&|aikgbciLkG5?yP|o!xaWj28gNv337TVwN zahTU1(Z9ME5@r1_vPfvtDO1AfT}N-8V6dI0-f)DMqCGf|-nqShgV>@wZA*Dj&TlE+ zA3WFRfvF9!Sx*nAlLCV%VYBnQ*G+qoxC8&d%d@UKpX%L0i> z?y0JtoUmg_{D#HK5Wz$-%PtcZJ@zOjPx#E|ynI3VO_i_CA5qS32K;B4g%3&{cD9I( z&CGC!ujqiTnMD<{y@_zWi2p&rY1U=5OUc8k0Q*r7D#0vCOtf<5-|-Z4BlFgD z9@S(T&Hs!a_2ACT*2^-rTNGc~FDf+b3^O({xp!0&JXRtvdz1E7J?E5B-8rK?y@F4DuvO)C`>^wFzt)Ayto?ej zhEqmWs)YZW3&ryI0=2ijk5y;u*x!oZ$aF`&2Db8_qaG5W0Sek69x09{|1l6B{Ge!P zA+Hy%*}~ymSiiJuS}T+4bb*>K;F~%Zt!I3t_xwVHC;p_xMEy$A^~7|_sCs+6KJA{V z@$P#saW28^%K$?~@Z!tH_m2ZpZacCUOU>SW+wWqnTo>428|B>+J%NpJT%Dd}B+~I?~LfrPf5=hH#5yVDh#jN*uPU-uFIh23(+6&_& z&>{C?5bA8c@nMp0bmc#%-|uo3wCRmp0|fID=wJZ|Ve=K}w(^uaWi+^S#thJCb^pNt z|NSdPVa=c3c|)FuMe2Lsa(9wrBv|osjO9Zc`p0Q6h6CxADQm(FG4RLUx7~Wnx0uQ> z2X*B%sSRbfB>{Ubp@7mEvGZ)lm&D^!YB=@b6;{bdS+9fLi#*A1HPjft0dBn*K#fow z@VFgq9?ChC$QZi9F`*@tNTi0lOZQz&V)}|4&xi5=J-7bw|!sHqLD!1;l`WAAr38Jg8 zw%j$=du#jq5U&8%F*=BJ?KrUS7_(4flt6FSRR!MVVbua+*mxI*4fp=DO_j!NXFcGGh3D)<$N+RmkvjP&j zE}nK>Oq0pP<9rR#xn*a0pfWa$q?fHAyp`po>MJ>!&XH;{@etrHWY9$&$`I>zP2q% zH+%|R#B(H} zA87K*b)r+b@SxR9>Y8S?kt(!fm(A-MyB`Yb3VuCOFxp9?z&IelG>&Mcks2 zk2zgep6K=Gfem)77WCJzih1tfw}HMR{X=_1-Kkf;T@%Uf2Rj4sN`N+Gdp^^J7rwSF zk>{nK>brsk73uS431_5fkq~x~=9xenksh<2p zxk9MFb6HrT0B>NU|?BDb=`Gc0C@|0k=%hoEE8dX?Ra{-hEgm0VJ7f zlPa*#896>a)_z!%$hZdWZ;O!NI<4Ka92?R8HE&Fm%CjSzb(+5l?X%G=twVTC;U&n!tz&~89X_6`dBrw)A{U`#R(VDI_OKl#8CndJY z`~$xyva9<0`lE$VT3dEG1MvYX1f*Z7qLQWQ)zNN=QvC_t$Di=~X-QFHcO9^p)?*w| z4aO$91LGzf#(qZa83_Z{9gY2 z0Z}>XLXlfb)1Rw0E4x5;)3JjlJQH{Eqe^Ota{RuX-(jzWnEfiBm!tIPCg3{36qUq_ zurHQ1izB1GEPj2+{n?fR@dt*moa^T9>!n<#h9Q}Pb7%B$CVoFpkD>as>^bWVXpkjg zXI-=EC8XL@o>W65r7H;{NLOy_KzxN4#y}VDUnButsF{_!!`nKl^>!eB5jju>SFEIK z4`Jv!a@~hk^w<2-BJpbA6`M$TcHq(y{2nJ=jm6^R9p=`S*U^-o%w7H8(Q0}WwVi?a zLp-;29!1-u0^@C#R30CItg`KvI`0qN`*Kew7237uh1zT*`ZI4`#@%FgX~S|u_aneC;Y># z{>%Z>i|_l$JN| zt5>>nLw_F9=vg!8(X2aDBri)qCFMQrP;FkW1jPhlF~n*4H_7LQqEFtwu%N0=w5u!b zVX;7Be%DzT5@gJ)iS?*@q40gfoT#a(>uP`MWTRGvTBEclSG5e8X~*xMv{4#CXHIeR+6D?jx!iS$GPE8 z9c8_-TI1)MA8?{({S-tPL8~!3N`{v2$9lt>lq_hLVW+A+=^(W6+sW4yb@l?L0hQ;2 zZj;~T#s7jQln$Fx@7#HLt$Ni#BQMUef)yX6I8o$TmRJ?n6HJ8uQc)bs=q!Zx&av+L zpkUs~%dxvvT@M`wo4;gt^A8Ducy5Rf28c$9Hb54|JjT_OlW8k3wJP3em*RBmMU|Zd zZv?__Cgv8hb9v`EN}L1xY+pgT=Cap*@o8zFue%GK8hOu)G1lBFO_T*HKc5MbQ6#ke zu`XlGGWT)rrW&oAjI~2fgRM>6qRy(1)9p%~*s_KFc|6Mx#KcUFekUvx1cW`$4-{t8 z4KipLciB#ahmaadm0NMSf?r)2J1G}vR5}rS$MA!Xd@@+AeXNqVu9JMhf|P6zUDT1C z8`0)!&5R^m9=Wt2A|z8fW_VmLX_ZU{LV?03@$(vZsM90|-E7d8Zo%>fDPLQ0Bp?G+U)vVTf~G_3y$ub5rUsUHRPi*_m1>(9vqQU#&bhX2jJA2ydSm zA?dFC(Mb2#f`2(rciW;uXyyKZA-*3JWz$D&*QNvaXBEXn$m$@s>|PSNeo$2CCx+je zy%L-x`c^Eojri?bu5Itt%5i2nI2X4(3EtQ)%0LM-3|)kO!C1>or?$&l~QjP{95O_VlK5A2ikXy|s1@ zsnwup3tPf|b2b{E`WZ>R0NM2Tj0 z-MsI$uttKV8Hk{4Be#37riBOJ){*jmkncY1j-H>ipO@(9RNi~LGmEjUzFUR$bs^2F z1N4`_{gw;Mt|i||_OJlte_VfF`Fs%{fwlQIn{D>TN+gcrEx8XO0&j%mw^IgqsA8Kk zI7$@0k6B!}`NB^53=Y(vgo$1EHW5x7Q~U+26~nl;g`=k=4thyDh@*cpnMgMKk)g&WVa)44a330$}rV-DBrUSgN)PDfK1)3H<#%asfluQk0qgYhOjSo0m9 z!js_5jEU&>+9o7fGllk_n__O=d>R{h64TNM&%2>I|Af^EwS7VlQ_o8rL+uRSpw*NU z0ily_YCT((k&}tM-Ww&h>|-+kOq-iF zb-R(qPwNT+-Qe`Sjj1Q_7F2%FiEqwY)pWv&IlfuqCBnd61#WZ(!bdJ9->>L{%_Dfg zplIjpwIK|Z9|>v#7$S{N6Hz)$8pCS`&3)%S5-NCV{SzUTRTj-{r1rUp^Z_X$O+GYu zs;uc_ej&z{K+yOaP%lKA9o#>B9 z5WJe7PEX7rAh_AykjiY~k%u}`_kl>1wFad0WeczzL{#12uNt|5= z>96hlE!MiSwO~!L81x6W6rUv0rS%*F8^+vy@3MxexTqIneihLpaLSa6?`qA?CJx{RxhpcG+%C<%GiNg6^6QB0wNK&0a zV?kfyP+B-BBZcMDe+?>n-+bi9e1g(V1%!-my$nHgR-QSvM zn=e8_UWy1NfwlZ&&2^X0mVd&NSw4j3ucy2X1ghFzFio&lQwwuA}pbyC&Sn3WN9JpFw?V~$?ls$Y9D zqFRrGrESfd;rdKRuL-9;*Npsct9LZ{!LIRPRvp6mT=HzYY`zFC9bHoKBXpZ@e1SNI z9+B3~udUsea+S#!ef2yrv+7>`03>Sm5&FP4lORv!=I^XP?QP40d z{7zM(;qSx_&ClHDzDO62w@(oEdzxFq<8hXi_d}S?Lc}JiQ}o0ovj%G#68S7HVno-n z>^C}pT}3G5Ogu_GlgHROIu2Vx(JO!C{^<2`ZQ={D6x@AWD%SNNSMGO-E3YqWH0zY9 zpf_WaFD2<4i_B#2qJafr_;lhdt8eYr04x=Fo;w06`?|TD<-PIrsB>E*>j)Re4!8Zq z+S`%;!_`{{L=}B|-zW+yEeMiBNQ0C}gNTIEqBKJbNOy;Vbl1?G(ls_fF?|sid=WsZ1_UyCQ+IxN1XPpVTXQp^0ER1iwH9QuUYY`yicFdK;x2U zDN^2JVa)6EK6fl+M4B0Vo>@VPw|#SbfpNTaAs$9qLBY;M&h5iTiT80G^7H3UTs4y~ zU%qtuj*TfQ8x2vOyZ~qU*fI?|Kf)(3kzZeghb;aKq$h@1mmQ}Ber@Q^3z-HQ+c@W< zztRQ^lOG+ZjLMU(1OleZ+QUoAyYrOA{**z!HQi-BL1j_bA^UjHZ&~Nrjl?T5T|>`t z|Fx-pTy~q$EOlVz)Vz@$(z;yI^zoEOmc6*|YmU9rezDU|H-@eSTz5wt>W<=Z&I0qR4J_!}gy_CE($# zl&dl!GcjKB8*JN8k695f$DM~x4$X&>BKQkP1)`PY@tr#LPb~g9{kM_-XP-mowDH}zs^)mm4x?{4=q~WQ{G!K%;fv?obrNcP zweuIH2u_8GD{H*dXZ#iJFOGAI*b*2YwAm)lUD|D5FFe0rA<5H`mdbl8>0g|H*W6)< zL&fvVEp+|w&c{2jy4%9P|9O`Gd7^m4`YA3%8K|hw>uD-{I~py%#% z(B)Pn-{selVml4iv75d(UKWeeMqhL21WJDkP<__>ed8`3ui+Xfiz*T55E-KuTciJp zL#3*{^csVaTN?Mp?xz{r^0@yAi60L7L(s!GOv3k~20dU%FpeeeARA4Cb5+L^0+p~` z*9r89SGu^}XxUYV0qEA8Rwc&KXTYMjZ%M_ku*yrksP8xKMKBB!;9qZ0&6%cQl<%x` zqup0G$HkSsmg8~d9&DZF2`+GE+o*57JTxm6}CF^s!CtN5eu_k0!8 z^C{BkYZKb9lA4&%4$zLca<=7dt6$-Kjt)p6{=r$u6FbS;8s@fQmA?Q?I#^Dufi0{9 zc0^|<>|gVl`2eXD8HPLjeLK>G>O*t?KVZX-sM8tJN3^mDVf&ju?Xvsnhr2Z2 z&Uzbw#HJ+W&5!pKpOg|)QYgAel4E0Ik5^9}r{Z3>7&5%PF`#ZS9Aa~mqTtRcd=k}N z`}VnP2jv0(7XdcYdSm53*i%E=RX@s;f_HBEa3*%zAAb%{O>3G!Jxw|zdM?^bUz z{}S=%W420`P_2=15VxAFc^BqLHjSYb%QVqq)=1&h)Hf6DyU>CxUezYAR)eD5N7ijQ zDrz6d;n1R+<*9EZiSF?>=GI zwZ8J^cfI)Vvy=~x=6`BAFt!j&ZR`?smoP=502FsQA1&U9|Bf`FCZ4GB!v6 zkU~ivJun9viD|k|6-@tb)ZQe<<4~)i-f_q}44Yi%E8Et2XGiz=Bv%AEY`I6wJstoD zcHchVo%}orzZi+fo;V-zxaJ%xzPpLH$;~*S$iYk8ZgV0h`Un0phHdSGJ;#EnMNR|~ ziavYJv?V?5_~9!lwLX+%&wffQGTyzlYnO`q092`1;H5rLzFlokgm9G1jGA;#Mo0<( zhp`v#c8->(DJnLYbRo zU&7gMop!6DQi6mh52C1Kp*Phj8p|>z?s$E&ko0QNIXMKd$!p-f^rT!lb?jO1)ks@u zarPZoYO;7!J(_$QAho-)3pDGZ&`o2GP>ic5~F7~w%kqU()(SY zo6VcLV0JkALvoPBZWjL%BEZ`QnE+2HOy*@Q?snv&3KLzoyy9Qh5A5B2Y?6&k7!W`&ok|F0lIT)zfH#qp|%$14lb8_aylkx&kmvq72cUL zTM-cIP80|ZHg`+Wd2FjwV!|RBn513-^>0D19dWyu+Aui|c{T0^$nehdb9zFmC4DcXE8us14UYG}Cm5FvfL~qWZWmW;%bp|^XGl!JFtT%+ zk85H)JQ!yi?F1mY3f1MUbBaxrjjWUody93Q<{G=q_hv!m$4`GhbHbiL>;Dsji|+*{ zw-VTV=Qt%(l9c-FZlGU&g&Mj2He&NE=dH5R0ZFQ9)yerH>PxE34`@(4RFw;wx%wCA zzbYu0-%``O^eUIWi&uy*88Wvk3}*eFUNkwnd@MvgCNztqyw3Dt2+o_;Qu*`|k5=ay zz1?HMm4kiV5zVrpAyymYjd@Q>qtTb|!>FRTrZ+7&2zS>0)q-+Qq!my8&$T{UPJypB zbHh)wpnc}snxaNRg%}u%sJHml)>E)ddzL@)3hcS7u3ZK#1*no4xcV>bU#+RrmYVy> zFyntd38wU%Gm`F;&#u3VD=QfEXlB0KEHJntNkxL^l1_Whbr1g(IsizmEWeL}h*PmH zQi!c2floWPO@z|Wg;n^L{;);>_AP4Lx`t&=>GRmD)N0%BE4fxu_i)+u*BY>4Q54-j?G6LDv>6J8MjgoxLeAi*sbhu>>}*^Iurq$9ik6g?`I@>8vWj zoBJKO!mnnfuj*;K&`#$(8GqNGq8GwSVvD49fN1*{{))|D~nG}uZ?tEI&0xg zZV?0EWo9+Kmj_x34tF{<@?EErmP;4YiMSVvN{8M~9GTK(@I7?=1`D1B;U!;3Yb>)e zsqKtXYWx|qThXK;FifS=bHqcsvg)pTHW^L3hK2AqRnxCrigsQFLIheMBXU55@75Y`x*1p2FNkHC& znz4~dkj?C?*-0l502Iu>g#efduI<)l9D7Z21fn|N@J@0h#0)4-;v*x9*b_PnB6i7P z(*?`(wA#nz*)R+H{zqyKtT2$@`~$kP6^X^BC;{*irS*SmbHU7LdV)Gl z6Hn`YyT&Sm3Q=fK!rhXZ)!M%~`tq&pn$;x)@Tti)=lIZ5rNN%LB`E4&@P)ls#R-d_ zv0KiS{bkP?#_`tMcVdp5i7*y-lAXif>>8d~a=%0brcSUAlb)jE@QJ5$E#;C|Dyz@$ zfy*a-Rvbf5&o8kod`(Pea)y0=R8f|b=~Qlf@7n1ehg1%I1>Pu+*&QQvxaLE|mc=ij zhHgAm_=x9I;y)8QUx^pywpJ$WN)s$;7KmAmj!2>jFJyOzzFzoMadOg%V1LKwD=%Dd z0Oss4ie(DDC=59x3>0l!SPwc6_m`bVB;0?11eKvO&k zF{%Cuv=>1P$(ARlWD&@{rr#h-1x-=;|;oDv#9F_lAa-;FU1ruK)r?;H=`%@Z)OaVM3 zk5|#&^Un1kCcXCPb${9Ts2BeImtKCyVs+{lUnH6c7^mu1%dO5kk5U62^bF)unn_U1 z!kc}QTP-06Zsr#bE*-Ch(dJ_gAg?n3y;;8QIi>l4TcCz*5goQWFWjn5aCCujMKBR) zaPWyrwr)7ZfA#BHxnr)Z%NU81Ea#ZftraeA49?{_on4MbV-UW6-^jM#O`A6Bed5Jz zr}wWoFXcc#TR;IwI?}Rt@2i5XRpOig>5UJdat>2jL`sYeg2*1h9(3wTTUWB)FP^MG!>5C9l0_}E3tAgkm zY@+<;>Q=AcwPbFqQK-L99Q{VoQG6U1BjtJz>tK}k$TNpavP+;dUfab`?p|=!j>wW9 zKOS`qMmPu{tEB#Zc0V$}qy_Pb|F4Uyp{Spq8KZ-`IQ|jNAfM4G0ichF)6f$;GHB?0 z4FY1M_=&qhOP>=Xef4Yj$~62^{=l4zEJscJyx(@vlSptPEaSuGI{l*jXJ2P9BCNLQ zWofaRc4?(&cJ}>DqG4q+HpX!QLE9RA17tFcIb%OG{Qi=K1~t0T-dZ<5bHn{tT|D@E z0zob+wSIT|{qx#`4jf0acIObm9*%KME0p}e2Uie6p5fqE-`Ov%aUiBfhd9T)dKiC+ zWrBW-^z~DJCcN{QkyZk!lZ@_*zgo zVx$n-8C*Kop_0h;5tvDZ-uu*SKjDH`QLZ5@`oCziY$e}tzOvxq(zqj%bICwHp?lJr zM=N$?$?lF(td5P>?2z$n(zD7cRi7l|&xL@vLdykq(e0hTW*tH@-c~D&s*VGA`^t3b z@4asLSjKMGcAHj&?K16KDPpKlbg(6~9e3N2mh>MsVTp122cFs%I+4tDtVGS~A?3o0 z_>>0;Ek3bxw)Cy4_KO-k5|yVqDiUu1DI7(8v@3oywX9Rqo*xyNQz(eU)hDA4g9{^f zrIqUuxLdkhq6w0ll;w|X&IB)eY&dWM<+-}2J$~{q8ueyS7-@LS8y-N(uV`$&!6PK& zg>$uMb<&#)vGz5U(|2DMNOa;}5KL${T2x4S|2-i?7rbY%IDbLkrjSm;5islS@khTY z%!2Wku*)?)>ZzBH3Lw5>sTnWmn%{8^_+rxZ+LmtV>o^!%RY*&zs8+jS5EJ$DHtl^+ z;gheQ1}@O8UMnLUJ5~Dj{c>L??8W)NhVjSR=&{puFHJWsOzKVe#{pu4 z%R;3aDD2(74ZhMPf;$9uwT82eFF!Sx)KV=*`ccdiyBE9~GUj^BTtLU^l^OrLw%EnF z4io>-`-X;q+m_<|o3NXHT+r?pG;4@1yuZ|Sf?c#o>+3G}UrSE0H)St~;F+l*MS z*3Ut-nPiJUhkzoq)nO8Bd~-yf26`SsW8sPbfL)$|F)0_`qBb#APX@YSds6JvWQCq} z*pFeb%CiDd^z#pLb3_mYMAvlP9kG!>J!|Y~|DO>Y!(UUHPzcKpH1H zvkv3dQ{*`G{W=QYZ8bf@^y15T-=r3m&~#WyMKT4Av6m1ON7;BYTa2@Q_8%y=_4wMa zmYDk3l0Y;OkTesOekT;DKgog;#YQKC-}yiYcJOm#*<~lKtFv1%Y8PdwZ?UHWmq?^) zg47>`d-SbU@7!=4Ddn=Y2*ci|eX zb!>givg#soPO?LDwVkl&h5IU>mYU|B1;OmWNKp`}TdtR8LWchVwV=3k$fAZ%m1zuM zJ?eX^U)|NI0;?1}TXbI5vt#?>8pE6*%7q@)(A)Y1PQ956++?)lq!{!=uxx)aiu~nh zR8x1=vDfmNa3Kg%YPAlkYXW^w+?|mujYD!s0E4+|&lG*x6w52ZzWRg*5X1-SYv@q% z)!lvj9kpNaimB5_`kK)2!Ii1=csTrtDsq9zdxe-It5th#8owfZ()J#z1*u=LeyuFI`Ej8rlxOpR*$ z!_wUQq@m9oT(^O@LbTZ#r~eucE7Z>!(vCg~n0`qnhKq>AkQM)H@?(K!Lyv+C98K3@p8LLq`)|7M$rjj~0TST1H%#EORY- zf8)OK(3TLNZITqL$AxLQwAM6fB=6OJU{FnzU9{2cS@!K@z zd5^!7o)5cw*|K~-Ekg|stjY72pBeF9;b@F)oQM98OS^Q+@Wsx6`EMS>l5#G;7DIlx zW@uBhQ=T6^+Sk?!X2|5go4UYYx=K7ht8G`kHuHOiO!=u=5&B4a)?Zreef<-ZSxt50N4jUiXswad&8epDn#J5*LTy5 z=E1Y+pD%O0I4Pz-@)9s#S=c>qI6KBKN96wnPS=2O@sb$6A#Y@ z;(-m)%c0z|dT$qj`ZHPf3pGpJ5RmFw=MnsAHz1-vV8}R+CRm#W&uZ@{v&n_HVbcY$ zL_Q5t@mZeVDYwL_#PX&?GpUWgjn0;iKhUz@Q~cdg8>#C`s=tV>*pnl`Oi&A@O(zFc zXUulO{T&izoP?~Cmh(I>LeN~b<_aSAaEGt{X~M|usm4!lRMS-b#d4~AAXM2;=1l%I zK&IUEEmUO*85Os@nmUG>9h9b zY!nVPF2TDXkLgB_l+fWRvK4CW36ggeW1k?S|377CRWQhQV>uh|+CRGh`)v0J-+G=) z`Dp%*v%tHOViWGhe^vuy|9J1HfV%cQbPV!2BXgd-vq%wSHAEQN@hc?w7Ohn;02fW`IjHq7K z`PkOK)VoorA86j*_eBc?Lr5(OheMf--#T91;s&PBa3AHil~R%q)fE*M%L&<#ZYW&8 zIh1;kvJ6#=EFdmRJ;p|b47GG=6^pzK*M;ddM2l@ZQI00}!@JmW(79V3Tx1-KCpb1r z9mZs$-NvmXQhzpuWry2+wrgkwY`EDDhUeh-Y&{S2yvc5=sTa!*(s< z7c>PHomorF!BD0#f{3KKt%HfGW|@H}DN^ijpyY5La;yd9_0iZLpR*&OY*d)TM|QSU zskS+BZiPE|?&0{&AEE3D(p%cInnLBka5aYRmS7ir+|5PO1U(?ZspE%c3I5PhsbMoU zk7Z;JSoH7N5FeM$yndCa7GBe>24Y0iY90U+{8MYp$T4*&xO>Qow`(4jugET4NROMm zVsrrR9a+{Q`@vmFT%AIkB0lTZv3i#8wpw2N2|V^7e2I`B7FoY{x$x_itXEdQMtpEA z>U(edu?sHd_jI+lS?UzP^7U}Jt4|fIf8`wm^KYa&lgp6BQgTsz370q3iEz&cFhhZ- z4#;iQORt#~sz?n{lsMs*7x%QcQ3gf- zHlA&>1+cEXnr%$A-0^%r>Q}M&+#bL8@@9i*|4=~(cPnTDEm!{8k{G8#B=3>g>nRQ9 z@^FQ3o0~MLzwb7tYb`K`lH@D&@5$Z@Zn#rk*L`iWUd*E5I=SJVdnNo2IRoZMKAj!K z_Vgi4xxc-~^Co=pN8J2c(%ff2ExUf&BF1xm`=i8_w#7~e-y)>fELeqw(>cb;vK(l2vY zN(Mh@uikjs8~;SJqmf~)~swO4g?ab!Fj6X&}?*8~6+NK7nZQwYrKVps% zxTyw}lltG~2kgSi0vd;RFZjUNHQkWf&osAPo|}>))xKb^9itzjL0*(dt|%ihtgh7E z4mZLOE`x9*-_I{!EVOLun_n0yy2qG&;iBvu;+|!W@tzn}zIHHV%M5Iq)CDcnc)Bz2 z^&|bX>-ounp}XRrQi1!Q_nf^w!n|v|S%18Cy8i3=oP;;Q)gJoK5Q2Ns0L{R}Y?K)Q z`Z3O9|B6&mGgaNWZyu*!94C4{ak+LhC^onXbfZ6OtyreMTA^{j3``=!6u~y)ngY8^ zs7N{C2Pl|o5^DvqW-21nOKEDhMBR)Vh)?xKWK%r{=UImmV8y5vrK}YVw$s0T3eXHq zI2Ja5yW2VjRMKJEU`BQrV+t+ed14ssPoZnWUlG5#(BovYlR;!UB#g-TOB=;UVw|PClYJGN@@V z^6!B=@di@T;fP!d6lZLGp+I5{q&#VX5WYT_o>x}Oph!9$xAR#TWha6OoBi;$HKmRJ zbByHCg(P2??%?*chDWZy4!aP1t_jk_F7dTA?YdiJ3vN_+lX<}3>m*jk-leqnY9x7_ zn9(&T)Q1?i)p<){r>vbgJLgY+Hg#b_@w!3egDih#EU6D$&UU{3n7t8I_Keeg|GS|( zAYjE~-B(KDD(V&5CACp65|umlT=ed(F8YKx+kCi{j5YLGzBevozzSX+mg#!P)=>1i z(NR!K{qq;-CTs6Cl#Y{@$FmppTWmEC_EEE`7hmowa_cJc6qMhQPZhL%M=;kQbxKz8 zjI&Xh`fvc9m#AgjyhfV}wdFI;iDeT?t=4(9$kitAe{O{+PIuKju{Rd?U!r`y!nuT< z2%^9Qg;%^kSJbaJ*0Q_^x*sN>FmQly&&h9^1?<6NA7OWHV!)oMX@`O~7Dr^h6Qv?_ z??d|`EbGK@q=9qMNBVs1{HdP8=C<-C>=%+JdMjI4uvj(^^)n`OvQ~8~#vakZM29q( zj-q@SE4(PAb<6$X3Y4*KY6-7;OGZ~xP4sq32|V-fX>bAymw7HV_BKquaYaU4+47b1k$ja$4;p^9>oBrns7qJ#rK$W##-@3@02) zqlOAEfbmtq%1v*Z;Y~>d+2ejkt!Xr9B{Dmm4}1|{H4eh$yM`Be0W(Pje|{H8I*iB( z*BAiz#7h_&we{~wMkLLq?9xb>l=hiG1yvGZ%Q-gh(kz>9W35wbsRFmF25U6?f~KqK zg^td!4m{S@bn7(B8&^Vcjevn4NB01h=gz)v-mzYjqnHQ!4~|$l4gq&Qt^44a5pw{V zsZ$bflYQA@Xlii%!?k?qbk#<$+A_o{4e0@!Qyg+&F45qu(9`)SK7?GXY`Lfvo>iJ3 zq4aF)lhr49)+aZt=Fb8(6R8;dCk1(B(aNDyA7BWy7F)j>$q|(sik>;)tzMp`Lp$^5 z&pL$u_P^IGllLhtLohgG$P`#0YWO-kW=;>mYvaCDXZ&*> zP-0!*94MFOL;tOooB8bf0rjaj`$zrT(8G-VVKuac%w!j4TuJVfM6pOvdBH;_$7B2M z1g6jYX4z^L^mmG9I$P7<9^uZdL>L_heyvDC=<8!Kq6CsIN37oAV&bec(4MvpWP9@< zail+O>dN*R4yU2q?cYUkV-wsxb=+EFi=@%*Al-ETI!+6pn#d!|==_m4(=$$BpfDtW z;}$ycE`K%$(EZG}ZZh+r+D7l{oTAUWp!w|90X#=rA;Jt6*OU+s9gzq0bOY|5pzcc} z_CIhYKku>f3C#L# z<%CC$&M6vh9M_yL_9k6(1}!p=PN&=S(x0KF+LxO8px*_ZK#rOn_}rU}jjWhabo`g? zd|zzQSQmK4oT|~eT!k^BLuzQGPlhi_;AM0EE?i*vmExHr6Ix~k8rv$kQyh~RQ-4u( zH|Af_X8!Bcmv=NHb;(}dQ|e2@%oIL|mNfmKx`7cMXt?f4X_<5ibF6q8wrW1DzC*@* zjX0KeE8Q$t8MK*;Bjk2NHX7XGS5|jJy0hd zIQDeVyGIiy0m$qrcSc->$wpIMdst`A&?(X%gyo-4Bw>D$pm-7W*2>-1b z#O}MmMwb->SqG~=13?eSS0w>Xt>@#Ddo29ZrC&QJQ+*QnN0Nj^$V(5|z7}Hy>bo-{ZfHrKq?w=6)F`=!~5srrkG>#VbYp-RKi=Y;+5^u_` zOTijcfc&LVc4;BeSa{g7SJiT+)@;ewttQSpGu;y7GBUVND9Tb|W!IgsCJFJ4&>6_7 z{LkGbDh;AK)RJy@i>2lsymTGXS3vxoXLV{fc_?F=aCzvpmUZfkxCra@i?Z;y@I>8u z>ecIR84sXlYgi=(Ab&JsS4g}7UMyr=wpYXl(ThkkJL)b+CaYwwjUSbD=VU5N>*Z2v z>E-@as*cPu|7XPe;_L_BO~KFWP7_{gE+7lon+sxQ~G9V+GR>XC9Z%= z<|w~rZRz~3`&OlB&-VwjOT^HJAA)w67zK2WD{rWdopS)hl?^!*@)9&r2sdN&)n zKNo@1WUo&biJ$!NK6(EHAJ9pDYlJ;wRT{Gy;beEF!n>5$uE)FpLNh8uynkwM1rb(c z<@b|T3QzpHMl`4F1Uvd9g~kvRh1o4-uVC{e;)eqcn;Hq1pSQK_&$8ql=Tf3VoPsxC zWA0XRr>4)~^26->oKw)*7q+#aM;)Z4I87s`bu;v>JdN8*4+f$2AL>U+hm-U&bbave zFMS0wIyA6QLK}PoR^P-9TW7P1fdoXUrRcalPe3bI1t8~bI*a7L(sv|0>$D#B%xxNa z5zIhRX5521WPcQ>!+DN(v*EPz^3Y2ZG5XSKIQ`KYiOcs-1)NQu{4HvL?hA;~Y3JLw zm@Qy*G6eKJJYz}S&C$O<%oK<%voA!*RX57JdaC0cOc7~yc+^d|==?)7xLP6+`HA`O zi{JgWj=5+V@B2aP@wdaS-_|x~-o+vA|}_OO@<%B^6fHUx1QqRMP)I%3oT7owJnF;<=Mq z1P;vDTXK)@=pV=pOXA4w+0Nzzmwnd$z>+34g&za@>3AB(Y!r(>V^&^6Tej<2=6r6s zvrd!4Irem?t~)wRzRNnVhcHJPs&DPvtzlt=-+~l|J*Eg&OE98;hYvsB@pQ$qX;f9T z8?o-c>=QckJ}E$7X7@q_;z^+Ey8R~;^HxJ5_&W~qEtT9m(f?$vWJq`YUEoFT7Jt|!pY&16rnkw=17(y>_vI_4e$f#j$+I+9aWl_sz!WuB32<4D&$qK?<{Gv zt7kJydFNV&Fw|hlEYKJ3&cpHbrhAIRyODl>vsuQSxg7~q8sn6d`rG&J$l#{>4Ndi} zgDGAdnSrN3ay>h{$QAa=G@~Zh&}pgB*(MXMpXmp*^BxW?F+itkr+|Npxz@q?IpSYd zECF9;v!^wgOP|h~n)Z=k@Und#nkK|fTRFx^$t>*>C?{sd^>c#kk0ofayS6vy;ydfq zXRU)Ez2({hg0e!lSXhrytqrF!{19bvz@gZPCir0mIDyRjy1SC5t`D zGUb{_QrIRc;^#5(Fd?ya;WjkZbj)RDW~`{gs*-*C+w=V_x*Y?15jIiM$B}QWUutGx zV~$ibpj2!YNlhzDGVkt2wbFz<@o)bHXlf>=cL=JJ0&3E*2*ZE=BjBZ%%9z!5y%$1X zK5G&4nfpk-TWBEiMXOl$gj;Yc8eU`k-KRtK%;HvUO!%& zaH@o3RU=Z{w^@cfSUctrXdSB`F9n{4p13%VEI9XcgE$2k1HV)AP&C9tG@#=o(n~r3sPn*7wn`OR+~pI zt9wSgJTTYl5Mr==F&ZQJQ#)kGtD7lHCMeG-mELsjEZ3h&gf)9~|8MtTyV3Nk74zVR zf{w{3GO#xR5|m)zsPw|m=Mr#7cXemYN$RbwAoBan)yPpAfM6$MDT{ajlKOwl4g0i= zq!Y*N5z^S(ewR=h>0lefOk!jr58O|QiK<}d;JutujyYYW9$a+{8^0NWc9Wpp@+RSf z)5e6qXLRqNEWp6l16WkztW@4{lijgw)1oo5B)T(dCPm`~5U5;2aH@?c0@y+rf#1da zP<-@1oB8GX|7EzgE$Uej=)%ygx#`%pmOrn0Ke^!yfh|M1Q3R^n^z zWtPms{l4+qD>Os@sp~7+E&t){61a>{Ch%umeB)HwhMv@u`to(A zvWUfc)s}OLLfN~Dytu-sW9t@?T0@B7dkTARx-ik$WioSk+;;jjS~fKOlxQs7c8J26 zxyEkZF!+weQ9oz2s<`p3+F5>%l}mmxI{3_E(!FdHC(Jk}Z(>>COVUtYp6JsDd2FbD ziDvg?cGego_Vo&h(>Kv_%ZorvqWLtAdN8Ue4@51nTgAH!!YM_3V-G73{r-77torRh zwZgSc9bnzDYl~{~5ZQwUpqA3^W8CSX71p5dz@SpFW44}qt>9SQN$hQG*@joEO@CxW zn*wyCgmBdCwrvQp7`@VPFp2y;R4XhO8S%?z<=7=4lWW9O-9^_FWt6(Il}31~UFx6T z_f`KWDFZdKt;k{$cT{~tVQ|Yjf~l3xAjCyKST|9m ze=(Kin?4!sL+jqu=SQ}kQt>x_;eL-PD8H`lT4sUQw0~F{@yA1vXx?=m@pn{ME~xh@!EAKG}6Jmw-sG2pdMx9A;EnNf88!{oaXa`Qrk^qN^n zJf?*Ypi$zGMWyEGA*7{M$GSQx`YscyZsN{Vf*pQMs@0~xoeXcgtRSB>Hc?|z*qzy3 z6gIgwHt3h~UKv6x>$VB(&)I_ZFQtP`KMh>>dnh2QHMhwJW4d@52ly6R{()Kj+i2nw z*uyL%SXWE?6D?Q3+=VbbmqUsSK8{4d3$3F#n0NVi4{Pd=$R@XH}MZKNKGh5|?1owbhE(RYeA3n1@I&Yor>pZbs4B9)RUJq7qHr z{g7rH$kff2U=E2dz+|~ZTS8oZ>u_CyZQJmdEksO1YL4V{pGE+RX~?n}H=Rl2mzH;X z1Ka$GJ?7i3)TpZ35gmIJ*g3%Kx-4mya!82!WxZmXtzm&NBfIZo`&H^VThE5@fl-2m z29|4x zLBR%nLWELFU~nHRX|=m&cU0ELW%7vihJ|zy^*QY!-jbJNF~?Okauv_fL*bJrnQa!A z1fqH~&Fe0sfIiIg$-3_3s#o#}KlTcUhpu}waku=LCp1VkGyj)XV zvxb*XGdrgfb2`bk%FsD9D*+cAzE-(xd{a#``LQ4^|KfPFbVe)bpT?M+DvxWF`WYyY*{IDj@!;SH^2OS!h!;Qgxx!~Dy zl(}AEgW4lBd@r^9GSBe+tocS@$U{w1=-Yfx&`eFw0J^-!$|MIJ!mKng4(x`Ov|_nu z08dw43K}L1n%*aNG8Rmg%W5seWOp(%RgH(yG*l_T4=ru*5k#M&qS;h$W_pS;Q$ltl zdWwFM6{eV$&bk&B&~!ba?tABIoj1hS`kyrry>e!z)`Fest6XM*MQ=GY$lZ%dqq2mo z27OTZOeU0wu4>6kK^H_I4B`OA@^4_W)Gyt}(6A&As6!K(QwYWOjYkl(iu@xyc+Dh< zhGDi71MAsG^g?flY0yyRM@n>Fvopv;xnj~fO8t(4b5OsM*s~KgAHvpr<|scNy~hLC z;2@ZMK=j%kxKSY56lxysio7p^qThH)OeO z(4^6$qmOMmVsl$tw1DfisNJMq`(gs`% zySmHA)L1+x*|F{a0+#kd!e{c6R_3YdpdlYzH7=W8H)ec3{Dr0MJIX03^#1c+y`rB@ z^F~2QR1b`@;^emh^Es`w$Kj%*OGLQV<2`6cLA>{}fzGVRy2N^~$1>Qg^lgumexWnS z^?*MRCh|9K40Fp;l8n>@Kgu|T&=a;@e}FO@4`Et8h!NKR(kweCQ8B-4`yX=4tL`Sh zaoMi;;*}D*cl?&p>~2ZmH})a0HXfoy%W02>?`65UP8xan`p{71{1cG$MZ!P+=SdN! zjlmw)GnXY{U2|l&tLRBM)`L&OCo%+?v~h#?1kaQn-AlEW=AF(tf7|_cPYbf!Xb0_| z!=(wn#=MOLuUE{@)Ew|9_I;bcfe`fTvx^gt^`=wvEPsNpXiP~&cM%WHj|A^ zcUygi6td2Meq$CCcg4GKYUaA=J!aSFXwATT=jNoQf2})RaK&n#1eNbghw2+Z{X-C^h)<}@WoSf=|QA! z{b^xv$jAdfrr|zY=}DF~0TBsak{_HhD=nAy$VKTo@E7FJ{W>}xB}2m$kB}=%S7NN; zM@iEiDjC*;ZUJ949>R&P2L{H^`8A%z0M3d^G7XiYe@*H}c8=F25nxbQm46r<7i_+% zA|aj>m|g6Ox!6Z#U+FDL#k?!kv@i3WuI+W`Hq1XJc21ojT5MVG*^@eu0wO5t8BC^u zD*w3rZAS|DYZg7ZKo`CQP|GXtnM8p0Gq?BI%yWXuK6Y{53%KB{y8ueme8AsxIhBwz zhJ;NZt2PbAl!$i+DP`3@UJC0zGWv_ukVa-X;BG6Ib zDS5JrZ#Nx-sE+1r#Dr7l(HUyYPG2SL=5=}IBjqZD)nA__+Y}?@+YeJA1v0eOp;rv4 z$DT4JXHBOw9gQ}#VHq|DvV0TWYAeQCZCVN!mmQ?jM~adZqUNE9jA{KcUC>z{f2-=n z;Z$`v9L~syG5t_L_cMC+%Fge8twokGRBN(H(f-rya8jxJM{AWSiWKwM8k@nllekee zTf@^xA*;tx=Cy{zD!In5TWr++nf#>rZn&_NS!)4)G|8oQtFv0x^p-q5_>0zqZf)a;NUSXWD!Lv8Fra5Y-EP>y_z-s3uPgSw)_~)VZ*Cahzyn zolmp8t0nxnZ8ya{Vn4_ywfmZC;5;SeW=cTEe8qLDHLPtwHO%3y<=#{zQY>CiTsqk{ zw?&8S_U?7P+N@V@Qs&hU7V8w3>BzW-gMtI1QymCi^+6Srh;PJ5p*E*Hr)?*AFSUW6 zODA1cKu-d~qknK%!`P?LS+82}eO>=Lm7X6~EW>gA@1CLi#}RTn*nKr(c&f*kjc||7 zSgq42`Q<%8D00ywH^Z{UCJD5@)4ICH$W%`7Z+Uo++2R#aekJLJTR4F2`>ydS)(bxSUL z%S1!ag)qH%gK*CwK35Yt1P{edA0(n!%oe`Y{G>&eIjV0%Q1fAD$lUdY-N*=^>z-Sl z8-39u#%;Sdkj*(3c=fgwiip&7==VcZXB-oyoo>XYkMPFfn+d9R6jt4Y(!BMoK9zDk zvZi=5#H(`Jty10vkG2hq)z{W5Dw9_i2t7@$$aLAxbx*mY0s$~@>&D;7T}U$&>jYQ^ z?|NA2WW;gMwvau0-F(lTF7fyjDecQyl{xnuiVQ;rW>o60UvYd%Mp|>cC>z%YboMF9 zRiw+unrhBLDeRZ8u3tH7MYwpcRO$nJ87^`?2CKUr2fo=LQH9NYFSo-~&O6+cDHmi= z_ObgQO|#FRw{QryM5E64P3x7)R$>q9dz|SD;1E4>a8dKeM5rk`QBq&UGF_|RB0jID z(F4!8^rhTGF=g~sn-TFu$ds%`AY1mS9DGKiXYaLr<`bT;yIH_1#kOLNsXlWJx!SLO zyE3E3M%gYgrFv+2=x1@R7AO>-l3yt5L*%x;Z-*$5!Eu+t+O>vo-pr@>!5&qW|~D+zB^?V1-*87m8nf1@!uy8!O&jPAfiJlwrv)8-+eq-|L77|;n|oVR}D%m z*r08$n23tAs@Uz2x*sQ7aJBXwCOBz2YjP-C^)0C;8IZLsATv}-M#zYAO@rRYf}{rp z*VhG1>~T9$W=Owcv2U&cDQAGf8Fy0xc(3RrSh8BoMPcauXlB3T7Z-^V0NDjke9W>x zybrJ8Fb?Lp*%H&rGS!ce1QwddAMj-=&vIFX_i^&-c{Y;pS5WHTkHR4fu6xjT_ zNCF%~V0pDczryz^ar;avt;%b!URL+KeSVI!+B!u2h|vwIFa*Mjb?h`s*}Wm!DGal~ zyN{}Au>=(N7r%^UWM zts8QW*lYJL!3A&R2kCRDW?u-5c?D5!4Qa6bhk&K6ZVZ)Es;z>%_2&H1 z=hnnMnvb|d^E`U1Fagw7l=oFs>_3AHiQxfx;i2ni+udYuVyr=%L6^rIElHv3hgM@a z%-1FOi3ArZ$6>EF{PSQeWAyZ`a zoa&vd@x@CZhojW+HyP)PTXn8PlV2ZR3& zpH3WhY%X)WfV1;6=a56&TO7ryYNO`B1=|XDR4=@;cT4ldg+Z@n`DRO%=}N|OE6nHGRg^dz7UsE*UASq_O&`_U8}OmOAI% zFz75!l{MtSRTD$2OAph_k_P2I4%Cb3o_C|Gpq_@&8E(f{kK!pBr88Gh_P}$_>vIY0 zKeqlHzR-lvNdC|PN5sR!HeV-W!5xR*uTl|4#mPzNDX`!9x)C37O?%-0xKJok;u9^l zVGHs)kto<{YPqzLUWu`n%cOPT<&7w<%QY=-fiqiQPrTB5+%ru^xoJzkk&|c;&W2dV z3As`tP_~FUV(7~U6lw5=EXpyV}GTByErr*^so98X0m{AGdv5~NE}PWcWWQ)P%db~vJrT-+=19=?Th-e zeEnJN_HUI)h7u@7@V`eDp2KmVdX@I~oQVSB2qv`j9%*=tuAE;Y8I-f#iO3N**A{h> zHuL3cFoeuVl`eZBysNI=*qeRGKY5>&74WqVj{|Q$0Wk&u(f=53`s0@l$iBmv==%KdbBQxznND3e~5eQsH(c}|M$=x(%q#rQc6p=h|(QWQX(Y{ z(%m5;A&7J%C3!%QmTnM{knX(e=ZnXMWrRZlfb73AW z1A)A==L5tdR-{8gmga4CUXrip9`E;kOn=+w_a+;ABpIQICtFPBM?wRjA66CHQPTRU?b&t;awrt9`gql~W7r0HqS=mJA8)9BX~;7-&~0JxieTH3 zO-Htut5cm-iEWBXvJ2L-m>jP=UQuT2)%b4O*?OP}-8T&`j;fhOK67rX^qyl`CmYzG zoSNI|m7icOSt$N_BHLoGQCw#8aJfZ@=@b9Q&x^C=hQ-~CY@38ONk_R2cBcCHU)D17 z^LNpgI^B38JE?A2?tqe{L;9>U1Erb@4BAp<OJD~-K2Fz!Ayrj|h>!fvqKj1$LY}V3%Au>*jvCS;Ih0uMR`8U*U zoX-|QKNc(RqOTLAvP9SFHSY735g3d*mQNcPH_g3-tM66tlhO9p!tK*fSlyH!2sdy; z4_8}Y&wre^x^eIfnlBtagYvECbn1@zhgnl@2aGVo>HtY-s_G#%PY-+%75~_=)B~d=8%uD(jd%{yTX8f^g5S#&>eSB z*m!u*OWZI?eTYEC{-(*oNNs{lTkk@7t2e%MAo8W&QD=kPr{pjL?EbB?ET}66yt>z& zz&Wq5v6^n{g<`19sL2=E&J+U|6*56~;xw(%P3;UEjX`&fm5k6;1G%COo=bk`RF$m> z%=cT{U#jos5>?ykj{oumPsYCfqnl!Ur+L}&QTmc(%5nB56$3V|ICfO_uAJmYEnnlt zK7kfmB~aZ8ofdVC)plzkHt5WlG4{>_U%`!^h%iwx4Z(F$em;~-IzKOu;qv5i_LXNl zS0czqGW@A|&!s&^iIalmCi(U9+m^!Pjp_RJZF<$uXhgpDa}lxm!0|=(XvmN ze9jQ%>XEuzhrm&!mc(hO36kMI*5`jqTq66T$7bV5s8l?L@6Qf~|JJyWSaj~8eZLn^ z5iFH}^#P|T&fFt@_pu_8KYP!8{riBc;n~J3%=oL}4#&!S2e{tw54~O~qR!OgT~{kX zQ(C6ecHzb}6DY%wGUMEVci-&gA0FqXIL~EgjH1zq)Zx{8$_}&}YKHR7JRD+HAwxYP zd*a<58C0vowoBLn<71?#;7@q1pe8m*of?(QQsabQQH`u5T)yTst?Boc`hu}GNI8Hc z+!c3G`C=1CsUxocAX5Mc(CX`@c;UhyU^@^OFu4s7Tg)eD;38Bz zTfm`h$Es&JN0rJ(umm3qb+&A%1L*>yeI1Isc5hksc(KL+;nkV&7S=8qKbzLJWX@)K zcJV^cTY~ycAfI8`uG=qKlJa^Hx;mYJnKWb3fKqWUS(1`Q04|*Wnym32ap!DYGN>O6 z1XsHS1V7V9kFK5FR!cpt{5rfQ&rUB*l9vX6k;G zEK;>OWhfT!{bDWY9qpLuG=HClfSj|aa427xTNj zXp+17VrhKyXP&x-?9la=SK>h)?se0mn0eOk(}jSNf-Wm5G?SU)$|?>Sm<)l1dn>Kgb-W7|kX<5?VcrvF@eBa~%?!VT?KDYT{${;& zp#GLUV9XoU-Tfch1gXCnFuyejISeK+p50%E8s49(cs{VE=xJ{}o+C}geIb!~eZvIc zaX=16QG&lqko!@eq9~4Sp`5*)e~P1TQD0bZH~=H8Yspy{2@-73eWcpLI)Dgq`^XUz ze3O6UgEJfKi?52jB$}sM=#H@+rY>kqa>7AX`gp>8b!aolHk|DOyoK>Ba+j_{@aSfN zZi!;8ez_dyVA(GJ)c0gcNB3zi=Q$gbC$}UNITGElQbw{`0IK?+3WQG}cT}s9V2Zyl z+-$;A2;#b&o*!IO=I?5zR!>BC3=SP`t2@(04h1Q^9OvR; zqL<5u7b*EyhGbl{r!#l;ZUlFOb)3m0*zdf@r#00pxnHV{AI&<46}@yrAQ75}-f zNZCN-jaO&Dn6DVIeV;ls_rJ;!@B*1K0EPrf*^pk8V%nd(yTnauC$P9F)f%Jn4J^|y zU;w7t8agp8Ow9x$L761gwp@%?T$twZT+fs^USF9SExGB_e0hI5&E7hAU0h?g2e6|f zNdA|<2sAPpNPOxypP27kFdH9WQMc3EqDje8KgFXOFd4Jr&i<)?d5r2XXVJA+F}(l1 z^ZZM_>3P?(+3m5T{apr1Mw{>sOH%`d=M}q&S+QMUoh|mI_EZN)$V%rXH9~=C*gP3B zWKqA#ZG&3yvSCEI7pY6+bpOBv2=ynJkJ&9q^!Sh`=L&2dNTMa3o^XC>BRxgrFS`RT z!K81AivH;UBdarZBKMW~%dW1Ucmaym%ti-(MK8CAyd30T>4=6j40^t4%CFn~ zx_82Dz8v^J&Ju)Jz#Yzi62m_>`73l`1&+spzCT9gJ}^}}OSZoqE*G6;H`dCf-d-5} zMEVD~^d2$a(W}!ET&=z3?W+2B^(Yf!g&4l4Gajd;qJH!~-WcjT3etdA>QgTvmK;^M z8GjSp@eCV5P*ezwvzRpCS;IINw$B4X))l+;Wl7IZ^(e#y%sH%yu6w)GzWq9^)Ce@l zcIjGT+DeaZJz~6Oe@wIn)VgE_pOGbp;=SdNb1vR6kUhsSZ9JaDdq0zS3VgvOTN?mI zStbaT^wJ6pAFeUM)DX#ck;rMVTS9zeJ-X-5A-7bx&>XGX;z@da_3cI)t6gw!%{zND zUN!qAt;4CaB#%v2#v5XA%iQcnne@UE&Ev$evyWm5t}kirJ}Jx`tA3PV&?MFE3;8sY z;JW9~rA={NS)MM)<#1ct6hscARSlQtzw*ezw$@~U_<{^6>WvuE_Cx)LjoEgg(tVVY zayF#7FYxl`T?nta*1eR9JQS4(9e+A|lCCU$`t_vvvhu;CB<~T1X<(`9eEalVYl$Xl z+>{$Jj%J7-A(4K$rwbmx>T7DlaUHa?nY+cWuj3tp5k$>IkyHf*&4jlxP~7DFg&`2Y zDfT1+HM2Mjp$qrB7cBmv>H))q#rhjGummU)?hV`OFjG{G6shu5z8j!Qv;ezGXJRaL zbo_zYI@SzP|ANZW`A6@|i!`~I_Kd*wQ-t$HQHH$0v}+vGp=YOeS8uG#yLGg6`Yo83 z0tp{CvaSQL?M<-mgq+UT@>h2?lB9L!Loo5n&(OKq9W0g*FE8%AFG|LE<3(QnIivmP z_pdTA0X?tASF-4RAx;4#JIf3C+q2-?pWT8X8#RFUnGF3K5e*-vaL?Rv;k7Jz4t(5a zAWxM@(-BkoAF866!pIEJ&=1Dv*vxep{Mj|ca;Tp-I4rs^I#m@IH^q#PXHPg@ZLVPH z=WDrtEJexW%*)+Bq8T?x+~BHTf*IrB&E73|wge7^@A@g8@NX$m{6jV?bxRk+!iS&n zqp5f8(V?64NtPYe<=V}Z_LVo zdhTN`k6IEhhMVopLKHAh1NF2*ys^ym-6IOh;A-pJ`H0rk+S7 z@Fe+N_6xENjE6D98t`?EL|BDXPFIt^Br+$l6g0Ru8jnJe7doX0Cy%6%i1e9M9vH%S z+0}NM5goAAj7gL;v+q47!eArck(q~;Tf-;wSA$*0|_t54Em!qc{w&!eg%eJXt6oJxbYj~*5 zW+hqK$qx>KwQB;elX1Wkluo}lw%|&1W%_Nk*%jMj;CT7;i>gUOz5WvEz>-oqhDb`# z;FXh^;oz2DWO_jh?mCC~!Tf`!eG_6XXR;AYcX3|Na|R9EX(h6IOU}y@&Tb zYc}*eSxidDj-B7&3BpM&4U-B9il-+S1$a$j>zOf7iXn2k)z0cTyMPpda6T`L@|8p4 z;M{6bo8?+Z81OwAtLnI_+BIDKWQ7k9aFPZK?b z-)OKIOeF=k4WNYDZpg`!2vmk_KTJtWcL7v4PtclaM;=sJ<_mL~ipAlUmIzNa{ z2vn#|wG>*T9Auz(0IuuH!iM-SY+r z#LH_962Vu;H0+A)1>wN!UZFTY_to@1Gh|^qujP3$8{DF52xu1Y(1w=qhUG#*gF3PY zuAI{I9T|dW6-RDrudUH>F_-P9Lq0JAzplNgrqj5S$%yWJ*VR$Dw6jwcL6dXF|G8>_of~cy6w<1t*ZhG1 zOSRfWQ=dxoqFZ@#_o9k_C33{B{?3Y+DB_K=qXKWi&}B!r<4a>c7e3aRr)w&A@Vo4` zc-hXq*)PU0ga->Xd>-gIEMqz0 zJ0iBSgIG)*(+#Q3c0V*H-CQdnF|uo6J{01sDJ%{9Li*%~@vweTh0QX$=Ncqw3|#l|1Syp&kk<5+(iOb?|mWM zynJf>{wAa9C;5F~g2`u+f9?o{w?uavFPlGV#NWy2NIkjmQ$;^G%<4#W;*O~M7Tr<> zZbt>l?u2>REl051aXe-%tI z7pz8VMK-_i=lx)^b&B?*6$?^tM!}>K^YuPIbT0{Na`^@=MX=3y5xLq{K@a?YmDSn` z-2dB0&cT%X9T-^tuY>o=?=9Z?*C^eNhbYYqb2pKMbUa!rd1tNQ=|4_C&`Og zU-1CB7&*3wYJ~I8-%5}v4S~IlXhuhC!ZF#wK30I|1B+?u?jN=pf@p6h^vCR!R?7IJ zS#3PRn|BHJdJR+80cacsTZ;c096XTfLJ|1>0n-3YbWIO3*ZgMcQe z6^p&i?|r>(;RotvoNpp+28jL@$o5~MWVUaA1&vh&o`DJ?HfZM8X}L68zybEFT0{Z$ zZDsVr-@qc0=Q9}GPk#LFra^a))cDC)5H4h$3`UyiJc8EaILZT1qn3p>6PGj6+SB`YyW~3= z6X0s@C<9Nd$@aZNC_b+r4g8$M;Rk&mOX{PHb*aShIH@Lf*}V63%KD#&dGkU`j2PPI zm4DD6+u}CTOK@Jc7$~JDhZY6iE#)!Az+F9fwE_feOnE2?H1R?F06l*9lD``)#uU9`lcRNcLuCX6?G!o5-Mu_q;i^$Kg~>6tKF) ztwL!`Yf6P8Szud*%7-!8&U`r-N<9aiL+~=z==tF*0NS3PN2gDLQ?rWbR<80n$_Qhe z4<3WZxx`VcVv}EbD`#~}?Uf5cR^#(D$4lQl8m}brIH9aiFgB)(4;B_N^+ zMK^;s)q_4Du-2;zwnN+Y?GYWPju4fmFwOHWE64z#Q!*|7`1bOml!!gcpP3|_8{Z>!6=%#!IszAY0ae31j|44M1Z9Db}i`m6&cz~EKPj&TMpJ; z#M#IZWcmuNyS|UlEW&4rof&W=8@*DNDy_w5|A-+nLmbzy@GkUM*0PMGZqX+tboQu_ zi;Ri}LacKRx4#T($j>I{Ka1a%KVeWdO#k;d4B3_QBkYEHo!XW8^@*X(k8wp&n*r4M z>3toP*+f~hi@+qtX`37uw3U0KC7*#M4CDBYBV#0&4yFQ#&q2LFfL@ijnqCpaJn75s z9AB6u+CKqt&}qaS#$?lFLEBl1;(cLX?P;Hj!DS@-``2s99=q*@INW>VD7y};ba|0* zzD~QE#5tF^TvT<&&m_@!pf>lzU`9(uwe2^MrdP(wLhPmi<5+>fAC@F`toBouY=E@K)y&iE*a}2}1y_gIUD3ee85t z;Hpt-GDurO<3zau?ReK(fA)=YjshDow?f|;T$%{h#ygBzh;IeH!&MH-;)VB+z3giCJ*=CoKx#862BigLL$6t#+jgv=KJ zxtF5rzh6kjTSJbAt$V$}GFQpa{{3lQHnB)qDE`x>(uZ%1-|CLQBeu8UdGPdif24Jy z-me6!u0`xr(JMuKDsaUE&wZW5=#$JTxmqqeW;6!@cXkRL1D zjv~raCOIsiV^#%4|3uQ#)M(k#uhE&^9v zNLq3iZb-!|56|x4TSI1fXg;+A@X5UF~d(6ir^#kzJ`cfyv=|jYgt2Ah+Dxana)Rn7{2myqyl>+ zw8DnGL@|X&U`Q+Cp7zjyhwPI3X~C|{6jPNqqQQ21YRmQRjq3Jm3Za0N-A|hdUN}Hm ze!bFldfkiXDP|$;qA|YM>JbzuWy{wAYTe7KiwN#(rkWWz3sN^I(JJJvU4O$i;@CbP zk#0{|bKE6`On9T+@0g>NKFxF|Yt=KGr&DokpA370XXb!Xn~6KBjf$f7Gbq43g*G4I zdx;#I4I%!NPzA<}A^h{%D%5p|?^%yFx>2`%g|70;7gy;HzMV!t&pJ307ZZ}bLzyXm zsJ|Y*zjW#DGWSXxwbq#CcG4yC)tdIMO!|}L9^JHZimz~VzE#_b5t0#pXgT#0uJm?i zbi3_Y*b*3$Br)Fzly;7dGV;1&V0^sB0$SxHL$vp`QfkA2m$o$ygZlnKKyv>Gj{#r! z4YLb%m;9BW?7&i4WKrzFk;gZq6pzJHFTzo$8;pf|!q&d%6^~4u*s77pYVOuC_XX(z zM$xBNAMm}Fb3$0!;CE}9;q=_e?TE;~2o6UvFF=^g`=22Y9cFe*aQfQl_Yka+qjT3Z zWyc|UGVr(=LmQ$TeBX%hr7%n%Z`2Up^`lj+iVaxN5~^aM;EmJMNfzob_qa84LLy{j zccEPPmTXDYY1vprCElGZro(g*H=|Trp6coF?`G)jLpv+U@!xmFBZ(fktikFP!~>q@ zzwy_1~;cz;}B$EB>ndZpFI;DL=H)V#!Z@jWpPTxcEL-F#lJ8xgzarxEKA8 zbA@$y0N9Vm+izH!Hp=!gvhU=22Yi(CgVROIz;NvD9{)d-o1|6o4_h}2hl=5L4lYg_Fu;0Y~ zzWn1ze6iJMqr&Hw`uEvAoL1%?&p{_1+?txG?n=5dBXS6>T>#Nz?iyT_Z%6NmMFQ$nG5pBg z$WAzIkV^Yy25Q6)cr5fI*gT(VMa!FcY}M)N`jBRdG*dpX?DDZC)Lp>U9V+j;k8E>m z137#a&_>R?96>3DZQ31T8fuyM^Gsc6zB{pgQ&DFqAQdm2#`|j>sm={yd}knL&uG0N zChnae?fh26!1z{t=DCY12 z>h(6`OuJv|c?XW$%CaUIaFZrme9M+iXaAZn9Rf3POcNDY!dAUR@w(`BA+)5K`T}z? zwH7vkc!Jr^!8~BJ(klJl3z$Irg7N}PPJWYdVYU%Xs9E%e@jaVse z?TC1r{$!O45Ei;EluD#${g;&w6oD9y4>psL6z&7ww~s^@MAZ+ z{U%?yU^D=kcd!LQt9mFK`)0pqvCenz36dSrL=jf)T5x3Aap zKh1Z_1ijt<4-%;kG2r~-`yXhMKGsunXPVp+L{bwnx-i9mg*=_XyqK@(M*7`7mh!ig zcgRTp`heg>CkenDS1cOe&Z$e_i9PQ~d`}&=gci0=r?P!@m;Yvi<-7|GoF;?|+(j7$ zVwPK{ES139LFZ=r?zMk2Dq=2@JwzPDVr$xG^08_h3c{@DM4eU`4ta&c&Xc?Tm$o3( z@fyV*@y~uX+Lo0p3@~jhOYFY2QUhHV5Cjp5a%V4(hC7^WsaqbOPM+Uh|6mV3R+#af zrlqD;Of>*?IW}$sN}#&AC=sONxpySG^DGiF8+g3cHSM}dcbT3>N<(L7d{wBMc0xyQ zFDS6r$aW-%_OIH(wt61>v`e1l@uvT^<35d$U+oCSZn#+J%I#-0WZCu4o<&Il zTM`z}hoPkuV*CJ7$eBixI_A!ARa}c5+DL>Gb~gB~ZTsG=4sX4BXQ&i`^uNs+m3r7` zFHEeGLd`v!DM$?sEl7wz<6E+31l1+IaabT8Q!5jTpf1x1tP4yqzS&19KAR3d-HZ0^ zdaGelDJT*qsms|~q1|wF%N!4fbb!2w1k0tSvT~$xn3BA_{OQiwr}Zx{+;ahd|DxRJ zEm1KyxeY)e7pJ8(sD^3-4P---z}F6%vaFDh<$NSN&-dkUq=uX*5aBfsik$P||FMq4I=MIq~jFPsBHSW>Gwo^UjppxZTg zA@Q`dU?=NyBY{(ZI<;hlf5BH;=Xk#%x?+Tm_)k6zd{mfZoWB4d@V~{a&xYZPp9$Pm z)9uF%2F+8JADIw0zUyrSl4ocqDmnXD3e?C3L1OYw2vl7#-2-A~z-F_S}@z*ZX^i(3W&K^JK-zwzl=Lf#w(k9BaIV!BvtLX$bJ@oZMB>UHDmgr$ManEHFjt5k~#b zcH6?%1U$yw4M~nt)x;vn0PFnTg1qScuI@GgpW>gGt&DqP~`GJT-C;A+x2-Q2k)Nh5|T^bjt zu6C(z4c~qIGApHXv1WYJxs7VnfrSOxck)%nKC{3_Yv1A=Avj2Um0@cdWAL6+qx*wrbcxiYjr!)6Bxc{x=rxb&= zp>d4eg9(1c9~Z7o4IA*6%c{$_mt-m4wBPGn5NMpDj{{jE;!7VIp*p(JOGkv%m&oC{ z?S#Z4y*7SnwJXAyevY(a&zr7DEMf0RxDrVt^0cY^6xKXSke(&g|x+d#Dy14E- zZ&MA!n~N3}rSo_pYhqS)1%`t{1Dj?lF?(+{5)bN1@1-`|cCA~1LNaYwwlL&!xBhRX zD@<><_*-umu^0&+_mvZ8cejgI0`sBSjFE47G-*~gHyvQ}^R^a5O1=%4O*oKBuq0W5 zY4svtVy6EdIkEnrk}SXv$^MUy_Vz`C)EdG62Pudkb69vkLRgj47pyIW9ry(5T9##g zfN7RdhV1Ql?m#?$%>e7X16n*eHYGZolSIeogCH4TJ%qZ7f-Z6thThB3^Ux75rdWt) z@`nUiJ}UBXss;)^x^S07nR)f%>Yl|QKLi&dm4>#SARH38LLHzN7v9;j!BL z{sPlBF%yDVu03B2(4pwhaBS zLU?g1H)Ec%Z%t9Vk1`FH)?N+#`8|A+ZGVK z9%f{B>)1JId!~VRM)SMXkmqhu2@fJ!_!0;*mf2;#f%Pus^lhfHXv3$|o}dIN6zyt% zzvJiMIwFtG#X|v5Eem67uZv6^Pk*tlUy#cfE@^<0RV6HP2v5c!cRWLxUk@o0uEvvx z?TgNX!rit+TI7|Vvkj=>VqU1q{rWJ6<@S;D;a?;DkX=n#(MqAw(2xFJTIKA}an8e$ zC$agZ3zlRfof=$t#yd<-kNx;V<^tXkdmC~x4fJ)6wI`gK$>_*g*+>U?gpQo|#MFjx zOZ|s#RsGszMh7*Y_Wr@k^x2gT)@25|hd4;(e5O1cpO>*;h|sEps}7C}Ih+y3bKBT> z(%LstQ%oMS9H>ICY?levFfWEc^b-~lr1sQN`q3kPB5PLXGraG;IFpl@Ot(eE+$BCU za4{3%BgFW2!8!|npi&s~P><~ACC`7ugkMC`@ewkBhw`68j>D>roRlTV8rcD`x#2D_*0WdMAg@0F|_b!0soTe9~^5Pry_DiJ)w~ zC<`>r{B8V?6sb##;i`9Ok(&tIaD8!BH*OL&q>9ggBnF7mk-2>sOIwzh7W)C{zX4dv zAnKzP8@G^?+{Uh8^FEv@JRO~>#nYAYda*t4>WSlSVL=SK7!>YK{16C4P%T(H&XyZf zW#0`_{SJ2u*N`f_`(9=x^WfU4iO7UrX|l=QudG-(v;h_y*9e?9Ta@m&Mw8b$U&rp&Lq=W) zs7UztHs9B_()E{NtClUbn1dTX#A>}&DEzRjSoSyT-XkPVgjp?5G_mc|dah$Te(e1A zhyr&X$}9ZPFuiZ2;>byf`g^WzU%M>h<_oZKevp^cyj!90a*7<6cF01zi05_pOa1wW zvt{pR`rSQWvl4}^Bd1<#1rN44Q!Y88gi*|4-P(9|u>)uwtYP3t^Z~#l0Du46J9H-p z$<`_~4<4r&ZddGl0e)GXo$~AwMeWk`cwPlXN@%P9zPoRc5-NX;_u&K*2XKX1rvwyD zSn=8)kCiHVoU;u;>MbMe^qLqh$mh3#+x0=$pErEvl_>h}Cb&=hRVb?KjrS`A{X_7K zeLPU$+i1|KFIAt4RZFLDX$_8}^CI+Ejfi3wWLw(u`)XWHl%JY=K~%5L1%21GuFVgg zb+Y)DB$hxxz@mbS;%BVEw-1Q=TOUY_H1W$8r;;H?5A9lH(w`R)Dmu5_5hxSGhV)p4 zc~UG?JWcOTn=A>{C%)@)NWFX{$u`4-yHr`HA*8Wi2?jjQBB1nFoh34)I_E+DB>}uw zwJ(t*4Ri>_h^5*IRq!}xIyE($FnM)DR9EPD8Fy9epA{iif1zIAm+Gv<^j~N3Xx-X{i-%nW;zQnH`F++A=2%{==8IZVMq9jtpauXakB*~% zdY(+%lx3d><8)7<2Op~mkU!9F7}hqF#P&7)Jil80HV!e?1%n60#t^=|8dF-mi&RR- zp$n@X8pDq@F^dT4-rMRs-{T$;-7>r=t7qM){b^N_Mxx6tSFDAgux#TlIh`0Z-YXTc z1rOgYfovVqxA;9(4(nRGfl??5zQ2#6HX)XvyTTpTzS5iJ$Rzg=<9>00qkME^OKO7+T&$An{9DBHkWx7ee{1`o%*7?r{TSvc$ z$Vu_B=vV-gS08>y%IAj)b!?$r4+yP(N)OsBBev?&BI~mRWUpca{LgYlg^)@bFjOfM zgd#(dTlrmQE@UAki3D!T82eT`zQoP39IruYTzA#24982Z&4P(s7GKRjFu`ZpCQuT? zrF?fpjRL>>0p3~pi_`kD%}0->ciw&f8mW4N{?Wgc=HhD|l(18&TCmr=Y67abHN>4r7Oyk?nonfG4-+Eo`h`q1@c z`D=<*id~H%(AN@6!3!RiI522_@7SLKL^`?2y1ZT9Z5$L{Gt=M&tMWJFzo3rA{gIxp zGh)p^S&LUYZ8?SU18zLHBEg*Oz#WzKde0b= zzFU!&>#}oahI^s;6MT0}WcvGaaa@$?ums!EraOZ=)kfLXPe%OSvSy%E9=<3MzhAkB z;6s0}Y)t1P?o@SpwoUePBlnB6uCv^vK8JT%Sp8ucL(}Cht z@A+bbW;qfp)*C*rAGBQ*IBHc3;+s16fm)__wGG+YS96J{SNQDE*rXAM36W8_>KyGG zwFa0i=32>=&KD1CbD0pCip81PL)Jx|E7L-v5qt^G^0~%h3R&KrotLj`=Z&vP?8&xU zH6&d*159aV@c1C#htC?`5o#~`vfw%7V8*&vZ|hU_@m$*ickaEAZ+d=-+lxf9>J{D| zTAQNEfe-ABQvMD~o5VGQOFxdfxlQL>D{!q?te@(9big~jGf!1SJAXh+K|p9eRM&Y& zG}x@0D``dXpZP@a*_f({c896!N&QUhl-B(r4NhcvsC7jRrelb)&#&1ns6dMwrn0hZ zMqNuRh!8p}8eOy7@p4l!_XA4sind|X0UE4vubuVb%8btNV$w~TVfuA%nU2Gvj=;V> zp*o&gdtr%P-uwLJ6IEW*Bi9!8{BpwW29wld*7E|#n@YikQm&9!XpX>*&3$z@CpqXa zrzDPurFvUD=rs8n_#1jyv#le)eh}fAyhEba!m3Q-F>yjDbsVxr$+1&Jx%W%Q6b^H) zY7%E3f=gPU-|#bl#zpKyQVA#~c^6g~c-r=)W;HD0VfeNJvYM`%n@793xiu{|uX(O} zYL$i%L_eHHCE#&Rr9IpaScaE=fX>``HW@)##oy@G0%3ChYk&ZY_e%MPNL52=#)Y*O~UDAhT$pF z*(B|0X5u`pX@WA+_>EON*c?O+csL^7apT^9jltv+Q)b=g2K5w zsZli#wQPmp-S#KC6VJ%|twzGh5{)uo>EK*M?0?SlPM1GSS;)I}RbTrYQevAf3(Q0k zQ<7bG)n@+66No#wn&96C$&hU~STu}KJ}Ld=9GO}2 zNx_DF;+l0k?7_P?|J>XjvfqJ(IF(-;#@ehe(-M5c4|6PbUDWwO=E7;-W!T}x6@|PF zc0-$S5ltwrt?qXT9$qsSHUY|bKgukSza4F&xH1|mQ3MHWw~IrU?@dqr-Uhnc8TjZu zkY(51zNMcJ!};@3GMfV?*tH9}uQrW;T0i>by*%aNUFa=Uy8$(EQxo+LFAK znwmu{JBsSGyJ*N|F;KE>d3z5F%9YjV{#Utj?f=q^Cj3qk-Tuq}AN8RB5{!Ys@tVD3=&5l=W>X&c`60mPFHdT9;Kh1ejngmY4XME+YySv>8okj{k~ zwG_HRc9{oMI{uLYiwi`X!fD`A1eVydCfQx}B8%|CztSckK9&K_h2*eZeZB24qNn><+>~2S8;0*h;L+$4 z+bv6FWvD))J)id^w?Fb?Q4zdB5~@J4D|Rh-BWqqi=Ub+3+uRQiIO*bcp@f1ab?uY$sjasL#D9Gi`k!E*t%7N|lDRLpwSbC|oc zrQP)M6xYD*isD?1sDSl+;Xxp=!PcV%kLeI6!GjGo3il(5Jj%=_SL`wh(J;;VSf#6a zYOm?0$|G21kAYYaLU5x)zADdW(^Q~)m6o()sPFgyID@Tw+Xng&DNv%+_39;@DtB*o zwYOT7@}9Fk9xB}srBt-wyov`_@5ysIu{w;^v5ZH39AECqO67J35=XTKQ+qQ+-JTs} zN1~Uz^m=YfB#ykX5@3V$J4cq#8i}m0cqi(o=q_uYTH}*Dqg`9L{0q)FFR4!XTTXU0 zJj)zNi9S(x!SRXH!<>jZOdIqh6UQa%;){6&w(E0+r&slu4-_%fv})08T0UVu5EC{- zT@oe~@|kOQF6c zGq`={sp$cZCjHuG-{Vu=@TB_yp9m+cRj|p_1qh0%RV9s7+&`sN1#nT1H{fZkVco@< zH(=O-@oe5%eR=4H25;W$#omu@N3Ds*Hi z;T#R9JD+d-1k-NaXv=RNH&-|g!_vf|xuKXa6>r&qjKK=;d%_Sc1OcFV&c(4(ZvY@j z>9j`vk;JeR-sb|#xgj&4dzp{cpUL!XHUHh6s^8E99myI7Say^BZ<0{9@_8*3D6;^+=mTO9$G98f;5z}>8dW%;F7#>*PB zjT`hc&C~^CTI&;fwYw6aq5<1XF6#Zu7e89F5`VG1`=fzn;p}@;SJ7ocO%G;44F#yY z`54isH5Uf+3yEd2vO@4oXX_Omwr6j^Slk*TnP#W8Yn&CRK3xbCL4m5^V z<+0c)s|2K~Lgqxx0Dt$zBavAx!!_t3RCyOMaunq`8`L1j#qZ@Y#d&vhw-h%TlhHEb z(I9BfBka3}&ummYJ)#Vhyyu<1{Q6fOTUf5`iLbGJyjqCGiLo!&DMpB9LpM9nm=@Jn zobMa*5ShXqes%(V72sAlM^zJm9%zX}@(_*?e0u)@;QrPJMuhyXLEN6|>3Ironln1i zD3*lIY(?N5jndOE0iDH5Q01$oq02=KPDy_IqcpJ2E|lym{**l(8N~`XL7|;XeTu)* z`Wwv$0}I^Vp4IkEywf0dD~Z3o-}#b-AK9WB^j5mlW7vpj1q05Cd-(+rQBnw@+;l9o z<}@BW)_RKQIzZ&s#en88OhU8!n$uUn;fFHBMW4cXM`~|wN=t9o_B-MCY%T@yfJY!? z@%+O!@7JZWdBg;(Hp=%}i>xw<9i@tRZJ=K2WkOJZGLHr;dx+q45K#1YUfstGWuup3 zXt>;0bo}vk=5)6s`tMXk?l`amZ|+;nLsydx@2Sx7z+`*%efaCJkU-6depnIP2$^hJ zBhl)CCkrwBo#pW}^@N=kyoKp(7xj@#TVry(Y-*n!gwpG^LdfqbBd?vK@X)9KsT^{y zXH9-6s}GX(3%J2SdMi9&Iwj;1*!-|IeX?k<33Wu#PiFW-zqR8f(LsPox892f;}@9j-cfB%e|~(ff$_C7kpyFT&VLQurPZ` z0|Y@D%sqKx8f;)!Ee0~ju-1ldD!Ao+%87mMM}_sJ5=YbRQb7(^zVG<>>D%YiI2|)U zM!9T`1=Fo&(01M`KxBP(S+2>hug|g_-~KKs%CeI(k!w_w2WmQp3Hq1U))j%_ECJFn zkri+8McgMINbz1Or5#!|9Z$>Gw%m#dNafWw>`mJ+b6brRbjeFG!DM|VNNK>5&3n%6 zs#BzRG0$pJcKvv-SaG`j-r?pHQ#8@H)vvmObIC)oYN@vYWt;kQ*!lt+77D}ce!sOR zeGS61ZI8v?Ug&Z!M+8pUeWdWD`Jn5Jq6!uZQX;QrOj#&{Q2-u;Y0YG>bb$Wdd)b;Hs$IJ44w`GpbuDE^%StoqxIBx0c7EJ7Tg z=nwkrfL}hosjyD){reLUhw!fHiW@Og*ryj!dIpcyQ0qFmnX zf)RuTU7%SIXb<&^DeS^B()JhvAx zo@AV1yo?05WWASYrJtVPgZ=pXm(jmz1a~&Uw*(#Od~Hfodt0%>&|vN^%Mvu2I(oCT zk<7knkI2BQ28G)DG&bdy2M#)Rz#homjUo}ZmB>1WIcH7N%hNp*JUZRqSzZapFO12H zPFan}rqGDCSo*=0nh6!2klT76nFJiMOVqMv7d+W0;b?ACDD2mR*zF$c{Vs9}xW{*N zPtWJ-RnyHi%IQH?R!4=YK5WFUuTPvXf827>a}Ii8hT!wf6@^NsaHMH>!|s}xSn$ch z4P?SljIyv$GxSR+MdSaCyUlVmEK9xet8PKs(2#l{!vlxfa~DqZ{HG~5>8<_DaQUmH zKvUTIX$;m5F7Hb>J@2#k^}FrdCOl+`|4UOeN+C=9TrXvg8xrtaJ}>RtpNmW+J2vF z+fn5?JtM2m=oXtv!|oZ1(@Y~*6^c+mw+6Pc2QsmM`08jgqR(tp=n2Q2O^KIFPJKfhG(LARSg$HfGu12Q*v_KZZ zPj4#Tm*}1aQ78SRjZjpfP|(bJHFUYqtScIyA)@ z1RRgUe5Ld}9sLl1EISR&T1?P^wjRg*&sN^?*Ln6zwU;D7)ep~5IBkde*%S)BybWwr zuj5a2slGkKzGQEo9dsHLU4NTDNZtHCFy*?~H3S2x@xpfgH}%gn8UHt+2H1VYSepDw zs@2-h^(+A6Z+L8-Rk?7LZh?6zL0~e)07H8&DDA?9Qf=`ipvw6VlXo3NkQ zO#jc@>sRRYC0bwWOP9ruXWeHMxuZ_Qv^+Av&Kvie>$Ca8h-R}xm5-0@=n}&}m|ram zvr=QYdO?>?vxZ0-7mHPZ3MF;Er3g^qh$3=YfH%8K8Xfh%?oVVadv!5D{#=SM)@L3M zl!-{Z4|dARW4FyxuZ6=_^u`z{{=3}O(Eh(QqD}QG94lU)W0ua}`Yo#a@$QH0JYJbp z75cn3%m)2i*0@SeJtH%>krQ@FF2O3tp5N#>m2iyxxd+UjbeMO_D6OXgjLdVMmpc+) z9=v}}VCJBay3hM8)zgk`IF;FGKu1u=Am|Sjllc_X{>8umTp`#&Mx;EaM=8BvPi8T` z#;&UJY3c&yrqqA!qHtF}ZCFhnyxg(k@nt_Mj+*n<{?>*s_$%Fqf2Pm3CJ~<cJ1T^%{;FvgiyO| z`DSBWV)rTkYhWmArv!V$vu9mJ&uoTx-t&8wJJZl%7r5jem2Qq^IZN*A_`HCBQGluo zp1mr7XuGL@Rm5iPfb;#h%nEUw$$cPVf_{Ccg_3FNN1hZhiKV?v*fxxpR2hA5b2J5< zTlkTZNzSn<5N^F7r`(=Ca~J$sqWFWsRuJs9W1!Rj(TwKEZ34~g%V#=mS2G?w(F8{r zf0u0gWjFt5<-;UvK`pzeSnR zxb+L+Hw$VD2SEyMNw&lJjN=>FUsKog53c>!T?+Thk*p0Ktt&GA-`XiYHG<;4WTkm* zO-K$c`ttL(G(A0wI7T?vF=@&~l!h@O=eS}&JWo;@K?d|KFm8Sl%L9vyzvgi@ySw`B zan%x+tfWk@gunf79s69ZU9h~Puc~8xV_(T8YkWM5qua&*s#T615ZEenH}geHT==HK z+;TP<`)oZH7;e!0#wCw%dJf$Ag64#*oL04{;eaIp_WaSS&S8#I7nGkKj~A<7gfiB{ z@+$pL8S&=B@E6)o2G<$J4rbM#9Qb9hF9{i)OkTi_2s@w%Mz!6H8DhV@*x+F3K~N5f zxLtPrKPorVE`{&r+jl3_j`)jut>|F;e{est&TnBoSd;r4a6$C`_uTu=Zj~#Lj6(Co z#p- zxV^Os!b%E+i6yYOwN-W<__Ip#QLN_= zDhNf*)hi8Qt*xhE0K@hCQCu`j<@P9+2njVflYG$y{7en=kU*La;vE0Ez{kV z-o5^i;BULwe#?|I5_XKV6#Cm;U0vQwzY=Nax3hlzazE$x_tj8V5Kx}!=7jG2y!B}b zfYud~XM*g+fwvHS8A=FYlr;S7*X?4}_gBCYe_v~+J-u)H8Dwi4^V;^z7flHS z;G;;eUj)r1J)m6FKjk8TeiY{{#kKyZH!uEMlp;Cx_irJ9o^5-)zc2k$w}DlV*5F{Y z%WP`Y^}oeJS9(+UWn~T9+VV?GLRmG&DJXn=cNVzfC5n{Hdq!_WVu()aQ-%KpO zI`AzGAb3ezXoQ1Dluvy*aBP+!b!cFjWB;Rd44EA);{Jeqg1xamij$o2Hqr(&{cUjM zidCDvn_`eneN)LuORE+ec`K_gy{V+ztV9qY*qfrc>Fy3^udXu2e0ZwhZ~47_4`tzI zX+7h(i$IfxB}U%Ic+a=0v&sC)-D=pS9^;$VFTyYbV&GM{^J1kZsW0Qb?&mwZR1}$8 zz&MYV+g}2U{BP9@zdQMKZT&!-8T=zT$o$In5K<}STN7Dg6Z+9y%QFAa8o99qcmUd0 zB98$DMo6^}Ps_j8Gqp%T*W((=-n4t)EP&dKEi9Y`sQ`FBrSj`LyBfpaL&zO0;;T0Q zRc1C*v7I_NRN~c#3GqJeB`7t5oR#sML{9O?)m85Bm0l~;+7&C*9hh0Lg>9U%Gv*^7 zG2{{79=^X{4(HfbJ<3my^s~rEO~4k7Hu+*EvsHFq=pP`K9jOYu}M@EMrES?$d=@^U5KV((+AF6 zrQqT~KiYE1(s)*&V@!mB8|^*GuK+~1JU&SL|FgI|@&*BN{=hj{)JtHjs zq?0n9YXMrb7R4a93OriBaWw}ZHp`!5JJ=U9{F-#~Lvmr*@s)z&_Di$Btn&`rpt|Qz z*P%OUWY?unQyaftD8Jp0(8S z8Tk3ib?uF==9%+0j}2?CnF0F4L1fotdS2no4+)?6MSM~?Qqu3)3(AR`i4Kq^1B*hB zE|4+>HN}XWBWLU7&F{uCuf^p@0?gRX&BKzu3En8h9d!mYNC@bm9IgNAX8PKikYMa( zd4IXW>}08ms+t{f2zO)J$l%SOFMBI~W8A^uaAJPomTIP=m0t^M^hdY~!+LswcgMB_ zm5slCjhUPtBQIu=a#S6p(0h&15O@$@ka+D!aSCmE;gM=?$@#p@YZT4=t>^|EGoX`!~p?anD3 zZZ>O5Xm^?|oB^wE(tdW&&FGlDlSKH*5s41L?ybKHlCab-SsddN{tV$Yu84csNbs4% z5wfcQ(&x7WHj-?8AWht61rwwwJT*11WYal$a>jVo4l!%R-$vg%?Bd1w*7m?Fl%lJp zrMXD&olr>#ypsGUJpnH7;0yo_%PZSRi-Yv^1+9j(|8`Ngw>G>R)QH8zRL_AiiBRb5m`^F;c+zCFT@s;=cwOzgjnor4n9fRV9G+p4iUPN;Q z`!rA_7+4?bg4$M7lEt0KqY2sMl`2DF%|?w%H1HZsvaS?q|N6oy6@1yKAdH;}sac~6 z4pS8lZ}>ghT%B8_xy~nt-Stayp1iIXffu-SzKXF;cor-u3Fxwbfh7~OOi95K1AhA6 zR)sD8eAl6cEv>(-S#He3cLJlIG4x(ko+BnZm^|=L?F=oNu{RRXO46XdCN@qcH<3!d z@kvH%6@1=e4aLMV42cod=2{bqWF8tD?^~o4cQ`r|Z&L~XE1J4LwuB>lI>`BEl)CtN zQNeKMB06Y5g*ub0opr~W+=OC$PB&pS2MM2-CbSMpp~U^knlXKAkIU{^4@DzNePU3h z`g~r-N*8hefA{*$+J@BE0@LN=|-l3vqHSwLT^e_^^5CH z*;!lVdjN|;o(Blh_0{8G3gNxlmOiE-QEy(Do#F_rx++=|t~qTNpx(KP7We`?5Qr81 z&_1k6UO`Qy)6#^G*9G)0fh28s*9KF{*1s2fkFED>Zp~LzGX5Jv>4XnSev1kxbe^?O z)S|grVpc8%Cf3b>WZEyB>kM}OltmC62wu_umj(mp*aXB;&)EhPet||QgjTa5TyK%a zQ9{oMJ#lQUGct{JnL3b(5GXh@!|2@zaFT4j5O{25yJXZb z-?Xckm;WP-FMgHH%#kJbe@JqpVP52=U7lU(rT}20R-SX0_D`b8ykCiLnHV zP^v|i@p*}Y>~dv(j>xgljMCx3h#1B~&5+q_RYa8Gt&0^kN6O=5-&WX{U@SM>6K;sX|eV0^TvMg|p+o zhIVyCcT<*j@XzFu<0bYIGZK#~L*2nhjs&&OubVXnr6y4ZT2shJIG%uu4@AH>i!Orc zTrl8l#^r0+t0e^@+VPDcx!m6IBfxZyB5FA{!ED6>A8VPr)4wPq|Fx8)GApn^wkV+3 zWzP2r367c#MaSL{Se_MwxX!qq^WI|_oc+Z;$fc8!i$o7Sxv{qh%+~A9>t6zwRxdrm z91guCI_iipG-kh@)r}Ysv%XhYnywi+RL^Hr!E!vGY6C;hVlk#`5XGsnrhoWgpXlxi z`qglT!mLw6cLV63j&?@kr^`3aI8PYGiqgAaIPwZYsI{$UMcCr+#jm>-=Jwg%{!#g7 z;8^R}!^vl&O^dA;^exUqm62hKz>-C{Jor_7P3m~pg|2E`@rV6Paw3T8+rQ(f%uxN$ zq&%LlcvRW*#|v1TJp1ax?>QTL#=&#c*D40xbaOT4TA3bkzE+5R)BDx=m}<$t(ORO* z@cEwJoAfn1$l|j)#^*&$Yh}D{dtV!Ls?Sbm!aL_8fBh8C<$0$~W3~`3&ZS{)Il^hz zFl6@0EC(siNh#r1kB2?t&Z~8tejw~Kt3)y9(ltwxI@aR?9VJp8WW0CIg~=ws#9Tbg zgnLIT@Q=XFcQ3{5w1_ZS=KbPV2+*0hc}cu1q*6mbF>|v0)8Eb*4R1L-|GHcMhtU6J z?n3MDsv0Us|EC$Cw&!0u!eU(#Vi0N_=z;xTgEu~-c5-hY_dk6x=ajJU+(KU<(eVm> zs`1|E?jdWp7dXFSS0i`PvkoU|?z!yePWf`Nh?2spKGi7n5R?FZ9uDxiCuD;gqWz#pY;n8V$OvVM>1DOTJEs)t4YYp=>nNVp^WUbNG7!G1(*I6qiv-}RCIdUP{GX?ZjcP2 zTqFKvE{qG~KCZ}bJBA$>82i~gMe55x+;a{>L6Q7jYZ;LOCq+Sw3v<3aN(3+etcvO5 z-QA&5=3=DnZWcjJ+5C+VMq~6} zrN3dF^;r<6Zd*awI3;Zc8$_%U0fk7pG_vTgDV0T{}Dw`g+1Hn7jl5bR^vBdL~8Qd zC}|p4XEE(&TXact^Ll^1PHMUu2i zX_utz-Zp0l2FCwejB)0t{A(lFDkmgvq}RMojlanDRr-vpYXw;>DH$K?!}>38Qs|x9 zx_|{7LOy9w6n3w1y&jXJ*F7!fB%N@+P1fBF;wK>n39<=NIW3SZB}T~OHbau(3}FYi z^)aWO1aaPH4CKss2G!A`j;Fo;u=+pr_D<~-_)6brN;X9>9y-3`{TFTf7fgTsK)5Xb z)CY@U9=_w<9Jp%VM2h22x!Sv{7lsyunfgWgaTC2kW9jxM|ixRXd*wSW${KJ zng6Xil*$XR(zZyO=$IUOhj-2|z4^hh+_$9=59tN?6YjzO;Dpv^Bz{f)yh}iU+>Rey z`IIDa-Yiu~(6Xv0w>>sV%uzOkT~a2z=YL5}K>=54tfz7|ZHTrwN@VR@_1v#<2DbVM zKeZ%GgQh}X(XA?}S_5i`-l??wy=sIS|L8;aBQ6Yuwel%ct;C%gKjX+Ha<&0LyiK)+_jTdn_+fyMXxJdKGmzp5;z1}hl9afwJD5FEKMs1lwRl>WM!BRsXR(A)G%)eK&55f=42|Kj9(Hjoo*CcGGh7_Y) zV_A0IUu!&=m04afS)D5HMz>XR0va$T!TPk7Hqh-Q2BbaIJxs{n?N@D#Dcuj7d@y;`g&Iq)>_e$1DCFUoDIV zmc&jKcKIhe7q_&psqmuT4nHc7-;cUuV!{8HroeBfvn;~?*&79-w!s<<>`4XD3^C%j z?Z25~)62}*2XG%Xlb>3X{F}?8?@YuPRf-AeT1-iS62xiypA_B>{W0EOqT4n`19OII zFkCZ=w{R*gKv9WUW_Nz(h7%7vegQnBP}a@=pAk z3Aw_^!m)3C@3UK%ETpvY`qBDd7sn}8^erP98VqX8EXiDLdMSk$RiVY(jUM3~GBy?L zpUb425OVL@d4ru&7Z$Vjdu^pw$D1e0iLD0PSKvRHSS64T+T6P04$s}a`zX+^#-2^- z)?}e>{(?BpjJVg^=L&N!O&rN{OA^J5=MAs4swRPm0bgbP#BT(8YD~>4Wd8b@q_yF% zY$20=N1@2rcjeQQ3|_NQE^Xb3n`w$(8ukg9QAI;`u!BJZn32njO?=lA_R*HRZL*u! zOcqL~DU}FnF~%nFVX|z=YcgN8&TG4dbYUgg%>E~JO?iQf)8w0oGvX%pTQKVX#$Wll zbLw2AWa+5JP?_)_0m_r>iGBC6@iHLHnr5lLZzj5d)!^#<(7=R{QJ&5wJAB>)d13mC z_e--Xal0Cg_IBsyq_jZnUGOF6<`G_&-?h3BcF#D*&VvrO^)J%u*$r$3KMGwpPaHpK zaQ)pd;e&s1L=f_@)Qm_(442@ z;*$SXi^y|n{rQ3`UubaJRvum^ESr}glbM?xQgo4gR2fWM_aw?5c|_`*ygmq^$vpM< zy^-mXx95}FIXWUqO$~x-x{25L*u8=ug3 z$H&6PC$(JUtc*C^vvotn&+->}iXllOFBSG5_nx_Xe#&pX!saz2#-L76$TTf#!yw_V z`TWqcM$!fg)8*9C9zk6E(Lta+(WBuG7u(6=twsas$Ge!>0yjuLcxp_X%QyZB1O!Jn zvE)=Xp$c^@>m(axO;zM(hw@@$6ahwdT&P?{taVl9^6#eYCm*YFETU2<(!IWqu%ngLkA*4?f3ec;Fut;0oow{Y>dvMcnuw}zF zp7^q+-B(<+RQi>-WNv$*ZiJIA>_w*c+V@%ifRwruJ7iU38oZ}^SfW@jeb(GBGjNK7 z&D7p7S(3P~o2y{88}PqT5DGv?cS@b3)r@Aa8Red`Q;^V?Jv_L^MSK+F;3i6K9;cl~ z<-GLan9+pvZPwqR=o)$T0`p6@pLoX|KSEp)-j5Hrq7uG+S5qZC5|>}jmJ+vo-RjOv zg0%Wh{_J2%?fdHD@G zL<$u}C!c)*I=qi>#we~`yPC&&+|Sn9sw1I7Q#YZQ+nMBPf^>e~;HwAP8&g%fIP5r8 zu`!`R$B!d=(lWDPr>pL*{iIUZ{d0!aKRE1KJu5N6=z2EFuXFXam`V6LyATmqQ^uyb z?w|1v!S2OyNh-XYwcRe& z=@G!>ziCk-55yH~s6vtne2yLzVc+&kt6&_fwZ2;&eo9BBrdU_Rb*>S23=&nfv|W2J zB0OsEj*ikBMTmXhw=zNC*2aqhf^~grqQ;j6st~p{Dw-F&}G1 z$M7d;3u|eN9^iWqMID$m+TKOVR-+J$lf|2`-1N^K*v0{3(AWXY1QEpUrCPK_-;aKw z>jLd_sh=I4+k}}<;U>S;Az(A;RCIQJc_^G=7-buaDblrI7tcAIqzUllc{}|?ZbqJ z(2!GgzMxp+((IR<%+De$M-gr1jTNBXMWNL>jzn;**!)8%?c+ehiu3^B$F^iIZdSI@ zIkqa`Le?qu^l}Y~$#JHw7kCFy?6Y$ zW#b8P)25S;GDWQs!sW=)L+*IkUP1zjKrIOKNkLt%)5L5{W(#u_mRQ-xyqY=7+ht<9 z!rPo>Wxs4Vaoim*zvz5yH(d6)aa7E32+t6IF!b1DD^ORHUe|b`ftFCx^Qbn3;`nE_ z=W+w#jfP@e&eBb>IO%x_dyAB>(~^NXThe8gGH+w(?D-%4ka+fi*E<^+VFhsPwHx5A zxv_(C&v;%vNT0`E%W$BFS(5DD`nO-}5@#~EJQD*Bdv^BEXM?NmM`_dAx~vEse18&} z;S&~Yu;G&-ajQ6~Lzqlt3HmeUC{gNY2ylWsj+(^c!Zio}`E!w?EX1}7s^}3v>;n2Elshd*Zd3%FvJ3ZlWS7%+?dl`+rW!6z?C; zK+?AzN$mC2iwBM{TRi#jT!^BV0$V)?IuwoT$bffjoT`!rg7>T^${6m(f@)=XS%eBLbszSNHr8e|&Ktx$~=>aY`U?bAbWNO9*7YvAUW-$DDg8mkR{m*D8^XIdsos_l!?o>JmrK z&8%EEp9cmwO?HN;qWh^DLY|!s=TLZ@7E$etyRDfvS^T&A$#DA~PoI4lw;Hpc>}4I}$;tgm2dD}q3b}?})1YF2EDN~|^0*(6G-DEkuaw$?t6Lnmq*38)D$6a#eO-DqVTm^0JMjY3P+48h2GB8aLRoVy* z8bBzda)t%fWzM7EULAA7GVqcq$sAT%W0TD);rAVhe0?O}Z`#l*F&cc!V#<-=1MfZd z5Fj~NdNuV8i6fz@c8%Oh47skdnYz+Jk;^l~U`;--ex_4~ zO~W-0oLCp3switv_D$_r4ynx$&u4<7d?V`7G@rFQo}82Bv`6tsCr&7mxqWUfS$z>q z`<_H~796O=`Z~DyuKe_)>U>@ox8Bz-efYg1HTC4aT0A~(Lb=yx3bHR6QhwZsypw@VDLW}_%mv*;QNf;K@(^{rhO%spl; zb-G6$lBt`(P$dZrxims4WU&Sl;mD7IzR4=-EpZ{rK$@abl!}eAk#$x0=lK*{x&RU^ z?z`Hb0qidFCy}^v?ai00QJx$imUtYSfi-6*nSNCoi2_eol8@?jj;q-7seu4RZ{p%~ zPr~&P@9mODKD8PfVHeY9%`B#d#pS0SB?#;W>)`yGsK0KZ6OLiM8Qa`rxVpT>J#N1w zqC9$EVg7Z#BFz#Kw8zZ$jo;Y-a4Y0CTPL~#Nj^AcSAXjN)u5}tUJpfx}Y$`p?>2|hjt`Cdt$v5aGe z3MFp1&X2=4O4Wh2Mmcs+x`h=RvA5jRSI{H!&eWvDZEebUV8wT4aI}ED@z}!$IF7Ki z%3gbh+F99b*w;Ac)#7}zZ2ymtKX=-3xt;SQSb&|MEHp|HEcTdz{iD&z!20q>@`qSb zt))eN3HY(g)$Fo<`NE&j&6}J-wch3yGRt*$=S3pL-IRhi&PA@!4>atjT)V{SwbGTchp}8~!hivj zeZSy&WuWW||Bk7V;Av3O)|$4* zbLEzRpcS6kya|_+1!B?ep4#jy*S3zaJ@tA=8JUS8xWa*OW-n!2JH>}$U>+Fed2dGj z{qX3mXYjM=1tSHkyH^(_e4L_v9iWPSz{#O&L(Y=C?wQ+*eKXl5-#+%8dHd_9TASSQ zIv=0FkO&iR(^cX2vs2efx1P~lDW@Ol$1G3614GfG(w2+LUp(lO)|oFyG9wCAE8-W? zbFS7$?7#4MLPB_4tRT9nky>xSctR{sW=oYez_zn@WSzmVWwM8==}GD9RCoj;tOgvZ z#Jh^avDDfG1hy)w7n>MSq~3T7MeeHYD`2?f+FrSW!A2B6UEBEkWDeKOGM_w){_LYS zqRoC*(2fC^!xNWuYDEMclp@=DUvP>)_0?`N^)wyBJj6PFGq6e zXc(Pmip;jIw)_d3gMog*t8Wzw>6meu3Z@VsD!%eCs>Lxcx4oZ3*fY_Y+WlSC(smi8&0v9p2bejR3^7Vec?9f-wLpvTD) z*Zz87EK>UE=U_RKp%m@fL>K5Z_$;n@>P6V8HB}NbdH!gM{6n5_QBZ-Uv`|=AL{z{y z2rd;uRP!OK_TR5?$+<3A6)bZF{)=55)Hv`Xg!_`zY8z60ePV{FEzloc>2_>@6mblA z$^4J)G&;8Fa}x7x`-vNW#Nh95V{0a@5~8;??B#s<9yRWd@RJMEACWWFj&U4Ehb(My zBlsH;`y+1Tp`o0N$zv`}$gLRJPcRkj5JUK=rjp5tY7}^>0I*~C=qJr?r}bH6m1Va( zFTJ@J$wsV6V2>Iu$(gn3wjMRgxO^-3C;UCqdqM4VmAyvx2URDd&apjsQ6rn`oklI^ z^vgU_pno{=>fQYTJewdrzoS|0o^VQxMiPqIs=>_V*`8%$<0Xk_BWjUp4-9rLM)5DR zDSf7I_OZttPw?SLU(&T$;Aij$W1-(XlD~+n?|hy^8BOhJ1*XgLpz`({+xdc@LiX9D zt&BqIt$@|o0#Q1s;-#vuO@*zfqHrpMj;9NFUf0|7DQ<5AecjM|D>` zWXGnP!ah0Aw;DdDpOdtOjAkYz$x+Fs{;Ok#_C z#Vdw@@J|n_FPa(S<(bTz2Jn^?dhBwiKooA;$l)?%I$XFz`8BkuPCmeuRL`jltVefa zQvxV@NK3`gcdtOF^4>kXWN@=FvnW6UJTg%%&r5HPfJhv_R-HxWgD-CaLs zv2elIIhgWRlN??JriZun(~t}+e9OL-eUY~-W5d>zvQu#Y%+cdR7YDsS@jK%x1;_H* zz1s8rwe-JlZr2wN;>}{Yj(-44cvrXTSqafC=kuzIBg2Ycwqw%nNc7b`L{2Mo#T+Y) zJL(&&)dZ%0UsIhTfJbcH}$ zdwXrj%5itmgMXwPg8sSAsPWIhKc^E9q5@6Lg|mzM0o2E9*ghN2Y{XAA<`FfVj8UCE1Td@s*N+J(FYE+v1S-dlko%ApRiF zy?Ef5#vAbf)G3f`{Q;O>;JpkrOPsdAf&;QN}Tqxc)nlU2*Q_Idf8Ra?ScfsW}KRf)2n%ro6A$yq&0 zjd^=g@O%?FCta8<8fL?EF^J%|dvplDTtd=|!X-)tMUh zO6M7n?7lGD?lrK7tY5Wa{fHg|k9m{6o14y{NtMwQ=^3B9m{mp0^Sy~lCEkwi5$kth z;cUs90pB0^S9rQI z1kGWZv(Y2lVYAw$wsm?Hr~7)M@>Hf$+ZI3Zvbb#A^=oJ34oI%!)AhpU+${X1kfx*u zIM6`Ayx{Id%&L2Lh6sd(vEs6DM7_R|!uc`(1yP9~(#J;M^44Trm@5VU2UTsa%zfnm zHu{|-iU#k3y;#TzMbMo1Pfn+9DZ%=5a-pfOes~Zq(z$(-JaY+}`^gwR?t`cAayF>r z*|Xg1%80bq@yy3w)7883=A_{)khjPP;kTB;{l2dcO< z&Zh5=Weo~~hGq5~GaopXJ%8F6%yv0_Er_qC9h&UZJiOc(UwUL?i^#7$0)+qII5i(y zUcJG_PDaeBw|tcERLtC-PDfCLvb^Q@c>Df1T1L9P_8wnIGMLO9_KIEfvc!jVXhuG1 zzsI|&QW!qmJn}o3e>yYgG+|(W;L+*CPz>!c9ZOA024{2)H$AUbl2H-|6}!PzoKUZ` zs9fN%z;ieWldS6>(qaSpCWpZ`>vbsdUFt&lGBjV%|)q}!x z!+zrI(tg9EPiA#Q8@o-!QS#;yM6jAyWCQcMCdeU>-nYboo==ja0@HIQd9>rShnQP4TXG(%2L&vLF&Zho_xYdjqmXFqJV zl*RHK%J=sLAB<)6Jx!dPW&raKtYzOq#cmp{{c71|7uB~KD^b_@9qI#$S>zGctjoD; ztDPOAJN)YKI{-TfE|JW0Rs%VWWhtMP26P7wOiuNfvE#^>zO~VKrlAj#d9JsD*M|&Y z)-<NBqBT{l&;PZ4D3avP@7EaDmupL4qI)aTS_=b`({HyAaqDtPDT zAM4_`i}Q1ylRb%|#IZ85J+*NgLE_?>L^q4JK99@3Ae3u$ND}+6r>SHhBf%!?d8{tw zg9Bk=qy1dL3bTKz8(Bx3%0Fw2z^q>Y8IvhB+r2ttPG@z82Q*vX4CJZnlpUNK*a86?*2{t`&AlYVtLM&KdDpD!1OS z3t=1mkuclYgT>c7Klfa9<8>h`W4|i{PMwhg(T2J=FHrS+E6%SSPr|7I6tGfnUV5P- zl|az_?-OyO3e&%?+p&zl4C$JZTKwn((IZjyF{|xAxNoXoaCVqcCI;5UpqKN*E58TKnK&(92>K)e$oOfVKLWWO#D_8P0j-^IJEq&uX@;I5mN75W&vgmL? zl*oFu_0&3j94>uy^P5BmCBI;Wb90?Gf?5TeSRWtGsc9Lp$TKUU9V_b`n@N@p*|a&NcWe;w9w2J~eoG zM=v@7^-)KsQm1TzcYN?CsTS($nT(f2EjhR#TQ`Sa8gn#NhngbZ^}$E6_L(kzku|eF z0DpwV*=QpGiwX|?I;AkpQsZhXZ%fVnmbEg_EOjNnowxfrcR9=DbmyaxaE_Y~8>plL zEl=o!3R5WZqsqN>c>cJXzg=PbJ|>ACs@2GBbIk6&dADy3LT$M^!z;LlrMG@9+d!x@ zuTX5%+~!Uxx81`PHC+7@!YVpeE2@6L84)C*Et9Q;cZ0|%D#2g|)c=T%yw0LwqO%d; z_KNbWdCgjckN1G1t4+BONIyx#=}`)V$Rv&lbJKsyj>=qD`l z^os&S&coG!nbf%=E!c9_%%yz$G;Q#JU@_KgJN(AMlpHs2=L@IyKd`Tigy6P`AA#;LDcjckY4g z)X03Qdb@%XeR6@rxvPOmc5MvD#1^1>0#I$fPI9I!S3RQ-cnMY_Mzt} zgH|7V0n??))#arbmf0(mrl%Q@`hlI;=2z4Q;#(*xxkV!wOvH6Bdy4bdzyv!g6R)~e z&XQ3h45%!H4+edXffvL}^^G=dNrA45gEoSq^mkSOh;ARJ(wNwiz(L%Y9Q-=(57w_8 z!TY}_XD0pa&i!7}tFpbpj!;0m)u+;9gQ@s<0zQiOqmNr^P%rAJO1FhE*dA%q>XzND zkHHO3`cF_*C;kxiy6F%B{5>q=rBlzP$c5qn=kVSqgAvJ_o|rBRSDokjjp>Vx`Y?9+ zQf%vDfH>p$EnHW?Eg@{rCNddAnSjfsO2-&EB;XU5Pg44$c54<70%30Zg>@M{u#L_A zdfSv0Xel1o15@BfJ^_7z?zY78r&e+2G#)}Vr5SSEO(4WW0pZgwgq;5g{FciNIbm1Bxm z6_RAV+<$}&`fP!?!9(A%y*pVP%u$C*YzS(XzMNKCGOn;SwO=cIG@c=h;T6f%NxsHq zsg%70M5EL>E*sha(C$;OqduQ*^^0$Zb>@C0akIL#M)aDpFAaNV-JX?r&E+J+m`nIO z4ehjYuL-Kq_Bk8fx_O^2)wn_;vCsI+UgxM+813P^52* z#gY3KMWCnPcvrj$K1B+MU+@LKFS5@BzafQQ@{!Zx;k^42go)xvxsXwtv)(T1*pi2+O`!y;4<s<-$7C<;!ROQh9%bnuJcMqQ_Zem{k7oz;w0FY?rZXlNni8! zYG$ugFQI=9Kh8uc0p39Cdz+Kbw@(ukeoMS`iK*Aw8K#jK zoxCx%iKh@oKkL0oEuUHq(6`7a z=h`KDlDS&Y&~6@KqpI;6)yGEed8Yh>d-xXRUhDY#rPd3x)z_mxI=5qzFD^1>d{@)j z-&I(ukz9Z2CgY#(fG+b-(dZ0zb5vR-NxdR&=OxdwlK8&oI*~lQ$X&so9kegWTQ!l& zZG`*U$X;_P+x;>bA^Dc%kU8^)X;#>2;I@X!{jnhc?d!r>=B_d&TxNQ5>Qs*pmYiX< z8blN)@|sOYYJCQf%*E-RKX27s{bFe^X5aeKdU90+?A3{S!s;9e!w7}3?n7|lL3gjT z4>Jn*{Hu9<2GDvej0SIXRT~{=Ym9S?v{h(mVxEu}>9vxoA5jM5^U~MvrjgJFCO#YA z`fjVlYIpM>ls1S>#dyV!$G zs+n5N?@!82e?(;xDp}?k*-hy;v4?`R*Oc; zNm3_so0{5?WkXuD?`HZZy0~huO^bbz(XT2$)G3mrf(n8W(9Q;rctTI|vwZHp#VUu{ z--MCxQa0)3)w{Uh#jtH?fs{mu?+7U!5{&WhY?$9woX5!)9M!-a1O8;agO)k6f8I5W zt|BJt+R~?eE5uh-RpJxLdfyRSB9=f{hS{8UZX6bTeWXY@r~%7_8qetx!t(mZ&!?R?Px~s zF@4{PPwZhujeH5n)}T!e$mV7jh5Qqj5vq~g<^4_^lLYcMDU^+V0?0Y#6i-^ECYxkeX6MFa3V0+6?)uN%5=O@oUHWw)9lH< zaik7&{^6Spm)3@vIxdeg({W0v24@B-RlSn|E5jc~_UzXeBc>!+Lkdc4NfrK@ zPj_=|P1=VmcP{<;q@3Kc7>|NgRW^4IcciOb9(fs%Bqi^cw6YDrMe+yJaprw?cYl1m zx@6b0?EV5;@MAcI*7;Ob{FADi*<7VotoM^wGV=`G^n(UPi4C{Hwr0cEG-zY`n^Cv4 zRcCg&j*r*h=t2Tvw(9&tIEu{bMfmOR;n9~{UiS8zqj`<&TWkAV00M-eDF4HUw8dYh z3nA}5j+;X!{KH>ZIvJ@%y^IQ@DtOy|nA)_pty^GGa|g=ky#J8i!tEao_|$E^&%P!1 z<9*q=>)#FhWF!~2RXRw+JXmK`^~QA|tDX%}=HLIsb2N24TX#Y(-e>6(a)oNpN*fER zaF@PLro11tjvoC{1ryw_w53m-(2^GbOaTft01yovROeG-+OV4^im@r}X(Fj7_0t-& zLPyz#X9ubT59+GTz{3gqS|JXZvegetF?V#z`g4*d8w=emhmhhT?X_$&s24s^!wRH^ z(6o6J?_0!~s{o}H42}{2gxSRd@kMu-ey=5q&;P^Sdqy?2g<*rJ*NTV;sDQv#I*3RY z5Ks}28cIS5O?nBv_aIzBsY)mG76=e}=*wMpoHM3^TtTp?O z2+1jXzh|GfJkRqQTUNdFJDW&hUCjTW)A2zlcx*muQ(&ypNlGplr;yepffLeJ*O z>{EPp5-NE*7Nu7Bn%M?s72Rn5F1~mpTZT^kvcPxVzF>-%H!!&RMl0p)RS9wb#YxMx za#VhLcVYEnW{QVGzy7C19<9X*hDqHzJ#)b=7jZ?G2|cO0B5(8WRh$HJd@u198{d@R z`T~fA*Z60j1g9H$*~N6k@yNYLW2^z@oG{2g8eVgsj=l;ivZ>IGB2!CN%hDzC>8*B8 za(OgQof;fWH9@{SpL)1^cH88@FwoKW91?AM1G;~-+_&Jr`PmYSy&h1 z=U02PFg*{{G9MlZDs-N>V#G0i;Un-kH35J7W8k^}gcg&K&{ANLBo-=Jepa;c zKfh{^0qa&}B&I$nzM1)+Ec}|9t$xhrZWvZRQY5Zj@04getyXy#uR zB>Mv@{R950QaMhBBw{6g4~yr2d_r>YZrhu{A2w8eQN(dUfKVPr|-eg1CZvYa$o7dFS&QsUvW#zRopWc`+>ewi5fNy zHmJixp=F{Bl|(HR2Pgmsv||SlusL5eEVy?g%8D>RYVqtqcv%Dhe)GwSXn8 zh&ACCAU3-Ol}>*=7ga(6fHWTw91AMu!CZF#qNh>c;KS>G$=hkLsC}~gWfg@M#egU) zL%7I08;@&G9s<$l#zFlO)>wxT@O6>f=dM1=4N8k$`1^f+lR|3$f+)nVs1b0C3l3fG zV=lA*f%w!dqZM>#GGBkxiMKYj8OsIaS_B(|l;mDrQzTEB*Oi1F%4CDCX?Cwn;52NF zW*_0?uzf2Nh?=~E-Ora`Fn*??4_#H|3&(|?Dq=Yvs;gzlc0aEw2cCK#G8!9sJ?j)BaZ^ky$|T2AbvFh^5q8hIAD^GB{{9j9(%nyIyx)Ll-hlR=(P9wqf!9nJsdoJ7|SAUu2uGG;s5erZDGW!e0|_sg+<*X?$!RG$TF?8c)D zMEC{q65DcNSc|JEX{ge9X{XwcWS$N-?IAKC_rHaouL z_t`)5PKR?ay@dci1c>-XHsj>wRRY}RqWfGxZMd1|3$_npi4bdT&{ukT@4wsdTkH~~ zsp~28;`S%MlR$QKMVBZqq~HwXfJ^USD}apN!Oq}9wUBhk64uZCCcsXxq)o9w=r^ZO z7!{^Iy&7mQ?IL`Z#)RDZP3Wb#3*B3h5a8iA*;S-#xLMg0sHZSY_{Co64SY61wQ?#A=q{r5CCiJ z+FRNngGesPw%qjcd-LgXVr0Q_%)`P!SQdi9?{25C4Kb&fEjvKe_85)qAgX?p3lV(k zzj`26jm7`F)u!zn?P24Q!lfPK@!C;pp!7X7ehTE%i#e=fe41*AF|#}mQFkjY22GSy zQa$+|hM=o{Du=c1`mhXO_2eUl77Y!2i7@}9r~PLbPBs>+LV!xgy-t387_b`xSI+?p zoEJP#MdfId=lgt)*O!E3_pIFWr(hpxXmqh`Nx0L*l5uq`o){b>Ds(<+W^?okDQ^l6 zIqUD@9LHi8xAUCp0}CO)rJANLl>JYtEF?fe;i=g;^9mqO|&r7i$M!o(dQM`J$_F3=S%dall3REHZ?cF<{O(aD&4^56m z-whAFJ$kF%mFS2sUEEePs(R1M1kn`sdQP;hGL(59a4a$NOy2Wf`yXFe?!Q;*%g57@ zBlT6=+C~y!2_*#UI@nzNtrr9=fECU?L3qjWW(4*~Z^s}IQFeDP>chwQljo?EGWADg z;(Kj%?`u0G(62FFU%X3df~Mn-CN`^*=?_|@qk=Q zqDaxdqe<*vc^ZMyat{2Pfq_S++-m}+((kQFZ8+yB^u;Y~5s}S@lZGS>XFlgZcXjIj zVyJQ;+sH5KRL~3HDhzzo=_Y2|IyqhQ_IBrNM|%Y@Ynd`$PKzffR9$S^8Rd|!=SQnrYqZ%kac&=5v44d~UBUD%=9bF)@ zCSBU=o~~W+yU=`575nYm2Rc*JSqQ{MRe0=9R-&yH>LxcdSDPR9n=n>LrdjwR?txzK zYtmaTC*Cps{?I(7#6)!GLgz#j#M8$uL1T5_E$V9Dn&zfiFF+mzB#DM{0S+O|C4k7# z1J<`mFcgq8O1~Q*+?C9wS!UMRhwR+F1n5}(9J+3Wy6@ZCPBb+ObybHd(CB`b9YB1h zTwpP2bC+?%x9kK|q(S>l{DtHtvR*VgG2eso$oF`IdcJm}9pFmKA1Z_APsP;I8{xjA z+L8eEP~RiBzFm~;EpHhz&GrLbSQI7TIY~yxBooi=+|K>i@29U2)QR|dBJRc?69c(O z-q#P@QO&BGf!H}=qF_sS$6_8mC~#rk&_?i4O^hhU67hKR4_OU}x%6T`5v*FH z(na}-@`)d31_WwEMs{n9Tmbr_3nWbyP=6z-V%4j%mxDlV^#k`@0Qv8p3FZ4Kd3g^O zKE77K<@o{fNT|DwJUD=KO5~nilV9*sF2d_a3=q>XS@;wqp!bKLFP16s8~V^6)bjWwg+y*d~6^RV+DUxyHF4`=l2 z$_sUbNBY!mJ|A&JZnTji@uk0sf&gL|bJ=bisAY;`x5X zy7o+{_T5q9y#P}!*Sp$USp;bbOE0>WuPyKUq&=+AgFjP}C=?`u1U=2X3v4a+#?@LG zOVgy$8(a6eJ2^{mzdT!eJ)-S0&jTV_7DTo&#sDZY8FJSYTI;Xy@+&>{o!MD)a8Co~~TTh8HS% zH99`B$c!}DWf;2cQnK>mt7aMXm^Liwx1h)^bZc9rxS)*L4$OlqhP~%pyJYBys4^!fK6P-?+^)0r?P zHXenVf(T_Oj5anCPJc|Mt3}7Hjw5KXdZCfY<2Gsxe<#!*~nT*laHt+*%A5ycK$%p2;@S`Dt0f2YNsYnz*oG z>88aWS7?w`3~D>0AT;LJROnU`My#(c`fBg5`KVe;R_(WL)%9N>xhvk>yZ!a!L)XSf9*ec3we3k$9hs`o88mdM%aB0j-!+u{6KIftxzyD=G zRDl}U=pL0CH1W%xiXPBaA&5`+@DqQ*iDvNjn7D$fUX5kb##z{Jf1psz*mJC4rZWrJ z+4WOz85C<|GW;oyKvzYe6>-m0%VuefuJ_2VF!9Mdige1;DY#9N_H{9#fZkx1-2_Oi9lna8Zqxjnhx+4bZW^Hg!c zp5t?PRDiAOkVe?!&~R4NdSOizo#1?zh4hHXb7Nm2y(k7bl~ge=lvA8`o2yV>U(ar( zRr?GGvQ)a^VtsfO5QG4vX*$1M1Lh+wVNoZ()^xZL5}knSfBXpfS`tu^V~K?B z^u3Xbu(^Co^~6 z55`E31BwI?&EAY7sH-@&nci`r{eEyy>JJA059z=&g~5LQ!dI>Y7f9Pmd>Jw3c62)u zx8aD+Qt2e@G~gO5z?Mba{cT~Zixxd8z_nQOW6GA+^VeS*)hoF=(xG40yLr2 zBfm7F3RJD;Q1iSw9HsSucF4Zaz*kvT@*!@dR76u&PiVeDlR&=e3;NB zvE4p{Zj+cX6vH@_lpgF!JVFMCAVpgpz-@DhOx47Lx_avx%?B)q78OzazRxC?iI^Y) zkDXd8)egrtw2T zj&+KuI5T8gm|2UYQ;L@i`PGK8!O?sMCc$}zsaBA$q>L(skKoKaHNl}yl>d3YJ~^!S z-HSuJ_rYZ#^bNdHZ^NwMhS@Ci_TvOdBT6#{DNiwUlc8<}khKXX&MwvFjp$7f2 zrUJqxXEmflnc|^M1J_4|N*48TQHC8a8B}xug=RpR#rf6xrnq|fMmJZ?dhLh2M=PZh z3saY9vNcZ{WM#|ZteoF~>ueE#zE1fzzWJP|>-V$EjRP8)@JhX)ll_KX-(d|-?VPV6 zVfZDLI&lSaMqlE23bo1qQizntA1e(;MsIs{9;&E)VdwVtsuyakSEFh4l0UZVu$K8f zhk!V7E$p2TOOWWfM+c1?7{|>5C#t5n;kql^@M)O&cncumfmC>!Ny_dn6*=?xu>2m= zy-t@O9a?9hT z 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 mXlZ#lEWmglZ%^QAI)Hd6k@b*#7_+=CFML literal 0 HcmV?d00001 diff --git a/part4-mission11/infra/s3/policy.png:Zone.Identifier b/part4-mission11/infra/s3/policy.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2x/dist/', + '/src/tests/', + '/src/tests/_helper/', + ], + testPathIgnorePatterns: [ + '/node_modules/', + '/dist/', + '/src/tests/_helper/', + ], +}; diff --git a/part4-mission11/jest.config.cjs b/part4-mission11/jest.config.cjs new file mode 100644 index 000000000..a3be762f5 --- /dev/null +++ b/part4-mission11/jest.config.cjs @@ -0,0 +1,7 @@ +/** @type {import('jest').Config} */ +module.exports = { + projects: ['/jest.unit.config.cjs', '/jest.int.config.cjs'], + collectCoverage: true, + coverageDirectory: 'coverage', + coverageReporters: ['text', 'lcov', 'html'], +}; diff --git a/part4-mission11/jest.int.config.cjs b/part4-mission11/jest.int.config.cjs new file mode 100644 index 000000000..7c7379c16 --- /dev/null +++ b/part4-mission11/jest.int.config.cjs @@ -0,0 +1,20 @@ +const base = require('./jest.base.cjs'); + +/** @type {import('jest').Config} */ +module.exports = { + ...base, + rootDir: __dirname, + displayName: 'integration', + testMatch: ['**/src/tests/int/**/*.test.ts'], + moduleNameMapper: { + '^@/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': + '/src/tests/_helper/prisma-mock.ts', + '^.+/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': + '/src/tests/_helper/prisma-mock.ts', + + '^@/(.*)$': '/src/$1', + + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + setupFiles: ['/src/tests/_helper/jest.env.setup.ts'], +}; diff --git a/part4-mission11/jest.setup.ts b/part4-mission11/jest.setup.ts new file mode 100644 index 000000000..fcb3afd2c --- /dev/null +++ b/part4-mission11/jest.setup.ts @@ -0,0 +1,3 @@ +import { jest } from '@jest/globals'; + +jest.setTimeout(10000); diff --git a/part4-mission11/jest.unit.config.cjs b/part4-mission11/jest.unit.config.cjs new file mode 100644 index 000000000..72087fae2 --- /dev/null +++ b/part4-mission11/jest.unit.config.cjs @@ -0,0 +1,29 @@ +const base = require('./jest.base.cjs'); + +/** @type {import('jest').Config} */ +module.exports = { + ...base, + rootDir: __dirname, + displayName: 'unit', + testMatch: ['**/src/tests/unit/**/*.test.ts'], + moduleNameMapper: { + // 1) token 모듈: 상대경로/alias 모두 커버 + '^@/lib/token(?:\\.(?:js|ts))?$': + '/src/tests/_helper/token-mock.ts', + '^.+/lib/token(?:\\.(?:js|ts))?$': + '/src/tests/_helper/token-mock.ts', + + // 2) prisma + '^@/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': + '/src/tests/_helper/prisma-mock.ts', + '^.+/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': + '/src/tests/_helper/prisma-mock.ts', + + // 3) alias 해석 + '^@/(.*)$': '/src/$1', + + // 4) 마지막에 .js 확장자 제거 규칙 + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + setupFiles: ['/src/tests/_helper/jest.env.setup.ts'], +}; diff --git a/part4-mission11/package-lock.json b/part4-mission11/package-lock.json new file mode 100644 index 000000000..a42397a4e --- /dev/null +++ b/part4-mission11/package-lock.json @@ -0,0 +1,12669 @@ +{ + "name": "part3-mission4", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "part3-mission4", + "version": "1.0.0", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "@aws-sdk/client-s3": "^3.931.0", + "@prisma/client": "^6.15.0", + "bcrypt": "^6.0.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^17.2.2", + "express": "^5.1.0", + "multer": "^2.0.2", + "multer-s3": "^3.0.1", + "nodemon": "^3.1.10", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", + "pg": "^8.16.3", + "socket.io": "^4.8.1", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", + "zod": "^4.1.5" + }, + "devDependencies": { + "@swc/core": "^1.15.0", + "@swc/jest": "^0.2.39", + "@types/bcrypt": "^6.0.0", + "@types/cookie-parser": "^1.4.9", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.3", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.10", + "@types/multer": "^2.0.0", + "@types/multer-s3": "^3.0.3", + "@types/node": "^24.5.2", + "@types/passport": "^1.0.17", + "@types/passport-jwt": "^4.0.1", + "@types/passport-local": "^1.0.38", + "@types/supertest": "^6.0.3", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", + "@typescript-eslint/eslint-plugin": "^8.46.3", + "@typescript-eslint/parser": "^8.46.3", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^28.14.0", + "globals": "^16.5.0", + "jest": "^29.7.0", + "prisma": "^6.15.0", + "socket.io-client": "^4.8.1", + "supertest": "^6.3.3", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "tsx": "^4.20.5", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.3" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.931.0.tgz", + "integrity": "sha512-p+ZSRvmylk/pNImGDvLt3lOkILOexNcYvsCjvN2TR9X8RvxvPURISVp2qdGKdwUr/zkshteg1x/30GYlcTKs5g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.931.0", + "@aws-sdk/credential-provider-node": "3.931.0", + "@aws-sdk/middleware-bucket-endpoint": "3.930.0", + "@aws-sdk/middleware-expect-continue": "3.930.0", + "@aws-sdk/middleware-flexible-checksums": "3.931.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-location-constraint": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.930.0", + "@aws-sdk/middleware-sdk-s3": "3.931.0", + "@aws-sdk/middleware-ssec": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.931.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/signature-v4-multi-region": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.931.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.931.0.tgz", + "integrity": "sha512-GM/CARsIUQGEspM9VhZaftFVXnNtFNUUXjpM1ePO4CHk1J/VFvXcsQr3SHWIs0F4Ll6pvy5LpcRlWW5pK7T4aQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.931.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.931.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.931.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.931.0.tgz", + "integrity": "sha512-l/b6AQbto4TuXL2FIm7Z+tbVjrp0LN7ESm97Sf3nneB0vjKtB6R0TS/IySzCYMgyOC3Hxz+Ka34HJXZk9eXTFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.931.0.tgz", + "integrity": "sha512-dTNBpkKXyBdcpEjyfgkE/EFU/0NRoukLs+Pj0S8K1Dg216J9uIijpi6CaBBN+HvnaTlEItm2tzXiJpPVI+TqHQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.931.0.tgz", + "integrity": "sha512-7Ge26fhMDn51BTbHgopx5+uOl4I47k15BDzYc4YT6zyjS99uycYNCA7zB500DGTTn2HK27ZDTyAyhTKZGxRxbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.931.0.tgz", + "integrity": "sha512-uzicpP7IHBxvAMjwGdmeke2bGTxjsKCSW7N48zuv0t0d56hmGHfcZIK5p4ry2OBJxzScp182OUAdAEG8wuSuuA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/credential-provider-env": "3.931.0", + "@aws-sdk/credential-provider-http": "3.931.0", + "@aws-sdk/credential-provider-process": "3.931.0", + "@aws-sdk/credential-provider-sso": "3.931.0", + "@aws-sdk/credential-provider-web-identity": "3.931.0", + "@aws-sdk/nested-clients": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.931.0.tgz", + "integrity": "sha512-eO8mfWNHz0dyYdVfPLVzmqXaSA3agZF/XvBO9/fRU90zCb8lKlXfgUmghGW7LhDkiv2v5uuizUiag7GsKoIcJw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.931.0", + "@aws-sdk/credential-provider-http": "3.931.0", + "@aws-sdk/credential-provider-ini": "3.931.0", + "@aws-sdk/credential-provider-process": "3.931.0", + "@aws-sdk/credential-provider-sso": "3.931.0", + "@aws-sdk/credential-provider-web-identity": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.931.0.tgz", + "integrity": "sha512-8Mu9r+5BUKqmKSI/WYHl5o4GeoonEb51RmoLEqG6431Uz4Y8C6gzAT69yjOJ+MwoWQ2Os37OZLOTv7SgxyOgrQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.931.0.tgz", + "integrity": "sha512-FP31lfMgNMDG4ZDX4NUZ+uoHWn76etcG8UWEgzZb4YOPV4M8a7gwU95iD+RBaK4lV3KvwH2tu68Hmne1qQpFqQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.931.0", + "@aws-sdk/core": "3.931.0", + "@aws-sdk/token-providers": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.931.0.tgz", + "integrity": "sha512-hfX0Buw2+ie0FBiSFMmnXfugQc9fO0KvEojnNnzhk4utlWjZobMcUprOQ/VKUueg0Kga1b1xu8gEP6g1aEh3zw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/nested-clients": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.931.0.tgz", + "integrity": "sha512-CG6ZZIbsrWnYLy5avjMckwaGQ6D5gExEZoEBDzu8fPIsjBd7Nxo3FJvkbE7MuK2/E762pnpWKd9BZANkciRx3A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/smithy-client": "^4.9.5", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.931.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.930.0.tgz", + "integrity": "sha512-cnCLWeKPYgvV4yRYPFH6pWMdUByvu2cy2BAlfsPpvnm4RaVioztyvxmQj5PmVN5fvWs5w/2d6U7le8X9iye2sA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.930.0.tgz", + "integrity": "sha512-5HEQ+JU4DrLNWeY27wKg/jeVa8Suy62ivJHOSUf6e6hZdVIMx0h/kXS1fHEQNNiLu2IzSEP/bFXsKBaW7x7s0g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.931.0.tgz", + "integrity": "sha512-eYWwUKeEommCrrm0Ro6fGDwVO0x2bL3niOmSnHIlIdpu7ruzAGaphj+2MekCxaSPORzkZ3yheHUzV45D8Qj63A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.930.0.tgz", + "integrity": "sha512-x30jmm3TLu7b/b+67nMyoV0NlbnCVT5DI57yDrhXAPCtdgM1KtdLWt45UcHpKOm1JsaIkmYRh2WYu7Anx4MG0g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.930.0.tgz", + "integrity": "sha512-QIGNsNUdRICog+LYqmtJ03PLze6h2KCORXUs5td/hAEjVP5DMmubhtrGg1KhWyctACluUH/E/yrD14p4pRXxwA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.930.0.tgz", + "integrity": "sha512-vh4JBWzMCBW8wREvAwoSqB2geKsZwSHTa0nSt0OMOLp2PdTYIZDi0ZiVMmpfnjcx9XbS6aSluLv9sKx4RrG46A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.930.0.tgz", + "integrity": "sha512-gv0sekNpa2MBsIhm2cjP3nmYSfI4nscx/+K9u9ybrWZBWUIC4kL2sV++bFjjUz4QxUIlvKByow3/a9ARQyCu7Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws/lambda-invoke-store": "^0.1.1", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.931.0.tgz", + "integrity": "sha512-uWF78ht8Wgxljn6y0cEcIWfbeTVnJ0cE1Gha9ScCqscmuBCpHuFMSd/p53w3whoDhpQL3ln9mOyY3tfST/NUQA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.930.0.tgz", + "integrity": "sha512-N2/SvodmaDS6h7CWfuapt3oJyn1T2CBz0CsDIiTDv9cSagXAVFjPdm2g4PFJqrNBeqdDIoYBnnta336HmamWHg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.931.0.tgz", + "integrity": "sha512-Ftd+f3+y5KNYKzLXaGknwJ9hCkFWshi5C9TLLsz+fEohWc1FvIKU7MlXTeFms2eN76TTVHuG8N2otaujl6CuHg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.931.0.tgz", + "integrity": "sha512-6/dXrX2nWgiWdHxooEtmKpOErms4+79AQawEvhhxpLPpa+tixl4i/MSFgHk9sjkGv5a1/P3DbnedpZWl+2wMOg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.931.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.931.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.931.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.930.0.tgz", + "integrity": "sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.931.0.tgz", + "integrity": "sha512-EGYYDSSk7k1xbSHtb8MfEMILf5achdNnnsYKgFk0+Oul3tPQ4xUmOt5qRP6sOO3/LQHF37gBYHUF9OSA/+uVCw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.931.0.tgz", + "integrity": "sha512-dr+02X9oxqmXG0856odFJ7wAXy12pr/tq2Zg+IS0TDThFvgtvx4yChkpqmc89wGoW+Aly47JPfPUXh0IMpGzIg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.931.0", + "@aws-sdk/nested-clients": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.930.0.tgz", + "integrity": "sha512-M2oEKBzzNAYr136RRc6uqw3aWlwCxqTP1Lawps9E1d2abRPvl1p1ztQmmXp1Ak4rv8eByIZ+yQyKQ3zPdRG5dw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.930.0.tgz", + "integrity": "sha512-q6lCRm6UAe+e1LguM5E4EqM9brQlDem4XDcQ87NzEvlTW6GzmNCO0w1jS0XgCFXQHjDxjdlNFX+5sRbHijwklg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.931.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.931.0.tgz", + "integrity": "sha512-j5if01rt7JCGYDVXck39V7IUyKAN73vKUPzmu+jp1apU3Q0lLSTZA/HCfL2HkMUKVLE67ibjKb+NCoEg0QhujA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.931.0", + "@aws-sdk/types": "3.930.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz", + "integrity": "sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", + "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.2.0.tgz", + "integrity": "sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@prisma/client": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.15.0.tgz", + "integrity": "sha512-wR2LXUbOH4cL/WToatI/Y2c7uzni76oNFND7+23ypLllBmIS8e3ZHhO+nud9iXSXKFt1SoM3fTZvHawg63emZw==", + "hasInstallScript": true, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.15.0.tgz", + "integrity": "sha512-KMEoec9b2u6zX0EbSEx/dRpx1oNLjqJEBZYyK0S3TTIbZ7GEGoVyGyFRk4C72+A38cuPLbfQGQvgOD+gBErKlA==", + "devOptional": true, + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.16.12", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.15.0.tgz", + "integrity": "sha512-y7cSeLuQmyt+A3hstAs6tsuAiVXSnw9T55ra77z0nbNkA8Lcq9rNcQg6PI00by/+WnE/aMRJ/W7sZWn2cgIy1g==", + "devOptional": true + }, + "node_modules/@prisma/engines": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.15.0.tgz", + "integrity": "sha512-opITiR5ddFJ1N2iqa7mkRlohCZqVSsHhRcc29QXeldMljOf4FSellLT0J5goVb64EzRTKcIDeIsJBgmilNcKxA==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "6.15.0", + "@prisma/engines-version": "6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb", + "@prisma/fetch-engine": "6.15.0", + "@prisma/get-platform": "6.15.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb.tgz", + "integrity": "sha512-a/46aK5j6L3ePwilZYEgYDPrhBQ/n4gYjLxT5YncUTJJNRnTCVjPF86QdzUOLRdYjCLfhtZp9aum90W0J+trrg==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.15.0.tgz", + "integrity": "sha512-xcT5f6b+OWBq6vTUnRCc7qL+Im570CtwvgSj+0MTSGA1o9UDSKZ/WANvwtiRXdbYWECpyC3CukoG3A04VTAPHw==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "6.15.0", + "@prisma/engines-version": "6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb", + "@prisma/get-platform": "6.15.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.15.0.tgz", + "integrity": "sha512-Jbb+Xbxyp05NSR1x2epabetHiXvpO8tdN2YNoWoA/ZsbYyxxu/CO/ROBauIFuMXs3Ti+W7N7SJtWsHGaWte9Rg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "6.15.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.3.tgz", + "integrity": "sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz", + "integrity": "sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz", + "integrity": "sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz", + "integrity": "sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz", + "integrity": "sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz", + "integrity": "sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.6.tgz", + "integrity": "sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.5.tgz", + "integrity": "sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.5.tgz", + "integrity": "sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.10.tgz", + "integrity": "sha512-SoAag3QnWBFoXjwa1jenEThkzJYClidZUyqsLKwWZ8kOlZBwehrLBp4ygVDjNEM2a2AamCQ2FBA/HuzKJ/LiTA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.3", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.10.tgz", + "integrity": "sha512-6fOwX34gXxcqKa3bsG0mR0arc2Cw4ddOS6tp3RgUD2yoTrDTbQ2aVADnDjhUuxaiDZN2iilxndgGDhnpL/XvJA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.6", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.5.tgz", + "integrity": "sha512-La1ldWTJTZ5NqQyPqnCNeH9B+zjFhrNoQIL1jTh4zuqXRlmXhxYHhMtI1/92OlnoAtp6JoN7kzuwhWoXrBwPqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.6.tgz", + "integrity": "sha512-hGz42hggqReicRRZUvrKDQiAmoJnx1Q+XfAJnYAGu544gOfxQCAC3hGGD7+Px2gEUUxB/kKtQV7LOtBRNyxteQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.3", + "@smithy/middleware-endpoint": "^4.3.10", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.9.tgz", + "integrity": "sha512-Bh5bU40BgdkXE2BcaNazhNtEXi1TC0S+1d84vUwv5srWfvbeRNUKFzwKQgC6p6MXPvEgw+9+HdX3pOwT6ut5aw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.6", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.12.tgz", + "integrity": "sha512-EHZwe1E9Q7umImIyCKQg/Cm+S+7rjXxCRvfGmKifqwYvn7M8M4ZcowwUOQzvuuxUUmdzCkqL0Eq0z1m74Pq6pw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.6", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", + "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "devOptional": true + }, + "node_modules/@swc/core": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.0.tgz", + "integrity": "sha512-8SnJV+JV0rYbfSiEiUvYOmf62E7QwsEG+aZueqSlKoxFt0pw333+bgZSQXGUV6etXU88nxur0afVMaINujBMSw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.0", + "@swc/core-darwin-x64": "1.15.0", + "@swc/core-linux-arm-gnueabihf": "1.15.0", + "@swc/core-linux-arm64-gnu": "1.15.0", + "@swc/core-linux-arm64-musl": "1.15.0", + "@swc/core-linux-x64-gnu": "1.15.0", + "@swc/core-linux-x64-musl": "1.15.0", + "@swc/core-win32-arm64-msvc": "1.15.0", + "@swc/core-win32-ia32-msvc": "1.15.0", + "@swc/core-win32-x64-msvc": "1.15.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.0.tgz", + "integrity": "sha512-TBKWkbnShnEjlIbO4/gfsrIgAqHBVqgPWLbWmPdZ80bF393yJcLgkrb7bZEnJs6FCbSSuGwZv2rx1jDR2zo6YA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.0.tgz", + "integrity": "sha512-f5JKL1v1H56CIZc1pVn4RGPOfnWqPwmuHdpf4wesvXunF1Bx85YgcspW5YxwqG5J9g3nPU610UFuExJXVUzOiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.0.tgz", + "integrity": "sha512-duK6nG+WyuunnfsfiTUQdzC9Fk8cyDLqT9zyXvY2i2YgDu5+BH5W6wM5O4mDNCU5MocyB/SuF5YDF7XySnowiQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.0.tgz", + "integrity": "sha512-ITe9iDtTRXM98B91rvyPP6qDVbhUBnmA/j4UxrHlMQ0RlwpqTjfZYZkD0uclOxSZ6qIrOj/X5CaoJlDUuQ0+Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.0.tgz", + "integrity": "sha512-Q5ldc2bzriuzYEoAuqJ9Vr3FyZhakk5hiwDbniZ8tlEXpbjBhbOleGf9/gkhLaouDnkNUEazFW9mtqwUTRdh7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.0.tgz", + "integrity": "sha512-pY4is+jEpOxlYCSnI+7N8Oxbap9TmTz5YT84tUvRTlOlTBwFAUlWFCX0FRwWJlsfP0TxbqhIe8dNNzlsEmJbXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.0.tgz", + "integrity": "sha512-zYEt5eT8y8RUpoe7t5pjpoOdGu+/gSTExj8PV86efhj6ugB3bPlj3Y85ogdW3WMVXr4NvwqvzdaYGCZfXzSyVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.0.tgz", + "integrity": "sha512-zC1rmOgFH5v2BCbByOazEqs0aRNpTdLRchDExfcCfgKgeaD+IdpUOqp7i3VG1YzkcnbuZjMlXfM0ugpt+CddoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.0.tgz", + "integrity": "sha512-7t9U9KwMwQblkdJIH+zX1V4q1o3o41i0HNO+VlnAHT5o+5qHJ963PHKJ/pX3P2UlZnBCY465orJuflAN4rAP9A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.0.tgz", + "integrity": "sha512-VE0Zod5vcs8iMLT64m5QS1DlTMXJFI/qSgtMDRx8rtZrnjt6/9NW8XUaiPJuRu8GluEO1hmHoyf1qlbY19gGSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/jest": { + "version": "0.2.39", + "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", + "integrity": "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^30.0.0", + "@swc/counter": "^0.1.3", + "jsonc-parser": "^3.2.0" + }, + "engines": { + "npm": ">= 7.0.0" + }, + "peerDependencies": { + "@swc/core": "*" + } + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.9.tgz", + "integrity": "sha512-tGZiZ2Gtc4m3wIdLkZ8mkj1T6CEHb35+VApbL2T14Dew8HA7c+04dmKqsKRNC+8RJPm16JEK0tFSwdZqubfc4g==", + "dev": true, + "peerDependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true + }, + "node_modules/@types/multer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", + "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/multer-s3": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/multer-s3/-/multer-s3-3.0.3.tgz", + "integrity": "sha512-VgWygI9UwyS7loLithUUi0qAMIDWdNrERS2Sb06UuPYiLzKuIFn2NgL7satyl4v8sh/LLoU7DiPanvbQaRg9Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aws-sdk/client-s3": "^3.0.0", + "@types/multer": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "dependencies": { + "undici-types": "~7.12.0" + } + }, + "node_modules/@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", + "dev": true, + "dependencies": { + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-local": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz", + "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/swagger-jsdoc": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", + "integrity": "sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==", + "dev": true + }, + "node_modules/@types/swagger-ui-express": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", + "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", + "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/type-utils": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.3", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", + "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", + "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.3", + "@typescript-eslint/types": "^8.46.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", + "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", + "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", + "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", + "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", + "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.3", + "@typescript-eslint/tsconfig-utils": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", + "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", + "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.3", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001753", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "devOptional": true + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "devOptional": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/effect": { + "version": "3.16.12", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.16.12.tgz", + "integrity": "sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==", + "devOptional": true, + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "28.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", + "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "engines": { + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "devOptional": true + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formidable": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "devOptional": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead." + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/multer-s3": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multer-s3/-/multer-s3-3.0.1.tgz", + "integrity": "sha512-BFwSO80a5EW4GJRBdUuSHblz2jhVSAze33ZbnGpcfEicoT0iRolx4kWR+AJV07THFRCQ78g+kelKFdjkCCaXeQ==", + "license": "MIT", + "dependencies": { + "@aws-sdk/lib-storage": "^3.46.0", + "file-type": "^3.3.0", + "html-comment-regex": "^1.1.2", + "run-parallel": "^1.1.6" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0" + } + }, + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nypm": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.1.tgz", + "integrity": "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==", + "devOptional": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.2.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "devOptional": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "peer": true + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "dependencies": { + "jsonwebtoken": "^9.0.0", + "passport-strategy": "^1.0.0" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true + }, + "node_modules/pg": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", + "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "dependencies": { + "pg-connection-string": "^2.9.1", + "pg-pool": "^3.10.1", + "pg-protocol": "^1.10.3", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.2.7" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", + "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", + "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "devOptional": true, + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.15.0.tgz", + "integrity": "sha512-E6RCgOt+kUVtjtZgLQDBJ6md2tDItLJNExwI0XJeBc1FKL+Vwb+ovxXxuok9r8oBgsOXBA33fGDuE/0qDdCWqQ==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/config": "6.15.0", + "@prisma/engines": "6.15.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.7.0", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.29.0.tgz", + "integrity": "sha512-gqs7Md3AxP4mbpXAq31o5QW+wGUZsUzVatg70yXpUR245dfIis5jAzufBd+UQM/w2xSfrhvA1eqsrgnl2PbezQ==", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "devOptional": true + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "dev": true, + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", + "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici-types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validator": { + "version": "13.15.20", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.20.tgz", + "integrity": "sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/zod": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.5.tgz", + "integrity": "sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/part4-mission11/package.json b/part4-mission11/package.json new file mode 100644 index 000000000..68d68a943 --- /dev/null +++ b/part4-mission11/package.json @@ -0,0 +1,82 @@ +{ + "name": "sprint-mission", + "version": "1.0.0", + "description": "", + "license": "ISC", + "author": "", + "type": "module", + "main": "dist/server.js", + "scripts": { + "seed": "tsx src/prisma/seed.ts", + "postinstall": "npx prisma generate && npx prisma migrate deploy && npx prisma db seed", + "test": "jest", + "test:unit": "jest --selectProjects unit", + "test:int": "jest --selectProjects integration", + "test:cov": "jest --coverage", + "lint": "eslint . --ext .ts,.tsx,.js,.cjs", + "lint:fix": "eslint . --ext .ts,.tsx,.js,.cjs --fix", + "dev": "tsx watch src/server.ts", + "build": "tsc", + "start": "nodemon dist/server.js", + "db:reset": "npx prisma migrate reset --skip-seed && npx prisma migrate dev && npx prisma db seed" + }, + "prisma": { + "seed": "tsx src/prisma/seed.ts" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.931.0", + "@prisma/client": "^6.15.0", + "bcrypt": "^6.0.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^17.2.2", + "express": "^5.1.0", + "multer": "^2.0.2", + "multer-s3": "^3.0.1", + "nodemon": "^3.1.10", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", + "pg": "^8.16.3", + "socket.io": "^4.8.1", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", + "zod": "^4.1.5" + }, + "devDependencies": { + "@swc/core": "^1.15.0", + "@swc/jest": "^0.2.39", + "@types/bcrypt": "^6.0.0", + "@types/cookie-parser": "^1.4.9", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.3", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.10", + "@types/multer": "^2.0.0", + "@types/multer-s3": "^3.0.3", + "@types/node": "^24.5.2", + "@types/passport": "^1.0.17", + "@types/passport-jwt": "^4.0.1", + "@types/passport-local": "^1.0.38", + "@types/supertest": "^6.0.3", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", + "@typescript-eslint/eslint-plugin": "^8.46.3", + "@typescript-eslint/parser": "^8.46.3", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^28.14.0", + "globals": "^16.5.0", + "jest": "^29.7.0", + "prisma": "^6.15.0", + "socket.io-client": "^4.8.1", + "supertest": "^6.3.3", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "tsx": "^4.20.5", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.3" + } +} diff --git a/part4-mission11/prisma/migrations/20250903063435_test/migration.sql b/part4-mission11/prisma/migrations/20250903063435_test/migration.sql new file mode 100644 index 000000000..d26a43ecd --- /dev/null +++ b/part4-mission11/prisma/migrations/20250903063435_test/migration.sql @@ -0,0 +1,74 @@ +-- CreateTable +CREATE TABLE "public"."User" ( + "id" SERIAL NOT NULL, + "username" TEXT NOT NULL, + "email" TEXT NOT NULL, + "images" TEXT[], + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Product" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "price" INTEGER NOT NULL, + "tags" TEXT[], + "images" TEXT[], + "userId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Product_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Article" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "tags" TEXT[], + "userId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Article_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Comment" ( + "id" SERIAL NOT NULL, + "content" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + "articleId" INTEGER, + "productId" INTEGER, + + CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_username_key" ON "public"."User"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "public"."User"("email"); + +-- AddForeignKey +ALTER TABLE "public"."Product" ADD CONSTRAINT "Product_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Article" ADD CONSTRAINT "Article_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Comment" ADD CONSTRAINT "Comment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Comment" ADD CONSTRAINT "Comment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "public"."Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Comment" ADD CONSTRAINT "Comment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "public"."Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/part4-mission11/prisma/migrations/20250904044259_test/migration.sql b/part4-mission11/prisma/migrations/20250904044259_test/migration.sql new file mode 100644 index 000000000..b8e440114 --- /dev/null +++ b/part4-mission11/prisma/migrations/20250904044259_test/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "public"."Article" ADD COLUMN "images" TEXT[]; diff --git a/part4-mission11/prisma/migrations/20250904070430_like/migration.sql b/part4-mission11/prisma/migrations/20250904070430_like/migration.sql new file mode 100644 index 000000000..5d290d994 --- /dev/null +++ b/part4-mission11/prisma/migrations/20250904070430_like/migration.sql @@ -0,0 +1,59 @@ +-- AlterTable +ALTER TABLE "public"."Article" ADD COLUMN "likeCount" INTEGER NOT NULL DEFAULT 0; + +-- AlterTable +ALTER TABLE "public"."Comment" ADD COLUMN "likeCount" INTEGER NOT NULL DEFAULT 0; + +-- AlterTable +ALTER TABLE "public"."Product" ADD COLUMN "likeCount" INTEGER NOT NULL DEFAULT 0; + +-- CreateTable +CREATE TABLE "public"."_ProductLikes" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL, + + CONSTRAINT "_ProductLikes_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_ArticleLikes" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL, + + CONSTRAINT "_ArticleLikes_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_CommentLikes" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL, + + CONSTRAINT "_CommentLikes_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateIndex +CREATE INDEX "_ProductLikes_B_index" ON "public"."_ProductLikes"("B"); + +-- CreateIndex +CREATE INDEX "_ArticleLikes_B_index" ON "public"."_ArticleLikes"("B"); + +-- CreateIndex +CREATE INDEX "_CommentLikes_B_index" ON "public"."_CommentLikes"("B"); + +-- AddForeignKey +ALTER TABLE "public"."_ProductLikes" ADD CONSTRAINT "_ProductLikes_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ProductLikes" ADD CONSTRAINT "_ProductLikes_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ArticleLikes" ADD CONSTRAINT "_ArticleLikes_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ArticleLikes" ADD CONSTRAINT "_ArticleLikes_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_CommentLikes" ADD CONSTRAINT "_CommentLikes_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_CommentLikes" ADD CONSTRAINT "_CommentLikes_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/part4-mission11/prisma/migrations/20250905090014_liked/migration.sql b/part4-mission11/prisma/migrations/20250905090014_liked/migration.sql new file mode 100644 index 000000000..f1dedd83b --- /dev/null +++ b/part4-mission11/prisma/migrations/20250905090014_liked/migration.sql @@ -0,0 +1,91 @@ +/* + Warnings: + + - You are about to drop the `_ArticleLikes` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `_CommentLikes` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `_ProductLikes` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "public"."_ArticleLikes" DROP CONSTRAINT "_ArticleLikes_A_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_ArticleLikes" DROP CONSTRAINT "_ArticleLikes_B_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_CommentLikes" DROP CONSTRAINT "_CommentLikes_A_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_CommentLikes" DROP CONSTRAINT "_CommentLikes_B_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_ProductLikes" DROP CONSTRAINT "_ProductLikes_A_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_ProductLikes" DROP CONSTRAINT "_ProductLikes_B_fkey"; + +-- DropTable +DROP TABLE "public"."_ArticleLikes"; + +-- DropTable +DROP TABLE "public"."_CommentLikes"; + +-- DropTable +DROP TABLE "public"."_ProductLikes"; + +-- CreateTable +CREATE TABLE "public"."ProductLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "productId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ProductLike_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."ArticleLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "articleId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ArticleLike_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."CommentLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "commentId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CommentLike_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "ProductLike_userId_productId_key" ON "public"."ProductLike"("userId", "productId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ArticleLike_userId_articleId_key" ON "public"."ArticleLike"("userId", "articleId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CommentLike_userId_commentId_key" ON "public"."CommentLike"("userId", "commentId"); + +-- AddForeignKey +ALTER TABLE "public"."ProductLike" ADD CONSTRAINT "ProductLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ProductLike" ADD CONSTRAINT "ProductLike_productId_fkey" FOREIGN KEY ("productId") REFERENCES "public"."Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ArticleLike" ADD CONSTRAINT "ArticleLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ArticleLike" ADD CONSTRAINT "ArticleLike_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "public"."Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."CommentLike" ADD CONSTRAINT "CommentLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."CommentLike" ADD CONSTRAINT "CommentLike_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "public"."Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/part4-mission11/prisma/migrations/20250909071844_ts/migration.sql b/part4-mission11/prisma/migrations/20250909071844_ts/migration.sql new file mode 100644 index 000000000..3cbedcd75 --- /dev/null +++ b/part4-mission11/prisma/migrations/20250909071844_ts/migration.sql @@ -0,0 +1,85 @@ +/* + Warnings: + + - You are about to drop the `ArticleLike` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `CommentLike` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `ProductLike` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "public"."ArticleLike" DROP CONSTRAINT "ArticleLike_articleId_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."ArticleLike" DROP CONSTRAINT "ArticleLike_userId_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."CommentLike" DROP CONSTRAINT "CommentLike_commentId_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."CommentLike" DROP CONSTRAINT "CommentLike_userId_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."ProductLike" DROP CONSTRAINT "ProductLike_productId_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."ProductLike" DROP CONSTRAINT "ProductLike_userId_fkey"; + +-- DropTable +DROP TABLE "public"."ArticleLike"; + +-- DropTable +DROP TABLE "public"."CommentLike"; + +-- DropTable +DROP TABLE "public"."ProductLike"; + +-- CreateTable +CREATE TABLE "public"."_ProductLikes" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL, + + CONSTRAINT "_ProductLikes_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_ArticleLikes" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL, + + CONSTRAINT "_ArticleLikes_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_CommentLikes" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL, + + CONSTRAINT "_CommentLikes_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateIndex +CREATE INDEX "_ProductLikes_B_index" ON "public"."_ProductLikes"("B"); + +-- CreateIndex +CREATE INDEX "_ArticleLikes_B_index" ON "public"."_ArticleLikes"("B"); + +-- CreateIndex +CREATE INDEX "_CommentLikes_B_index" ON "public"."_CommentLikes"("B"); + +-- AddForeignKey +ALTER TABLE "public"."_ProductLikes" ADD CONSTRAINT "_ProductLikes_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ProductLikes" ADD CONSTRAINT "_ProductLikes_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ArticleLikes" ADD CONSTRAINT "_ArticleLikes_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ArticleLikes" ADD CONSTRAINT "_ArticleLikes_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_CommentLikes" ADD CONSTRAINT "_CommentLikes_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_CommentLikes" ADD CONSTRAINT "_CommentLikes_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/part4-mission11/prisma/migrations/20250922033747_liketest/migration.sql b/part4-mission11/prisma/migrations/20250922033747_liketest/migration.sql new file mode 100644 index 000000000..45d5760b4 --- /dev/null +++ b/part4-mission11/prisma/migrations/20250922033747_liketest/migration.sql @@ -0,0 +1,103 @@ +/* + Warnings: + + - You are about to drop the column `likeCount` on the `Article` table. All the data in the column will be lost. + - You are about to drop the column `likeCount` on the `Comment` table. All the data in the column will be lost. + - You are about to drop the column `likeCount` on the `Product` table. All the data in the column will be lost. + - You are about to drop the `_ArticleLikes` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `_CommentLikes` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `_ProductLikes` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "public"."_ArticleLikes" DROP CONSTRAINT "_ArticleLikes_A_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_ArticleLikes" DROP CONSTRAINT "_ArticleLikes_B_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_CommentLikes" DROP CONSTRAINT "_CommentLikes_A_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_CommentLikes" DROP CONSTRAINT "_CommentLikes_B_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_ProductLikes" DROP CONSTRAINT "_ProductLikes_A_fkey"; + +-- DropForeignKey +ALTER TABLE "public"."_ProductLikes" DROP CONSTRAINT "_ProductLikes_B_fkey"; + +-- AlterTable +ALTER TABLE "public"."Article" DROP COLUMN "likeCount"; + +-- AlterTable +ALTER TABLE "public"."Comment" DROP COLUMN "likeCount"; + +-- AlterTable +ALTER TABLE "public"."Product" DROP COLUMN "likeCount"; + +-- DropTable +DROP TABLE "public"."_ArticleLikes"; + +-- DropTable +DROP TABLE "public"."_CommentLikes"; + +-- DropTable +DROP TABLE "public"."_ProductLikes"; + +-- CreateTable +CREATE TABLE "public"."ProductLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "productId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ProductLike_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."ArticleLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "articleId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ArticleLike_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."CommentLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "commentId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CommentLike_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "ProductLike_userId_productId_key" ON "public"."ProductLike"("userId", "productId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ArticleLike_userId_articleId_key" ON "public"."ArticleLike"("userId", "articleId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CommentLike_userId_commentId_key" ON "public"."CommentLike"("userId", "commentId"); + +-- AddForeignKey +ALTER TABLE "public"."ProductLike" ADD CONSTRAINT "ProductLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ProductLike" ADD CONSTRAINT "ProductLike_productId_fkey" FOREIGN KEY ("productId") REFERENCES "public"."Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ArticleLike" ADD CONSTRAINT "ArticleLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ArticleLike" ADD CONSTRAINT "ArticleLike_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "public"."Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."CommentLike" ADD CONSTRAINT "CommentLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."CommentLike" ADD CONSTRAINT "CommentLike_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "public"."Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/part4-mission11/prisma/migrations/20251103043014_notify/migration.sql b/part4-mission11/prisma/migrations/20251103043014_notify/migration.sql new file mode 100644 index 000000000..8a348e414 --- /dev/null +++ b/part4-mission11/prisma/migrations/20251103043014_notify/migration.sql @@ -0,0 +1,20 @@ +-- CreateEnum +CREATE TYPE "public"."NotificationType" AS ENUM ('PRICE_CHANGE', 'NEW_COMMENT'); + +-- CreateTable +CREATE TABLE "public"."Notification" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "type" "public"."NotificationType" NOT NULL, + "message" TEXT NOT NULL, + "productId" INTEGER, + "articleId" INTEGER, + "commentId" INTEGER, + "isRead" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "public"."Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/part4-mission11/prisma/migrations/migration_lock.toml b/part4-mission11/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..044d57cdb --- /dev/null +++ b/part4-mission11/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/part4-mission11/prisma/schema.prisma b/part4-mission11/prisma/schema.prisma new file mode 100644 index 000000000..70ae557c2 --- /dev/null +++ b/part4-mission11/prisma/schema.prisma @@ -0,0 +1,131 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + username String @unique + email String @unique + images String[] + password String + products Product[] + articles Article[] + comments Comment[] + productLikes ProductLike[] + articleLikes ArticleLike[] + commentLikes CommentLike[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + Notification Notification[] +} + +model Product { + id Int @id @default(autoincrement()) + name String + description String + price Int + tags String[] + images String[] + comments Comment[] + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + likes ProductLike[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Article { + id Int @id @default(autoincrement()) + title String + content String + tags String[] + images String[] + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + comments Comment[] + likes ArticleLike[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Comment { + id Int @id @default(autoincrement()) + content String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + articleId Int? + article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) + productId Int? + product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) + likes CommentLike[] +} + +model ProductLike { + id Int @id @default(autoincrement()) + userId Int + productId Int + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + product Product @relation(fields: [productId], references: [id], onDelete: Cascade) + + @@unique([userId, productId]) +} + +model ArticleLike { + id Int @id @default(autoincrement()) + userId Int + articleId Int + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + article Article @relation(fields: [articleId], references: [id], onDelete: Cascade) + + @@unique([userId, articleId]) +} + +model CommentLike { + id Int @id @default(autoincrement()) + userId Int + commentId Int + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + comment Comment @relation(fields: [commentId], references: [id], onDelete: Cascade) + + @@unique([userId, commentId]) +} + +model Notification { + id Int @id @default(autoincrement()) + user User @relation(fields: [userId], references: [id]) + userId Int // 알림 받는 사람 + + type NotificationType + message String + + productId Int? // 상품 관련 알림일 수도 있고 + articleId Int? // 게시글 관련 알림일 수도 있음 + commentId Int? // 댓글 알림일 수도 있음 + + isRead Boolean @default(false) + createdAt DateTime @default(now()) +} + +enum NotificationType { + PRICE_CHANGE // 좋아요한 상품 가격 변동 + NEW_COMMENT // 내 게시글에 댓글 달림 +} diff --git a/part4-mission11/src/app.ts b/part4-mission11/src/app.ts new file mode 100644 index 000000000..ae3311b64 --- /dev/null +++ b/part4-mission11/src/app.ts @@ -0,0 +1,46 @@ +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import express from 'express'; +import path from 'path'; + +import { dirnameFromMeta } from './lib/dirname.js'; +import passport from './lib/passport/index.js'; +import errorHandler from './middlewares/errorHandler.js'; +import { requestLogger } from './middlewares/logger.js'; +import routes from './routes/index.js'; +import { setupSwagger } from './swagger.js'; + +export async function buildApp(_opts: { forTest?: boolean } = {}) { + const app = express(); + const __dirname_safe = dirnameFromMeta(import.meta.url); + const isProd = process.env.NODE_ENV === 'production'; + + // nginx + app.set('trust proxy', 1); + + app.use( + cors({ + origin: [process.env.CORS_ORIGIN || 'http://localhost:3001'], + credentials: true, + }) + ); + + app.use(express.json()); + app.use(express.urlencoded({ extended: true })); + + // dev/test 에서만 src/uploads 정적 서빙 + if (!isProd) { + app.use('/uploads', express.static(path.join(__dirname_safe, './uploads'))); + } + + app.use(cookieParser()); + app.use(passport.initialize()); + app.use(requestLogger); + + app.use('/', routes); + setupSwagger(app); + + app.use(errorHandler); + + return app; +} diff --git a/part4-mission11/src/config/multer.ts b/part4-mission11/src/config/multer.ts new file mode 100644 index 000000000..101cc2d4c --- /dev/null +++ b/part4-mission11/src/config/multer.ts @@ -0,0 +1,78 @@ +import { S3Client } from '@aws-sdk/client-s3'; +import multer, { type FileFilterCallback } from 'multer'; +import multerS3 from 'multer-s3'; +import path from 'path'; + +import { dirnameFromMeta } from '../lib/dirname.js'; + +const __dirname_safe = dirnameFromMeta(import.meta.url); + +const isProd = process.env.NODE_ENV === 'production'; + +/* ------------ 공통 파일 필터 (이미지 전용) ------------ */ +const fileFilter = ( + req: Express.Request, + file: Express.Multer.File, + cb: FileFilterCallback +) => { + const allowedMimes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; + if (allowedMimes.includes(file.mimetype)) { + cb(null, true); + } else { + const err = new multer.MulterError('LIMIT_UNEXPECTED_FILE'); + (err as unknown as { message: string }).message = + '이미지 파일만 업로드할 수 있습니다.'; + cb(err); + } +}; + +/* ------------ 스토리지 엔진 결정 (dev: 로컬, prod: S3) ------------ */ +let storage: multer.StorageEngine; + +if (isProd) { + // 프로덕션: S3로 업로드 + const s3 = new S3Client({ + region: process.env.AWS_REGION!, + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY_ID!, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, + }, + }); + + storage = multerS3({ + s3, + bucket: process.env.AWS_S3_BUCKET!, + acl: 'public-read', + metadata: (req, file, cb) => { + cb(null, { fieldName: file.fieldname }); + }, + key: (req, file, cb) => { + const ext = path.extname(file.originalname); + const filename = `${file.fieldname}-${Date.now()}${ext}`; + cb(null, filename); + }, + }); +} else { + // 개발/테스트: 로컬 디스크 저장 + storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, path.join(__dirname_safe, '../uploads')); + }, + filename: (req, file, cb) => { + const ext = path.extname(file.originalname); + cb(null, `${file.fieldname}-${Date.now()}${ext}`); + }, + }); +} + +/* ------------ Multer 미들웨어 ------------ */ +const upload = multer({ + storage, + fileFilter, + limits: { + fileSize: 5 * 1024 * 1024, // 5MB + files: 5, + }, +}); + +export default upload; diff --git a/part4-mission11/src/controllers/article-controller.ts b/part4-mission11/src/controllers/article-controller.ts new file mode 100644 index 000000000..e1a78ce9c --- /dev/null +++ b/part4-mission11/src/controllers/article-controller.ts @@ -0,0 +1,76 @@ +import type { Request, Response } from 'express'; + +import { articleService } from '../services/article-service.js'; + +class ArticleController { + // 게시글 + async getAllArticles(req: Request, res: Response) { + const userId = req.user?.id; + const { data, pagination } = await articleService.getAllArticles( + req.query, + userId + ); + res.json({ data, pagination }); + } + async getArticleById(req: Request, res: Response) { + const userId = req.user?.id; + const idParam = req.params.id; + const articleId = parseInt(idParam!, 10); + const article = await articleService.getArticleById(articleId, userId); + res.status(200).json({ data: article }); + } + + async createArticle(req: Request, res: Response) { + const { title, content } = req.body; + const userId = req.user!.id; + const newArticle = await articleService.createArticle( + title, + content, + userId + ); + res.status(201).json({ data: newArticle }); + } + + async updateArticle(req: Request, res: Response) { + const idParam = req.params.id; + const id = parseInt(idParam!, 10); + const { title, content, tags, images } = req.body; + const updateData = { title, content, tags, images }; + const userId = req.user!.id; + const updated = await articleService.updateArticle(id, userId, updateData); + res.json({ data: updated }); + } + + async deleteArticle(req: Request, res: Response) { + const idParam = req.params.id; + const id = parseInt(idParam!, 10); + const userId = req.user!.id; + await articleService.deleteArticle(id, userId); + res.status(204).send(); + } + + async likeArticle(req: Request, res: Response) { + const userId = req.user!.id; + const idParam = req.params.id; + const articleId = parseInt(idParam!, 10); + const article = await articleService.articleLike(userId, articleId); + res.json({ data: article }); + } + + async unlikeArticle(req: Request, res: Response) { + const userId = req.user!.id; + const idParam = req.params.id; + const articleId = parseInt(idParam!, 10); + const result = await articleService.articleUnlike(userId, articleId); + res.status(200).json({ data: result }); + } + + // 본인이 작성한 게시글 조회 + async getUserArticles(req: Request, res: Response) { + const userId = req.user!.id; + const articles = await articleService.getUserArticles(userId); + res.status(200).json({ data: articles }); + } +} + +export const articleController = new ArticleController(); diff --git a/part4-mission11/src/controllers/comments/article-comment-controller.ts b/part4-mission11/src/controllers/comments/article-comment-controller.ts new file mode 100644 index 000000000..a6dd1b201 --- /dev/null +++ b/part4-mission11/src/controllers/comments/article-comment-controller.ts @@ -0,0 +1,68 @@ +import type { Request, Response } from 'express'; + +import { articleCommentService } from '../../services/comments/article-comment-service.js'; + +class ArticleCommentController { + async getComments(req: Request, res: Response) { + const idParam = req.params.articleId; + const articleId = parseInt(idParam!, 10); + const userId = req.user?.id; + const comments = await articleCommentService.getCommentsByArticleId( + articleId, + userId + ); + res.json({ data: comments }); + } + + async createComment(req: Request, res: Response) { + const idParam = req.params.articleId; + const articleId = parseInt(idParam!, 10); + const { content } = req.body; + const userId = req.user!.id; + const newComment = await articleCommentService.createArticleComment( + articleId, + content, + userId + ); + return res.status(201).json({ data: newComment }); + } + + async updateComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const { content } = req.body; + const userId = req.user!.id; + const updated = await articleCommentService.updateComment( + commentId, + userId, + content + ); + res.json({ data: updated }); + } + + async deleteComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const userId = req.user!.id; + await articleCommentService.deleteComment(commentId, userId); + return res.status(204).send(); + } + + async likeComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const userId = req.user!.id; + const result = await articleCommentService.commentLike(userId, commentId); + res.status(200).json({ data: result }); + } + + async unlikeComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const userId = req.user!.id; + const result = await articleCommentService.commentUnlike(userId, commentId); + res.status(200).json({ data: result }); + } +} + +export const articleCommentController = new ArticleCommentController(); diff --git a/part4-mission11/src/controllers/comments/product-comment-controller.ts b/part4-mission11/src/controllers/comments/product-comment-controller.ts new file mode 100644 index 000000000..c1a11017f --- /dev/null +++ b/part4-mission11/src/controllers/comments/product-comment-controller.ts @@ -0,0 +1,68 @@ +import type { Request, Response } from 'express'; + +import { productCommentService } from '../../services/comments/product-comment-service.js'; + +class ProductCommentController { + async getComments(req: Request, res: Response) { + const idParam = req.params.productId; + const productId = parseInt(idParam!, 10); + const userId = req.user?.id; + const comments = await productCommentService.getCommentsByProductId( + productId, + userId + ); + res.json({ data: comments }); + } + + async createComment(req: Request, res: Response) { + const idParam = req.params.productId; + const productId = parseInt(idParam!, 10); + const { content } = req.body; + const userId = req.user!.id; + const newComment = await productCommentService.createProductComment( + productId, + content, + userId + ); + return res.status(201).json({ data: newComment }); + } + + async updateComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const { content } = req.body; + const userId = req.user!.id; + const updated = await productCommentService.updateComment( + commentId, + userId, + content + ); + res.json({ data: updated }); + } + + async deleteComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const userId = req.user!.id; + await productCommentService.deleteComment(commentId, userId); + return res.status(204).send(); + } + + async likeComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const userId = req.user!.id; + const result = await productCommentService.commentLike(userId, commentId); + res.status(200).json({ data: result }); + } + + async unlikeComment(req: Request, res: Response) { + const idParam = req.params.commentId; + const commentId = parseInt(idParam!, 10); + const userId = req.user!.id; + const result = await productCommentService.commentUnlike(userId, commentId); + res.status(200).json({ data: result }); + } +} + +export const productCommentController = new ProductCommentController(); diff --git a/part4-mission11/src/controllers/notification-controller.ts b/part4-mission11/src/controllers/notification-controller.ts new file mode 100644 index 000000000..a0b0d8af3 --- /dev/null +++ b/part4-mission11/src/controllers/notification-controller.ts @@ -0,0 +1,33 @@ +import type { Request, Response, NextFunction } from 'express'; + +import { notificationService } from '../services/notification-service.js'; +import type { AuthenticatedRequest } from '../types/authenticated-request.js'; + +class NotificationController { + async getMyNotifications(req: Request, res: Response, _next: NextFunction) { + const { user } = req as AuthenticatedRequest; + const list = await notificationService.getMyNotifications(user.id); + res.json(list); + } + + async getMyUnreadCount(req: Request, res: Response, _next: NextFunction) { + const { user } = req as AuthenticatedRequest; + const count = await notificationService.getMyUnreadCount(user.id); + res.json({ unreadCount: count }); + } + + async markAsRead(req: Request, res: Response, _next: NextFunction) { + const { user } = req as AuthenticatedRequest; + const { notificationId } = req.params; + await notificationService.markAsRead(user.id, Number(notificationId)); + res.status(204).end(); + } + + async markAllAsRead(req: Request, res: Response, _next: NextFunction) { + const { user } = req as AuthenticatedRequest; + await notificationService.markAllAsRead(user.id); + res.status(204).end(); + } +} + +export const notificationController = new NotificationController(); diff --git a/part4-mission11/src/controllers/product-controller.ts b/part4-mission11/src/controllers/product-controller.ts new file mode 100644 index 000000000..0d4e6d9d8 --- /dev/null +++ b/part4-mission11/src/controllers/product-controller.ts @@ -0,0 +1,98 @@ +import type { Request, Response } from 'express'; + +import { productService } from '../services/product-service.js'; + +class ProductController { + // 상품 + async getAllProducts(req: Request, res: Response) { + const userId = req.user?.id; + const { data, pagination } = await productService.getAllProducts( + req.query, + userId + ); + res.json({ data, pagination }); + } + + async getProductById(req: Request, res: Response) { + const idParam = req.params.id; + const id = parseInt(idParam!, 10); + const userId = req.user?.id; + const product = await productService.getProductById(id, userId); + res.status(200).json({ data: product }); + } + + async createProduct(req: Request, res: Response) { + const { name, description, price, tags } = req.body; + const newProduct = await productService.createProduct( + req.user!.id, + name, + description, + price, + tags + ); + res.status(201).json({ data: newProduct }); + } + + async updateProduct(req: Request, res: Response) { + const idParam = req.params.id; + const id = parseInt(idParam!, 10); + const { name, description, price, tags, images } = req.body; + const updateData = { name, description, price, tags, images }; + const updated = await productService.updateProduct( + id, + req.user!.id, + updateData + ); + res.json({ data: updated }); + } + + async updateProductPrice(req: Request, res: Response) { + const productId = parseInt(req.params.id!, 10); + const { newPrice } = req.body; + + const actorUserId = req.user!.id; + + const updated = await productService.updateProductPrice( + productId, + Number(newPrice), + actorUserId + ); + + res.json({ + message: '가격이 변경되었습니다.', + data: updated, + }); + } + + async deleteProduct(req: Request, res: Response) { + const idParam = req.params.id; + const id = parseInt(idParam!, 10); + await productService.deleteProduct(id, req.user!.id); + res.status(204).send(); + } + + async likeProduct(req: Request, res: Response) { + const userId = req.user!.id; + const idParam = req.params.id; + const productId = parseInt(idParam!, 10); + const product = await productService.productLike(userId, productId); + res.json({ data: product }); + } + + async unlikeProduct(req: Request, res: Response) { + const userId = req.user!.id; + const idParam = req.params.id; + const productId = parseInt(idParam!, 10); + const product = await productService.productUnlike(userId, productId); + res.json({ data: product }); + } + + // 본인이 등록한 상품 조회 + async getUserProducts(req: Request, res: Response) { + const userId = req.user!.id; + const products = await productService.getUserProducts(userId); + res.status(200).json({ data: products }); + } +} + +export const productController = new ProductController(); diff --git a/part4-mission11/src/controllers/user-controller.ts b/part4-mission11/src/controllers/user-controller.ts new file mode 100644 index 000000000..a616a54b8 --- /dev/null +++ b/part4-mission11/src/controllers/user-controller.ts @@ -0,0 +1,119 @@ +import type { Request, Response } from 'express'; + +import { articleService } from '../services/article-service.js'; +import { productService } from '../services/product-service.js'; +import { userService } from '../services/user-service.js'; + +class UserController { + // 회원가입 + async register(req: Request, res: Response) { + const { username, email, password } = req.body; + const user = await userService.register(username, email, password); + res.status(201).json({ + data: user, + message: '회원 가입 성공!', + }); + } + + // 로그인 + async login(req: Request, res: Response) { + const userId = req.user!.id; + const { accessToken, refreshToken } = await userService.login(userId); + userService.setTokenCookies(res, accessToken, refreshToken); + res.status(200).json({ + accessToken: accessToken, + refreshToken: refreshToken, + message: '로그인 되었습니다.', + }); + } + + // 로그아웃 + logout(req: Request, res: Response) { + userService.clearTokenCookies(res); + res.status(200).send({ message: '로그아웃 되었습니다.' }); + } + + // 유저 정보 조회 + async getUserProfile(req: Request, res: Response) { + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + const profile = await userService.getUserProfile(userId); + if (!profile) { + return res.status(404).json({ message: '유저를 찾을 수 없습니다.' }); + } + res.status(200).json({ profile, message: '유저 프로필 조회!' }); + } + + // 유저 정보 수정 + async updateUserProfile(req: Request, res: Response) { + const { username, email, images } = req.body; // 수정할 필드만 뽑음 + const updateData = { username, email, images }; + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + const updated = await userService.updateUserProfile(userId, updateData); + res.status(200).json({ updated, message: '프로필 수정 완료!' }); + } + + // 비밀번호 수정 + async updatePassword(req: Request, res: Response) { + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + if (!Number.isFinite(userId)) { + return res.status(400).json({ message: '잘못된 사용자 ID 입니다.' }); + } + const { currentPassword, newPassword, newPasswordConfirm } = req.body; + if (newPassword !== newPasswordConfirm) { + return res + .status(400) + .json({ message: '새 비밀번호가 일치하지 않습니다.' }); + } + await userService.updatePassword(userId, currentPassword, newPassword); + res.status(200).json({ message: '비밀번호가 변경되었습니다.' }); + } + + // 유저가 단 댓글 조회 + async getUserComments(req: Request, res: Response) { + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + if (!Number.isFinite(userId)) { + return res.status(400).json({ message: '잘못된 사용자 ID 입니다.' }); + } + const comments = await userService.getUserComments(userId); + res.status(200).json({ comments }); + } + + // 유저가 좋아요 누른 상품 조회 + async getUserLikedProducts(req: Request, res: Response) { + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + if (!Number.isFinite(userId)) { + return res.status(400).json({ message: '잘못된 사용자 ID 입니다.' }); + } + const likedProducts = await productService.getUserLikedProducts(userId); + res.json({ data: likedProducts }); + } + + // 유저가 좋아요 누른 게시글 조회 + async getUserLikedArticles(req: Request, res: Response) { + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + if (!Number.isFinite(userId)) { + return res.status(400).json({ message: '잘못된 사용자 ID 입니다.' }); + } + const likedArticles = await articleService.getUserLikedArticles(userId); + res.json({ data: likedArticles }); + } + + // 유저가 좋아요 누른 댓글 조회 + async getUserLikedComments(req: Request, res: Response) { + const idParam = req.params.userId; + const userId = parseInt(idParam!, 10); + if (!Number.isFinite(userId)) { + return res.status(400).json({ message: '잘못된 사용자 ID 입니다.' }); + } + const likedComments = await userService.getUserLikedComments(userId); + res.json({ data: likedComments }); + } +} + +export const userController = new UserController(); diff --git a/part4-mission11/src/dtos/article-dto.ts b/part4-mission11/src/dtos/article-dto.ts new file mode 100644 index 000000000..b33afad6f --- /dev/null +++ b/part4-mission11/src/dtos/article-dto.ts @@ -0,0 +1,61 @@ +import type { Prisma } from '@prisma/client'; + +import { prisma } from '../lib/prismaClient.js'; + +// DB에서 실제 Article 타입 +export type RawArticle = NonNullable< + Awaited> +>; + +// 응답용 DTO +export interface ArticleResponse { + id: number; + title: string; + content: string; + tags: string[]; + images: string[]; + likeCount: number; + isLiked: boolean; + user: { username: string }; + comments: CommentResponse[]; +} + +export interface CommentResponse { + id: number; + content: string; + likeCount: number; + isLiked: boolean; + user: { username: string }; +} + +export type ArticleWithRelations = Prisma.ArticleGetPayload<{ + include: { + likedBy: { select: { id: true } }; + comments: { + select: { + id: true; + content: true; + likeCount: true; + likedBy: { select: { id: true } }; + }; + }; + user: { select: { username: true } }; + }; +}>; + +export type ArticleQuery = { + page?: number; + limit?: number; + sort?: 'recent' | 'old'; + keyword?: string; + query?: string; + search?: string; +}; + +export interface UpdateArticleDto { + title?: string; + content?: string; + price?: number; + tags?: string[]; + images?: string[]; +} diff --git a/part4-mission11/src/dtos/product-dto.ts b/part4-mission11/src/dtos/product-dto.ts new file mode 100644 index 000000000..397bd8003 --- /dev/null +++ b/part4-mission11/src/dtos/product-dto.ts @@ -0,0 +1,90 @@ +// product-type.ts +import type { Prisma } from '@prisma/client'; + +import { prisma } from '../lib/prismaClient.js'; + +// DB에서 실제로 나오는 타입 +export type RawProduct = NonNullable< + Awaited> +>; + +// 응답용 DTO +export interface ProductResponse { + id: number; + name: string; + description: string; + price: number; + tags: string[]; + images: string[]; + userId: number; + likeCount: number; + isLiked: boolean; + comments: CommentResponse[]; +} + +// 댓글 응답 DTO +export interface CommentResponse { + id: number; + content: string; + likeCount: number; + isLiked: boolean; + user: { username: string }; +} + +export type ProductWithRelations = Prisma.ProductGetPayload<{ + include: { + likedBy: { select: { id: true } }; + comments: { + select: { + id: true; + content: true; + likeCount: true; + likedBy: { select: { id: true } }; + }; + }; + user: { select: { username: true } }; + }; +}>; + +export type ProductQuery = { + page?: number; + limit?: number; + sort?: 'recent' | 'old'; + keyword?: string; + query?: string; + search?: string; +}; + +export type ProductById = { + id: true; + name: true; + description: true; + price: true; + tags: true; + images: true; + userId: true; + likeCount: true; + likedBy: { select: { id: true; username: true } }; + comments: { + select: { + id: true; + content: true; + likeCount: true; + createdAt: true; + updatedAt: true; + user: { select: { username: true } }; + likedBy: { + where: { id: number }; + select: { id: true }; + }; + }; + }; +}; + +export interface UpdateProductDto { + name?: string; + description?: string; + price?: number; + tags?: string[]; + images?: string[]; +} diff --git a/part4-mission11/src/dtos/user-dto.ts b/part4-mission11/src/dtos/user-dto.ts new file mode 100644 index 000000000..a6b21f852 --- /dev/null +++ b/part4-mission11/src/dtos/user-dto.ts @@ -0,0 +1,41 @@ +import { prisma } from '../lib/prismaClient.js'; + +// prisma가 유저를 조회했을 때 나오는 실제 User 타입 +export type RawUser = NonNullable< + Awaited> +>; + +// Service 계층에서 DB에 업데이트할 때 사용하는 타입 +export type UserUpdateData = Partial>; + +export type UserPublic = Pick; + +// Prisma 유저 레코드에서 password 제거한 타입 +export type UserWithoutPassword = { + id: number; + username: string; + email: string; + images: string[] | null; +}; + +// Service 응답용 유저 프로필 DTO +export interface UserProfile { + id: number; + username: string; + email: string; + images: string[]; +} + +// 댓글 DTO +export interface CommentResponse { + content: string; + article?: { + id: number; + title: string; + } | null; + product?: { + id: number; + name: string; + } | null; + likeCount: number; +} diff --git a/part4-mission11/src/env.ts b/part4-mission11/src/env.ts new file mode 100644 index 000000000..6f6cc3536 --- /dev/null +++ b/part4-mission11/src/env.ts @@ -0,0 +1,7 @@ +import dotenv from 'dotenv'; + +if (process.env.NODE_ENV === 'test') { + dotenv.config({ quiet: true }); +} else { + dotenv.config(); +} diff --git a/part4-mission11/src/lib/appError.ts b/part4-mission11/src/lib/appError.ts new file mode 100644 index 000000000..7add7e608 --- /dev/null +++ b/part4-mission11/src/lib/appError.ts @@ -0,0 +1,10 @@ +export default class AppError extends Error { + public statusCode: number; + public isOperational: boolean; + + constructor(message: string, statusCode: number = 500) { + super(message); + this.statusCode = statusCode; + this.isOperational = true; + } +} diff --git a/part4-mission11/src/lib/constants.ts b/part4-mission11/src/lib/constants.ts new file mode 100644 index 000000000..5599b6315 --- /dev/null +++ b/part4-mission11/src/lib/constants.ts @@ -0,0 +1,30 @@ +declare global {} + +// NODE_ENV, PORT 등은 크게 문제 없음 +const NODE_ENV = process.env.NODE_ENV || 'development'; +const PORT = process.env.PORT || 3000; + +// 먼저 raw로 읽어온다 +const ACCESS_SECRET_RAW = process.env.ACCESS_TOKEN_SECRET; +const REFRESH_SECRET_RAW = process.env.REFRESH_TOKEN_SECRET; + +// 존재하지 않으면 서버 바로 중단 +if (!ACCESS_SECRET_RAW || !REFRESH_SECRET_RAW) { + throw new Error('JWT secrets are not set in environment variables'); +} + +// 여기서부터는 string으로 확정된 애만 export +const ACCESS_TOKEN_SECRET = ACCESS_SECRET_RAW as string; +const REFRESH_TOKEN_SECRET = REFRESH_SECRET_RAW as string; + +const ACCESS_TOKEN_COOKIE_NAME = 'access-token'; +const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token'; + +export { + NODE_ENV, + PORT, + ACCESS_TOKEN_SECRET, + REFRESH_TOKEN_SECRET, + ACCESS_TOKEN_COOKIE_NAME, + REFRESH_TOKEN_COOKIE_NAME, +}; diff --git a/part4-mission11/src/lib/dirname.ts b/part4-mission11/src/lib/dirname.ts new file mode 100644 index 000000000..5b5bf449e --- /dev/null +++ b/part4-mission11/src/lib/dirname.ts @@ -0,0 +1,8 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + +export function dirnameFromMeta(metaUrl: string) { + if (typeof __dirname !== 'undefined') return __dirname; // CJS + const __filename = fileURLToPath(metaUrl); // ESM + return path.dirname(__filename); +} diff --git a/part4-mission11/src/lib/exclude.ts b/part4-mission11/src/lib/exclude.ts new file mode 100644 index 000000000..4a7c743ba --- /dev/null +++ b/part4-mission11/src/lib/exclude.ts @@ -0,0 +1,9 @@ +export function exclude( + entity: T, + keys: Key[] +): Omit { + for (let key of keys) { + delete entity[key]; + } + return entity; +} diff --git a/part4-mission11/src/lib/passport/index.ts b/part4-mission11/src/lib/passport/index.ts new file mode 100644 index 000000000..77b35f182 --- /dev/null +++ b/part4-mission11/src/lib/passport/index.ts @@ -0,0 +1,20 @@ +import passport from 'passport'; + +import { accessTokenStrategy, refreshTokenStrategy } from './jwtStrategy.js'; +import { localStrategy } from './localStrategy.js'; + +// 전략 등록 +passport.use('local', localStrategy); +passport.use('access-token', accessTokenStrategy); +passport.use('refresh-token', refreshTokenStrategy); + +// 미들웨어 export +export const localAuth = passport.authenticate('local', { session: false }); +export const accessAuth = passport.authenticate('access-token', { + session: false, +}); +export const refreshAuth = passport.authenticate('refresh-token', { + session: false, +}); + +export default passport; diff --git a/part4-mission11/src/lib/passport/jwtStrategy.ts b/part4-mission11/src/lib/passport/jwtStrategy.ts new file mode 100644 index 000000000..93adef9db --- /dev/null +++ b/part4-mission11/src/lib/passport/jwtStrategy.ts @@ -0,0 +1,40 @@ +import { type JwtPayload } from 'jsonwebtoken'; +import { + Strategy as JwtStrategy, + ExtractJwt, + type VerifiedCallback, +} from 'passport-jwt'; + +import { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from '../constants.js'; +import { prisma } from '../prismaClient.js'; + +const accessTokenOptions = { + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + secretOrKey: ACCESS_TOKEN_SECRET, +}; + +const refreshTokenOptions = { + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + secretOrKey: REFRESH_TOKEN_SECRET, +}; + +async function jwtVerify(payload: JwtPayload, done: VerifiedCallback) { + try { + const user = await prisma.user.findUnique({ + where: { id: payload.id }, + }); + done(null, user); + } catch (error) { + done(error, false); + } +} + +export const accessTokenStrategy = new JwtStrategy( + accessTokenOptions, + jwtVerify +); + +export const refreshTokenStrategy = new JwtStrategy( + refreshTokenOptions, + jwtVerify +); diff --git a/part4-mission11/src/lib/passport/localStrategy.ts b/part4-mission11/src/lib/passport/localStrategy.ts new file mode 100644 index 000000000..3d74ee4d5 --- /dev/null +++ b/part4-mission11/src/lib/passport/localStrategy.ts @@ -0,0 +1,51 @@ +import bcrypt from 'bcrypt'; +import * as PassportLocal from 'passport-local'; +const LocalStrategy = PassportLocal.Strategy; +import type { IVerifyOptions } from 'passport-local'; + +import type { AuthUser } from '../../types/authenticated-request.js'; +import { prisma } from '../prismaClient.js'; + +export const localStrategy = new LocalStrategy(async function ( + username: string, + password: string, + done: (error: unknown, user?: AuthUser | false, info?: IVerifyOptions) => void +) { + try { + // 1) 유저 조회 + const user = await prisma.user.findUnique({ + where: { username }, + select: { + id: true, + username: true, + email: true, + password: true, // 비교를 위해 필요하지만 최종 결과엔 안 넣음 + }, + }); + + if (!user) { + // 로그인 실패: 유저 없음 + return done(null, false); + } + + // 2) 비번 비교 + const isPasswordValid = await bcrypt.compare(password, user.password); + if (!isPasswordValid) { + // 로그인 실패: 비번 틀림 + return done(null, false); + } + + // 3) 민감정보 제거하고 AuthUser 형태로 변환 + const safeUser: AuthUser = { + id: user.id, + username: user.username, + email: user.email, + }; + + // 4) 로그인 성공 + return done(null, safeUser); + } catch (err) { + // DB 오류 등 + return done(err); + } +}); diff --git a/part4-mission11/src/lib/ports.ts b/part4-mission11/src/lib/ports.ts new file mode 100644 index 000000000..6e0fe3b48 --- /dev/null +++ b/part4-mission11/src/lib/ports.ts @@ -0,0 +1,23 @@ +import { wsGateway as realWs } from './ws.js'; + +export type WsPort = { + notifyUser: (args: { + userId: number; + type: 'NEW_COMMENT' | 'PRICE_CHANGE' | string; + message: string; + createdAt?: Date; + data?: Record; + }) => void; +}; + +const defaultPorts = { ws: realWs as WsPort }; + +export const ports: { ws: WsPort } = { ...defaultPorts }; + +export function setPorts(patch: Partial) { + Object.assign(ports, patch); +} + +export function resetPorts() { + ports.ws = defaultPorts.ws; +} diff --git a/part4-mission11/src/lib/prismaClient.ts b/part4-mission11/src/lib/prismaClient.ts new file mode 100644 index 000000000..23c750d83 --- /dev/null +++ b/part4-mission11/src/lib/prismaClient.ts @@ -0,0 +1,20 @@ +// src/lib/prismaClient.ts +import { PrismaClient } from '@prisma/client'; + +declare global { + // 글로벌 캐시용 + var __prisma: PrismaClient | undefined; +} + +/** + * PrismaClient 싱글톤 + * - 프로덕션: top-level export + * - 개발(TSX watch): 글로벌 캐시 사용 + */ +export const prisma: PrismaClient = + global.__prisma ?? + new PrismaClient(); + // {log: ['query', 'warn', 'error'],} + +// 개발 환경에서 글로벌 캐시에 저장 +if (process.env.NODE_ENV !== 'production') global.__prisma = prisma; diff --git a/part4-mission11/src/lib/token.ts b/part4-mission11/src/lib/token.ts new file mode 100644 index 000000000..0606fcf70 --- /dev/null +++ b/part4-mission11/src/lib/token.ts @@ -0,0 +1,57 @@ +import jwt from 'jsonwebtoken'; + +import AppError from './appError.js'; +import { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from './constants.js'; + +type AccessPayload = jwt.JwtPayload & { sub: number; type: 'access' }; +type RefreshPayload = jwt.JwtPayload & { sub: number; type: 'refresh' }; + +export function generateTokens(userId: number) { + const accessToken = jwt.sign( + { sub: userId, type: 'access' } as AccessPayload, + ACCESS_TOKEN_SECRET, + { algorithm: 'HS256', expiresIn: '1h' } + ); + const refreshToken = jwt.sign( + { sub: userId, type: 'refresh' } as RefreshPayload, + REFRESH_TOKEN_SECRET, + { algorithm: 'HS256', expiresIn: '7d' } + ); + return { accessToken, refreshToken }; +} + +export function verifyAccessToken(token: string): { userId: number } { + try { + const d = jwt.verify(token, ACCESS_TOKEN_SECRET, { + algorithms: ['HS256'], + }) as AccessPayload; + if ( + typeof d !== 'object' || + d.type !== 'access' || + typeof d.sub !== 'number' + ) { + throw new AppError('유효하지 않은 액세스 토큰', 401); + } + return { userId: d.sub }; + } catch { + throw new AppError('유효하지 않은 액세스 토큰', 401); + } +} + +export function verifyRefreshToken(token: string): { userId: number } { + try { + const d = jwt.verify(token, REFRESH_TOKEN_SECRET, { + algorithms: ['HS256'], + }) as RefreshPayload; + if ( + typeof d !== 'object' || + d.type !== 'refresh' || + typeof d.sub !== 'number' + ) { + throw new AppError('유효하지 않은 리프레시 토큰', 401); + } + return { userId: d.sub }; + } catch { + throw new AppError('유효하지 않은 리프레시 토큰', 401); + } +} diff --git a/part4-mission11/src/lib/ws.ts b/part4-mission11/src/lib/ws.ts new file mode 100644 index 000000000..875be010d --- /dev/null +++ b/part4-mission11/src/lib/ws.ts @@ -0,0 +1,145 @@ +import type { NotificationType as PrismaNotificationType } from '@prisma/client'; +import { NotificationType as NotificationTypeValues } from '@prisma/client'; +import type { Server as HTTPServer } from 'http'; +import { Server } from 'socket.io'; + +import { parseUserIdFromToken } from './wsAuth.js'; +import type { NotificationType as DomainNotificationType } from '../types/notification.js'; + +type UserSocketMap = Map>; +const userSockets: UserSocketMap = new Map(); +let io: Server | undefined; + +type AuthFn = (rawToken: unknown) => number | null; + +export function __resetWsForTest() { + userSockets.clear(); + io = undefined; +} +export function __getUserSocketsForTest() { + return userSockets; +} + +type WireNotificationType = 'contract-linked' | 'chat' | 'system'; +export interface WireNotificationPayload { + type: WireNotificationType; + message: string; + createdAt: string; + data?: Record; +} + +export function mapDomainToWire( + t: PrismaNotificationType | DomainNotificationType +): WireNotificationType { + switch (t) { + case NotificationTypeValues.PRICE_CHANGE: + return 'system'; + case NotificationTypeValues.NEW_COMMENT: + return 'chat'; + default: { + const _never: never = t as never; + return 'system'; + } + } +} + +export function setupWebSocket(server: HTTPServer, deps?: { auth?: AuthFn }) { + const auth = deps?.auth ?? parseUserIdFromToken; + + io = new Server(server, { + path: '/ws', + cors: { + origin: [process.env.CORS_ORIGIN || 'http://localhost:3001'], + credentials: true, + methods: ['GET', 'POST'], + }, + }); + + io.on('connection', (socket) => { + const userId = auth(socket.handshake.auth?.token); + if (!userId) { + socket.disconnect(true); + return; + } + + const set = userSockets.get(userId) ?? new Set(); + set.add(socket.id); + userSockets.set(userId, set); + + socket.emit('joined', { ok: true, userId }); + + socket.on('disconnect', () => { + const s = userSockets.get(userId); + if (s) { + s.delete(socket.id); + if (s.size === 0) userSockets.delete(userId); + } + }); + }); +} + +// 알림 게이트웨이 +export const wsGateway = { + notifyUser(args: { + userId: number; + type: PrismaNotificationType | DomainNotificationType; + message: string; + createdAt?: Date; + data?: Record; + }) { + if (!io) return; + + const { userId, type, message, data } = args; + const createdAt = (args.createdAt ?? new Date()).toISOString(); + const wire: WireNotificationPayload = { + type: mapDomainToWire(type), + message, + createdAt, + ...(data !== undefined ? { data } : {}), + }; + + const sockets = userSockets.get(userId); + if (!sockets) return; + + for (const sid of sockets) { + io.to(sid).emit('notification', wire); + } + }, +}; + +// 전달받은 io를 실제로 사용 (전역 의존성 제거) +export function publishToUser( + sio: Server, + { + userId, + event, + payload, + }: { userId: number; event: 'notification'; payload: unknown } +) { + const sockets = userSockets.get(userId); + if (!sockets) return; + for (const sid of sockets) { + sio.to(sid).emit(event, payload); + } +} + +export async function closeWebSocket(): Promise { + if (!io) return; + + // 1) 모든 소켓 강제 disconnect + const sockets = await io.fetchSockets().catch(() => []); + for (const s of sockets) { + try { + s.disconnect(true); + } catch {} + } + + // 2) io 자체 종료를 "완료"까지 대기 + await new Promise((resolve) => { + io!.close(() => resolve()); + }); + + io = undefined; +} + +// export type { UserSocketMap }; // (원하면) diff --git a/part4-mission11/src/lib/wsAuth.ts b/part4-mission11/src/lib/wsAuth.ts new file mode 100644 index 000000000..8a68bc715 --- /dev/null +++ b/part4-mission11/src/lib/wsAuth.ts @@ -0,0 +1,15 @@ +import { verifyAccessToken as realVerifyAccessToken } from './token.js'; + +export function parseUserIdFromToken( + rawToken: unknown, + // 테스트에서 주입 가능 + verify: (t: string) => { userId: number } = realVerifyAccessToken +): number | null { + if (typeof rawToken !== 'string') return null; + try { + const { userId } = verify(rawToken); + return typeof userId === 'number' ? userId : null; + } catch { + return null; + } +} diff --git a/part4-mission11/src/middlewares/authorize.ts b/part4-mission11/src/middlewares/authorize.ts new file mode 100644 index 000000000..536b65f20 --- /dev/null +++ b/part4-mission11/src/middlewares/authorize.ts @@ -0,0 +1,103 @@ +import bcrypt from 'bcrypt'; +import type { Request, RequestHandler } from 'express'; + +import { prisma } from '../lib/prismaClient.js'; + +// params에 어떤 키들이 올 수 있는지 제네릭으로 지정. +type Params = { id?: string; commentId?: string; userId?: string }; + +// modelGetter는 req를 받아서 userId를 포함한 리소스를 반환(또는 null) +type ModelGetter = (req: Request) => Promise<{ userId: number } | null>; + +// 공통 로직 +export const isOwner = (modelGetter: ModelGetter): RequestHandler => { + return async (req, res, next) => { + const resource = await modelGetter(req as Request); + if (!resource) + return res.status(404).json({ message: '대상을 찾을 수 없습니다.' }); + const reqUserId = (req.user as { id?: number } | undefined)?.id; + if (typeof reqUserId !== 'number') { + return res.status(401).json({ message: '로그인이 필요합니다.' }); + } + if (resource.userId !== reqUserId) + return res.status(403).json({ message: '권한이 없습니다.' }); + next(); + }; +}; + +// 제품 권한 체크 +export const isProductOwner = isOwner((req) => + prisma.product.findUnique({ + where: { id: parseInt((req.params.id ?? '') as string, 10) || 0 }, + select: { userId: true }, + }) +); + +// 게시글 권한 체크 +export const isArticleOwner = isOwner((req) => + prisma.article.findUnique({ + where: { id: parseInt((req.params.id ?? '') as string, 10) || 0 }, + select: { userId: true }, + }) +); + +// 댓글 권한 체크 +export const isCommentOwner = isOwner((req) => + prisma.comment.findUnique({ + where: { id: parseInt((req.params.commentId ?? '') as string, 10) || 0 }, + select: { userId: true }, + }) +); + +// 본인인지 체크 +export const isUserSelf: RequestHandler = (req, res, next) => { + // :userId 또는 :id 둘 다 지원 + const targetIdRaw = (req.params.userId ?? req.params.id) as + | string + | undefined; + const targetId = Number.parseInt(targetIdRaw ?? '', 10); + + const reqUserId = (req.user as { id?: number } | undefined)?.id; + + if (typeof reqUserId !== 'number') { + return res.status(401).json({ message: '로그인이 필요합니다.' }); + } + + // 파라미터가 없거나 숫자가 아니면 권한 없음으로 처리(요구사항에 따라 400으로 바꿀 수도 있음) + if (!Number.isFinite(targetId) || targetId !== reqUserId) { + return res.status(403).json({ message: '권한이 없습니다.' }); + } + + next(); +}; + +// 비밀번호 체크 +export const verifyPassword: RequestHandler = async (req, res, next) => { + try { + const { currentPassword } = req.body as { currentPassword?: string }; + if (!currentPassword) { + return res + .status(400) + .json({ message: '현재 비밀번호를 입력해 주세요.' }); + } + + const reqUserId = (req.user as { id?: number } | undefined)?.id; + if (typeof reqUserId !== 'number') { + return res.status(401).json({ message: '로그인이 필요합니다.' }); + } + + const user = await prisma.user.findUnique({ where: { id: reqUserId } }); + if (!user) { + return res.status(404).json({ message: '사용자를 찾을 수 없습니다.' }); + } + + const isValid = await bcrypt.compare(currentPassword, user.password); + if (!isValid) { + return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' }); + } + + next(); + } catch (err) { + next(err); + } +}; diff --git a/part4-mission11/src/middlewares/errorHandler.ts b/part4-mission11/src/middlewares/errorHandler.ts new file mode 100644 index 000000000..0e024834d --- /dev/null +++ b/part4-mission11/src/middlewares/errorHandler.ts @@ -0,0 +1,205 @@ +import { Prisma } from '@prisma/client'; +import type { ErrorRequestHandler } from 'express'; +import multer from 'multer'; + +/** ---- Custom Errors ---- */ +export class AppError extends Error { + constructor(message: string, public statusCode = 500, name = 'AppError') { + super(message); + this.name = name; + } +} +export class BadRequestError extends AppError { + constructor(message = '잘못된 요청입니다.') { + super(message, 400, 'BadRequestError'); + } +} +export class NotFoundError extends AppError { + constructor(message = '리소스를 찾을 수 없습니다.') { + super(message, 404, 'NotFoundError'); + } +} +export class ForbiddenError extends AppError { + constructor(message = '권한이 없습니다.') { + super(message, 403, 'ForbiddenError'); + } +} +export class UnauthorizedError extends AppError { + constructor(message = '로그인이 필요합니다.') { + super(message, 401, 'UnauthorizedError'); + } +} + +/** ---- HttpError Guard ---- */ +interface HttpError extends Error { + statusCode?: number; +} +function isHttpError(err: unknown): err is HttpError { + return ( + !!err && typeof err === 'object' && 'message' in err && 'statusCode' in err + ); +} + +/** ---- Prisma mapping helpers ---- */ +type PrismaMapped = { + status: number; + error: string; + message: string; + code: string; +}; +type PrismaLike = { code?: string; meta?: { target?: unknown } }; + +/** 실제 Prisma KnownRequestError 전용(널 아님) */ +function mapPrismaKnown( + err: Prisma.PrismaClientKnownRequestError +): PrismaMapped { + const code = err.code; + const rawTarget = err.meta?.target; + const fields = + Array.isArray(rawTarget) && rawTarget.every((s) => typeof s === 'string') + ? (rawTarget as string[]) + : []; + + let status = 400; + let message = `DB 요청 에러 (${code})`; + const error = 'PrismaClientKnownRequestError'; + + if (code === 'P2002') { + if (fields.includes('username')) message = '이미 사용 중인 닉네임입니다.'; + else if (fields.includes('email')) message = '이미 사용 중인 이메일입니다.'; + else message = `중복된 값이 존재합니다. (${fields.join(', ')})`; + status = 409; + } else if (code === 'P2003') { + message = '잘못된 참조로 인해 작업이 불가능합니다.'; + status = 400; + } else if (code === 'P2025') { + message = '대상을 찾을 수 없습니다.'; + status = 404; + } + return { status, error, message, code }; +} + +/** 가짜/래핑된 Prisma-like 에러 폴백(없으면 null) */ +function mapPrismaLike(err: unknown): PrismaMapped | null { + const code = (err as PrismaLike)?.code; + if (typeof code !== 'string') return null; + + const rawTarget = (err as PrismaLike)?.meta?.target; + const fields = + Array.isArray(rawTarget) && rawTarget.every((s) => typeof s === 'string') + ? (rawTarget as string[]) + : []; + + let status = 400; + let message = `DB 요청 에러 (${code})`; + const error = 'PrismaClientKnownRequestError'; + + if (code === 'P2002') { + if (fields.includes('username')) message = '이미 사용 중인 닉네임입니다.'; + else if (fields.includes('email')) message = '이미 사용 중인 이메일입니다.'; + else message = `중복된 값이 존재합니다. (${fields.join(', ')})`; + status = 409; + } else if (code === 'P2003') { + message = '잘못된 참조로 인해 작업이 불가능합니다.'; + status = 400; + } else if (code === 'P2025') { + message = '대상을 찾을 수 없습니다.'; + status = 404; + } + return { status, error, message, code }; +} + +/** ---- Multer mapping ---- */ +function mapMulter(err: multer.MulterError) { + let message = err.message; + if (err.code === 'LIMIT_FILE_SIZE') + message = '파일 크기가 너무 큽니다. (최대 5MB)'; + else if (err.code === 'LIMIT_UNEXPECTED_FILE') + message = '허용되지 않는 파일 필드입니다.'; + else if (err.code === 'LIMIT_FILE_COUNT') + message = '최대 5개의 파일만 업로드할 수 있습니다.'; + return { status: 400, error: 'MulterError', message, code: err.code }; +} + +/** ---- Error Handler ---- */ +const errorHandler: ErrorRequestHandler = (err, req, res, _next) => { + console.error((err as Error)?.stack ?? err); + + const isProd = process.env.NODE_ENV === 'production'; + const isTest = process.env.NODE_ENV === 'test'; + + if (!isTest) { + console.error((err as Error)?.stack ?? err); + } + + // 기본값 + let status = 500; + let error = (err as Error)?.name || 'InternalServerError'; + let message = (err as Error)?.message || '서버 오류'; + let code: string | undefined; + + // 1) 커스텀 AppError + if (err instanceof AppError) { + status = err.statusCode; + error = err.name; + message = err.message; + } + // 2) HttpError + else if (isHttpError(err)) { + status = err.statusCode ?? 500; + error = (err as Error).name || error; + message = err.message ?? message; + } + // 3) Prisma KnownRequestError (확정 매핑: null 아님) + else if (err instanceof Prisma.PrismaClientKnownRequestError) { + const m = mapPrismaKnown(err); + status = m.status; + error = m.error; + message = m.message; + code = m.code; + } + // 4) MulterError + else if (err instanceof multer.MulterError) { + const m = mapMulter(err); + status = m.status; + error = m.error; + message = m.message; + code = m.code; + } + + // 5) 폴백: Prisma-like(code만 있는 가짜/래핑) 매핑 시도 + if (!code) { + const m2 = mapPrismaLike(err); + if (m2) { + status = m2.status; + error = m2.error; + message = m2.message; + code = m2.code; + } + } + + // 공통 응답 payload (단 한 번만 선언) + const payload: { + status: number; + error: string; + message: string; + code?: string; + stack?: string; + path?: string; + method?: string; + } = { status, error, message }; + + if (!isProd) { + if (code !== undefined) payload.code = code; + payload.path = req.originalUrl; + payload.method = req.method; + const st = (err as Error).stack; + if (st !== undefined) payload.stack = st; + } else { + if (code !== undefined) payload.code = code; + } + + return res.status(status).json(payload); +}; + +export default errorHandler; diff --git a/part4-mission11/src/middlewares/logger.ts b/part4-mission11/src/middlewares/logger.ts new file mode 100644 index 000000000..409bf60e5 --- /dev/null +++ b/part4-mission11/src/middlewares/logger.ts @@ -0,0 +1,15 @@ +import type { RequestHandler } from 'express'; + +export const requestLogger: RequestHandler = (req, res, next) => { + if (process.env.NODE_ENV === 'test') return next(); + const start = Date.now(); + + res.on('finish', () => { + const duration = Date.now() - start; + console.log( + `[백엔드] ${res.statusCode} ${req.method} ${req.originalUrl} - ${duration}ms` + ); + }); + + next(); +}; diff --git a/part4-mission11/src/middlewares/validation.ts b/part4-mission11/src/middlewares/validation.ts new file mode 100644 index 000000000..7a5824050 --- /dev/null +++ b/part4-mission11/src/middlewares/validation.ts @@ -0,0 +1,199 @@ +import type { Request, Response, NextFunction } from 'express'; +import { z } from 'zod'; + +import { prisma } from '../lib/prismaClient.js'; + +class Validation { + // ------------------------------ + // 상품 생성 + // ------------------------------ + productSchema = z.object({ + name: z.preprocess( + (val) => (val === undefined ? '' : val), + z.string().nonempty('상품 이름은 필수입니다.') + ), + description: z.preprocess( + (val) => (val === undefined ? '' : val), + z.string().nonempty('상품 설명은 필수입니다.') + ), + price: z.preprocess( + (val) => (val === undefined ? NaN : val), + z.number().positive('가격은 양수여야 합니다.') + ), + tags: z.array(z.string()).optional(), + }); + + // 상품 업데이트 + productUpdateSchema = z + .object({ + name: z.string().optional(), + description: z.string().optional(), + price: z.number().positive().optional(), + tags: z.array(z.string()).optional(), + }) + .refine((data) => Object.keys(data).length > 0, { + message: '수정할 데이터가 없습니다.', + }); + + productPriceUpdateSchema = z.object({ + newPrice: z.preprocess( + (val) => (val === undefined ? NaN : val), + z.number().positive('가격은 양수여야 합니다.') + ), + }); + + // ------------------------------ + // 게시글 생성 + // ------------------------------ + articleSchema = z.object({ + title: z.preprocess( + (val) => (val === undefined ? '' : val), + z.string().nonempty('제목은 필수입니다.') + ), + content: z.preprocess( + (val) => (val === undefined ? '' : val), + z.string().nonempty('내용은 필수입니다.') + ), + }); + + // 게시글 업데이트 + articleUpdateSchema = z + .object({ + title: z.string().optional(), + content: z.string().optional(), + }) + .refine((data) => Object.keys(data).length > 0, { + message: '수정할 데이터가 없습니다.', + }); + + // ------------------------------ + // 댓글 생성/업데이트 + // ------------------------------ + commentSchema = z.object({ + content: z.preprocess( + (val) => (val === undefined ? '' : val), + z.string().nonempty('내용은 필수입니다.') + ), + }); + + // 문자열 규칙만 담는 스키마 + passwordRules = z + .string() + .min(8, '비밀번호는 최소 8자 이상이어야 합니다.') + .max(64, '비밀번호는 최대 64자까지 가능합니다.') + .regex(/[A-Z]/, '대문자가 최소 1개 포함되어야 합니다.') + .regex(/[a-z]/, '소문자가 최소 1개 포함되어야 합니다.') + .regex(/[0-9]/, '숫자가 최소 1개 포함되어야 합니다.') + .regex(/[^A-Za-z0-9]/, '특수문자가 최소 1개 포함되어야 합니다.'); + + // 비번 변경용 스키마 (세 필드) + passwordSchema = z + .object({ + currentPassword: z.string().min(1, '현재 비밀번호는 필수입니다.'), + newPassword: this.passwordRules, // ← 이제 string + newPasswordConfirm: z.string().min(1, '새 비밀번호 확인은 필수입니다.'), + }) + .superRefine((val, ctx) => { + if (val.newPassword !== val.newPasswordConfirm) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: ['newPasswordConfirm'], + message: '새 비밀번호가 일치하지 않습니다.', + }); + } + }); + + // ------------------------------ + // ID 검증 + // ------------------------------ + idSchema = z.string().refine((val) => /^[1-9]\d*$/.test(val), { + message: 'ID가 올바르지 않습니다.', + }); + + // ------------------------------ + // 유저네임, 이메일 중복 검사 미들웨어 + // ------------------------------ + async validateRegister(req: Request, res: Response, next: NextFunction) { + const { username, email } = req.body; + + // username 중복 체크 + const usernameExists = await prisma.user.findUnique({ + where: { username }, + }); + if (usernameExists) { + return res.status(409).json({ message: '이미 사용 중인 닉네임입니다.' }); + } + + // email 중복 체크 + const emailExists = await prisma.user.findUnique({ where: { email } }); + if (emailExists) { + return res.status(409).json({ message: '이미 사용 중인 이메일입니다.' }); + } + + next(); + } + + // 목록 쿼리 스키마 (필요에 맞게 필드 추가/수정 OK) + listQuerySchema = z + .object({ + page: z.coerce.number().int().min(1).default(1), + pageSize: z.coerce.number().int().min(1).max(100).default(10), + sortBy: z.enum(['createdAt', 'updatedAt']).default('createdAt'), + order: z.enum(['asc', 'desc']).default('desc'), + searchBy: z.enum(['title', 'content', 'username']).optional(), + keyword: z.string().trim().optional(), + }) + .superRefine((val, ctx) => { + const usedSearch = + val.searchBy !== undefined || val.keyword !== undefined; + if (usedSearch && (!val.searchBy || !val.keyword)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'searchBy와 keyword를 함께 보내주세요.', + }); + } + }); + + // ------------------------------ + // 미들웨어용 스키마 검증 함수 + // ------------------------------ + validate(schema: z.ZodTypeAny) { + return (req: Request, res: Response, next: NextFunction) => { + const result = schema.safeParse(req.body); + if (!result.success) { + return res.status(400).json({ + message: result.error.issues.map((e) => e.message).join(', '), + }); + } + next(); + }; + } + + validateParam(paramName: string, schema: z.ZodTypeAny) { + return (req: Request, res: Response, next: NextFunction) => { + const result = schema.safeParse(req.params[paramName]); + if (!result.success) { + return res.status(400).json({ + message: result.error.issues.map((e) => e.message).join(', '), + }); + } + next(); + }; + } + + // 쿼리 검증 미들웨어 추가 + validateQuery(schema: z.ZodTypeAny) { + return (req: Request, res: Response, next: NextFunction) => { + const result = schema.safeParse(req.query); + if (!result.success) { + return res.status(400).json({ + message: result.error.issues.map((e) => e.message).join(', '), + }); + } + res.locals.query = result.data; + next(); + }; + } +} + +export const validation = new Validation(); diff --git a/part4-mission11/src/prisma/seed.ts b/part4-mission11/src/prisma/seed.ts new file mode 100644 index 000000000..43fdea670 --- /dev/null +++ b/part4-mission11/src/prisma/seed.ts @@ -0,0 +1,164 @@ +import bcrypt from 'bcrypt'; +import { prisma } from '../lib/prismaClient.js'; + +const main = async () => { + console.log('🔄 시드 시작...'); + + // 0️⃣ 모든 댓글/게시글/상품은 매번 삭제 후 재생성 + await prisma.comment.deleteMany(); + await prisma.article.deleteMany(); + await prisma.product.deleteMany(); + console.log('🧹 product / article / comment 초기화 완료'); + + // 1️⃣ 유저는 username unique 있으므로 upsert 가능 → 안전 + const hashedPassword1 = await bcrypt.hash('password1', 10); + const hashedPassword2 = await bcrypt.hash('password2', 10); + + const user1 = await prisma.user.upsert({ + where: { username: 'testUser1' }, + update: {}, + create: { + username: 'testUser1', + email: 'test1@example.com', + password: hashedPassword1, + images: [], + }, + }); + + const user2 = await prisma.user.upsert({ + where: { username: 'testUser2' }, + update: {}, + create: { + username: 'testUser2', + email: 'test2@example.com', + password: hashedPassword2, + images: [], + }, + }); + + console.log('👤 유저 upsert 완료'); + + // 2️⃣ 상품 재생성 (deleteMany 했으므로 create는 항상 성공) + const product1 = await prisma.product.create({ + data: { + name: 'Nintendo Switch2', + description: '아 스위치2 갖고 싶다', + price: 650000, + tags: ['전자제품'], + images: [], + userId: user1.id, + }, + }); + + const product2 = await prisma.product.create({ + data: { + name: 'PlayStation 5', + description: '게임 끝판왕', + price: 750000, + tags: ['게임기'], + images: [], + userId: user2.id, + }, + }); + + const product3 = await prisma.product.create({ + data: { + name: 'Xbox Series X', + description: 'MS 게임기', + price: 700000, + tags: ['게임기'], + images: [], + userId: user1.id, + }, + }); + + console.log('🛒 상품 생성 완료'); + + // 3️⃣ 게시글 재생성 + const article1 = await prisma.article.create({ + data: { + title: '스위치2 솔직히 너무 비싼듯 ㅇㅇ', + content: 'ㅈㄱㄴ', + tags: ['리뷰'], + userId: user2.id, + }, + }); + + const article2 = await prisma.article.create({ + data: { + title: '플스5 성능 리뷰', + content: '가격만 빼면 마음에 드네', + tags: ['리뷰', '게임'], + userId: user1.id, + }, + }); + + const article3 = await prisma.article.create({ + data: { + title: '엑스박스 시리즈 X 후기', + content: '엑스박스 쳤다...', + tags: ['리뷰', '게임'], + userId: user2.id, + }, + }); + + console.log('📝 게시글 생성 완료'); + + // 4️⃣ 댓글 재생성 + await prisma.comment.createMany({ + data: [ + // Product1 댓글 + { content: '와 가격', userId: user2.id, productId: product1.id }, + { + content: '스위치2 존버 대성공 ㅋㅋ', + userId: user1.id, + productId: product1.id, + }, + + // Product2 + { + content: '플스5 진짜 사고 싶다', + userId: user1.id, + productId: product2.id, + }, + + // Product3 + { content: '엑박도 좋음', userId: user2.id, productId: product3.id }, + + // Article1 + { + content: 'ㄹㅇ 쉽지않음 거의 플스5급 아님?', + userId: user1.id, + articleId: article1.id, + }, + { + content: '플스5 프로 생각하면 또 선녀 같네', + userId: user2.id, + articleId: article1.id, + }, + + // Article2 + { + content: '성능 리뷰 잘 봤습니다', + userId: user2.id, + articleId: article2.id, + }, + + // Article3 + { content: '엑박 후기 ㄳ', userId: user1.id, articleId: article3.id }, + ], + }); + + console.log('💬 댓글 생성 완료'); +}; + +main() + .then(() => { + console.log('🎉 데이터베이스 시딩 완료.'); + return prisma.$disconnect(); + }) + .catch(async (e) => { + console.error('❌ 시딩 에러:', e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/part4-mission11/src/repositories/article-repository.ts b/part4-mission11/src/repositories/article-repository.ts new file mode 100644 index 000000000..3afc63292 --- /dev/null +++ b/part4-mission11/src/repositories/article-repository.ts @@ -0,0 +1,91 @@ +import type { Prisma } from '@prisma/client'; + +import type { ArticleWithRelations } from '../dtos/article-dto.js'; +import { prisma } from '../lib/prismaClient.js'; + +class ArticleRepository { + async findMany( + args: Prisma.ArticleFindManyArgs + ): Promise { + return prisma.article.findMany(args) as Promise; + } + + async findUnique(articleId: number, userId?: number) { + return prisma.article.findUnique({ + where: { id: articleId }, + include: { + user: { select: { username: true } }, + comments: { + include: { + user: { select: { username: true } }, + }, + }, + ...(userId && { + likes: { where: { userId }, select: { userId: true } }, + }), + }, + }); + } + + async create(data: { title: string; content: string; userId: number }) { + return prisma.article.create({ + data: { + title: data.title, + content: data.content, + user: { connect: { id: data.userId } }, + }, + }); + } + + async update( + articleId: number, + userId: number, + updateData: Prisma.ArticleUpdateInput + ) { + return prisma.article.update({ + where: { id: articleId, userId }, + data: updateData, + }); + } + + async delete(articleId: number, userId: number) { + return prisma.article.deleteMany({ + where: { id: articleId, userId }, + }); + } + + async count(where?: Prisma.ArticleWhereInput) { + return prisma.article.count({ where: where ?? {} }); + } + + async findUserArticles(userId: number) { + return prisma.article.findMany({ + where: { userId }, + orderBy: { createdAt: 'desc' }, + select: { + id: true, + title: true, + content: true, + tags: true, + images: true, + }, + }); + } + + async findLikedArticles(userId: number) { + return prisma.article.findMany({ + where: { + likes: { some: { userId } }, + }, + }); + } + + findLiteById(articleId: number) { + return prisma.article.findUnique({ + where: { id: articleId }, + select: { id: true, userId: true, title: true }, + }); + } +} + +export const articleRepository = new ArticleRepository(); diff --git a/part4-mission11/src/repositories/comments/article-comment-repository.ts b/part4-mission11/src/repositories/comments/article-comment-repository.ts new file mode 100644 index 000000000..1510102b8 --- /dev/null +++ b/part4-mission11/src/repositories/comments/article-comment-repository.ts @@ -0,0 +1,29 @@ +import { prisma } from '../../lib/prismaClient.js'; + +class ArticleCommentRepository { + findByArticleId(articleId: number) { + return prisma.comment.findMany({ + where: { articleId }, + select: { + id: true, + content: true, + createdAt: true, + updatedAt: true, + user: { select: { username: true } }, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + create(articleId: number, content: string, userId: number) { + return prisma.comment.create({ + data: { + content, + userId, + articleId, + }, + }); + } +} + +export const articleCommentRepository = new ArticleCommentRepository(); diff --git a/part4-mission11/src/repositories/comments/comment-repository.ts b/part4-mission11/src/repositories/comments/comment-repository.ts new file mode 100644 index 000000000..b37660426 --- /dev/null +++ b/part4-mission11/src/repositories/comments/comment-repository.ts @@ -0,0 +1,27 @@ +import { prisma } from '../../lib/prismaClient.js'; + +class CommentRepository { + findById(commentId: number) { + return prisma.comment.findUnique({ + where: { id: commentId }, + include: { + user: { select: { username: true } }, + }, + }); + } + + update(commentId: number, content: string) { + return prisma.comment.update({ + where: { id: commentId }, + data: { content }, + }); + } + + delete(commentId: number, userId: number) { + return prisma.comment.deleteMany({ + where: { id: commentId, userId }, + }); + } +} + +export const commentRepository = new CommentRepository(); diff --git a/part4-mission11/src/repositories/comments/product-comment-repository.ts b/part4-mission11/src/repositories/comments/product-comment-repository.ts new file mode 100644 index 000000000..995a23c8c --- /dev/null +++ b/part4-mission11/src/repositories/comments/product-comment-repository.ts @@ -0,0 +1,44 @@ +import { prisma } from '../../lib/prismaClient.js'; + +class ProductCommentRepository { + findByProductId(productId: number) { + return prisma.comment.findMany({ + where: { productId }, + select: { + id: true, + content: true, + createdAt: true, + updatedAt: true, + user: { select: { username: true } }, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + create(productId: number, content: string, userId: number) { + return prisma.comment.create({ + data: { + content, + userId, + productId, + }, + }); + } + + async countByCommentIds(commentIds: number[]) { + return prisma.commentLike.groupBy({ + by: ['commentId'], + _count: { commentId: true }, + where: { commentId: { in: commentIds } }, + }); + } + + async findByUserAndCommentIds(userId: number, commentIds: number[]) { + return prisma.commentLike.findMany({ + where: { userId, commentId: { in: commentIds } }, + select: { commentId: true }, + }); + } +} + +export const productCommentRepository = new ProductCommentRepository(); diff --git a/part4-mission11/src/repositories/like-repository.ts b/part4-mission11/src/repositories/like-repository.ts new file mode 100644 index 000000000..14355f7d2 --- /dev/null +++ b/part4-mission11/src/repositories/like-repository.ts @@ -0,0 +1,252 @@ +import type { Prisma } from '@prisma/client'; + +import { prisma } from '../lib/prismaClient.js'; + +/** + * 공통적으로 쓰는 유틸 타입 + */ +type ArticleLikeGroupByResult = { + articleId: number; + _count: { articleId: number }; +}; + +type ProductLikeGroupByResult = { + productId: number; + _count: { productId: number }; +}; + +type CommentLikeGroupByResult = { + commentId: number; + _count: { commentId: number }; +}; + +type ArticleUserLikeResult = { articleId: number }; +type ProductUserLikeResult = { productId: number }; +type CommentUserLikeResult = { commentId: number }; + +/** + * ArticleLike 전용 리포지토리 + */ +export class ArticleLikeRepository { + async create(userId: number, articleId: number) { + return prisma.articleLike.create({ + data: { userId, articleId }, + }); + } + + async delete(userId: number, articleId: number) { + return prisma.articleLike.delete({ + where: { + userId_articleId: { + userId, + articleId, + }, + }, + }); + } + + async count(articleId: number) { + return prisma.articleLike.count({ + where: { articleId }, + }); + } + + async exists(userId: number, articleId: number): Promise { + const record = await prisma.articleLike.findUnique({ + where: { + userId_articleId: { + userId, + articleId, + }, + }, + }); + return !!record; + } + + async countByTargetIds( + articleIds: number[] + ): Promise { + const rows = await prisma.articleLike.groupBy({ + by: ['articleId'], + _count: { articleId: true }, + where: { articleId: { in: articleIds } }, + }); + return rows; + } + + async findByUserAndTargetIds( + userId: number, + articleIds: number[] + ): Promise { + const rows = await prisma.articleLike.findMany({ + where: { + userId, + articleId: { in: articleIds }, + }, + select: { + articleId: true, + }, + }); + return rows; + } +} + +/** + * ProductLike 전용 리포지토리 + */ +export class ProductLikeRepository { + async create(userId: number, productId: number) { + return prisma.productLike.create({ + data: { userId, productId }, + }); + } + + async delete(userId: number, productId: number) { + return prisma.productLike.delete({ + where: { + userId_productId: { + userId, + productId, + }, + }, + }); + } + + async count(productId: number) { + return prisma.productLike.count({ + where: { productId }, + }); + } + + async exists(userId: number, productId: number): Promise { + const record = await prisma.productLike.findUnique({ + where: { + userId_productId: { + userId, + productId, + }, + }, + }); + return !!record; + } + + async countByTargetIds( + productIds: number[] + ): Promise { + const rows = await prisma.productLike.groupBy({ + by: ['productId'], + _count: { productId: true }, + where: { productId: { in: productIds } }, + }); + + return rows; + } + + async findByUserAndTargetIds( + userId: number, + productIds: number[] + ): Promise { + const rows = await prisma.productLike.findMany({ + where: { + userId, + productId: { in: productIds }, + }, + select: { + productId: true, + }, + }); + + return rows; + } + + /** + * 도메인 특화: 이 상품을 좋아요 누른 유저 목록 + */ + async findUserIdsWhoLikedProductTx( + tx: Prisma.TransactionClient, + productId: number + ) { + const likes = await tx.productLike.findMany({ + where: { productId }, + select: { userId: true }, + }); + + return likes.map((l) => l.userId); + } +} + +/** + * CommentLike 전용 리포지토리 + */ +export class CommentLikeRepository { + async create(userId: number, commentId: number) { + return prisma.commentLike.create({ + data: { userId, commentId }, + }); + } + + async delete(userId: number, commentId: number) { + return prisma.commentLike.delete({ + where: { + userId_commentId: { + userId, + commentId, + }, + }, + }); + } + + async count(commentId: number) { + return prisma.commentLike.count({ + where: { commentId }, + }); + } + + async exists(userId: number, commentId: number): Promise { + const record = await prisma.commentLike.findUnique({ + where: { + userId_commentId: { + userId, + commentId, + }, + }, + }); + return !!record; + } + + async countByTargetIds( + commentIds: number[] + ): Promise { + const rows = await prisma.commentLike.groupBy({ + by: ['commentId'], + _count: { commentId: true }, + where: { commentId: { in: commentIds } }, + }); + + return rows; + } + + async findByUserAndTargetIds( + userId: number, + commentIds: number[] + ): Promise { + const rows = await prisma.commentLike.findMany({ + where: { + userId, + commentId: { in: commentIds }, + }, + select: { + commentId: true, + }, + }); + + return rows; + } +} + +/** + * 실제 export해서 쓰는 인스턴스들 + */ +export const articleLikeRepository = new ArticleLikeRepository(); +export const productLikeRepository = new ProductLikeRepository(); +export const commentLikeRepository = new CommentLikeRepository(); diff --git a/part4-mission11/src/repositories/notification-repository.ts b/part4-mission11/src/repositories/notification-repository.ts new file mode 100644 index 000000000..7dce62edd --- /dev/null +++ b/part4-mission11/src/repositories/notification-repository.ts @@ -0,0 +1,54 @@ +import { prisma } from '../lib/prismaClient.js'; +import { AppError } from '../middlewares/errorHandler.js'; +import { type NotificationCreateInput } from '../types/notification.js'; + +class NotificationRepository { + create(data: NotificationCreateInput) { + return prisma.notification.create({ + data: { + ...data, + productId: data.productId ?? null, + articleId: data.articleId ?? null, + commentId: data.commentId ?? null, + }, + }); + } + + findByUserId(userId: number) { + return prisma.notification.findMany({ + where: { userId }, + orderBy: { createdAt: 'desc' }, + }); + } + + countUnread(userId: number) { + return prisma.notification.count({ + where: { userId, isRead: false }, + }); + } + + async markAsRead(userId: number, notificationId: number) { + const result = await prisma.notification.updateMany({ + where: { + id: notificationId, + userId, + }, + data: { + isRead: true, + }, + }); + + if (result.count === 0) { + throw new AppError('알림을 찾을 수 없습니다.', 404); + } + } + + async markAllAsRead(userId: number) { + await prisma.notification.updateMany({ + where: { userId, isRead: false }, + data: { isRead: true }, + }); + } +} + +export const notificationRepository = new NotificationRepository(); diff --git a/part4-mission11/src/repositories/product-repository.ts b/part4-mission11/src/repositories/product-repository.ts new file mode 100644 index 000000000..289d0f841 --- /dev/null +++ b/part4-mission11/src/repositories/product-repository.ts @@ -0,0 +1,137 @@ +import type { Prisma } from '@prisma/client'; + +import type { ProductWithRelations } from '../dtos/product-dto.js'; +import { prisma } from '../lib/prismaClient.js'; + +class ProductRepository { + async findMany( + args: Prisma.ProductFindManyArgs + ): Promise { + return prisma.product.findMany(args) as Promise; + } + + async findUnique(productId: number, userId?: number) { + return prisma.product.findUnique({ + where: { id: productId }, + include: { + user: { select: { username: true } }, + comments: { + include: { + user: { select: { username: true } }, + }, + }, + ...(userId && { + likes: { where: { userId }, select: { userId: true } }, + }), + }, + }); + } + + findById(productId: number) { + return prisma.product.findUnique({ + where: { id: productId }, + }); + } + + async create(data: { + name: string; + description: string; + price: number; + tags: string[]; + userId: number; + }) { + return prisma.product.create({ + data: { + name: data.name, + description: data.description, + price: data.price, + tags: data.tags, + user: { connect: { id: data.userId } }, + }, + }); + } + + async updatePrice(productId: number, newPrice: number) { + return prisma.product.update({ + where: { id: productId }, + data: { price: newPrice }, + }); + } + + async update( + productId: number, + userId: number, + updateData: Prisma.ProductUpdateInput + ) { + return prisma.product.update({ + where: { id: productId, userId }, + data: updateData, + }); + } + + async delete(productId: number, userId: number) { + return prisma.product.deleteMany({ where: { id: productId, userId } }); + } + + async count(where?: Prisma.ProductWhereInput) { + return prisma.product.count({ where: where ?? {} }); + } + + async findUserProducts(userId: number) { + return prisma.product.findMany({ + where: { userId }, + orderBy: { createdAt: 'desc' }, + select: { + id: true, + name: true, + description: true, + price: true, + tags: true, + images: true, + }, + }); + } + + async findLikedProducts(userId: number) { + return prisma.product.findMany({ + where: { + likes: { some: { userId } }, + }, + }); + } + + async countByProductIds(productIds: number[]) { + return prisma.productLike.groupBy({ + by: ['productId'], + _count: { productId: true }, + where: { productId: { in: productIds } }, + }); + } + + async findByUserAndProductIds(userId: number, productIds: number[]) { + return prisma.productLike.findMany({ + where: { userId, productId: { in: productIds } }, + select: { productId: true }, + }); + } + + findLiteById(productId: number) { + return prisma.product.findUnique({ + where: { id: productId }, + select: { id: true, userId: true, name: true }, + }); + } + + async updatePriceTx( + tx: Prisma.TransactionClient, + productId: number, + price: number + ) { + return tx.product.update({ + where: { id: productId }, + data: { price }, + }); + } +} + +export const productRepository = new ProductRepository(); diff --git a/part4-mission11/src/repositories/user-repository.ts b/part4-mission11/src/repositories/user-repository.ts new file mode 100644 index 000000000..001ff09b1 --- /dev/null +++ b/part4-mission11/src/repositories/user-repository.ts @@ -0,0 +1,99 @@ +import type { UserUpdateData } from '../dtos/user-dto.js'; +import { prisma } from '../lib/prismaClient.js'; + +class UserRepository { + async findByUsername(username: string) { + return prisma.user.findUnique({ where: { username } }); + } + + findUsernameById(userId: number) { + return prisma.user.findUnique({ + where: { id: userId }, + select: { username: true }, + }); + } + + async createUser(data: { + username: string; + email: string; + password: string; + }) { + return prisma.user.create({ data }); + } + + // 비밀번호 제외 버전 (프로필 조회 등) + async findById(userId: number) { + return prisma.user.findUnique({ + where: { id: userId }, + select: { + id: true, + username: true, + email: true, + images: true, + createdAt: true, + updatedAt: true, + }, + }); + } + + // 비밀번호 포함 버전 (인증/비밀번호 변경용) + async findByIdWithPassword(userId: number) { + return prisma.user.findUnique({ + where: { id: userId }, + }); + } + + async updateUser(userId: number, updateData: UserUpdateData) { + return prisma.user.update({ + where: { id: userId }, + data: updateData, + select: { + username: true, + email: true, + images: true, + }, + }); + } + + async updatePassword(userId: number, hashedPassword: string) { + return prisma.user.update({ + where: { id: userId }, + data: { password: hashedPassword }, + }); + } + + // 사용자가 작성한 댓글 조회 + async getUserComments(userId: number) { + return prisma.comment.findMany({ + where: { userId }, + orderBy: { createdAt: 'desc' }, + select: { + id: true, + content: true, + article: { select: { id: true, title: true } }, + product: { select: { id: true, name: true } }, + createdAt: true, + }, + }); + } + + // 사용자가 좋아요한 댓글 조회 + async getUserLikedComments(userId: number) { + return prisma.commentLike.findMany({ + where: { userId }, + include: { + comment: { + select: { + id: true, + content: true, + article: { select: { id: true, title: true } }, + product: { select: { id: true, name: true } }, + createdAt: true, + }, + }, + }, + }); + } +} + +export const userRepository = new UserRepository(); diff --git a/part4-mission11/src/routes/article-router.ts b/part4-mission11/src/routes/article-router.ts new file mode 100644 index 000000000..fcf769faf --- /dev/null +++ b/part4-mission11/src/routes/article-router.ts @@ -0,0 +1,57 @@ +import express from 'express'; + +import { articleController } from '../controllers/article-controller.js'; +import { accessAuth } from '../lib/passport/index.js'; +import { isArticleOwner } from '../middlewares/authorize.js'; +import { validation } from '../middlewares/validation.js'; + +const router = express.Router(); + +// 게시글 조회, 생성 +router + .route('/') + .get( + validation.validateQuery(validation.listQuerySchema), + articleController.getAllArticles + ) + .post( + accessAuth, + validation.validate(validation.articleSchema), + articleController.createArticle + ); +// 게시글 상세 조회, 수정, 삭제 +router + .route('/:id') + .get( + validation.validateParam('id', validation.idSchema), + articleController.getArticleById + ) + .patch( + accessAuth, + validation.validateParam('id', validation.idSchema), + isArticleOwner, + validation.validate(validation.articleUpdateSchema), + articleController.updateArticle + ) + .delete( + accessAuth, + validation.validateParam('id', validation.idSchema), + isArticleOwner, + articleController.deleteArticle + ); + +// 게시글 좋아요, 좋아요 취소 +router + .route('/:id/like') + .post( + accessAuth, + validation.validateParam('id', validation.idSchema), + articleController.likeArticle + ) + .delete( + accessAuth, + validation.validateParam('id', validation.idSchema), + articleController.unlikeArticle + ); + +export default router; diff --git a/part4-mission11/src/routes/auth-router.ts b/part4-mission11/src/routes/auth-router.ts new file mode 100644 index 000000000..6abb669e9 --- /dev/null +++ b/part4-mission11/src/routes/auth-router.ts @@ -0,0 +1,25 @@ +import express from 'express'; + +import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants.js'; +import { verifyRefreshToken, generateTokens } from '../lib/token.js'; +import { userService } from '../services/user-service.js'; + +const router = express.Router(); + +// 리프레시 토큰 +router.post('/refresh', async (req, res) => { + try { + const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]; + if (!refreshToken) return res.status(401).json({ message: '인증 오류' }); + + const { userId } = verifyRefreshToken(refreshToken); + const { accessToken, refreshToken: newRefreshToken } = + generateTokens(userId); + userService.setTokenCookies(res, accessToken, newRefreshToken); + return res.json({ accessToken }); + } catch (_err) { + return res.status(401).json({ message: '인증 오류' }); + } +}); + +export default router; diff --git a/part4-mission11/src/routes/comments/article-comment-router.ts b/part4-mission11/src/routes/comments/article-comment-router.ts new file mode 100644 index 000000000..20a89d02c --- /dev/null +++ b/part4-mission11/src/routes/comments/article-comment-router.ts @@ -0,0 +1,51 @@ +import express from 'express'; + +import { articleCommentController } from '../../controllers/comments/article-comment-controller.js'; +import { accessAuth } from '../../lib/passport/index.js'; +import { isCommentOwner } from '../../middlewares/authorize.js'; +import { validation } from '../../middlewares/validation.js'; + +const router = express.Router(); + +router + .route('/:articleId/comments') + .get(articleCommentController.getComments) + .post( + accessAuth, + validation.validateParam('articleId', validation.idSchema), + validation.validate(validation.commentSchema), + articleCommentController.createComment + ); + +// 댓글 수정, 삭제 +router + .route('/comments/:commentId') + .patch( + accessAuth, + isCommentOwner, + validation.validateParam('commentId', validation.idSchema), + validation.validate(validation.commentSchema), + articleCommentController.updateComment + ) + .delete( + accessAuth, + isCommentOwner, + validation.validateParam('commentId', validation.idSchema), + articleCommentController.deleteComment + ); + +// 게시글 댓글 좋아요 +router + .route('/comments/:commentId/like') + .post( + accessAuth, + validation.validateParam('commentId', validation.idSchema), + articleCommentController.likeComment + ) + .delete( + accessAuth, + validation.validateParam('commentId', validation.idSchema), + articleCommentController.unlikeComment + ); + +export default router; diff --git a/part4-mission11/src/routes/comments/product-comment-router.ts b/part4-mission11/src/routes/comments/product-comment-router.ts new file mode 100644 index 000000000..83c467e35 --- /dev/null +++ b/part4-mission11/src/routes/comments/product-comment-router.ts @@ -0,0 +1,51 @@ +import express from 'express'; + +import { productCommentController } from '../../controllers/comments/product-comment-controller.js'; +import { accessAuth } from '../../lib/passport/index.js'; +import { isCommentOwner } from '../../middlewares/authorize.js'; +import { validation } from '../../middlewares/validation.js'; + +const router = express.Router(); + +// 상품 댓글 조회, 작성 +router + .route('/:productId/comments') + .get(productCommentController.getComments) + .post( + accessAuth, + validation.validate(validation.commentSchema), + productCommentController.createComment + ); + +// 상품 댓글 수정, 삭제 +router + .route('/comments/:commentId') + .patch( + accessAuth, + validation.validateParam('commentId', validation.idSchema), + isCommentOwner, + validation.validate(validation.commentSchema), + productCommentController.updateComment + ) + .delete( + accessAuth, + validation.validateParam('commentId', validation.idSchema), + isCommentOwner, + productCommentController.deleteComment + ); + +// 상품 댓글 좋아요, 좋아요 취소 +router + .route('/comments/:commentId/like') + .post( + accessAuth, + validation.validateParam('commentId', validation.idSchema), + productCommentController.likeComment + ) + .delete( + accessAuth, + validation.validateParam('commentId', validation.idSchema), + productCommentController.unlikeComment + ); + +export default router; diff --git a/part4-mission11/src/routes/image-router.ts b/part4-mission11/src/routes/image-router.ts new file mode 100644 index 000000000..b12ab0aa9 --- /dev/null +++ b/part4-mission11/src/routes/image-router.ts @@ -0,0 +1,50 @@ +import express, { type Request, type Response } from 'express'; + +import upload from '../config/multer.js'; + +const router = express.Router(); +const isProd = process.env.NODE_ENV === 'production'; + +router.post('/upload/single', upload.single('myImage'), (req, res) => { + if (!req.file) { + return res.status(400).send('파일이 업로드되지 않았습니다.'); + } + + const file = req.file; + const filename = file.key ?? file.filename; + const url = + isProd && file.location ? file.location : `/uploads/${file.filename}`; + + res.status(200).json({ + message: '파일이 성공적으로 업로드되었습니다.', + filename, + url, + }); +}); + +router.post( + '/upload/array', + upload.array('myImages', 5), + (req: Request, res: Response) => { + const files = req.files as Express.Multer.File[] | undefined; + + if (!files || files.length === 0) { + return res.status(400).send('파일이 업로드되지 않았습니다.'); + } + + const result = files.map((file) => { + const filename = file.key ?? file.filename; + const url = + isProd && file.location ? file.location : `/uploads/${file.filename}`; + + return { filename, url }; + }); + + res.status(200).json({ + message: '파일들이 성공적으로 업로드되었습니다.', + files: result, + }); + } +); + +export default router; diff --git a/part4-mission11/src/routes/index.ts b/part4-mission11/src/routes/index.ts new file mode 100644 index 000000000..548174357 --- /dev/null +++ b/part4-mission11/src/routes/index.ts @@ -0,0 +1,23 @@ +import express from 'express'; + +import articleRouter from './article-router.js'; +import authRouter from './auth-router.js'; +import articleCommentRouter from './comments/article-comment-router.js'; +import productCommentRouter from './comments/product-comment-router.js'; +import imageRouter from './image-router.js'; +import notificationRouter from './notification-router.js'; +import productRouter from './product-router.js'; +import userRouter from './user-router.js'; + +const router = express.Router(); + +router.use('/users', userRouter); +router.use('/products', productRouter); +router.use('/products', productCommentRouter); +router.use('/articles', articleRouter); +router.use('/articles', articleCommentRouter); +router.use('/images', imageRouter); +router.use('/auth', authRouter); +router.use('/notifications', notificationRouter); + +export default router; diff --git a/part4-mission11/src/routes/notification-router.ts b/part4-mission11/src/routes/notification-router.ts new file mode 100644 index 000000000..4b2110bc8 --- /dev/null +++ b/part4-mission11/src/routes/notification-router.ts @@ -0,0 +1,23 @@ +import { Router } from 'express'; + +import { notificationController } from '../controllers/notification-controller.js'; +import { accessAuth } from '../lib/passport/index.js'; +import { validation } from '../middlewares/validation.js'; + +const router = Router(); + +router.get('/', accessAuth, notificationController.getMyNotifications); +router.get( + '/unread-count', + accessAuth, + notificationController.getMyUnreadCount +); +router.patch( + '/:notificationId/read', + accessAuth, + validation.validateParam('notificationId', validation.idSchema), + notificationController.markAsRead +); +router.patch('/read-all', accessAuth, notificationController.markAllAsRead); + +export default router; diff --git a/part4-mission11/src/routes/product-router.ts b/part4-mission11/src/routes/product-router.ts new file mode 100644 index 000000000..0e3973b78 --- /dev/null +++ b/part4-mission11/src/routes/product-router.ts @@ -0,0 +1,64 @@ +import express from 'express'; + +import { productController } from '../controllers/product-controller.js'; +import { accessAuth } from '../lib/passport/index.js'; +import { isProductOwner } from '../middlewares/authorize.js'; +import { validation } from '../middlewares/validation.js'; + +const router = express.Router(); + +// 상품 조회, 등록 +router + .route('/') + .get(productController.getAllProducts) + .post( + accessAuth, + validation.validate(validation.productSchema), + productController.createProduct + ); + +// 상품 상세 조회, 수정, 삭제 +router + .route('/:id') + .get( + validation.validateParam('id', validation.idSchema), + productController.getProductById + ) + .patch( + accessAuth, + validation.validateParam('id', validation.idSchema), + isProductOwner, + validation.validate(validation.productUpdateSchema), + productController.updateProduct + ) + .delete( + accessAuth, + validation.validateParam('id', validation.idSchema), + isProductOwner, + productController.deleteProduct + ); + +// 상품 좋아요, 좋아요 취소 +router + .route('/:id/like') + .post( + accessAuth, + validation.validateParam('id', validation.idSchema), + productController.likeProduct + ) + .delete( + accessAuth, + validation.validateParam('id', validation.idSchema), + productController.unlikeProduct + ); + +router.patch( + '/:id/price', + accessAuth, + validation.validateParam('id', validation.idSchema), + isProductOwner, + validation.validate(validation.productPriceUpdateSchema), + productController.updateProductPrice +); + +export default router; diff --git a/part4-mission11/src/routes/user-router.ts b/part4-mission11/src/routes/user-router.ts new file mode 100644 index 000000000..89f05ec83 --- /dev/null +++ b/part4-mission11/src/routes/user-router.ts @@ -0,0 +1,516 @@ +import express from 'express'; + +import { articleController } from '../controllers/article-controller.js'; +import { productController } from '../controllers/product-controller.js'; +import { userController } from '../controllers/user-controller.js'; +import { localAuth, accessAuth } from '../lib/passport/index.js'; +import { isUserSelf } from '../middlewares/authorize.js'; +import { validation } from '../middlewares/validation.js'; + +const router = express.Router(); + +// 등록 +/** + * @openapi + * /users/register: + * post: + * summary: 회원가입 + * tags: + * - User + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - username + * - email + * - password + * properties: + * username: + * type: string + * example: "shim" + * email: + * type: string + * format: email + * example: "shim@example.com" + * password: + * type: string + * format: password + * example: "mypassword123" + * responses: + * 201: + * description: 회원가입 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * data: + * type: object + * properties: + * id: + * type: integer + * example: 1 + * username: + * type: string + * example: "shim" + * email: + * type: string + * example: "shim@example.com" + * message: + * type: string + * example: "회원 가입 성공!" + * 409: + * description: 닉네임 중복입니다. + */ +router.post('/register', validation.validateRegister, userController.register); + +// 로그인&로그아웃 +/** + * @openapi + * /users/login: + * post: + * summary: 로그인 + * tags: + * - User + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - username + * - password + * properties: + * username: + * type: string + * example: "johndoe" + * password: + * type: string + * format: password + * example: "mypassword123" + * responses: + * 200: + * description: 로그인 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * data: + * type: object + * properties: + * accessToken : + * type: string + * example: "abcdefg" + * refreshToken: + * type: string + * example: "abcdefg" + * message: + * type: string + * example: "로그인 성공!" + * 403: + * description: '아이디 혹은 패스워드가 일치하지 않습니다' + */ +router.post('/login', localAuth, userController.login); + +// 로그인&로그아웃 +/** + * @openapi + * /users/logout: + * post: + * summary: 로그아웃 + * tags: + * - User + * requestBody: + * required: false + * responses: + * 200: + * description: 로그아웃 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * example: "로그아웃 되었습니다." + * 401: + * description: 인증되지 않은 사용자 + */ +router.post('/logout', userController.logout); + +// 유저 조회, 정보 수정 +/** + * @openapi + * /users/{userId}: + * get: + * summary: 유저 프로필 조회 + * tags: + * - User + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: integer + * description: 조회할 유저 ID + * responses: + * 200: + * description: 프로필 조회 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * id: + * type: integer + * username: + * type: string + * email: + * type: string + * images: + * type: array + * items: + * type: string + * 401: + * description: 인증되지 않은 사용자 + * 403: + * description: 자기 자신의 프로필만 조회 가능 + */ + +/** + * @openapi + * /users/{userId}: + * patch: + * summary: 유저 프로필 수정 + * tags: + * - User + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: integer + * description: 수정할 유저 ID + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * username: + * type: string + * example: "newname" + * email: + * type: string + * example: "newemail@example.com" + * images: + * type: array + * items: + * type: string + * example: ["image1.jpg", "image2.png"] + * responses: + * 200: + * description: 프로필 수정 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * profile: + * type: object + * properties: + * id: + * type: integer + * username: + * type: string + * email: + * type: string + * images: + * type: array + * items: + * type: string + * example: ["image1.jpg", "image2.png"] + * 401: + * description: 인증되지 않은 사용자 + * 403: + * description: 자기 자신의 프로필만 수정 가능 + */ +router + .route('/:userId') + .get( + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + userController.getUserProfile + ) + .patch( + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + userController.updateUserProfile + ); + +// 유저 비밀번호 수정 +/** + * @openapi + * /users/{userId}/password: + * patch: + * summary: 비밀번호 변경 + * tags: + * - User + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: integer + * description: 유저 비밀번호 변경 + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: true + * properties: + * currentPassword: + * type: string + * example: "password" + * newPassword: + * type: string + * example: "newpassword" + * newPasswordConfirm: + * type: string + * example: "newpassword" + * responses: + * 200: + * description: 비밀번호 변경 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * example: "비밀번호가 변경되었습니다." + * 400: + * description: "새 비밀번호가 일치하지 않습니다." + * 404: + * description: "사용자를 찾을 수 없습니다." + */ +router.patch( + '/:userId/password', + accessAuth, + isUserSelf, + validation.validate(validation.passwordSchema), + userController.updatePassword +); + +// 자신의 상품, 게시글, 댓글 조회 +/** + * @openapi + * /users/{userId}/my-products: + * get: + * summary: 자신이 등록한 상품 조회 + * tags: + * - User + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: integer + * description: 조회할 유저 id + * responses: + * 200: + * description: 자신이 등록한 상품 조회 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * id: + * type: integer + * example: "1" + * name: + * type: string + * example: "name" + * description: + * type: string + * example: "description" + * price: + * type: integer + * example: "10000" + * tags: + * type: array + * items: + * type: string + * example: ["tag1", "tag2"] + * images: + * type: array + * items: + * type: string + * example: ["image1.jpg", "image2.png"] + * likeCount: + * type: integer + * example: "1" + * 403: + * description: "권한이 없습니다." + */ +/** + * @openapi + * /users/{userId}/my-articles: + * get: + * summary: 자신이 등록한 게시글 조회 + * tags: + * - User + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: integer + * description: 조회할 유저 id + * responses: + * 200: + * description: 자신이 등록한 게시글 조회 성공 + * content: + * application/json: + * schema: + * type: object + * properties: + * id: + * type: integer + * example: "1" + * title: + * type: string + * example: "title" + * content: + * type: string + * example: "content" + * price: + * type: integer + * example: "10000" + * tags: + * type: array + * items: + * type: string + * example: ["tag1", "tag2"] + * images: + * type: array + * items: + * type: string + * example: ["image1.jpg", "image2.png"] + * likeCount: + * type: integer + * example: "1" + * 403: + * description: "권한이 없습니다." + */ +/** + * @openapi + * /users/{userId}/my-comments: + * get: + * summary: 자신이 등록한 댓글 조회 + * tags: + * - User + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: integer + * description: 조회할 유저 ID + * responses: + * 200: + * description: 자신이 등록한 댓글 조회 성공 + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * properties: + * content: + * type: string + * example: "댓글 내용입니다." + * article: + * type: object + * nullable: true + * properties: + * id: + * type: integer + * example: 1 + * title: + * type: string + * example: "게시글 제목" + * product: + * type: object + * nullable: true + * properties: + * id: + * type: integer + * example: 2 + * name: + * type: string + * example: "상품명" + * likeCount: + * type: integer + * example: 5 + * 403: + * description: "권한이 없습니다." + */ +router.get( + '/:userId/my-products', + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + productController.getUserProducts +); +router.get( + '/:userId/my-articles', + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + articleController.getUserArticles +); +router.get( + '/:userId/my-comments', + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + userController.getUserComments +); + +// 좋아요한 상품, 게시글, 댓글 조회 +router.get( + '/:userId/likes/products', + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + userController.getUserLikedProducts +); + +router.get( + '/:userId/likes/articles', + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + userController.getUserLikedArticles +); + +router.get( + '/:userId/likes/comments', + accessAuth, + isUserSelf, + validation.validateParam('userId', validation.idSchema), + userController.getUserLikedComments +); + +export default router; diff --git a/part4-mission11/src/server.ts b/part4-mission11/src/server.ts new file mode 100644 index 000000000..aa03608b6 --- /dev/null +++ b/part4-mission11/src/server.ts @@ -0,0 +1,25 @@ +import './env.js'; +import http from 'http'; + +import { buildApp } from './app.js'; +import { setupWebSocket } from './lib/ws.js'; + +async function startServer() { + try { + const app = await buildApp({ forTest: false }); + + const server = http.createServer(app); + setupWebSocket(server); + + const PORT = Number(process.env.PORT) || 3000; + server.listen(PORT, '0.0.0.0', () => { + // eslint-disable-next-line no-console + console.log(`Server is running on http://localhost:${PORT}`); + }); + } catch (e) { + console.error(e); + process.exit(1); + } +} + +startServer(); diff --git a/part4-mission11/src/services/article-service.ts b/part4-mission11/src/services/article-service.ts new file mode 100644 index 000000000..ab7d27264 --- /dev/null +++ b/part4-mission11/src/services/article-service.ts @@ -0,0 +1,213 @@ +import { Prisma } from '@prisma/client'; + +import type { ArticleQuery, UpdateArticleDto } from '../dtos/article-dto.js'; +import AppError from '../lib/appError.js'; +import { articleRepository } from '../repositories/article-repository.js'; +import { + articleLikeRepository, + commentLikeRepository, +} from '../repositories/like-repository.js'; + +class ArticleService { + // 전체 게시글 조회 + async getAllArticles(query: ArticleQuery, userId?: number) { + const page = Number(query.page) || 1; + const limit = Number(query.limit) || 10; + const skip = (page - 1) * limit; + const sort = query.sort === 'old' ? 'old' : 'recent'; + const search = (query.keyword ?? query.query ?? query.search ?? '').trim(); + + const orderBy: Prisma.ArticleOrderByWithRelationInput = + sort === 'old' ? { createdAt: 'asc' } : { createdAt: 'desc' }; + + const where: Prisma.ArticleWhereInput = search + ? { + OR: [ + { title: { contains: search, mode: 'insensitive' } }, + { content: { contains: search, mode: 'insensitive' } }, + ], + } + : {}; + + const articles = await articleRepository.findMany({ + skip, + take: limit, + where, + orderBy, + include: { + user: { select: { username: true } }, + comments: { + include: { user: { select: { username: true } } }, + }, + }, + }); + + const articleIds = articles.map((a) => a.id); + const commentIds = articles.flatMap((a) => a.comments.map((c) => c.id)); + + const articleLikeCounts = articleIds.length + ? await articleLikeRepository.countByTargetIds(articleIds) + : []; + const articleLikeCountMap = Object.fromEntries( + articleLikeCounts.map((al) => [al.articleId, al._count.articleId]) + ); + + const commentLikeCounts = commentIds.length + ? await commentLikeRepository.countByTargetIds(commentIds) + : []; + const commentLikeCountMap = Object.fromEntries( + commentLikeCounts.map((cl) => [cl.commentId, cl._count.commentId]) + ); + + let myLikedArticleIds: number[] = []; + let myLikedCommentIds: number[] = []; + + if (typeof userId === 'number') { + const likedArticles = articleIds.length + ? await articleLikeRepository.countByTargetIds(articleIds) + : []; + myLikedArticleIds = likedArticles.map((l) => l.articleId); + + const likedComments = commentIds.length + ? await commentLikeRepository.findByUserAndTargetIds(userId, commentIds) + : []; + myLikedCommentIds = likedComments.map((l) => l.commentId); + } + + const articlesWithLike = articles.map((a) => ({ + ...a, + likeCount: articleLikeCountMap[a.id] || 0, + isLiked: + typeof userId === 'number' ? myLikedArticleIds.includes(a.id) : false, + comments: a.comments.map((c) => ({ + ...c, + likeCount: commentLikeCountMap[c.id] || 0, + isLiked: + typeof userId === 'number' ? myLikedCommentIds.includes(c.id) : false, + })), + })); + + const totalArticles = await articleRepository.count(where); + const totalPages = Math.ceil(totalArticles / limit); + + return { + data: articlesWithLike, + pagination: { totalArticles, totalPages, currentPage: page, limit }, + }; + } + + // 단일 게시글 조회 + async getArticleById(articleId: number, userId?: number) { + const article = await articleRepository.findUnique(articleId); + + if (!article) throw new AppError('존재하지 않는 게시글입니다.', 404); + + const likeCount = await articleLikeRepository.count(article.id); + const isLiked = userId + ? await articleLikeRepository.exists(userId, article.id) + : false; + + const commentIds = article.comments.map((c) => c.id); + + const commentLikeCounts = await commentLikeRepository.countByTargetIds( + commentIds + ); + const commentLikeCountMap = Object.fromEntries( + commentLikeCounts.map((cl) => [cl.commentId, cl._count.commentId]) + ); + + let myLikedCommentIds: number[] = []; + if (userId) { + const likedComments = await commentLikeRepository.findByUserAndTargetIds( + userId, + commentIds + ); + myLikedCommentIds = likedComments.map((l) => l.commentId); + } + + const commentsWithLikes = article.comments.map((c) => ({ + ...c, + likeCount: commentLikeCountMap[c.id] || 0, + isLiked: userId ? myLikedCommentIds.includes(c.id) : false, + })); + + return { + ...article, + likeCount, + isLiked, + comments: commentsWithLikes, + }; + } + + // 게시글 작성 + async createArticle(title: string, content: string, userId: number) { + if (!userId) throw new AppError('작성자를 확인할 수 없습니다.', 400); + + const newArticle = await articleRepository.create({ + title, + content, + userId, + }); + if (!newArticle) throw new AppError('게시글 등록에 실패했습니다.', 400); + + return newArticle; + } + + // 게시글 수정 + async updateArticle( + articleId: number, + userId: number, + updateData: UpdateArticleDto + ) { + const article = await articleRepository.findUnique(articleId); + if (!article) throw new AppError('게시글 없음', 404); + if (article.userId !== userId) throw new AppError('권한 없음', 403); + + await articleRepository.update(articleId, userId, updateData); + + return { message: '게시글이 수정되었습니다.' }; + } + + // 게시글 삭제 + async deleteArticle(articleId: number, userId: number) { + const deleted = await articleRepository.delete(articleId, userId); + if (deleted.count === 0) { + throw new AppError('권한이 없거나 게시글이 존재하지 않습니다.', 403); + } + return { message: '게시글이 삭제되었습니다.' }; + } + + // 본인이 작성한 게시글 조회 + async getUserArticles(userId: number) { + return articleRepository.findUserArticles(userId); + } + + // 좋아요한 게시글 조회 + async getUserLikedArticles(userId: number) { + return articleRepository.findLikedArticles(userId); + } + + // 게시글 좋아요 + async articleLike(userId: number, articleId: number) { + const alreadyLiked = await articleLikeRepository.exists(userId, articleId); + if (alreadyLiked) { + throw new AppError('이미 좋아요를 눌렀습니다.', 400); + } + await articleLikeRepository.create(userId, articleId); + const count = await articleLikeRepository.count(articleId); + return { message: '좋아요 완료', likeCount: count }; + } + + // 게시글 좋아요 취소 + async articleUnlike(userId: number, articleId: number) { + const exists = await articleLikeRepository.exists(userId, articleId); + if (!exists) { + throw new AppError('좋아요를 누른 기록이 없습니다.', 400); + } + await articleLikeRepository.delete(userId, articleId); + const count = await articleLikeRepository.count(articleId); + return { message: '좋아요 취소', likeCount: count }; + } +} + +export const articleService = new ArticleService(); diff --git a/part4-mission11/src/services/comments/article-comment-service.ts b/part4-mission11/src/services/comments/article-comment-service.ts new file mode 100644 index 000000000..884f22118 --- /dev/null +++ b/part4-mission11/src/services/comments/article-comment-service.ts @@ -0,0 +1,80 @@ +import { commentService } from './comment-service.js'; +import AppError from '../../lib/appError.js'; +import { articleRepository } from '../../repositories/article-repository.js'; +import { articleCommentRepository } from '../../repositories/comments/article-comment-repository.js'; +import { commentLikeRepository } from '../../repositories/like-repository.js'; +import { userRepository } from '../../repositories/user-repository.js'; +import { notificationService } from '../notification-service.js'; + +class ArticleCommentService { + updateComment = commentService.updateComment; + deleteComment = commentService.deleteComment; + commentLike = commentService.likeComment; + commentUnlike = commentService.unlikeComment; + + async getCommentsByArticleId(articleId: number, userId?: number) { + const comments = await articleCommentRepository.findByArticleId(articleId); + if (comments.length === 0) return []; + + const commentIds = comments.map((c) => c.id); + + // 1) 댓글별 likeCount 한 번에 가져오기 + const grouped = await commentLikeRepository.countByTargetIds(commentIds); + const likeCountMap = grouped.reduce>((acc, row) => { + acc[row.commentId] = row._count.commentId; + return acc; + }, {}); + + // 2) 유저가 좋아요 누른 댓글들 한 번에 가져오기 + let likedSet = new Set(); + if (userId) { + const likedRows = await commentLikeRepository.findByUserAndTargetIds( + userId, + commentIds + ); + likedSet = new Set(likedRows.map((row) => row.commentId)); + } + + // 3) 메모리에서 합쳐서 반환 + return comments.map((c) => ({ + ...c, + likeCount: likeCountMap[c.id] ?? 0, + isLiked: userId ? likedSet.has(c.id) : false, + })); + } + + async createArticleComment( + articleId: number, + content: string, + userId: number + ) { + // 1) 글 정보(작성자, 제목) → 레포 + const article = await articleRepository.findLiteById(articleId); + if (!article) throw new AppError('게시글을 찾을 수 없습니다.', 404); + + // 2) 댓글 생성 → 레포 + const comment = await articleCommentRepository.create( + articleId, + content, + userId + ); + + // 3) 자기 글에 본인이 단 댓글은 알림 스킵 + if (article.userId !== userId) { + // 4) 작성자명 → 레포 + const commenter = await userRepository.findUsernameById(userId); + + await notificationService.pushArticleComment({ + receiverUserId: article.userId, + articleId: article.id, + commentId: comment.id, + articleTitle: article.title, + commenterName: commenter?.username ?? '익명', + }); + } + + return comment; + } +} + +export const articleCommentService = new ArticleCommentService(); diff --git a/part4-mission11/src/services/comments/comment-service.ts b/part4-mission11/src/services/comments/comment-service.ts new file mode 100644 index 000000000..e5a8903cc --- /dev/null +++ b/part4-mission11/src/services/comments/comment-service.ts @@ -0,0 +1,45 @@ +import AppError from '../../lib/appError.js'; +import { commentRepository } from '../../repositories/comments/comment-repository.js'; +import { commentLikeRepository } from '../../repositories/like-repository.js'; + +class CommentService { + async updateComment(commentId: number, userId: number, content: string) { + const comment = await commentRepository.findById(commentId); + if (!comment) throw new AppError('댓글을 찾을 수 없습니다.', 404); + if (comment.userId !== userId) throw new AppError('권한이 없습니다.', 403); + + return commentRepository.update(commentId, content); + } + + async deleteComment(commentId: number, userId: number) { + const deleted = await commentRepository.delete(commentId, userId); + if (deleted.count === 0) { + throw new AppError('권한이 없거나 댓글이 존재하지 않습니다.', 403); + } + return { message: '댓글이 삭제되었습니다.' }; + } + + async likeComment(userId: number, commentId: number) { + const exists = await commentLikeRepository.exists(userId, commentId); + if (exists) { + throw new AppError('이미 좋아요를 눌렀습니다.', 400); + } + + await commentLikeRepository.create(userId, commentId); + const count = await commentLikeRepository.count(commentId); + return { message: '좋아요 완료', likeCount: count }; + } + + async unlikeComment(userId: number, commentId: number) { + const exists = await commentLikeRepository.exists(userId, commentId); + if (!exists) { + throw new AppError('좋아요를 누른 기록이 없습니다.', 400); + } + + await commentLikeRepository.delete(userId, commentId); + const count = await commentLikeRepository.count(commentId); + return { message: '좋아요 취소', likeCount: count }; + } +} + +export const commentService = new CommentService(); diff --git a/part4-mission11/src/services/comments/product-comment-service.ts b/part4-mission11/src/services/comments/product-comment-service.ts new file mode 100644 index 000000000..9cef3a054 --- /dev/null +++ b/part4-mission11/src/services/comments/product-comment-service.ts @@ -0,0 +1,79 @@ +import { commentService } from './comment-service.js'; +import AppError from '../../lib/appError.js'; +import { productCommentRepository } from '../../repositories/comments/product-comment-repository.js'; +import { commentLikeRepository } from '../../repositories/like-repository.js'; +import { productRepository } from '../../repositories/product-repository.js'; +import { userRepository } from '../../repositories/user-repository.js'; +import { notificationService } from '../notification-service.js'; + +class ProductCommentService { + updateComment = commentService.updateComment; + deleteComment = commentService.deleteComment; + commentLike = commentService.likeComment; + commentUnlike = commentService.unlikeComment; + + async getCommentsByProductId(productId: number, userId?: number) { + const comments = await productCommentRepository.findByProductId(productId); + if (comments.length === 0) return []; + + const commentIds = comments.map((c) => c.id); + + // 1) 댓글별 likeCount 한 번에 가져오기 + const grouped = await commentLikeRepository.countByTargetIds(commentIds); + const likeCountMap = grouped.reduce>((acc, row) => { + acc[row.commentId] = row._count.commentId; + return acc; + }, {}); + + // 2) 유저가 좋아요 누른 댓글들 한 번에 가져오기 + let likedSet = new Set(); + if (userId) { + const likedRows = await commentLikeRepository.findByUserAndTargetIds( + userId, + commentIds + ); + likedSet = new Set(likedRows.map((row) => row.commentId)); + } + + // 3) 메모리에서 합쳐서 반환 + return comments.map((c) => ({ + ...c, + likeCount: likeCountMap[c.id] ?? 0, + isLiked: userId ? likedSet.has(c.id) : false, + })); + } + + async createProductComment( + productId: number, + content: string, + userId: number + ) { + // 1) 상품 정보(소유자, 이름) + const product = await productRepository.findLiteById(productId); + if (!product) throw new AppError('상품을 찾을 수 없습니다.', 404); + + // 2) 댓글 생성 + const comment = await productCommentRepository.create( + productId, + content, + userId + ); + + // 3) 자기 상품에 본인이 단 댓글은 알림 스킵 + if (product.userId !== userId) { + const commenter = await userRepository.findUsernameById(userId); + + await notificationService.pushProductComment({ + receiverUserId: product.userId, + productId: product.id, + commentId: comment.id, + productName: product.name, + commenterName: commenter?.username ?? '익명', + }); + } + + return comment; + } +} + +export const productCommentService = new ProductCommentService(); diff --git a/part4-mission11/src/services/notification-service.ts b/part4-mission11/src/services/notification-service.ts new file mode 100644 index 000000000..a8567ae9a --- /dev/null +++ b/part4-mission11/src/services/notification-service.ts @@ -0,0 +1,125 @@ +import { ports } from '../lib/ports.js'; +import { notificationRepository } from '../repositories/notification-repository.js'; + +class NotificationService { + async pushPriceChange(args: { + receiverUserId: number; + productId: number; + productName: string; + oldPrice: number; + newPrice: number; + }) { + const { receiverUserId, productId, productName, oldPrice, newPrice } = args; + + const message = `${productName} 가격이 ${oldPrice}원 → ${newPrice}원 으로 변경되었습니다.`; + + const notif = await notificationRepository.create({ + userId: receiverUserId, + type: 'PRICE_CHANGE', + message, + productId, + }); + + // 객체 1개로 전달 + data는 있을 때만 포함 + ports.ws.notifyUser({ + userId: receiverUserId, + type: notif.type, + message: notif.message, + createdAt: notif.createdAt, + ...(notif.productId !== null + ? { data: { productId: notif.productId } } + : {}), + }); + + return notif; + } + + async pushArticleComment(args: { + receiverUserId: number; + articleId: number; + commentId: number; + articleTitle: string; + commenterName: string; + }) { + const { + receiverUserId, + articleId, + commentId, + articleTitle, + commenterName, + } = args; + + const message = `${commenterName} 님이 '${articleTitle}' 글에 댓글을 남겼습니다.`; + + const notif = await notificationRepository.create({ + userId: receiverUserId, + type: 'NEW_COMMENT', + message, + articleId, + commentId, + }); + + // 객체 1개로 전달 + data는 있을 때만 포함 + ports.ws.notifyUser({ + userId: receiverUserId, + type: notif.type, + message: notif.message, + createdAt: notif.createdAt, + ...(notif.articleId !== null && notif.commentId !== null + ? { data: { articleId: notif.articleId, commentId: notif.commentId } } + : {}), + }); + + return notif; + } + + async pushProductComment(args: { + receiverUserId: number; + productId: number; + commentId: number; + productName: string; + commenterName: string; + }) { + const { receiverUserId, productId, commentId, productName, commenterName } = + args; + const message = `${commenterName} 님이 상품 '${productName}'에 댓글을 남겼습니다.`; + + const notif = await notificationRepository.create({ + userId: receiverUserId, + type: 'NEW_COMMENT', + message, + productId, + commentId, + }); + + ports.ws.notifyUser({ + userId: receiverUserId, + type: notif.type, + message: notif.message, + createdAt: notif.createdAt, + ...(notif.productId !== null && notif.commentId !== null + ? { data: { productId: notif.productId, commentId: notif.commentId } } + : {}), + }); + + return notif; + } + + async getMyNotifications(userId: number) { + return notificationRepository.findByUserId(userId); + } + + async getMyUnreadCount(userId: number) { + return notificationRepository.countUnread(userId); + } + + async markAsRead(userId: number, notificationId: number) { + await notificationRepository.markAsRead(userId, notificationId); + } + + async markAllAsRead(userId: number) { + await notificationRepository.markAllAsRead(userId); + } +} + +export const notificationService = new NotificationService(); diff --git a/part4-mission11/src/services/product-service.ts b/part4-mission11/src/services/product-service.ts new file mode 100644 index 000000000..e3593233f --- /dev/null +++ b/part4-mission11/src/services/product-service.ts @@ -0,0 +1,267 @@ +import { Prisma } from '@prisma/client'; + +import { notificationService } from './notification-service.js'; +import type { ProductQuery, UpdateProductDto } from '../dtos/product-dto.js'; +import AppError from '../lib/appError.js'; +import { prisma } from '../lib/prismaClient.js'; +import { + productLikeRepository, + commentLikeRepository, +} from '../repositories/like-repository.js'; +import { productRepository } from '../repositories/product-repository.js'; + +class ProductService { + // 전체 상품 조회 + async getAllProducts(query: ProductQuery, userId?: number) { + const page = Number(query.page) || 1; + const limit = Number(query.limit) || 10; + const skip = (page - 1) * limit; + const sort = query.sort === 'old' ? 'old' : 'recent'; + const search = (query.keyword ?? query.query ?? query.search ?? '').trim(); + + const orderBy: Prisma.ProductOrderByWithRelationInput = + sort === 'old' ? { createdAt: 'asc' } : { createdAt: 'desc' }; + + const where: Prisma.ProductWhereInput = search + ? { + OR: [ + { name: { contains: search, mode: 'insensitive' } }, + { description: { contains: search, mode: 'insensitive' } }, + ], + } + : {}; + + const products = await productRepository.findMany({ + skip, + take: limit, + where, + orderBy, + include: { + user: { select: { username: true } }, + comments: { + include: { user: { select: { username: true } } }, + }, + }, + }); + + const productIds = products.map((p) => p.id); + const commentIds = products.flatMap((p) => p.comments.map((c) => c.id)); + + const productLikeCounts = productIds.length + ? await productLikeRepository.countByTargetIds(productIds) + : []; + const productLikeCountMap = Object.fromEntries( + productLikeCounts.map((pl) => [pl.productId, pl._count.productId]) + ); + + const commentLikeCounts = commentIds.length + ? await commentLikeRepository.countByTargetIds(commentIds) + : []; + const commentLikeCountMap = Object.fromEntries( + commentLikeCounts.map((cl) => [cl.commentId, cl._count.commentId]) + ); + + let myLikedProductIds: number[] = []; + let myLikedCommentIds: number[] = []; + + if (typeof userId === 'number') { + const likedProducts = productIds.length + ? await productLikeRepository.findByUserAndTargetIds(userId, productIds) + : []; + myLikedProductIds = likedProducts.map((l) => l.productId); + + const likedComments = commentIds.length + ? await commentLikeRepository.findByUserAndTargetIds(userId, commentIds) + : []; + myLikedCommentIds = likedComments.map((l) => l.commentId); + } + + const productsWithLike = products.map((p) => ({ + ...p, + likeCount: productLikeCountMap[p.id] || 0, + isLiked: + typeof userId === 'number' ? myLikedProductIds.includes(p.id) : false, + comments: p.comments.map((c) => ({ + ...c, + likeCount: commentLikeCountMap[c.id] || 0, + isLiked: + typeof userId === 'number' ? myLikedCommentIds.includes(c.id) : false, + })), + })); + + const totalProducts = await productRepository.count(where); + const totalPages = Math.ceil(totalProducts / limit); + + return { + data: productsWithLike, + pagination: { totalProducts, totalPages, currentPage: page, limit }, + }; + } + + // 단일 상품 조회 + async getProductById(productId: number, userId?: number) { + const product = await productRepository.findUnique(productId, userId); + + if (!product) throw new AppError('존재하지 않는 상품입니다.', 404); + + const likeCount = await productLikeRepository.count(product.id); + const isLiked = userId + ? await productLikeRepository.exists(userId, product.id) + : false; + + const commentIds = product.comments.map((c) => c.id); + + const commentLikeCounts = await commentLikeRepository.countByTargetIds( + commentIds + ); + const commentLikeCountMap = Object.fromEntries( + commentLikeCounts.map((cl) => [cl.commentId, cl._count.commentId]) + ); + + let myLikedCommentIds: number[] = []; + if (userId) { + const likedComments = await commentLikeRepository.findByUserAndTargetIds( + userId, + commentIds + ); + myLikedCommentIds = likedComments.map((l) => l.commentId); + } + + const commentsWithLikes = product.comments.map((c) => ({ + ...c, + likeCount: commentLikeCountMap[c.id] || 0, + isLiked: userId ? myLikedCommentIds.includes(c.id) : false, + })); + + const productWithLike = { + ...product, + likeCount, + isLiked, + comments: commentsWithLikes, + }; + + return productWithLike; + } + + async createProduct( + userId: number, + name: string, + description: string, + price: number, + tags: string[] + ) { + const newProduct = await productRepository.create({ + userId, + name, + description, + price, + tags, + }); + if (!newProduct) throw new AppError('제품 등록 실패', 400); + return newProduct; + } + + async updateProductPrice( + productId: number, + newPrice: number, + _actorUserId: number + ) { + // 1. 기존 상품 + const product = await productRepository.findUnique(productId); + if (!product) { + throw new AppError('존재하지 않는 상품입니다.', 404); + } + + // 2. 가격이 같으면 그냥 반환 + if (product.price === newPrice) { + return product; + } + + // 3. 트랜잭션: 가격 업데이트 + 좋아요 유저 ID 조회 + const { updatedProduct, likedUserIds } = await prisma.$transaction( + async (tx: Prisma.TransactionClient) => { + const updatedProduct = await productRepository.updatePriceTx( + tx, + productId, + newPrice + ); + + const likedUserIds = + await productLikeRepository.findUserIdsWhoLikedProductTx( + tx, + productId + ); + + return { updatedProduct, likedUserIds }; + } + ); + + // 4. 트랜잭션 이후 → 알림 발송 (기존 서비스 그대로 사용) + for (const userId of likedUserIds) { + await notificationService.pushPriceChange({ + receiverUserId: userId, + productId, + oldPrice: product.price, + newPrice, + productName: product.name, + }); + } + + return updatedProduct; + } + + async updateProduct( + productId: number, + userId: number, + updateData: UpdateProductDto + ) { + const product = await productRepository.findUnique(productId); + if (!product) throw new AppError('제품 없음', 404); + if (product.userId !== userId) throw new AppError('권한 없음', 403); + + await productRepository.update(productId, userId, updateData); + + return { message: '상품이 수정되었습니다.' }; + } + + async deleteProduct(productId: number, userId: number) { + const deleted = await productRepository.delete(productId, userId); + if (deleted.count === 0) throw new AppError('권한 없거나 제품 없음', 403); + return { message: '제품 삭제 완료' }; + } + + // --------------------------- + // 본인 상품 조회 + async getUserProducts(userId: number) { + return productRepository.findUserProducts(userId); + } + + // 좋아요한 상품 조회 + async getUserLikedProducts(userId: number) { + return productRepository.findLikedProducts(userId); + } + + // 상품 좋아요 + async productLike(userId: number, productId: number) { + const alreadyLiked = await productLikeRepository.exists(userId, productId); + if (alreadyLiked) { + throw new AppError('이미 좋아요를 눌렀습니다.', 400); + } + await productLikeRepository.create(userId, productId); + const count = await productLikeRepository.count(productId); + return { message: '좋아요 완료', likeCount: count }; + } + + // 상품 좋아요 취소 + async productUnlike(userId: number, productId: number) { + const exists = await productLikeRepository.exists(userId, productId); + if (!exists) { + throw new AppError('좋아요를 누른 기록이 없습니다.', 400); + } + await productLikeRepository.delete(userId, productId); + const count = await productLikeRepository.count(productId); + return { message: '좋아요 취소', likeCount: count }; + } +} + +export const productService = new ProductService(); diff --git a/part4-mission11/src/services/user-service.ts b/part4-mission11/src/services/user-service.ts new file mode 100644 index 000000000..892e0014f --- /dev/null +++ b/part4-mission11/src/services/user-service.ts @@ -0,0 +1,122 @@ +import bcrypt from 'bcrypt'; +import type { Response } from 'express'; + +import type { UserPublic } from '../dtos/user-dto.js'; +import AppError from '../lib/appError.js'; +import { + NODE_ENV, + ACCESS_TOKEN_COOKIE_NAME, + REFRESH_TOKEN_COOKIE_NAME, +} from '../lib/constants.js'; +import { exclude } from '../lib/exclude.js'; +import { generateTokens, verifyRefreshToken } from '../lib/token.js'; +import { commentLikeRepository } from '../repositories/like-repository.js'; +import { userRepository } from '../repositories/user-repository.js'; + +class UserService { + async register(username: string, email: string, password: string) { + const existing = await userRepository.findByUsername(username); + if (existing) throw new AppError('이미 사용 중인 닉네임입니다.', 409); + + const hashed = await bcrypt.hash(password, 10); + const user = await userRepository.createUser({ + username, + email, + password: hashed, + }); + + return exclude(user, ['password']); + } + + async login(userId: number) { + return generateTokens(userId); + } + + async getUserProfile(userId: number) { + return userRepository.findById(userId); + } + + async updateUserProfile(userId: number, updateData: UserPublic) { + return userRepository.updateUser(userId, updateData); + } + + async updatePassword( + userId: number, + currentPassword: string, + newPassword: string + ) { + const user = await userRepository.findByIdWithPassword(userId); + if (!user) throw new AppError('사용자를 찾을 수 없습니다.', 404); + + // 현재 비밀번호 비교 + const isValid = await bcrypt.compare(currentPassword, user.password); + if (!isValid) { + throw new AppError('현재 비밀번호가 일치하지 않습니다.', 400); + } + + // 기존 비밀번호와 동일한지 확인 + const isSame = await bcrypt.compare(newPassword, user.password); + if (isSame) { + throw new AppError('기존 비밀번호로는 변경할 수 없습니다.', 400); + } + + // 새 비밀번호로 업데이트 + const hashed = await bcrypt.hash(newPassword, 10); + const updated = await userRepository.updatePassword(userId, hashed); + + return exclude(updated, ['password']); + } + + async getUserComments(userId: number) { + const comments = await userRepository.getUserComments(userId); + + return Promise.all( + comments.map(async (c) => { + const likeCount = await commentLikeRepository.count(c.id); + return { ...c, likeCount }; + }) + ); + } + + async getUserLikedComments(userId: number) { + const liked = await userRepository.getUserLikedComments(userId); + + return Promise.all( + liked.map(async (like) => { + const c = like.comment; + const likeCount = await commentLikeRepository.count(c.id); + return { ...c, likeCount, isLiked: true }; + }) + ); + } + + setTokenCookies(res: Response, accessToken: string, refreshToken: string) { + res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, { + httpOnly: true, + secure: NODE_ENV === 'production', + sameSite: 'lax', + maxAge: 1 * 60 * 60 * 1000, + }); + res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, { + httpOnly: true, + secure: NODE_ENV === 'production', + sameSite: 'lax', + maxAge: 7 * 24 * 60 * 60 * 1000, + path: '/auth/refresh', + }); + } + + clearTokenCookies(res: Response) { + res.clearCookie(ACCESS_TOKEN_COOKIE_NAME); + res.clearCookie(REFRESH_TOKEN_COOKIE_NAME); + } + + async refreshTokens(refreshToken: string, res: Response) { + const { userId } = verifyRefreshToken(refreshToken); + const tokens = generateTokens(userId); + this.setTokenCookies(res, tokens.accessToken, tokens.refreshToken); + return tokens.accessToken; + } +} + +export const userService = new UserService(); diff --git a/part4-mission11/src/swagger.ts b/part4-mission11/src/swagger.ts new file mode 100644 index 000000000..81608cdf2 --- /dev/null +++ b/part4-mission11/src/swagger.ts @@ -0,0 +1,21 @@ +import type { Express } from 'express'; +import swaggerJSDoc from 'swagger-jsdoc'; +import swaggerUi from 'swagger-ui-express'; + +const options: swaggerJSDoc.Options = { + definition: { + openapi: '3.0.0', + info: { + title: 'My API', + version: '1.0.0', + description: 'Express + TypeScript API 문서', + }, + }, + apis: ['./src/routes/*.ts', './src/controllers/*.ts'], +}; + +const swaggerSpec = swaggerJSDoc(options); + +export function setupSwagger(app: Express) { + app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); +} diff --git a/part4-mission11/src/types/authenticated-request.ts b/part4-mission11/src/types/authenticated-request.ts new file mode 100644 index 000000000..fd1f2f131 --- /dev/null +++ b/part4-mission11/src/types/authenticated-request.ts @@ -0,0 +1,11 @@ +import type { Request } from 'express'; + +export interface AuthUser { + id: number; + username: string; + email: string; +} + +export interface AuthenticatedRequest extends Request { + user: AuthUser; +} diff --git a/part4-mission11/src/types/express.d.ts b/part4-mission11/src/types/express.d.ts new file mode 100644 index 000000000..75b17422e --- /dev/null +++ b/part4-mission11/src/types/express.d.ts @@ -0,0 +1,15 @@ +import express from 'express'; + +declare global { + namespace Express { + interface User { + id: number; + username?: string; + email: string; + } + + interface Request { + user?: User; + } + } +} diff --git a/part4-mission11/src/types/multer-s3.d.ts b/part4-mission11/src/types/multer-s3.d.ts new file mode 100644 index 000000000..6ff5c2320 --- /dev/null +++ b/part4-mission11/src/types/multer-s3.d.ts @@ -0,0 +1,12 @@ +export {}; + +declare global { + namespace Express { + namespace Multer { + interface File { + location?: string; + key?: string; + } + } + } +} diff --git a/part4-mission11/src/types/notification.ts b/part4-mission11/src/types/notification.ts new file mode 100644 index 000000000..fb6da2438 --- /dev/null +++ b/part4-mission11/src/types/notification.ts @@ -0,0 +1,15 @@ +import type { NotificationType as PrismaNotificationType } from '@prisma/client'; +import { NotificationType as NotificationTypeValues } from '@prisma/client'; + +export type NotificationType = PrismaNotificationType; + +export { NotificationTypeValues }; + +export type NotificationCreateInput = { + userId: number; + type: NotificationType; + message: string; + productId?: number | null; + articleId?: number | null; + commentId?: number | null; +}; diff --git a/part4-mission11/tests/_helper/debug.ts b/part4-mission11/tests/_helper/debug.ts new file mode 100644 index 000000000..6e6e08f1b --- /dev/null +++ b/part4-mission11/tests/_helper/debug.ts @@ -0,0 +1,6 @@ +export const dbg = (...args: unknown[]) => { + if (process.env.NODE_ENV === 'test') console.log('[DBG]', ...args); +}; +export const dbe = (...args: unknown[]) => { + if (process.env.NODE_ENV === 'test') console.error('[DBG:ERR]', ...args); +}; diff --git a/part4-mission11/tests/_helper/factories.ts b/part4-mission11/tests/_helper/factories.ts new file mode 100644 index 000000000..38bf2b660 --- /dev/null +++ b/part4-mission11/tests/_helper/factories.ts @@ -0,0 +1,116 @@ +import type { NotificationType } from '../../types/notification.js'; + +export type NotificationRecord = { + id: number; + userId: number; + articleId: number | null; + productId: number | null; + commentId: number | null; + type: NotificationType; + message: string; + isRead: boolean; + createdAt: Date; +}; + +export function makeNotification( + over: Partial = {} +): NotificationRecord { + return { + id: 1, + userId: 1, + articleId: null, + productId: null, + commentId: null, + type: 'NEW_COMMENT' as NotificationType, + message: '알림', + isRead: false, + createdAt: new Date(), + ...over, + }; +} + +export type ArticleLite = { + id: number; + title: string; + userId: number; +}; + +export type ProductLite = { + id: number; + name: string; + userId: number; +}; + +export type CommentCore = { + id: number; + content: string; + userId: number; + user: { username: string }; + articleId: number | null; + productId: number | null; + createdAt: Date; + updatedAt: Date; +}; + +// 리스트 조회에서 사용하는 셀렉트 결과 타입 +export type ListedComment = { + id: number; + content: string; + createdAt: Date; + updatedAt: Date; + user: { username: string }; +}; + +export type CommentLikeRecord = { + id: number; + userId: number; + commentId: number; + createdAt: Date; +}; + +export function makeArticleLite(over?: Partial): ArticleLite { + return { id: 1, title: 'Title', userId: 10, ...over }; +} + +export function makeProductLite(over?: Partial): ProductLite { + return { id: 1, name: 'Prod', userId: 20, ...over }; +} + +export function makeComment(over?: Partial): CommentCore { + return { + id: 100, + content: 'hello', + userId: 999, + user: { username: 'user' }, + articleId: null, + productId: null, + createdAt: new Date(), + updatedAt: new Date(), + ...over, + }; +} + +export function makeListedComment( + over?: Partial +): ListedComment { + return { + id: 200, + content: 'listed', + createdAt: new Date(), + updatedAt: new Date(), + user: { username: 'user' }, + ...over, + }; +} + +export function makeCommentLike( + over: Partial = {} +): CommentLikeRecord { + return { + id: 1, + userId: 1, + commentId: 1, + createdAt: new Date(), + ...over, + }; +} diff --git a/part4-mission11/tests/_helper/jest-typed.ts b/part4-mission11/tests/_helper/jest-typed.ts new file mode 100644 index 000000000..8c6f06d86 --- /dev/null +++ b/part4-mission11/tests/_helper/jest-typed.ts @@ -0,0 +1,17 @@ +export type Awaited = T extends Promise ? U : T; + +export function asMockFn( + fn: (args: TArgs) => Promise +) { + return fn as jest.MockedFunction<(args: TArgs) => Promise>; +} + +/** 공통 함수 시그니처 */ +type FnLike = (...args: unknown[]) => unknown; + +/** 새 범용 캐스터: 인자 0개/여러 개/옵셔널 모두 커버 */ +export type MockedFn = jest.MockedFunction; + +export function asMock(fn: Fn) { + return fn as jest.MockedFunction; +} diff --git a/part4-mission11/tests/_helper/jest.env.setup.ts b/part4-mission11/tests/_helper/jest.env.setup.ts new file mode 100644 index 000000000..94c7328da --- /dev/null +++ b/part4-mission11/tests/_helper/jest.env.setup.ts @@ -0,0 +1,11 @@ +process.env.NODE_ENV ??= 'test'; + +process.env.ACCESS_TOKEN_SECRET ??= 'test_access'; +process.env.REFRESH_TOKEN_SECRET ??= 'test_refresh'; +process.env.ACCESS_TOKEN_COOKIE_NAME ??= 'access-token'; +process.env.REFRESH_TOKEN_COOKIE_NAME ??= 'refresh-token'; +process.env.ACCESS_TOKEN_EXPIRES_IN ??= '15m'; +process.env.REFRESH_TOKEN_EXPIRES_IN ??= '7d'; + +process.env.RESEND_API_KEY ??= 'dummy'; +process.env.DATABASE_URL ??= 'postgresql://user:pass@localhost:5432/dbname'; diff --git a/part4-mission11/tests/_helper/mock-modules.ts b/part4-mission11/tests/_helper/mock-modules.ts new file mode 100644 index 000000000..97f6f937b --- /dev/null +++ b/part4-mission11/tests/_helper/mock-modules.ts @@ -0,0 +1,26 @@ +import { prisma } from './prisma-mock.js'; + +export async function setupPrismaMock() { + jest.resetModules(); + // @ts-expect-error: unstable_mockModule은 타입 선언이 없음 (런타임 전용) + await jest.unstable_mockModule('../../lib/prismaClient.js', () => ({ + __esModule: true, + prisma, + default: prisma, + })); +} + +// 필요할 때만 추가 모듈 주입 +/* +await jest.unstable_mockModule('../../lib/token.js', () => ({ + __esModule: true, + generateTokens: jest.fn().mockReturnValue({ accessToken: 'acc', refreshToken: 'ref' }), + verifyRefreshToken: jest.fn().mockReturnValue({ userId: 7 }), +})); +await jest.unstable_mockModule('../../lib/constants.js', () => ({ + __esModule: true, + NODE_ENV: 'test', + ACCESS_TOKEN_COOKIE_NAME: 'AT', + REFRESH_TOKEN_COOKIE_NAME: 'RT', +})); +*/ diff --git a/part4-mission11/tests/_helper/prisma-mock.ts b/part4-mission11/tests/_helper/prisma-mock.ts new file mode 100644 index 000000000..7e4126926 --- /dev/null +++ b/part4-mission11/tests/_helper/prisma-mock.ts @@ -0,0 +1,1566 @@ +//#region Imports +import { jest } from '@jest/globals'; +import bcrypt from 'bcrypt'; +//#endregion + +//#region Records (Types) +export type UserRecord = { + id: number; + username: string; + email: string; + password: string; + images: string[]; + createdAt: Date; + updatedAt: Date; +}; + +export type ArticleRecord = { + id: number; + title: string; + content: string; + userId: number; + tags: string[]; + images: string[]; + createdAt: Date; + updatedAt: Date; +}; + +export type ProductRecord = { + id: number; + name: string; + description: string; + price: number; + userId: number; + tags: string[]; + images: string[]; + createdAt: Date; + updatedAt: Date; +}; + +export type ArticleLikeRecord = { + id: number; + articleId: number; + userId: number; +}; + +export type ProductLikeRecord = { + id: number; + productId: number; + userId: number; +}; + +export type CommentRecord = { + id: number; + content: string; + userId: number; + articleId?: number | null; + productId?: number | null; + createdAt: Date; + updatedAt: Date; +}; + +export type NotificationRecord = { + id: number; + userId: number; + type: 'COMMENT' | 'LIKE' | 'SYSTEM' | string; + message: string; + isRead: boolean; + createdAt: Date; + updatedAt: Date; +}; + +type CommentLikeRecord = { id: number; commentId: number; userId: number }; + +type BooleanSelect = Partial>; + +type UserSelect = BooleanSelect; +type UserWhereUnique = { id?: number; username?: string; email?: string }; + +type FindUniqueUserArgs = + | { where: UserWhereUnique; select?: undefined } + | { + where: UserWhereUnique; + select: Pick; + }; + +type FindUniqueUserReturn = A extends { + select: infer S; +} + ? S extends UserSelect + ? Pick> | null + : UserRecord | null + : UserRecord | null; + +type ProductSelect = BooleanSelect; +type FindUniqueProductArgs = + | { where: { id: number }; select?: undefined } + | { + where: { id: number }; + select: Pick; + }; + +type FindUniqueProductReturn = A extends { + select: infer S; +} + ? S extends ProductSelect + ? Pick> | null + : ProductRecord | null + : ProductRecord | null; +//#endregion + +//#region In-memory DB & Sequences +const db: { + users: UserRecord[]; + articles: ArticleRecord[]; + products: ProductRecord[]; + comments: CommentRecord[]; + articleLikes: ArticleLikeRecord[]; + productLikes: ProductLikeRecord[]; + commentLikes: CommentLikeRecord[]; + notifications: NotificationRecord[]; +} = { + users: [], + articles: [], + products: [], + comments: [], + articleLikes: [], + productLikes: [], + commentLikes: [], + notifications: [], +}; + +let seq = { + user: 1, + article: 1, + product: 1, + cmt: 1, + aLike: 1, + pLike: 1, + cLike: 1, + notif: 1, +}; +//#endregion + +//#region Utils (helpers) +function pickUserBy(where: UserWhereUnique): UserRecord | undefined { + const { id, username, email } = where; + return db.users.find( + (u) => + (id !== undefined && u.id === id) || + (username !== undefined && u.username === username) || + (email !== undefined && u.email === email) + ); +} + +function ensureArticleArrays< + T extends { + tags?: unknown; + images?: unknown; + comments?: unknown; + likes?: unknown; + } +>(a: T) { + return { + ...a, + tags: Array.isArray(a.tags) ? a.tags : [], + images: Array.isArray(a.images) ? a.images : [], + comments: Array.isArray(a.comments) ? a.comments : [], + likes: Array.isArray(a.likes) ? a.likes : [], + }; +} +function ensureProductArrays< + T extends { + tags?: unknown; + images?: unknown; + comments?: unknown; + likes?: unknown; + } +>(p: T) { + return { + ...p, + tags: Array.isArray(p.tags) ? p.tags : [], + images: Array.isArray(p.images) ? p.images : [], + comments: Array.isArray(p.comments) ? p.comments : [], + likes: Array.isArray(p.likes) ? p.likes : [], + }; +} + +function isNumArray(x: unknown): x is number[] { + return ( + Array.isArray(x) && + x.every((n) => typeof n === 'number' && Number.isFinite(n)) + ); +} + +function wantsCount(v: unknown, key: string): boolean { + if (typeof v !== 'object' || v === null) return false; + const obj = v as Record; + return obj._all === true || obj[key] === true; +} + +type InsensitiveMode = 'insensitive' | 'default'; + +function matchesArticleWhere( + a: ArticleRecord, + where?: { + OR?: Array< + | { title?: { contains?: string; mode?: InsensitiveMode } } + | { content?: { contains?: string; mode?: InsensitiveMode } } + >; + } +): boolean { + if (!where?.OR || where.OR.length === 0) return true; + return where.OR.some((cond) => { + if ('title' in cond && cond.title?.contains != null) { + const q = cond.title.contains!; + return cond.title.mode === 'insensitive' + ? a.title.toLowerCase().includes(q.toLowerCase()) + : a.title.includes(q); + } + if ('content' in cond && cond.content?.contains != null) { + const q = cond.content.contains!; + return cond.content.mode === 'insensitive' + ? a.content.toLowerCase().includes(q.toLowerCase()) + : a.content.includes(q); + } + return false; + }); +} + +function matchesProductWhere( + p: ProductRecord, + where?: { + OR?: Array< + | { name?: { contains?: string; mode?: InsensitiveMode } } + | { description?: { contains?: string; mode?: InsensitiveMode } } + >; + } +): boolean { + if (!where?.OR || where.OR.length === 0) return true; + return where.OR.some((cond) => { + if ('name' in cond && cond.name?.contains != null) { + const q = cond.name.contains!; + return cond.name.mode === 'insensitive' + ? p.name.toLowerCase().includes(q.toLowerCase()) + : p.name.includes(q); + } + if ('description' in cond && cond.description?.contains != null) { + const q = cond.description.contains!; + return cond.description.mode === 'insensitive' + ? p.description.toLowerCase().includes(q.toLowerCase()) + : p.description.includes(q); + } + return false; + }); +} + +/** 키쌍(where: userId_articleId | articleId_userId) 타입 생성기 */ +type PairKey = + | { [K in `${T1}_${T2}`]: { [P in T1 | T2]: number } }[`${T1}_${T2}`] + | { [K in `${T2}_${T1}`]: { [P in T1 | T2]: number } }[`${T2}_${T1}`]; + +function pickArticleLikeKey(where: PairKey<'userId', 'articleId'>): { + userId: number; + articleId: number; +} { + const a = + (where as unknown as Record)[ + 'userId_articleId' + ] ?? + (where as unknown as Record)[ + 'articleId_userId' + ]; + if (!a) + throw new Error( + 'articleLike.where needs userId_articleId or articleId_userId' + ); + return { userId: Number(a.userId), articleId: Number(a.articleId) }; +} + +function pickProductLikeKey(where: PairKey<'userId', 'productId'>): { + userId: number; + productId: number; +} { + const a = + (where as unknown as Record)[ + 'userId_productId' + ] ?? + (where as unknown as Record)[ + 'productId_userId' + ]; + if (!a) + throw new Error( + 'productLike.where needs userId_productId or productId_userId' + ); + return { userId: Number(a.userId), productId: Number(a.productId) }; +} + +/* ---- like matchers ---- */ +type ArticleLikeWhere = + | { articleId: number; userId?: number } + | { articleId: { in: number[] }; userId?: number }; +type ProductLikeWhere = + | { productId: number; userId?: number } + | { productId: { in: number[] }; userId?: number }; +type CommentLikeWhere = + | { commentId: number; userId?: number } + | { commentId: { in: number[] }; userId?: number }; + +function matchArticleLike( + where: ArticleLikeWhere, + rec: ArticleLikeRecord +): boolean { + const idOk = + typeof (where as { articleId: number }).articleId === 'number' + ? rec.articleId === (where as { articleId: number }).articleId + : (where as { articleId: { in: number[] } }).articleId.in.includes( + rec.articleId + ); + const userOk = + (where as { userId?: number }).userId === undefined || + rec.userId === (where as { userId?: number }).userId; + return idOk && userOk; +} + +function matchProductLike( + where: ProductLikeWhere, + rec: ProductLikeRecord +): boolean { + const idOk = + typeof (where as { productId: number }).productId === 'number' + ? rec.productId === (where as { productId: number }).productId + : (where as { productId: { in: number[] } }).productId.in.includes( + rec.productId + ); + const userOk = + (where as { userId?: number }).userId === undefined || + rec.userId === (where as { userId?: number }).userId; + return idOk && userOk; +} + +function matchCommentLike( + where: CommentLikeWhere, + rec: CommentLikeRecord +): boolean { + const idOk = + typeof (where as { commentId: number }).commentId === 'number' + ? rec.commentId === (where as { commentId: number }).commentId + : (where as { commentId: { in: number[] } }).commentId.in.includes( + rec.commentId + ); + + const userOk = + (where as { userId?: number }).userId === undefined || + rec.userId === (where as { userId?: number }).userId; + + return idOk && userOk; +} +//#endregion + +//#region Query arg helper types +type OrderDir = 'asc' | 'desc'; + +type ProductWhereOr = { + OR?: Array< + | { name?: { contains?: string; mode?: InsensitiveMode } } + | { description?: { contains?: string; mode?: InsensitiveMode } } + >; +}; +type FindManyProductArgs = { where?: ProductWhereOr }; + +type CommentLikeOrderBy = { id?: OrderDir }; + +type CommentIncludeArticle = + | boolean + | { select?: Partial> }; +type CommentIncludeProduct = + | boolean + | { select?: Partial> }; + +type CommentInclude = + | boolean + | { + select?: Partial> & { + article?: CommentIncludeArticle; + product?: CommentIncludeProduct; + }; + include?: { + article?: CommentIncludeArticle; + product?: CommentIncludeProduct; + }; + }; + +type FindManyCommentLikeArgs = { + where?: { + userId?: number; + commentId?: number | { in?: number[] }; + }; + orderBy?: CommentLikeOrderBy; + skip?: number; + take?: number; + include?: { comment?: CommentInclude }; +}; + +type GroupByCountOpt = { + _count?: { _all?: true } & Partial>; +}; +type ArticleLikeGroupByArgs = { + by?: string[]; + where?: { articleId?: { in?: number[] } }; +} & GroupByCountOpt<'articleId'>; +type ProductLikeGroupByArgs = { + by?: string[]; + where?: { productId?: { in?: number[] } }; +} & GroupByCountOpt<'productId'>; +type CommentLikeGroupByArgs = { + by?: string[]; + where?: { commentId?: { in?: number[] } }; +} & GroupByCountOpt<'commentId'>; +//#endregion + +//#region Prisma Mock Root +export const prisma = { + //#region prisma.user + user: { + create: jest.fn( + async (args: { + data: Omit; + }) => { + const now = new Date(); + const { images: imagesIn, ...rest } = args.data; + const rec: UserRecord = { + id: seq.user++, + createdAt: now, + updatedAt: now, + ...rest, + images: imagesIn ?? [], + }; + db.users.push(rec); + return { ...rec }; + } + ), + + findUnique: jest.fn( + async ( + args: A + ): Promise> => { + const found = pickUserBy(args.where); + if (!found) return null as FindUniqueUserReturn; + if (!('select' in args) || !args.select) + return { ...found } as FindUniqueUserReturn; + + const sel = args.select as UserSelect; + const pickedEntries = Object.keys(sel) + .filter((k) => sel[k as keyof UserSelect]) + .map((k) => [k, found[k as keyof UserRecord]] as const); + const picked = Object.fromEntries(pickedEntries) as Pick< + UserRecord, + Extract + >; + return picked as FindUniqueUserReturn; + } + ), + + update: jest.fn( + async (args: { + where: { id: number }; + data: Partial>; + }) => { + const target = db.users.find((u) => u.id === args.where.id); + if (!target) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + Object.assign(target, args.data, { updatedAt: new Date() }); + return { ...target }; + } + ), + }, + //#endregion + + //#region prisma.article + article: { + findMany: jest.fn( + async (args?: { + where?: { + OR?: Array< + | { + title?: { contains?: string; mode?: 'insensitive' | 'default' }; + } + | { + content?: { + contains?: string; + mode?: 'insensitive' | 'default'; + }; + } + >; + }; + orderBy?: { createdAt?: 'asc' | 'desc'; id?: 'asc' | 'desc' }; + skip?: number; + take?: number; + }) => { + let list = db.articles.filter((a) => + matchesArticleWhere(a, args?.where) + ); + if (args?.orderBy?.createdAt || args?.orderBy?.id) { + const dirCreated = args?.orderBy?.createdAt === 'asc' ? 1 : -1; + const dirId = args?.orderBy?.id === 'asc' ? 1 : -1; + list.sort((a, b) => { + if (args?.orderBy?.createdAt) { + const diff = + (a.createdAt.getTime() - b.createdAt.getTime()) * dirCreated; + if (diff !== 0) return diff; + } + if (args?.orderBy?.id) { + return (a.id - b.id) * dirId; + } + return 0; + }); + } + const start = args?.skip ?? 0; + const end = args?.take != null ? start + args.take : undefined; + const sliced = list.slice(start, end); + + return sliced.map((a) => ensureArticleArrays({ ...a })); + } + ), + + findUnique: jest.fn(async (args: { where: { id: number } }) => { + const f = db.articles.find((a) => a.id === args.where.id); + return f ? ensureArticleArrays({ ...f }) : null; + }), + + count: jest.fn( + async (args?: { + where?: { + OR?: Array< + | { + title?: { contains?: string; mode?: InsensitiveMode }; + } + | { + content?: { + contains?: string; + mode?: InsensitiveMode; + }; + } + >; + }; + }) => + db.articles.filter((a) => matchesArticleWhere(a, args?.where)).length + ), + create: jest.fn( + async (args: { + data: Omit; + }) => { + const now = new Date(); + const rec: ArticleRecord = { + id: seq.article++, + title: args.data.title, + content: args.data.content ?? '', + userId: args.data.userId, + tags: Array.isArray(args.data.tags) ? args.data.tags : [], + images: Array.isArray(args.data.images) ? args.data.images : [], + createdAt: now, + updatedAt: now, + }; + db.articles.push(rec); + return { ...rec }; + } + ), + + update: jest.fn( + async (args: { + where: { id: number }; + data: Partial>; + }) => { + const target = db.articles.find((p) => p.id === args.where.id); + if (!target) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + Object.assign(target, { + ...args.data, + tags: args.data.tags ?? target.tags, + images: args.data.images ?? target.images, + updatedAt: new Date(), + }); + return { ...target }; + } + ), + + delete: jest.fn(async (args: { where: { id: number } }) => { + const idx = db.articles.findIndex((a) => a.id === args.where.id); + if (idx === -1) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + const [removed] = db.articles.splice(idx, 1); + return { ...removed }; + }), + + deleteMany: jest.fn(async (args?: { where?: { id?: number } }) => { + const before = db.articles.length; + if (!args?.where || args.where.id == null) { + db.articles = []; + } else { + const id = args.where.id; + db.articles = db.articles.filter((a) => a.id !== id); + } + const after = db.articles.length; + return { count: before - after }; + }), + }, + //#endregion + + //#region prisma.product + product: { + findMany: jest.fn(async (args?: FindManyProductArgs) => { + const list = db.products.filter((p) => + matchesProductWhere(p, args?.where) + ); + return list.map((p) => ensureProductArrays({ ...p })); + }), + + findUnique: jest.fn( + async ( + args: A + ): Promise> => { + const f = db.products.find((p) => p.id === args.where.id); + if (!f) return null as FindUniqueProductReturn; + + if (!('select' in args) || !args.select) { + return ensureProductArrays({ + ...f, + }) as unknown as FindUniqueProductReturn; + } + + const sel = args.select as ProductSelect; + const pickedEntries = Object.keys(sel) + .filter((k) => sel[k as keyof ProductSelect]) + .map( + (k) => + [k, f[k as keyof ProductRecord]] as [ + keyof ProductRecord | string, + unknown + ] + ); + const picked = Object.fromEntries(pickedEntries) as Pick< + ProductRecord, + Extract + >; + return picked as FindUniqueProductReturn; + } + ), + + count: jest.fn( + async (args?: { + where?: { + OR?: Array< + | { + name?: { + contains?: string; + mode?: InsensitiveMode; + }; + } + | { + description?: { + contains?: string; + mode?: InsensitiveMode; + }; + } + >; + }; + }) => + db.products.filter((p) => matchesProductWhere(p, args?.where)).length + ), + + create: jest.fn( + async (args: { + data: Omit; + }) => { + const now = new Date(); + const rec: ProductRecord = { + id: seq.product++, + name: args.data.name, + description: args.data.description, + price: args.data.price ?? 0, + userId: args.data.userId, + tags: Array.isArray(args.data.tags) ? args.data.tags : [], + images: Array.isArray(args.data.images) ? args.data.images : [], + createdAt: now, + updatedAt: now, + }; + db.products.push(rec); + return { ...rec }; + } + ), + + update: jest.fn( + async (args: { + where: { id: number }; + data: Partial>; + }) => { + const target = db.products.find((p) => p.id === args.where.id); + if (!target) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + Object.assign(target, { + ...args.data, + tags: args.data.tags ?? target.tags, + images: args.data.images ?? target.images, + updatedAt: new Date(), + }); + return { ...target }; + } + ), + + delete: jest.fn(async (args: { where: { id: number } }) => { + const idx = db.products.findIndex((p) => p.id === args.where.id); + if (idx === -1) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + const [removed] = db.products.splice(idx, 1); + return { ...removed }; + }), + + deleteMany: jest.fn(async (args?: { where?: { id?: number } }) => { + const before = db.products.length; + if (!args?.where || args.where.id == null) { + db.products = []; + } else { + const id = args.where.id; + db.products = db.products.filter((p) => p.id !== id); + } + const after = db.products.length; + return { count: before - after }; + }), + }, + //#endregion + + //#region prisma.comment + comment: { + findUnique: jest.fn(async (args: { where: { id: number } }) => { + const f = db.comments.find((c) => c.id === args.where.id); + return f ? { ...f } : null; + }), + + findMany: jest.fn( + async (args?: { + where?: { + id?: number | { in?: number[] }; + articleId?: number | null; + productId?: number | null; + userId?: number; + }; + orderBy?: { createdAt?: OrderDir }; + skip?: number; + take?: number; + }) => { + let list = db.comments.slice(); + + if (args?.where?.id !== undefined) { + const idCond = args.where.id as number | { in?: number[] }; + if (typeof idCond === 'number') { + list = list.filter((c) => c.id === idCond); + } else if (idCond && Array.isArray(idCond.in)) { + list = list.filter((c) => idCond.in!.includes(c.id)); + } + } + + if (args?.where?.articleId !== undefined) { + list = list.filter((c) => c.articleId === args.where!.articleId); + } + if (args?.where?.productId !== undefined) { + list = list.filter((c) => c.productId === args.where!.productId); + } + if (args?.where?.userId !== undefined) { + list = list.filter((c) => c.userId === args.where!.userId); + } + + if (args?.orderBy?.createdAt) { + const dir = args.orderBy.createdAt === 'asc' ? 1 : -1; + list.sort( + (a, b) => (a.createdAt.getTime() - b.createdAt.getTime()) * dir + ); + } + + const start = args?.skip ?? 0; + const end = args?.take != null ? start + args.take : undefined; + return list.slice(start, end).map((c) => ({ ...c })); + } + ), + + create: jest.fn( + async (args: { + data: Omit & + Partial>; + }) => { + const hasArticle = typeof args.data.articleId === 'number'; + const hasProduct = typeof args.data.productId === 'number'; + if (hasArticle === hasProduct) { + const e = new Error( + 'Exactly one of articleId/productId required' + ) as Error & { code: string }; + e.code = 'VALIDATION'; + throw e; + } + + const now = new Date(); + const rec: CommentRecord = { + id: args.data.id ?? seq.cmt++, + content: args.data.content ?? '', + userId: args.data.userId, + articleId: hasArticle ? args.data.articleId! : null, + productId: hasProduct ? args.data.productId! : null, + createdAt: now, + updatedAt: now, + }; + db.comments.push(rec); + return { ...rec }; + } + ), + + update: jest.fn( + async (args: { + where: { id: number }; + data: Partial>; + }) => { + const t = db.comments.find((c) => c.id === args.where.id); + if (!t) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + Object.assign(t, { ...args.data, updatedAt: new Date() }); + return { ...t }; + } + ), + + delete: jest.fn(async (args: { where: { id: number } }) => { + const idx = db.comments.findIndex((c) => c.id === args.where.id); + if (idx < 0) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + const [removed] = db.comments.splice(idx, 1); + return { ...removed }; + }), + }, + //#endregion + + //#region prisma.articleLike + articleLike: { + findUnique: jest.fn( + async ({ where }: { where: PairKey<'userId', 'articleId'> }) => { + const { userId, articleId } = pickArticleLikeKey(where); + return ( + db.articleLikes.find( + (l) => l.userId === userId && l.articleId === articleId + ) ?? null + ); + } + ), + + create: jest.fn( + async ({ data }: { data: { userId: number; articleId: number } }) => { + const userId = Number(data.userId); + const articleId = Number(data.articleId); + const exists = db.articleLikes.some( + (l) => l.userId === userId && l.articleId === articleId + ); + if (exists) { + const e = new Error('Unique constraint failed') as Error & { + code: string; + }; + e.code = 'P2002'; + throw e; + } + const row: ArticleLikeRecord = { id: seq.aLike++, userId, articleId }; + db.articleLikes.push(row); + return { ...row }; + } + ), + + delete: jest.fn( + async ({ where }: { where: PairKey<'userId', 'articleId'> }) => { + const { userId, articleId } = pickArticleLikeKey(where); + const idx = db.articleLikes.findIndex( + (l) => l.userId === userId && l.articleId === articleId + ); + if (idx < 0) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + const [removed] = db.articleLikes.splice(idx, 1); + return { ...removed }; + } + ), + + count: jest.fn( + async (args: { where: ArticleLikeWhere }) => + db.articleLikes.filter((l) => matchArticleLike(args.where, l)).length + ), + + groupBy: jest.fn(async (args: ArticleLikeGroupByArgs) => { + const rawIds = args?.where?.articleId?.in ?? []; + const ids = isNumArray(rawIds) ? rawIds : []; + return ids.map((id) => { + const c = db.articleLikes.filter((l) => l.articleId === id).length; + return wantsCount(args?._count, 'articleId') + ? { articleId: id, _count: { articleId: c } } + : { articleId: id }; + }); + }), + }, + //#endregion + + //#region prisma.productLike + productLike: { + findUnique: jest.fn( + async ({ where }: { where: PairKey<'userId', 'productId'> }) => { + const { userId, productId } = pickProductLikeKey(where); + return ( + db.productLikes.find( + (l) => l.userId === userId && l.productId === productId + ) ?? null + ); + } + ), + + create: jest.fn( + async ({ data }: { data: { userId: number; productId: number } }) => { + const userId = Number(data.userId); + const productId = Number(data.productId); + const exists = db.productLikes.some( + (l) => l.userId === userId && l.productId === productId + ); + if (exists) { + const e = new Error('Unique constraint failed') as Error & { + code: string; + }; + e.code = 'P2002'; + throw e; + } + const row: ProductLikeRecord = { id: seq.pLike++, userId, productId }; + db.productLikes.push(row); + return { ...row }; + } + ), + + delete: jest.fn( + async ({ where }: { where: PairKey<'userId', 'productId'> }) => { + const { userId, productId } = pickProductLikeKey(where); + const idx = db.productLikes.findIndex( + (l) => l.userId === userId && l.productId === productId + ); + if (idx < 0) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + const [removed] = db.productLikes.splice(idx, 1); + return { ...removed }; + } + ), + + count: jest.fn( + async (args: { where: ProductLikeWhere }) => + db.productLikes.filter((l) => matchProductLike(args.where, l)).length + ), + + groupBy: jest.fn(async (args: ProductLikeGroupByArgs) => { + const rawIds = args?.where?.productId?.in ?? []; + const ids = isNumArray(rawIds) ? rawIds : []; + return ids.map((id) => { + const c = db.productLikes.filter((l) => l.productId === id).length; + return wantsCount(args?._count, 'productId') + ? { productId: id, _count: { productId: c } } + : { productId: id }; + }); + }), + }, + //#endregion + + //#region prisma.commentLike + commentLike: { + findUnique: jest.fn( + async (args: { + where: { userId_commentId: { userId: number; commentId: number } }; + }) => { + const { userId, commentId } = args.where.userId_commentId; + return ( + db.commentLikes.find( + (l) => l.userId === userId && l.commentId === commentId + ) ?? null + ); + } + ), + + findMany: jest.fn(async (args?: FindManyCommentLikeArgs) => { + let list = db.commentLikes.slice(); + + if (args?.where) { + const w = args.where; + const hasCommentIdCond = + typeof w.commentId === 'number' || + (w.commentId && Array.isArray((w.commentId as { in?: number[] }).in)); + + if (hasCommentIdCond) { + let cond: CommentLikeWhere = + typeof w.commentId === 'number' + ? { commentId: w.commentId } + : { + commentId: { + in: (w.commentId as { in?: number[] }).in ?? [], + }, + }; + + if (typeof w.userId === 'number') { + cond = { ...cond, userId: w.userId }; + } + + list = list.filter((rec) => matchCommentLike(cond, rec)); + } + + if (typeof w.userId === 'number') { + list = list.filter((rec) => rec.userId === w.userId); + } + } + + if (args?.orderBy?.id) { + const dir = args.orderBy.id === 'asc' ? 1 : -1; + list.sort((a, b) => (a.id - b.id) * dir); + } + + const start = args?.skip ?? 0; + const end = args?.take != null ? start + args.take : undefined; + const sliced = list.slice(start, end); + + // ---------- include.comment 처리 ---------- + const commentArg = args?.include?.comment; + if (!commentArg) return sliced.map((x) => ({ ...x })); + + // 선택/포함 타입 정의 + type ArticleSelect = Partial>; + type ProductSelect = Partial>; + type CommentBaseSelect = Partial>; + + interface CommentSelectShape { + select: CommentBaseSelect & { + article?: { select?: ArticleSelect }; + product?: { select?: ProductSelect }; + }; + } + interface CommentIncludeShape { + include?: { + article?: { select?: ArticleSelect }; + product?: { select?: ProductSelect }; + }; + } + + // 타입 가드 + const hasSelect = (v: unknown): v is CommentSelectShape => + typeof v === 'object' && + v !== null && + 'select' in (v as Record); + + const hasInclude = (v: unknown): v is CommentIncludeShape => + typeof v === 'object' && + v !== null && + 'include' in (v as Record); + + const isSelect = hasSelect(commentArg); + const sel = isSelect ? commentArg.select : undefined; + + // 안전한 pick 유틸 + const pick = >( + obj: T | null, + keys?: Partial> + ): T | null => { + if (!obj) return null; + if (!keys) return { ...obj }; + const out = {} as T; + (Object.keys(keys) as Array).forEach((k) => { + if (keys[k]) { + out[k] = obj[k]; + } + }); + return out; + }; + + // include 모드에서 article/product 포함 여부 + const wantArticle = + !isSelect && hasInclude(commentArg) && !!commentArg.include?.article; + const wantProduct = + !isSelect && hasInclude(commentArg) && !!commentArg.include?.product; + + type CommentWithIncludes = CommentRecord & { + article?: ArticleRecord | null; + product?: ProductRecord | null; + }; + + return sliced.map((like) => { + const c = db.comments.find((x) => x.id === like.commentId) || null; + + // include 모드 (select 아님) + if (!isSelect) { + let comment: CommentWithIncludes | null = c ? { ...c } : null; + + if (comment && wantArticle) { + comment.article = + c!.articleId != null + ? db.articles.find((a) => a.id === c!.articleId) || null + : null; + } + if (comment && wantProduct) { + comment.product = + c!.productId != null + ? db.products.find((p) => p.id === c!.productId) || null + : null; + } + + return { ...like, comment }; + } + + // select 모드 + const commentSelected = pick(c, sel as CommentBaseSelect); + + // article select + if (sel?.article) { + const art = + c && c.articleId != null + ? db.articles.find((a) => a.id === c.articleId) || null + : null; + + (commentSelected as Record)['article'] = sel.article + .select + ? pick(art, sel.article.select) + : art; + } + + // product select + if (sel?.product) { + const prod = + c && c.productId != null + ? db.products.find((p) => p.id === c.productId) || null + : null; + + (commentSelected as Record)['product'] = sel.product + .select + ? pick(prod, sel.product.select) + : prod; + } + + return { ...like, comment: commentSelected }; + }); + }), + + create: jest.fn( + async (args: { data: { userId: number; commentId: number } }) => { + const { userId, commentId } = args.data; + const exists = db.commentLikes.some( + (l) => l.userId === userId && l.commentId === commentId + ); + if (exists) { + const e = new Error('Unique constraint failed') as Error & { + code: string; + }; + e.code = 'P2002'; + throw e; + } + const row: CommentLikeRecord = { id: seq.cLike++, userId, commentId }; + db.commentLikes.push(row); + return { ...row }; + } + ), + + delete: jest.fn( + async (args: { + where: { userId_commentId: { userId: number; commentId: number } }; + }) => { + const { userId, commentId } = args.where.userId_commentId; + const idx = db.commentLikes.findIndex( + (l) => l.userId === userId && l.commentId === commentId + ); + if (idx < 0) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + const [removed] = db.commentLikes.splice(idx, 1); + return { ...removed }; + } + ), + + count: jest.fn( + async (args: { where: CommentLikeWhere }) => + db.commentLikes.filter((l) => matchCommentLike(args.where, l)).length + ), + + groupBy: jest.fn(async (args: CommentLikeGroupByArgs) => { + const rawIds = args?.where?.commentId?.in ?? []; + const ids = isNumArray(rawIds) ? rawIds : []; + return ids.map((id) => { + const c = db.commentLikes.filter((l) => l.commentId === id).length; + return wantsCount(args?._count, 'commentId') + ? { commentId: id, _count: { commentId: c } } + : { commentId: id }; + }); + }), + }, + //#endregion + + //#region prisma.notification + notification: { + findMany: jest.fn( + async (args?: { + where?: { userId?: number; isRead?: boolean }; + orderBy?: { createdAt?: OrderDir }; + skip?: number; + take?: number; + }) => { + let list = db.notifications.slice(); + + if (args?.where?.userId !== undefined) { + list = list.filter((n) => n.userId === args.where!.userId); + } + if (args?.where?.isRead !== undefined) { + list = list.filter((n) => n.isRead === args.where!.isRead); + } + + if (args?.orderBy?.createdAt) { + const dir = args.orderBy.createdAt === 'asc' ? 1 : -1; + list.sort( + (a, b) => (a.createdAt.getTime() - b.createdAt.getTime()) * dir + ); + } + + const start = args?.skip ?? 0; + const end = args?.take != null ? start + args.take : undefined; + return list.slice(start, end).map((n) => ({ ...n })); + } + ), + + count: jest.fn( + async (args?: { where?: { userId?: number; isRead?: boolean } }) => { + return db.notifications.filter((n) => { + if ( + args?.where?.userId !== undefined && + n.userId !== args.where!.userId + ) + return false; + if ( + args?.where?.isRead !== undefined && + n.isRead !== args.where!.isRead + ) + return false; + return true; + }).length; + } + ), + + updateMany: jest.fn( + async (args: { + where?: { userId?: number; isRead?: boolean }; + data: Partial>; + }) => { + let count = 0; + for (const n of db.notifications) { + const userOk = + args.where?.userId === undefined || n.userId === args.where!.userId; + const readOk = + args.where?.isRead === undefined || n.isRead === args.where!.isRead; + if (userOk && readOk) { + Object.assign(n, args.data, { updatedAt: new Date() }); + count++; + } + } + return { count }; + } + ), + + update: jest.fn( + async (args: { + where: { id: number }; + data: Partial>; + }) => { + const target = db.notifications.find((n) => n.id === args.where.id); + if (!target) { + const e = new Error('Not found') as Error & { code: string }; + e.code = 'P2025'; + throw e; + } + Object.assign(target, args.data, { updatedAt: new Date() }); + return { ...target }; + } + ), + + create: jest.fn( + async (args: { + data: Omit; + }) => { + const now = new Date(); + const rec: NotificationRecord = { + id: seq.notif++, + createdAt: now, + updatedAt: now, + ...args.data, + }; + db.notifications.push(rec); + return { ...rec }; + } + ), + + findUnique: jest.fn(async (args: { where: { id: number } }) => { + const n = db.notifications.find((x) => x.id === args.where.id); + return n ? { ...n } : null; + }), + }, + //#endregion +}; +//#endregion + +//#region Prisma Mock: $transaction & default export +type PrismaLike = typeof prisma & { + $transaction: jest.MockedFunction<(arg: unknown) => Promise>; +}; + +(prisma as PrismaLike).$transaction = jest.fn(async (arg: unknown) => { + if (Array.isArray(arg)) return Promise.all(arg as unknown[]); + if (typeof arg === 'function') + return (arg as (tx: typeof prisma) => unknown)(prisma); + return arg; +}); + +export default prisma; +//#endregion + +//#region Test Helpers (reset & seeders) +export function prismaReset(): void { + db.users = []; + db.articles = []; + db.products = []; + db.comments = []; + db.articleLikes = []; + db.productLikes = []; + db.commentLikes = []; + db.notifications = []; + seq = { + user: 1, + article: 1, + product: 1, + cmt: 1, + aLike: 1, + pLike: 1, + cLike: 1, + notif: 1, + }; + + prisma.user.create.mockClear(); + prisma.user.findUnique.mockClear(); + prisma.user.update.mockClear(); + + prisma.article.findMany.mockClear(); + prisma.article.findUnique.mockClear(); + prisma.article.count.mockClear(); + prisma.article.create.mockClear(); + prisma.article.update.mockClear(); + prisma.article.delete.mockClear(); + prisma.article.deleteMany.mockClear(); + + prisma.product.findMany.mockClear(); + prisma.product.findUnique.mockClear(); + prisma.product.count.mockClear(); + prisma.product.create.mockClear(); + prisma.product.update.mockClear(); + prisma.product.delete.mockClear(); + prisma.product.deleteMany.mockClear(); + + prisma.comment.findMany.mockClear(); + prisma.comment.findUnique.mockClear(); + prisma.comment.create.mockClear(); + prisma.comment.update.mockClear(); + prisma.comment.delete.mockClear(); + + prisma.articleLike.count.mockClear(); + prisma.articleLike.groupBy.mockClear(); + prisma.productLike.count.mockClear(); + prisma.productLike.groupBy.mockClear(); + prisma.commentLike.count.mockClear(); + prisma.commentLike.groupBy.mockClear(); + + prisma.notification.findMany.mockClear(); + prisma.notification.count.mockClear(); + prisma.notification.updateMany.mockClear(); + prisma.notification.update.mockClear(); + prisma.notification.create.mockClear(); + prisma.notification.findUnique.mockClear(); + + (prisma as PrismaLike).$transaction.mockClear(); +} + +export function seedUsers( + list: Array< + Pick & + Partial> + > +): void { + for (const u of list) { + db.users.push({ + id: u.id, + username: u.username, + email: u.email, + password: u.password, + images: u.images ?? [], + createdAt: u.createdAt ?? new Date(), + updatedAt: u.updatedAt ?? new Date(), + }); + } +} + +export async function seedUsersWithHash( + list: Array< + Pick & + Partial> + >, + opts: { saltRounds?: number } = {} +): Promise { + const saltRounds = opts.saltRounds ?? 10; + + for (const u of list) { + const hashed = await bcrypt.hash(u.password, saltRounds); + db.users.push({ + id: u.id, + username: u.username, + email: u.email, + password: hashed, + images: u.images ?? [], + createdAt: u.createdAt ?? new Date(), + updatedAt: u.updatedAt ?? new Date(), + }); + } +} + +export function seedArticles( + list: Array< + Pick & Partial + > +): void { + for (const a of list) { + db.articles.push({ + id: a.id, + title: a.title, + content: a.content ?? '', + userId: a.userId, + tags: a.tags ?? [], + images: a.images ?? [], + createdAt: a.createdAt ?? new Date(), + updatedAt: a.updatedAt ?? new Date(), + }); + } +} + +export function seedProducts( + list: Array< + Pick & + Partial + > +): void { + for (const p of list) { + db.products.push({ + id: p.id, + name: p.name, + description: p.description ?? '', + price: p.price, + userId: p.userId, + tags: p.tags ?? [], + images: p.images ?? [], + createdAt: p.createdAt ?? new Date(), + updatedAt: p.updatedAt ?? new Date(), + }); + } +} + +export function seedComments( + list: Array< + Pick & + ( + | { articleId: number; productId?: undefined } + | { productId: number; articleId?: undefined } + ) & + Partial> + > +): CommentRecord[] { + const out: CommentRecord[] = []; + for (const c of list) { + const hasArticle = + typeof (c as { articleId?: number }).articleId === 'number'; + const hasProduct = + typeof (c as { productId?: number }).productId === 'number'; + if (hasArticle === hasProduct) { + throw new Error( + 'seedComments: require exactly one of articleId or productId' + ); + } + const rec: CommentRecord = { + id: c.id, + content: c.content, + userId: c.userId, + articleId: (c as { articleId?: number }).articleId ?? null, + productId: (c as { productId?: number }).productId ?? null, + createdAt: c.createdAt ?? new Date(), + updatedAt: c.updatedAt ?? new Date(), + }; + db.comments.push(rec); + out.push(rec); + } + return out; +} + +export function seedArticleLikes( + pairs: ReadonlyArray> +): void { + for (const x of pairs) db.articleLikes.push({ id: seq.aLike++, ...x }); +} + +export function seedProductLikes( + pairs: ReadonlyArray> +): void { + for (const x of pairs) db.productLikes.push({ id: seq.pLike++, ...x }); +} + +export function seedCommentLikes( + list: Array> +): void { + for (const x of list) db.commentLikes.push({ id: seq.cLike++, ...x }); +} + +export function seedNotifications( + list: Array< + Omit & + Partial> + > +): void { + for (const n of list) { + const now = new Date(); + db.notifications.push({ + id: n.id ?? seq.notif++, + userId: n.userId, + type: n.type, + message: n.message, + isRead: n.isRead ?? false, + createdAt: n.createdAt ?? now, + updatedAt: n.updatedAt ?? now, + }); + } +} +//#endregion diff --git a/part4-mission11/tests/_helper/test-app.ts b/part4-mission11/tests/_helper/test-app.ts new file mode 100644 index 000000000..1eb25f8c9 --- /dev/null +++ b/part4-mission11/tests/_helper/test-app.ts @@ -0,0 +1,5 @@ +export async function createTestApp() { + const mod = await import('../../app.js'); + const app = await mod.buildApp({ forTest: true }); + return app as import('express').Express; +} diff --git a/part4-mission11/tests/_helper/test-passport-app.ts b/part4-mission11/tests/_helper/test-passport-app.ts new file mode 100644 index 000000000..3aae8cb93 --- /dev/null +++ b/part4-mission11/tests/_helper/test-passport-app.ts @@ -0,0 +1,36 @@ +import express, { type ErrorRequestHandler } from 'express'; +import passport from 'passport'; + +import { localStrategy } from '../../lib/passport/localStrategy.js'; + +type MaybeHttpError = { + status?: unknown; + message?: unknown; +}; + +export function createPassportTestApp() { + const app = express(); + app.use(express.json()); + passport.use(localStrategy); + app.use(passport.initialize()); + + app.post( + '/login', + passport.authenticate('local', { session: false }), + (req, res) => { + res.status(200).json({ ok: true, user: req.user }); + } + ); + + // 에러 바디 노출 (디버깅용) + const errorHandler: ErrorRequestHandler = (err, _req, res, _next) => { + const e = err as MaybeHttpError; + const status = typeof e.status === 'number' ? e.status : 500; + const message = + typeof e.message === 'string' ? e.message : 'Internal Server Error'; + res.status(status).json({ message }); + }; + app.use(errorHandler); + + return app; +} diff --git a/part4-mission11/tests/_helper/test-utils.ts b/part4-mission11/tests/_helper/test-utils.ts new file mode 100644 index 000000000..489b595d0 --- /dev/null +++ b/part4-mission11/tests/_helper/test-utils.ts @@ -0,0 +1,63 @@ +import './mock-modules.js'; +import bcrypt from 'bcrypt'; +import request from 'supertest'; + +import { prisma } from './prisma-mock.js'; + +export async function getPrismaMock() { + return prisma; +} + +export async function loginAndGetSession( + app: import('express').Express, + opts?: { + loginPath?: string; + username?: string; + password?: string; + userId?: number; + seedDb?: boolean; + resetBeforeSeed?: boolean; + } +) { + const { + loginPath = '/users/login', + username = 'u', + password = 'pw', + userId = 7, + seedDb = false, + resetBeforeSeed = false, + } = opts ?? {}; + + if (seedDb) { + const { prismaReset, seedUsersWithHash } = await import('./prisma-mock.js'); + if (resetBeforeSeed) prismaReset(); + await seedUsersWithHash([ + { id: userId, username, email: 'u@ex.com', password }, + ]); + } + + const prisma = await getPrismaMock(); + + prisma.user.findUnique.mockResolvedValue({ + id: userId, + username, + email: 'u@ex.com', + password: await bcrypt.hash(password, 10), + createdAt: new Date(), + updatedAt: new Date(), + images: [], + }); + + const res = await request(app) + .post(loginPath) + .send({ username, password }) + .expect(200); + + const setCookies = res.headers['set-cookie'] ?? []; + const cookiePairs = ( + Array.isArray(setCookies) ? setCookies : [setCookies] + ).map((c) => c.split(';')[0]); + const accessToken = res.body?.accessToken as string | undefined; + + return { cookies: cookiePairs, accessToken, user: { id: userId, username } }; +} diff --git a/part4-mission11/tests/_helper/token-mock.ts b/part4-mission11/tests/_helper/token-mock.ts new file mode 100644 index 000000000..b8305ebe2 --- /dev/null +++ b/part4-mission11/tests/_helper/token-mock.ts @@ -0,0 +1,15 @@ +import { jest } from '@jest/globals'; + +export type Tokens = { accessToken: string; refreshToken: string }; + +export const generateTokens = jest.fn<(userId: number) => Tokens>(() => ({ + accessToken: 'A.T', + refreshToken: 'R.T', +})); + +export const verifyRefreshToken = jest.fn< + (token: string) => { userId: number } +>(() => ({ userId: 7 })); + +// default 있어도 되지만, 테스트에서는 named export로 쓰는 걸 권장 +export default { generateTokens, verifyRefreshToken }; diff --git a/part4-mission11/tests/_helper/ws-test-util.ts b/part4-mission11/tests/_helper/ws-test-util.ts new file mode 100644 index 000000000..e5d0ed967 --- /dev/null +++ b/part4-mission11/tests/_helper/ws-test-util.ts @@ -0,0 +1,41 @@ +import type { Socket } from 'socket.io-client'; + +export function waitConnect(s: Socket) { + return new Promise((res, rej) => { + const ok = () => { + cleanup(); + res(); + }; + const er = (e: unknown) => { + cleanup(); + rej(e); + }; + const cleanup = () => { + s.off('connect', ok); + s.off('connect_error', er as (e: Error) => void); + }; + s.once('connect', ok); + s.once('connect_error', er as (e: Error) => void); + }); +} + +export function waitDisconnect(s: Socket) { + return new Promise((res) => { + const done = () => { + s.off('disconnect', done); + res(); + }; + s.once('disconnect', done); + }); +} + +export async function cleanClient(s?: Socket) { + if (!s) return; + try { + s.removeAllListeners(); + s.disconnect(); // alias: close() + await waitDisconnect(s); + } catch { + // ignore + } +} diff --git a/part4-mission11/tests/int/int.articles.public.test.ts b/part4-mission11/tests/int/int.articles.public.test.ts new file mode 100644 index 000000000..330d4d4d1 --- /dev/null +++ b/part4-mission11/tests/int/int.articles.public.test.ts @@ -0,0 +1,68 @@ +import request from 'supertest'; + +import { + prismaReset, + seedArticles, + seedArticleLikes, + seedCommentLikes, +} from '../_helper/prisma-mock.js'; +import { createTestApp } from '../_helper/test-app.js'; + +describe('[통합] 게시글 API (비인증)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + + beforeEach(() => { + prismaReset(); + seedArticles([ + { id: 21, title: 'B', userId: 101, images: ['b1.png'], tags: [] }, + { id: 22, title: 'C', userId: 101, images: ['c1.png'], tags: [] }, + ]); + seedArticleLikes([ + { articleId: 21, userId: 1 }, + { articleId: 21, userId: 2 }, + ]); + seedCommentLikes([{ commentId: 100, userId: 1 }]); + }); + + test('GET /articles?query=__not_exists__ → 200 []', async () => { + const app = await createTestApp(); + seedArticles([{ id: 1, title: 'Foo', userId: 1 }]); + const res = await request(app) + .get('/articles?query=__not_exists__') + .expect(200); + expect(res.body.data.length).toBe(0); + }); + + test('GET /articles → 200 + 목록', async () => { + const res = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10 }) + .expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ + data: expect.arrayContaining([ + expect.objectContaining({ id: 21, title: 'B' }), + expect.objectContaining({ id: 22, title: 'C' }), + ]), + }) + ); + }); + + test('GET /articles/:id → 200 + 단건', async () => { + const res = await request(app).get('/articles/21').expect(200); + expect(res.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ id: 21, title: 'B' }), + }) + ); + }); + + test('GET /articles/404 → 404', async () => { + await request(app).get('/articles/404').expect(404); + }); +}); diff --git a/part4-mission11/tests/int/int.articles.secure.test.ts b/part4-mission11/tests/int/int.articles.secure.test.ts new file mode 100644 index 000000000..73fb5fcb2 --- /dev/null +++ b/part4-mission11/tests/int/int.articles.secure.test.ts @@ -0,0 +1,146 @@ +import '../_helper/mock-modules.js'; +import request from 'supertest'; + +import { prismaReset, seedArticles } from '../_helper/prisma-mock.js'; +import { createTestApp } from '../_helper/test-app.js'; +import { loginAndGetSession } from '../_helper/test-utils.js'; + +describe('[통합] 게시글 API (인증 필요)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + prismaReset(); + }); + + test('POST /articles → 201 (쿠키 필요)', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + const res = await request(app) + .post('/articles') + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: 'N', content: 'd', tags: [], images: [] }) + .expect(201); + + const createdId = res.body?.data?.id ?? 2; + const getRes = await request(app).get(`/articles/${createdId}`).expect(200); + expect(getRes.body.data).toEqual( + expect.objectContaining({ title: 'N', content: 'd' }) + ); + }); + + test('POST /articles → 401 (토큰 없음)', async () => { + await request(app) + .post('/articles') + .send({ title: 'N', content: 'd', tags: [], images: [] }) + .expect(401); + }); + + test('POST /articles → 400 (검증 실패: 빈 title)', async () => { + const { accessToken } = await loginAndGetSession(app); + const res = await request(app) + .post('/articles') + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: '', content: 'd', tags: [], images: [] }) + .expect(400); + + expect(res.body).toEqual( + expect.objectContaining({ + message: expect.stringMatching('제목은 필수입니다.'), + }) + ); + }); + + test('PATCH /articles/:id → 200 (쿠키 필요)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 1, title: 'N', userId: user.id }]); + await request(app) + .patch('/articles/1') + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: 'N2', content: 'd2', tags: [], images: [] }) + .expect(200); + + const res = await request(app).get('/articles/1').expect(200); + expect(res.body.data).toEqual( + expect.objectContaining({ id: 1, title: 'N2', content: 'd2' }) + ); + }); + + test('PATCH /articles/:id → 403 (소유자 아님)', async () => { + prismaReset(); + seedArticles([{ id: 2, title: 'X', userId: 999 }]); + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + const res = await request(app) + .patch('/articles/2') + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: 'X2', content: 'd2', tags: [], images: [] }) + .expect(403); + + expect(res.body).toEqual( + expect.objectContaining({ + message: expect.stringMatching('권한이 없습니다.'), + }) + ); + }); + + test('DELETE /articles/:id → 200 (쿠키 필요)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 1, title: 'N', userId: user.id }]); + + await request(app) + .delete('/articles/1') + .set('Authorization', `Bearer ${accessToken}`) + .expect(204); + }); + + test('DELETE /articles/:id → 204 & 이후 조회 404', async () => { + prismaReset(); + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 3, title: 'T', userId: user.id }]); + await request(app) + .delete('/articles/3') + .set('Authorization', `Bearer ${accessToken}`) + .expect(204); + + await request(app).get('/articles/3').expect(404); + }); + + test('POST/DELETE /articles/:id/like → 200 → 204', async () => { + prismaReset(); + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 10, title: 'L', userId: user.id }]); + + const likeRes = await request(app) + .post('/articles/10/like') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(likeRes.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ + message: expect.stringMatching(/완료|liked/i), + likeCount: expect.any(Number), + }), + }) + ); + + const unlikeRes = await request(app) + .delete('/articles/10/like') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(unlikeRes.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ + message: expect.stringMatching(/취소|unliked/i), + likeCount: expect.any(Number), + }), + }) + ); + }); +}); diff --git a/part4-mission11/tests/int/int.auth.test.ts b/part4-mission11/tests/int/int.auth.test.ts new file mode 100644 index 000000000..2982fe6e1 --- /dev/null +++ b/part4-mission11/tests/int/int.auth.test.ts @@ -0,0 +1,364 @@ +import { jest } from '@jest/globals'; +import bcrypt from 'bcrypt'; +import type { JwtPayload } from 'jsonwebtoken'; +import request from 'supertest'; +import type { Response as SupertestResponse } from 'supertest'; + +import { + ACCESS_TOKEN_COOKIE_NAME, + REFRESH_TOKEN_COOKIE_NAME, +} from '../../lib/constants.js'; +import { prisma } from '../../lib/prismaClient.js'; +import { validation } from '../../middlewares/validation.js'; +import { asMockFn, type Awaited } from '../_helper/jest-typed.js'; + +export function extractCookieUnsafe( + res: SupertestResponse, + name: string +): string | null { + const raw = res.get?.('Set-Cookie') as string | string[] | undefined; + const raw2 = + raw ?? + (res.headers?.['set-cookie'] as unknown as string | string[] | undefined); + + const arr: string[] = Array.isArray(raw2) ? raw2 : raw2 ? [raw2] : []; + const item = arr.find( + (c) => typeof c === 'string' && c.startsWith(`${name}=`) + ); + if (!item) return null; + + const semi = item.indexOf(';'); + const first = semi >= 0 ? item.slice(0, semi) : item; + const eq = first.indexOf('='); + return eq >= 0 ? first.slice(eq + 1) : null; +} + +describe('[통합] 인증 (회원가입/로그인)', () => { + let app: import('express').Express; + + beforeAll(async () => { + jest.spyOn(validation, 'validateRegister').mockImplementation((( + req, + _res, + next + ) => { + if ( + typeof req.body?.email !== 'string' || + typeof req.body?.username !== 'string' || + typeof req.body?.password !== 'string' + ) { + } + next(); + return Promise.resolve(); + }) as typeof validation.validateRegister); + + const { createTestApp } = await import('../_helper/test-app.js'); + app = await createTestApp(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => {}); + jest.spyOn(console, 'error').mockImplementation(() => {}); + }); + + afterEach(() => { + (console.log as unknown as jest.Mock).mockRestore(); + (console.error as unknown as jest.Mock).mockRestore(); + }); + + // --------------------------- + // 회원가입 + // --------------------------- + test('POST /users/register → 201 + 생성된 유저 일부 필드', async () => { + const now = new Date(); + + type UserCreateArgs = Parameters[0]; + type UserEntity = Awaited>; + + asMockFn(prisma.user.create).mockResolvedValue({ + id: 101, + email: 'new@ex.com', + username: 'newbie', + password: await bcrypt.hash('1234abcd!', 10), + images: [] as string[], + createdAt: now, + updatedAt: now, + } satisfies UserEntity); + + const res = await request(app) + .post('/users/register') + .send({ email: 'new@ex.com', username: 'newbie', password: '1234abcd!' }) + .expect(201); + + const body = res.body ?? {}; + const flattened = body.data?.user ?? body.data ?? body.user ?? body; + + expect(flattened).toEqual( + expect.objectContaining({ + id: expect.any(Number), + email: 'new@ex.com', + username: 'newbie', + }) + ); + + expect(prisma.user.create).toHaveBeenCalledTimes(1); + }); + + test('POST /users/register (중복 이메일) → 409', async () => { + const p2002 = Object.assign(new Error('P2002'), { + code: 'P2002' as const, + meta: { target: ['email'] as string[] }, + }) as Error & { code: 'P2002'; meta: { target: string[] } }; + + type UserCreateArgs = Parameters[0]; + type UserEntity = Awaited>; + + asMockFn( + prisma.user.create + ).mockRejectedValueOnce(p2002); + + const res = await request(app) + .post('/users/register') + .send({ email: 'dup@ex.com', username: 'dup', password: '1234abcd!' }) + .expect(409); + + expect(res.body).toEqual( + expect.objectContaining({ + status: 409, + message: expect.stringMatching(/이미 사용 중인 이메일|중복/), + }) + ); + }); + + // --------------------------- + // 로그인 + // --------------------------- + test('POST /users/login → 200 + 토큰 + 쿠키', async () => { + const hashed = await bcrypt.hash('1234abcd!', 10); + + type FindUniqueArgs = Parameters[0]; + type FindUniqueRet = Awaited>; + + asMockFn( + prisma.user.findUnique + ).mockResolvedValue({ + id: 7, + username: 'u', + email: 'u@ex.com', + password: hashed, + images: [] as string[], + createdAt: new Date(), + updatedAt: new Date(), + } satisfies NonNullable); + + const res = await request(app) + .post('/users/login') + .send({ username: 'u', password: '1234abcd!' }) + .expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ + accessToken: expect.any(String), + refreshToken: expect.any(String), + }) + ); + + const rawCookies = res.get('Set-Cookie') ?? []; + const cookies = ( + Array.isArray(rawCookies) ? rawCookies : [rawCookies] + ).join(';'); + + expect(typeof ACCESS_TOKEN_COOKIE_NAME).toBe('string'); + expect(typeof REFRESH_TOKEN_COOKIE_NAME).toBe('string'); + + expect(cookies).toMatch( + new RegExp( + `${ACCESS_TOKEN_COOKIE_NAME.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&')}=` + ) + ); + expect(cookies).toMatch( + new RegExp( + `${REFRESH_TOKEN_COOKIE_NAME.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&')}=` + ) + ); + }); + + test('POST /users/login (없는 유저) → 400', async () => { + type FindUniqueArgs = Parameters[0]; + type FindUniqueRet = Awaited>; + + asMockFn( + prisma.user.findUnique + ).mockResolvedValueOnce(null); + + await request(app) + .post('/users/login') + .send({ username: 'nope', password: 'whatever' }) + .expect(401); + }); + + test('POST /users/login (비밀번호 불일치) → 400', async () => { + const hashedReal = await bcrypt.hash('real-pass', 10); + + type FindUniqueArgs = Parameters[0]; + type FindUniqueRet = Awaited>; + + asMockFn( + prisma.user.findUnique + ).mockResolvedValueOnce({ + id: 9, + username: 'u2', + email: 'u2@ex.com', + password: hashedReal, + images: [] as string[], + createdAt: new Date(), + updatedAt: new Date(), + } satisfies NonNullable); + + await request(app) + .post('/users/login') + .send({ username: 'u2', password: 'wrong-pass' }) + .expect(401); + }); + + test('POST /auth/refresh → 200 + accessToken 재발급 & refresh 회전', async () => { + const hashed = await bcrypt.hash('1234abcd!', 10); + + type FindUniqueArgs = Parameters[0]; + type FindUniqueRet = Awaited>; + + asMockFn( + prisma.user.findUnique + ).mockResolvedValue({ + id: 77, + username: 'ruser', + email: 'r@ex.com', + password: hashed, + images: [], + createdAt: new Date(), + updatedAt: new Date(), + } satisfies NonNullable); + + const loginRes = await request(app) + .post('/users/login') + .send({ username: 'ruser', password: '1234abcd!' }) + .expect(200); + + const setCookie = loginRes.get('Set-Cookie') ?? []; + const cookieHeader = (Array.isArray(setCookie) ? setCookie : [setCookie]) + .map((c) => c.split(';')[0]) + .join('; '); + + const res = await request(app) + .post('/auth/refresh') + .set('Cookie', cookieHeader) + .expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ accessToken: expect.any(String) }) + ); + + const refreshedCookies = (res.get('Set-Cookie') ?? []).join(';'); + expect(refreshedCookies).toMatch( + new RegExp( + `${ACCESS_TOKEN_COOKIE_NAME.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&')}=` + ) + ); + expect(refreshedCookies).toMatch( + new RegExp( + `${REFRESH_TOKEN_COOKIE_NAME.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&')}=` + ) + ); + }); + + test('POST /auth/refresh (쿠키 없음) → 401', async () => { + const res = await request(app).post('/auth/refresh').expect(401); + expect(res.body).toEqual( + expect.objectContaining({ message: expect.any(String) }) + ); + }); + + test('POST /auth/refresh (토큰 위조: 재서명으로 시그니처 불일치) → 401', async () => { + type FindUniqueArgs = Parameters[0]; + type FindUniqueRet = Awaited>; + + const hashed = await bcrypt.hash('1234abcd!', 10); + asMockFn( + prisma.user.findUnique + ).mockResolvedValue({ + id: 777, + username: 'siguser', + email: 'sig@ex.com', + password: hashed, + images: [], + createdAt: new Date(), + updatedAt: new Date(), + } satisfies NonNullable); + + const loginRes = await request(app) + .post('/users/login') + .send({ username: 'siguser', password: '1234abcd!' }) + .expect(200); + + const refreshRaw = extractCookieUnsafe(loginRes, REFRESH_TOKEN_COOKIE_NAME); + expect(typeof refreshRaw).toBe('string'); + + const jwt = (await import('jsonwebtoken')).default; + const C1 = await import('../../lib/constants.js'); + + const decoded = jwt.decode(refreshRaw!) as JwtPayload | null; + const sub = (decoded?.sub as unknown as number) ?? 777; + + const BAD_SECRET = `${C1.REFRESH_TOKEN_SECRET}__FORGED__`; + const forged = jwt.sign({ sub, type: 'refresh' }, BAD_SECRET, { + algorithm: 'HS256', + expiresIn: '7d', + }); + + expect(() => + jwt.verify(forged, C1.REFRESH_TOKEN_SECRET, { algorithms: ['HS256'] }) + ).toThrow(); + + jest.resetModules(); + const { verifyRefreshToken } = await import('../../lib/token.js'); + + expect(() => verifyRefreshToken(forged)).toThrow( + /유효하지 않은 리프레시 토큰/ + ); + + const fakeCookieHeader = `${REFRESH_TOKEN_COOKIE_NAME}=${encodeURIComponent( + forged + )}`; + await request(app) + .post('/auth/refresh') + .set('Cookie', [fakeCookieHeader]) + .expect(401); + }); + + // 401: Authorization 헤더 없음 + test('GET /users/me → 401 (헤더 없음)', async () => { + await request(app).get('/users/me').expect(401); + }); + + // 401: Bearer 형식 깨짐 + test('GET /users/me → 401 (잘못된 Bearer 형식)', async () => { + await request(app) + .get('/users/me') + .set('Authorization', 'Token abc') + .expect(401); + }); + + // 401: refresh 쿠키 없음 + test('POST /auth/refresh → 401 (쿠키 없음)', async () => { + await request(app).post('/auth/refresh').expect(401); + }); + + // 401: 위조/쓰레기 쿠키 + test('POST /auth/refresh → 401 (위조 쿠키)', async () => { + await request(app) + .post('/auth/refresh') + .set('Cookie', [`REFRESH_TOKEN=fake.jwt.parts`]) + .expect(401); + }); +}); diff --git a/part4-mission11/tests/int/int.comments.secure.test.ts b/part4-mission11/tests/int/int.comments.secure.test.ts new file mode 100644 index 000000000..41ea08a2d --- /dev/null +++ b/part4-mission11/tests/int/int.comments.secure.test.ts @@ -0,0 +1,269 @@ +import request from 'supertest'; + +import { + prismaReset, + seedArticles, + seedProducts, + seedComments, +} from '../_helper/prisma-mock.js'; +import { createTestApp } from '../_helper/test-app.js'; +import { loginAndGetSession } from '../_helper/test-utils.js'; + +/* ----------------------------- + * 타입: API 응답 & DTO + * --------------------------- */ +type CommentDTO = { + id: number; + content: string; + // 필요시 확장: userId, articleId/productId 등 +}; + +type ApiData = { data: T }; +type ApiList = { data: T[] }; + +const asBody = (res: request.Response): T => res.body as unknown as T; + +describe('[통합] 게시글 댓글 API (인증 필요)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + beforeEach(() => { + prismaReset(); + }); + + test('GET /articles/:articleId/comments → 200 (토큰 필요) + 목록', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 1, title: 'A', userId: user.id }]); + seedComments([{ id: 101, articleId: 1, userId: user.id, content: 'c' }]); + + const res = await request(app) + .get('/articles/1/comments') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + const body = asBody>(res); + expect(Array.isArray(body.data)).toBe(true); + expect(body.data[0]).toEqual( + expect.objectContaining({ + id: expect.any(Number), + content: expect.any(String), + }) + ); + }); + + test('GET /articles/:articleId/comments → 200 (토큰 없음, 비로그인)', async () => { + seedArticles([{ id: 1, title: 'A', userId: 7 }]); + await request(app).get('/articles/1/comments').expect(200); + }); + + test('POST /articles/:articleId/comments → 201 (토큰 필요)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 1, title: 'A', userId: user.id }]); + + const res = await request(app) + .post('/articles/1/comments') + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: 'hello' }) + .expect(201); + + const body = asBody>(res); + expect(body.data).toEqual( + expect.objectContaining({ + id: expect.any(Number), + content: 'hello', + }) + ); + }); + + test('POST /articles/:id/comments → 401 (토큰 없음)', async () => { + const app = await createTestApp(); + seedArticles([{ id: 1, title: 'A', userId: 7 }]); + await request(app) + .post('/articles/1/comments') + .send({ content: 'x' }) + .expect(401); + }); + + test('PATCH /comments/:commentId → 200 (소유자) / 403 (비소유자)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 1, title: 'A', userId: user.id }]); + const [c] = seedComments([ + { id: 201, articleId: 1, userId: user.id, content: 'old' }, + ]); + if (!c) throw new Error('seedComments failed'); + const cId = c.id; + + await request(app) + .patch(`/articles/comments/${cId}`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: 'new' }) + .expect(200); + + const { accessToken: other } = await loginAndGetSession(app, { + userId: 999, + }); + await request(app) + .patch(`/articles/comments/${cId}`) + .set('Authorization', `Bearer ${other}`) + .send({ content: 'hack' }) + .expect(403); + }); + + test('POST/DELETE /comments/:id/like → 200 → (200 or 204)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedArticles([{ id: 1, title: 'A', userId: user.id }]); + const [c] = seedComments([ + { id: 301, articleId: 1, userId: user.id, content: 'c' }, + ]); + if (!c) throw new Error('seedComments failed'); + const cId = c.id; + + const likeRes = await request(app) + .post(`/articles/comments/${cId}/like`) + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + const likeBody = + asBody>(likeRes); + expect(likeBody.data.message).toEqual(expect.stringMatching(/완료|liked/i)); + expect(typeof likeBody.data.likeCount).toBe('number'); + + const unlikeRes = await request(app) + .delete(`/articles/comments/${cId}/like`) + .set('Authorization', `Bearer ${accessToken}`) + .expect((res) => { + if (![200, 204].includes(res.status)) { + throw new Error(`expected 200 or 204, got ${res.status}`); + } + }); + + if (unlikeRes.status === 200) { + const unlikeBody = + asBody>(unlikeRes); + expect(unlikeBody.data.message).toEqual( + expect.stringMatching(/취소|unliked/i) + ); + expect(typeof unlikeBody.data.likeCount).toBe('number'); + } + }); +}); + +describe('[통합] 상품 댓글 API (인증 필요)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + beforeEach(() => { + prismaReset(); + }); + + test('GET /products/:productId/comments → 200 (토큰 필요) + 목록', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([{ id: 1, name: 'A', price: 111, userId: user.id }]); + seedComments([{ id: 101, productId: 1, userId: user.id, content: 'c' }]); + + const res = await request(app) + .get('/products/1/comments') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + const body = asBody>(res); + expect(Array.isArray(body.data)).toBe(true); + expect(body.data[0]).toEqual( + expect.objectContaining({ + id: expect.any(Number), + content: expect.any(String), + }) + ); + }); + + test('GET /products/:productId/comments → 200 (토큰 없음, 비로그인)', async () => { + seedProducts([{ id: 1, name: 'A', price: 111, userId: 7 }]); + await request(app).get('/products/1/comments').expect(200); + }); + + test('POST /products/:productId/comments → 201 (토큰 필요)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([{ id: 1, name: 'A', price: 111, userId: user.id }]); + + const res = await request(app) + .post('/products/1/comments') + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: 'hello' }) + .expect(201); + + const body = asBody>(res); + expect(body.data).toEqual( + expect.objectContaining({ + id: expect.any(Number), + content: 'hello', + }) + ); + }); + + test('PATCH /comments/:commentId → 200 (소유자) / 403 (비소유자)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([{ id: 1, name: 'A', price: 111, userId: user.id }]); + const [c] = seedComments([ + { id: 201, productId: 1, userId: user.id, content: 'old' }, + ]); + if (!c) throw new Error('seedComments failed'); + const cId = c.id; + + await request(app) + .patch(`/products/comments/${cId}`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: 'new' }) + .expect(200); + + const { accessToken: other } = await loginAndGetSession(app, { + userId: 999, + }); + await request(app) + .patch(`/products/comments/${cId}`) + .set('Authorization', `Bearer ${other}`) + .send({ content: 'hack' }) + .expect(403); + }); + + test('POST/DELETE /comments/:id/like → 200 → (200 or 204)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([{ id: 1, name: 'A', price: 111, userId: user.id }]); + const [c] = seedComments([ + { id: 301, productId: 1, userId: user.id, content: 'c' }, + ]); + if (!c) throw new Error('seedComments failed'); + const cId = c.id; + + const likeRes = await request(app) + .post(`/products/comments/${cId}/like`) + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + const likeBody = + asBody>(likeRes); + expect(likeBody.data.message).toEqual(expect.stringMatching(/완료|liked/i)); + expect(typeof likeBody.data.likeCount).toBe('number'); + + const unlikeRes = await request(app) + .delete(`/products/comments/${cId}/like`) + .set('Authorization', `Bearer ${accessToken}`) + .expect((res) => { + if (![200, 204].includes(res.status)) { + throw new Error(`expected 200 or 204, got ${res.status}`); + } + }); + + if (unlikeRes.status === 200) { + const unlikeBody = + asBody>(unlikeRes); + expect(unlikeBody.data.message).toEqual( + expect.stringMatching(/취소|unliked/i) + ); + expect(typeof unlikeBody.data.likeCount).toBe('number'); + } + }); +}); diff --git a/part4-mission11/tests/int/int.notifications.test.ts b/part4-mission11/tests/int/int.notifications.test.ts new file mode 100644 index 000000000..b1c732456 --- /dev/null +++ b/part4-mission11/tests/int/int.notifications.test.ts @@ -0,0 +1,107 @@ +import bcrypt from 'bcrypt'; +import request from 'supertest'; + +import { prisma } from '../../lib/prismaClient.js'; +import { createTestApp } from '../_helper/test-app.js'; +import { loginAndGetSession } from '../_helper/test-utils.js'; + +jest.setTimeout(20_000); + +describe('Notifications API (secure)', () => { + let agent: ReturnType; + let tokenUser1: string; + + beforeAll(async () => { + const app = await createTestApp(); + agent = request.agent(app); + + const hashed = await bcrypt.hash('1234', 10); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValue({ + id: 7, + username: 'u', + email: 'u@ex.com', + password: hashed, + images: [], + createdAt: new Date(), + updatedAt: new Date(), + }); + + const res = await agent + .post('/users/login') + .send({ username: 'u', password: '1234' }); + + expect(res.status).toBe(200); + tokenUser1 = res.body.accessToken as string; + }); + + test('PATCH /notifications/read-all → 200 {count:0}', async () => { + const app = await createTestApp(); + const { accessToken } = await loginAndGetSession(app, { userId: 77 }); + const res = await request(app) + .patch('/notifications/read-all') + .set('Authorization', `Bearer ${accessToken}`) + .expect((r) => { + if (![200, 204].includes(r.status)) { + throw new Error(`expected 200 or 204, got ${r.status}`); + } + }); + + if (res.status === 200) { + expect(res.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ count: expect.any(Number) }), + }) + ); + } + }); + + test('GET /notifications -> 내 알림 목록', async () => { + const res = await agent + .get('/notifications') + .set('Authorization', `Bearer ${tokenUser1}`); + + expect(res.status).toBe(200); + expect(Array.isArray(res.body)).toBe(true); + }); + + test('GET /notifications/unread-count -> 미읽음 개수', async () => { + const res = await agent + .get('/notifications/unread-count') + .set('Authorization', `Bearer ${tokenUser1}`); + + expect(res.status).toBe(200); + expect(res.body).toEqual( + expect.objectContaining({ unreadCount: expect.any(Number) }) + ); + }); + + test('PATCH /notifications/:id/read -> 단건 읽음 처리', async () => { + const list = await agent + .get('/notifications') + .set('Authorization', `Bearer ${tokenUser1}`); + + const target = list.body.items?.[0]; + if (!target) return; + + const res = await agent + .patch(`/notifications/${target.id}/read`) + .set('Authorization', `Bearer ${tokenUser1}`); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ message: '알림이 읽음 처리되었습니다.' }); + }); + + test('PATCH /notifications/read-all -> 전체 읽음 처리', async () => { + const res = await agent + .patch('/notifications/read-all') + .set('Authorization', `Bearer ${tokenUser1}`); + + expect(res.status).toBe(204); + expect(res.text === '' || !res.text).toBe(true); + }); + + test('보호 API: 토큰 없으면 401', async () => { + const res = await agent.get('/notifications'); + expect(res.status).toBe(401); + }); +}); diff --git a/part4-mission11/tests/int/int.products.public.test.ts b/part4-mission11/tests/int/int.products.public.test.ts new file mode 100644 index 000000000..87d2a545d --- /dev/null +++ b/part4-mission11/tests/int/int.products.public.test.ts @@ -0,0 +1,84 @@ +import request from 'supertest'; + +import { + prismaReset, + seedProducts, + seedProductLikes, + seedCommentLikes, +} from '../_helper/prisma-mock.js'; +import { createTestApp } from '../_helper/test-app.js'; + +describe('[통합] 게시글 API (비인증)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + + beforeEach(() => { + prismaReset(); + seedProducts([ + { + id: 21, + name: 'B', + userId: 101, + price: 999, + images: ['b1.png'], + tags: [], + }, + { + id: 22, + name: 'C', + userId: 101, + price: 999, + images: ['c1.png'], + tags: [], + }, + ]); + seedProductLikes([ + { productId: 21, userId: 1 }, + { productId: 21, userId: 2 }, + ]); + seedCommentLikes([{ commentId: 100, userId: 1 }]); + }); + + test('GET /products?query=__not_exists__ → 200 []', async () => { + const app = await createTestApp(); + seedProducts([{ id: 1, name: 'Alpha', price: 1, userId: 1 }]); + + const res = await request(app) + .get('/products?query=__not_exists__') + .expect(200); + expect(Array.isArray(res.body.data)).toBe(true); + expect(res.body.data.length).toBe(0); + }); + + test('GET /products → 200 + 목록', async () => { + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10 }) + .expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ + data: expect.arrayContaining([ + expect.objectContaining({ id: 21, name: 'B' }), + expect.objectContaining({ id: 22, name: 'C' }), + ]), + }) + ); + }); + + test('GET /products/:id → 200 + 단건', async () => { + const res = await request(app).get('/products/21').expect(200); + expect(res.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ id: 21, name: 'B' }), + }) + ); + }); + + test('GET /products/404 → 404', async () => { + await request(app).get('/products/404').expect(404); + }); +}); diff --git a/part4-mission11/tests/int/int.products.secure.test.ts b/part4-mission11/tests/int/int.products.secure.test.ts new file mode 100644 index 000000000..589a00eec --- /dev/null +++ b/part4-mission11/tests/int/int.products.secure.test.ts @@ -0,0 +1,165 @@ +import '../_helper/mock-modules.js'; +import request from 'supertest'; + +import { prismaReset, seedProducts } from '../_helper/prisma-mock.js'; +import { createTestApp } from '../_helper/test-app.js'; +import { loginAndGetSession } from '../_helper/test-utils.js'; + +describe('[통합] 상품 API (인증 필요)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + prismaReset(); + }); + + test('POST /products → 201 (쿠키 필요)', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + const res = await request(app) + .post('/products') + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: 'N', description: 'd', price: 999, tags: [], images: [] }) + .expect(201); + + const createdId = res.body?.data?.id ?? 1; + + const getRes = await request(app).get(`/products/${createdId}`).expect(200); + expect(getRes.body.data).toEqual( + expect.objectContaining({ name: 'N', description: 'd' }) + ); + }); + + test('POST /products → 401 (토큰 없음)', async () => { + await request(app) + .post('/products') + .send({ name: 'N', description: 'd', price: 999, tags: [], images: [] }) + .expect(401); + }); + + test('POST /products → 400 (검증 실패: 빈 name)', async () => { + const { accessToken } = await loginAndGetSession(app); + + const res = await request(app) + .post('/products') + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: '', description: 'd', price: 999, tags: [], images: [] }) + .expect(400); + + expect(res.body).toEqual( + expect.objectContaining({ + message: expect.stringMatching('상품 이름은 필수입니다.'), + }) + ); + }); + + test('PATCH /products/:id → 200 (쿠키 필요)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([ + { id: 1, name: 'N', description: 'd', price: 1000, userId: user.id }, + ]); + + await request(app) + .patch('/products/1') + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: 'N2', description: 'd2', price: 888, tags: [], images: [] }) + .expect(200); + + const res = await request(app).get('/products/1').expect(200); + expect(res.body.data).toEqual( + expect.objectContaining({ + id: 1, + name: 'N2', + description: 'd2', + price: 888, + }) + ); + }); + + test('PATCH /products/:id → 403 (소유자 아님)', async () => { + prismaReset(); + seedProducts([ + { id: 2, name: 'X', description: 'd', price: 1000, userId: 999 }, + ]); + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + const res = await request(app) + .patch('/products/2') + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: 'X2', description: 'd2', price: 777, tags: [], images: [] }) + .expect(403); + + expect(res.body).toEqual( + expect.objectContaining({ + message: expect.stringMatching('권한이 없습니다.'), + }) + ); + }); + + test('DELETE /products/:id → 204 (쿠키 필요)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([ + { id: 1, name: 'N', description: 'd', price: 1000, userId: user.id }, + ]); + + await request(app) + .delete('/products/1') + .set('Authorization', `Bearer ${accessToken}`) + .expect(204); + }); + + test('DELETE /products/:id → 204 & 이후 조회 404', async () => { + prismaReset(); + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([ + { id: 3, name: 'T', description: 'd', price: 1000, userId: user.id }, + ]); + + await request(app) + .delete('/products/3') + .set('Authorization', `Bearer ${accessToken}`) + .expect(204); + + await request(app).get('/products/3').expect(404); + }); + + test('POST/DELETE /products/:id/like → 200 → 200', async () => { + prismaReset(); + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + seedProducts([ + { id: 10, name: 'L', description: 'd', price: 1000, userId: user.id }, + ]); + + const likeRes = await request(app) + .post('/products/10/like') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(likeRes.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ + message: expect.stringMatching(/완료|liked/i), + likeCount: expect.any(Number), + }), + }) + ); + + const unlikeRes = await request(app) + .delete('/products/10/like') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(unlikeRes.body).toEqual( + expect.objectContaining({ + data: expect.objectContaining({ + message: expect.stringMatching(/취소|unliked/i), + likeCount: expect.any(Number), + }), + }) + ); + }); +}); diff --git a/part4-mission11/tests/int/int.uploads.test.ts b/part4-mission11/tests/int/int.uploads.test.ts new file mode 100644 index 000000000..873fae04f --- /dev/null +++ b/part4-mission11/tests/int/int.uploads.test.ts @@ -0,0 +1,119 @@ +import fs from 'fs'; +import path from 'path'; +import request from 'supertest'; + +describe('[통합] 이미지 업로드', () => { + let app: import('express').Express; + const projectRoot = path.resolve(process.cwd()); + const savedDir = path.join(projectRoot, 'src', 'uploads'); + + beforeAll(async () => { + const { createTestApp } = await import('../_helper/test-app.js'); + app = await createTestApp(); + + fs.mkdirSync(savedDir, { recursive: true }); + }); + + afterEach(() => { + if (!fs.existsSync(savedDir)) return; + for (const f of fs.readdirSync(savedDir)) { + try { + fs.unlinkSync(path.join(savedDir, f)); + } catch {} + } + }); + + test('POST /images/upload/single → 400 (파일 없음)', async () => { + await request(app).post('/images/upload/single').expect(400); + }); + + test('단일 업로드: 이미지(jpg) → 200 + 파일 생성', async () => { + const jpg = Buffer.from([0xff, 0xd8, 0xff, 0xd9]); + const res = await request(app) + .post('/images/upload/single') + .attach('myImage', jpg, { filename: 'a.jpg', contentType: 'image/jpeg' }) + .expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ + message: expect.any(String), + filename: expect.stringMatching(/myImage-\d+\.jpg$/), + url: expect.stringMatching(/^\/uploads\/myImage-\d+\.jpg$/), + }) + ); + + const filename: string = res.body.filename; + const onDisk = path.join(savedDir, filename); + expect(fs.existsSync(onDisk)).toBe(true); + expect(fs.statSync(onDisk).size).toBeGreaterThan(0); + }); + + test('여러 파일 업로드(<=5개) → 200 + files 배열', async () => { + const png = Buffer.from([0x89, 0x50, 0x4e, 0x47]); + const req = request(app).post('/images/upload/array'); + for (let i = 0; i < 3; i++) { + req.attach('myImages', png, { + filename: `b${i}.png`, + contentType: 'image/png', + }); + } + const res = await req.expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ + message: expect.any(String), + files: expect.any(Array), + }) + ); + expect(res.body.files).toHaveLength(3); + for (const f of res.body.files as Array<{ + filename: string; + url: string; + }>) { + expect(f.filename).toMatch(/^myImages-\d+\.png$/); + expect(f.url).toMatch(/^\/uploads\/myImages-\d+\.png$/); + } + }); + + test('허용되지 않는 형식(text/plain) → 400', async () => { + const txt = Buffer.from('hello'); + await request(app) + .post('/images/upload/single') + .attach('myImage', txt, { filename: 'c.txt', contentType: 'text/plain' }) + .expect(400); + }); + + test('파일 개수 초과(6개) → 400 (LIMIT_FILE_COUNT)', async () => { + const webp = Buffer.from('RIFF'); + let req = request(app).post('/images/upload/array'); + for (let i = 0; i < 6; i++) { + req = req.attach('myImages', webp, { + filename: `d${i}.webp`, + contentType: 'image/webp', + }); + } + const _res = await req.expect(400); + }); + + test('파일 크기 초과(>5MB) → 400 (LIMIT_FILE_SIZE)', async () => { + const big = Buffer.alloc(5 * 1024 * 1024 + 1, 0); // 5MB + 1 + const _res = await request(app) + .post('/images/upload/single') + .attach('myImage', big, { filename: 'e.jpg', contentType: 'image/jpeg' }) + .expect(400); + }); + + test('단일 업로드: 파일 미첨부 → 400', async () => { + await request(app) + .post('/images/upload/single') + .field('note', 'no file') + .expect(400); + }); + + test('여러 파일 업로드: 파일 미첨부 → 400', async () => { + await request(app) + .post('/images/upload/array') + .field('note', 'no files') + .expect(400); + }); +}); diff --git a/part4-mission11/tests/int/int.users.secure.test.ts b/part4-mission11/tests/int/int.users.secure.test.ts new file mode 100644 index 000000000..35fd437f7 --- /dev/null +++ b/part4-mission11/tests/int/int.users.secure.test.ts @@ -0,0 +1,192 @@ +// src/tests/int.users.secure.test.ts +import { jest } from '@jest/globals'; +import request from 'supertest'; + +import { + prismaReset, + seedArticles, + seedCommentLikes, + seedComments, + seedProductLikes, + seedProducts, + seedUsersWithHash, +} from '../_helper/prisma-mock.js'; +import { createTestApp } from '../_helper/test-app.js'; +import { loginAndGetSession } from '../_helper/test-utils.js'; + +describe('[통합] 유저 API (인증 필요)', () => { + let app: import('express').Express; + + beforeAll(async () => { + app = await createTestApp(); + }); + + beforeEach(async () => { + jest.clearAllMocks(); + prismaReset(); + await seedUsersWithHash([ + { id: 7, username: 'u', email: 'u@ex.com', password: 'pw' }, + ]); + }); + + // ---------------------------- + // 프로필 수정 (PATCH /users/:userId) + // ---------------------------- + test('PATCH /users/:id → 200 (소유자)', async () => { + const { accessToken, user } = await loginAndGetSession(app, { userId: 7 }); + const res = await request(app) + .patch('/users/7') + .set('Authorization', `Bearer ${accessToken}`) + .send({ id: user.id, username: 'u', email: 'u@ex.com', images: [] }) + .expect(200); + + expect(res.body).toEqual( + expect.objectContaining({ + updated: expect.objectContaining({ + id: 7, + username: 'u', + email: 'u@ex.com', + images: [], + }), + message: '프로필 수정 완료!', + }) + ); + }); + + test('PATCH /users/:id → 403 (비소유자)', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 8 }); + await request(app) + .patch('/users/7') + .set('Authorization', `Bearer ${accessToken}`) + .send({ username: 'hack' }) + .expect(403); + }); + + // ---------------------------- + // 비밀번호 변경 (PATCH /users/:userId/password) + // ---------------------------- + test('PATCH /users/:id/password → 400 (새 비번 불일치)', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + const res = await request(app) + .patch('/users/7/password') + .set('Authorization', `Bearer ${accessToken}`) + .send({ + currentPassword: 'pw', + newPassword: 'n1', + newPasswordConfirm: 'n2', + }) + .expect(400); + + expect(typeof res.body.message).toBe('string'); + expect(res.body.message).toEqual( + expect.stringMatching(/(일치하지 않습니다|불일치|mismatch|confirm)/i) + ); + }); + + test('PATCH /users/:id/password → 200 (소유자)', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + const res = await request(app) + .patch('/users/7/password') + .set('Authorization', `Bearer ${accessToken}`) + .send({ + currentPassword: 'pw', + newPassword: 'NewPass123!', + newPasswordConfirm: 'NewPass123!', + }) + .expect(200); + + expect(res.body).toEqual({ message: '비밀번호가 변경되었습니다.' }); + }); + + // ---------------------------- + // 내가 단 댓글 (GET /users/:userId/my-comments) + // ---------------------------- + test('GET /users/:id/my-comments → 200 + {comments}', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + // 시드 + seedArticles([{ id: 101, title: 't1', userId: 7 }]); + seedProducts([{ id: 202, name: 'p1', userId: 7, price: 1000 }]); + seedComments([ + { id: 1, userId: 7, content: 'hi', articleId: 101 }, + { id: 2, userId: 7, content: 'hello', productId: 202 }, + ]); + seedCommentLikes([ + { commentId: 2, userId: 100 }, + { commentId: 2, userId: 101 }, + { commentId: 2, userId: 102 }, + ]); + + const res = await request(app) + .get('/users/7/my-comments') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(Array.isArray(res.body.comments)).toBe(true); + expect(res.body.comments).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: 1, + content: 'hi', + userId: 7, + articleId: 101, + productId: null, + likeCount: expect.any(Number), + }), + expect.objectContaining({ + id: 2, + content: 'hello', + userId: 7, + articleId: null, + productId: 202, + likeCount: 3, + }), + ]) + ); + }); + + // ---------------------------- + // 좋아요한 목록들 + // ---------------------------- + test('GET /users/:id/likes/products → 200 + {data}', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + seedProducts([{ id: 10, name: 'Prod10', userId: 99, price: 1000 }]); + seedProductLikes([{ productId: 10, userId: 7 }]); + + const res = await request(app) + .get('/users/7/likes/products') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(Array.isArray(res.body.data)).toBe(true); + expect(res.body.data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: 10, name: 'Prod10' }), + ]) + ); + }); + + test('GET /users/:id/likes/comments → 200 + {data}', async () => { + const { accessToken } = await loginAndGetSession(app, { userId: 7 }); + + seedArticles([{ id: 20, title: 'A20', userId: 88 }]); + seedComments([{ id: 30, userId: 55, content: 'nice', articleId: 20 }]); + seedCommentLikes([{ commentId: 30, userId: 7 }]); + + const res = await request(app) + .get('/users/7/likes/comments') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + + expect(Array.isArray(res.body.data)).toBe(true); + expect(res.body.data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: 30, + content: 'nice', + }), + ]) + ); + }); +}); diff --git a/part4-mission11/tests/int/int.ws.test.ts b/part4-mission11/tests/int/int.ws.test.ts new file mode 100644 index 000000000..1eb88e7b0 --- /dev/null +++ b/part4-mission11/tests/int/int.ws.test.ts @@ -0,0 +1,123 @@ +import { NotificationType as P } from '@prisma/client'; +import { createServer } from 'http'; +import type { AddressInfo } from 'net'; +import { io as Client, type Socket } from 'socket.io-client'; + +import { + setupWebSocket, + wsGateway, + closeWebSocket, + __resetWsForTest, + __getUserSocketsForTest, +} from '../../lib/ws.js'; + +/** ---- 타입 (any 금지) ---- */ +type Wire = { + type: 'system' | 'chat' | 'contract-linked'; + message: string; + createdAt: string; + data?: Record; +}; +type S2C = { + joined: (v: { ok: boolean; userId: number }) => void; + notification: (p: Wire) => void; + error: (m: string) => void; +}; +type C2S = Record; + +/** ---- 헬퍼 ---- */ +const waitConnect = (s: Socket) => + new Promise((res, rej) => { + const ok = () => { + cleanup(); + res(); + }; + const er = (e: unknown) => { + cleanup(); + rej(e); + }; + const cleanup = () => { + s.off('connect', ok); + s.off('connect_error', er as (e: Error) => void); + }; + s.once('connect', ok); + s.once('connect_error', er as (e: Error) => void); + }); + +const onceNotification = (s: Socket) => + new Promise((resolve) => { + const h = (p: Wire) => { + s.off('notification', h); + resolve(p); + }; + s.on('notification', h); + }); + +// 서버 내부 소켓맵에서 특정 userId의 연결 개수가 기대치가 될 때까지 대기 +async function waitForServerSockets( + userId: number, + expectedCount: number, + timeoutMs = 5000 +) { + const start = Date.now(); + // 폴링 주기 50ms + while (Date.now() - start < timeoutMs) { + const map = __getUserSocketsForTest(); + const set = map.get(userId); + if (set && set.size === expectedCount) return; + await new Promise((r) => setTimeout(r, 50)); + } + throw new Error( + `userSockets(${userId}) did not reach ${expectedCount} within ${timeoutMs}ms` + ); +} + +/** ---- 상태 초기화 ---- */ +beforeEach(() => __resetWsForTest()); +afterEach(async () => { + await closeWebSocket(); + __resetWsForTest(); +}); + +/** ---- 본 테스트 ---- */ +test('setupWebSocket + wsGateway.notifyUser → client receives', async () => { + const httpServer = createServer(); + httpServer.keepAliveTimeout = 0; + httpServer.headersTimeout = 0; + + await new Promise((r) => httpServer.listen(0, '127.0.0.1', r)); + const { port } = httpServer.address() as AddressInfo; + const base = `http://127.0.0.1:${port}`; + + setupWebSocket(httpServer, { auth: () => 99 }); + await new Promise((r) => setImmediate(r)); + + const opts = { + path: '/ws', + auth: { token: 'T' }, + transports: ['websocket'], + reconnection: false, + forceNew: true, + timeout: 4000, + }; + + const c1 = Client(base, opts) as unknown as Socket; + const c2 = Client(base, opts) as unknown as Socket; + + try { + await Promise.all([waitConnect(c1), waitConnect(c2)]); + await waitForServerSockets(99, 2, 5000); + + const p = onceNotification(c2); + wsGateway.notifyUser({ userId: 99, type: P.NEW_COMMENT, message: 'hi' }); + const got = await p; + expect(got).toMatchObject({ message: 'hi' }); + } finally { + c1.removeAllListeners(); + c2.removeAllListeners(); + c1.disconnect(); + c2.disconnect(); + await closeWebSocket(); + await new Promise((r) => httpServer.close(() => r())); + } +}, 20000); diff --git a/part4-mission11/tests/unit/unit.article-comment.service.test.ts b/part4-mission11/tests/unit/unit.article-comment.service.test.ts new file mode 100644 index 000000000..b571f89a7 --- /dev/null +++ b/part4-mission11/tests/unit/unit.article-comment.service.test.ts @@ -0,0 +1,323 @@ +import { + describe, + test, + expect, + beforeEach, + afterEach, + jest, +} from '@jest/globals'; + +import AppError from '../../lib/appError.js'; +import { articleRepository } from '../../repositories/article-repository.js'; +import { articleCommentRepository } from '../../repositories/comments/article-comment-repository.js'; +import { commentRepository } from '../../repositories/comments/comment-repository.js'; +import { commentLikeRepository } from '../../repositories/like-repository.js'; +import { notificationRepository } from '../../repositories/notification-repository.js'; +import { userRepository } from '../../repositories/user-repository.js'; +import { articleCommentService } from '../../services/comments/article-comment-service.js'; +import { notificationService } from '../../services/notification-service.js'; +import { + makeArticleLite, + makeComment, + makeNotification, + makeListedComment, + makeCommentLike, +} from '../_helper/factories.js'; +import prisma from '../_helper/prisma-mock.js'; + +describe('ArticleCommentService', () => { + const ARTICLE_ID = 10; + const AUTHOR_ID = 1; + const OTHER_USER_ID = 2; + + beforeEach(async () => jest.restoreAllMocks()); + afterEach(async () => jest.clearAllMocks()); + + test('getCommentsByArticleId: likeCount / isLiked 포함', async () => { + jest + .spyOn(articleCommentRepository, 'findByArticleId') + .mockResolvedValue([ + makeListedComment({ id: 101, content: 'c1', user: { username: 'u1' } }), + makeListedComment({ id: 102, content: 'c2', user: { username: 'u2' } }), + ]); + + jest.spyOn(commentLikeRepository, 'countByTargetIds').mockResolvedValue([ + { commentId: 101, _count: { commentId: 3 } }, + { commentId: 102, _count: { commentId: 0 } }, + ]); + jest + .spyOn(commentLikeRepository, 'findByUserAndTargetIds') + .mockImplementation(async (uid: number, _ids: number[]) => + uid === OTHER_USER_ID ? [{ commentId: 101 }] : [] + ); + + const list = await articleCommentService.getCommentsByArticleId( + ARTICLE_ID, + OTHER_USER_ID + ); + + expect(list).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: 101, likeCount: 3, isLiked: true }), + expect.objectContaining({ id: 102, likeCount: 0, isLiked: false }), + ]) + ); + }); + + test('createArticleComment: 글 없음 → 404', async () => { + jest.spyOn(articleRepository, 'findLiteById').mockResolvedValue(null); + await expect( + articleCommentService.createArticleComment( + ARTICLE_ID, + 'hello', + OTHER_USER_ID + ) + ).rejects.toThrow(AppError); + }); + + test('createArticleComment: 자기 글이면 알림 스킵', async () => { + jest + .spyOn(articleRepository, 'findLiteById') + .mockResolvedValue( + makeArticleLite({ id: ARTICLE_ID, userId: AUTHOR_ID, title: 'T' }) + ); + jest + .spyOn(articleCommentRepository, 'create') + .mockResolvedValue( + makeComment({ id: 201, articleId: ARTICLE_ID, userId: AUTHOR_ID }) + ); + + const { notificationService } = await import( + '../../services/notification-service.js' + ); + const pushSpy = jest + .spyOn(notificationService, 'pushArticleComment') + .mockResolvedValue( + makeNotification({ + userId: AUTHOR_ID, + articleId: ARTICLE_ID, + commentId: 201, + type: 'NEW_COMMENT', + }) + ); + + await articleCommentService.createArticleComment( + ARTICLE_ID, + 'c', + AUTHOR_ID + ); + + expect(pushSpy).not.toHaveBeenCalled(); + }); + + test('createArticleComment: 남의 글이면 알림 발송', async () => { + jest + .spyOn(articleRepository, 'findLiteById') + .mockResolvedValue( + makeArticleLite({ id: ARTICLE_ID, userId: AUTHOR_ID, title: 'T' }) + ); + jest + .spyOn(articleCommentRepository, 'create') + .mockResolvedValue( + makeComment({ id: 202, articleId: ARTICLE_ID, userId: OTHER_USER_ID }) + ); + jest + .spyOn(userRepository, 'findUsernameById') + .mockResolvedValue({ username: '댓글쓴이' }); + + const { notificationService } = await import( + '../../services/notification-service.js' + ); + const pushSpy = jest + .spyOn(notificationService, 'pushArticleComment') + .mockResolvedValue( + makeNotification({ + id: 999, + userId: AUTHOR_ID, + articleId: ARTICLE_ID, + commentId: 202, + type: 'NEW_COMMENT', + message: '새 댓글이 달렸습니다.', + }) + ); + + await articleCommentService.createArticleComment( + ARTICLE_ID, + 'c', + OTHER_USER_ID + ); + + expect(pushSpy).toHaveBeenCalledWith( + expect.objectContaining({ + receiverUserId: AUTHOR_ID, + articleId: ARTICLE_ID, + commentId: 202, + articleTitle: 'T', + commenterName: '댓글쓴이', + }) + ); + }); + + test('pushArticleComment: 정상', async () => { + const repoSpy = jest + .spyOn(notificationRepository, 'create') + .mockResolvedValue( + makeNotification({ + id: 1, + userId: 42, + articleId: 10, + commentId: 777, + message: '새 댓글', + }) + ); + + const res = await notificationService.pushArticleComment({ + receiverUserId: 42, + articleId: 10, + commentId: 777, + articleTitle: 'T', + commenterName: 'A', + }); + + expect(repoSpy).toHaveBeenCalledWith( + expect.objectContaining({ + userId: 42, + articleId: 10, + commentId: 777, + message: expect.any(String), + }) + ); + expect(res.id).toBe(1); + }); + + test('markAsRead: 정상', async () => { + const upd = jest + .spyOn(prisma.notification, 'updateMany') + .mockResolvedValue({ count: 1 }); + + await expect( + notificationService.markAsRead(99, 7) + ).resolves.toBeUndefined(); + + expect(upd).toHaveBeenCalledWith({ + where: { id: 7, userId: 99 }, + data: { isRead: true }, + }); + }); + + test('markAsRead: 알림이 없거나 내 것이 아니면 404', async () => { + jest + .spyOn(prisma.notification, 'updateMany') + .mockResolvedValue({ count: 0 }); + + await expect(notificationService.markAsRead(99, 7)).rejects.toThrow( + '알림을 찾을 수 없습니다.' + ); + }); + + test('updateComment: 본인 아니면 403', async () => { + jest + .spyOn(commentRepository, 'findById') + .mockResolvedValue(makeComment({ id: 301, userId: AUTHOR_ID })); + await expect( + articleCommentService.updateComment(301, OTHER_USER_ID, 'x') + ).rejects.toThrow(AppError); + }); + + test('updateComment: 성공', async () => { + jest + .spyOn(commentRepository, 'findById') + .mockResolvedValue(makeComment({ id: 301, userId: AUTHOR_ID })); + const upd = jest + .spyOn(commentRepository, 'update') + .mockResolvedValue( + makeComment({ id: 301, content: 'new', userId: AUTHOR_ID }) + ); + + const r = await articleCommentService.updateComment(301, AUTHOR_ID, 'new'); + expect(upd).toHaveBeenCalledWith(301, 'new'); + expect(r.content).toBe('new'); + }); + + test('pushNewComment: 정상', async () => { + const repoSpy = jest + .spyOn(notificationRepository, 'create') + .mockResolvedValue( + makeNotification({ + id: 1, + userId: 42, + articleId: 10, + commentId: 777, + message: '새 댓글', + }) + ); + + const res = await notificationService.pushArticleComment({ + receiverUserId: 42, + articleId: 10, + commentId: 777, + articleTitle: 'T', + commenterName: 'A', + }); + + expect(repoSpy).toHaveBeenCalledWith( + expect.objectContaining({ + userId: 42, + articleId: 10, + commentId: 777, + message: expect.any(String), + }) + ); + expect(res.id).toBe(1); + }); + + test('deleteComment: 0건 삭제 → 403', async () => { + jest.spyOn(commentRepository, 'delete').mockResolvedValue({ count: 0 }); + await expect( + articleCommentService.deleteComment(301, OTHER_USER_ID) + ).rejects.toThrow(AppError); + }); + + test('deleteComment: 성공', async () => { + jest.spyOn(commentRepository, 'delete').mockResolvedValue({ count: 1 }); + await expect( + articleCommentService.deleteComment(301, AUTHOR_ID) + ).resolves.toEqual( + expect.objectContaining({ message: '댓글이 삭제되었습니다.' }) + ); + }); + + test('commentLike / commentUnlike 플로우', async () => { + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(true); + await expect( + articleCommentService.commentLike(OTHER_USER_ID, 500) + ).rejects.toThrow(AppError); + + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(false); + const create = jest + .spyOn(commentLikeRepository, 'create') + .mockResolvedValue( + makeCommentLike({ userId: OTHER_USER_ID, commentId: 500 }) + ); + jest.spyOn(commentLikeRepository, 'count').mockResolvedValue(7); + const liked = await articleCommentService.commentLike(OTHER_USER_ID, 500); + expect(create).toHaveBeenCalled(); + expect(liked.likeCount).toBe(7); + + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(false); + await expect( + articleCommentService.commentUnlike(OTHER_USER_ID, 500) + ).rejects.toThrow(AppError); + + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(true); + const del = jest + .spyOn(commentLikeRepository, 'delete') + .mockResolvedValue( + makeCommentLike({ userId: OTHER_USER_ID, commentId: 500 }) + ); + jest.spyOn(commentLikeRepository, 'count').mockResolvedValue(6); + const un = await articleCommentService.commentUnlike(OTHER_USER_ID, 500); + expect(del).toHaveBeenCalled(); + expect(un.likeCount).toBe(6); + }); +}); diff --git a/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts b/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts new file mode 100644 index 000000000..3e2db19a3 --- /dev/null +++ b/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts @@ -0,0 +1,79 @@ +// src/tests/auth.localStrategy.int.test.ts +import bcrypt from 'bcrypt'; +import request from 'supertest'; + +import { localStrategy } from '../../lib/passport/localStrategy.js'; +import { prisma } from '../../lib/prismaClient.js'; +import { createPassportTestApp } from '../_helper/test-passport-app.js'; + +type Done = (err: unknown, user?: unknown, info?: unknown) => void; +type VerifyFn = ( + username: string, + password: string, + done: Done +) => void | Promise; + +describe('passport-local (비밀번호 검증)', () => { + const app = createPassportTestApp(); + const verify: VerifyFn = (localStrategy as unknown as { _verify: VerifyFn }) + ._verify; + test('localStrategy: 유저 없음 → 실패', async () => { + // prisma.user.findUnique 가 null 반환하도록 모킹 + jest.spyOn(prisma.user, 'findUnique').mockResolvedValueOnce(null); + const done = jest.fn(); + await verify('nouser', 'pw', done); + expect(done).toHaveBeenCalledWith(null, false); + }); + + test('localStrategy: 비밀번호 불일치 → 실패', async () => { + const hashed = await bcrypt.hash('right', 10); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValueOnce({ + id: 1, + username: 'u', + email: 'e', + password: hashed, + images: [], + createdAt: new Date(), + updatedAt: new Date(), + }); + const done = jest.fn(); + await verify('u', 'wrong', done); + expect(done).toHaveBeenCalledWith(null, false); + }); + + test('비번이 맞으면 200', async () => { + const hashed = await bcrypt.hash('1234abcd!', 10); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValue({ + id: 7, + username: 'u', + email: 'u@ex.com', + password: hashed, + createdAt: new Date(), + updatedAt: new Date(), + images: [], + }); + + await request(app) + .post('/login') + .send({ username: 'u', password: '1234abcd!' }) + .expect(200); + }); + + test('비번이 틀리면 401', async () => { + const hashed = await bcrypt.hash('1234abcd!', 10); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValue({ + id: 7, + username: 'u', + email: 'u@ex.com', + password: hashed, + createdAt: new Date(), + updatedAt: new Date(), + images: [], + }); + + await request(app) + .post('/login') + .send({ username: 'u', password: 'wrong!' }) + .expect(401); + }); +}); diff --git a/part4-mission11/tests/unit/unit.product-comment.service.test.ts b/part4-mission11/tests/unit/unit.product-comment.service.test.ts new file mode 100644 index 000000000..e1b081bd1 --- /dev/null +++ b/part4-mission11/tests/unit/unit.product-comment.service.test.ts @@ -0,0 +1,287 @@ +import { + describe, + test, + expect, + beforeEach, + afterEach, + jest, +} from '@jest/globals'; + +import AppError from '../../lib/appError.js'; +import { commentRepository } from '../../repositories/comments/comment-repository.js'; +import { productCommentRepository } from '../../repositories/comments/product-comment-repository.js'; +import { commentLikeRepository } from '../../repositories/like-repository.js'; +import { notificationRepository } from '../../repositories/notification-repository.js'; +import { productRepository } from '../../repositories/product-repository.js'; +import { userRepository } from '../../repositories/user-repository.js'; +import { productCommentService } from '../../services/comments/product-comment-service.js'; +import { notificationService } from '../../services/notification-service.js'; +import { + makeProductLite, + makeComment, + makeListedComment, + makeNotification, + makeCommentLike, +} from '../_helper/factories.js'; +import prisma from '../_helper/prisma-mock.js'; + +describe('ProductCommentService', () => { + const PRODUCT_ID = 20; + const OWNER_ID = 10; + const OTHER_USER_ID = 11; + + beforeEach(async () => jest.restoreAllMocks()); + afterEach(async () => jest.clearAllMocks()); + + test('getCommentsByProductId: likeCount / isLiked 포함', async () => { + jest + .spyOn(productCommentRepository, 'findByProductId') + .mockResolvedValue([ + makeListedComment({ id: 901, content: 'p1', user: { username: 'u' } }), + ]); + jest + .spyOn(commentLikeRepository, 'countByTargetIds') + .mockResolvedValue([{ commentId: 901, _count: { commentId: 2 } }]); + + jest + .spyOn(commentLikeRepository, 'findByUserAndTargetIds') + .mockImplementation(async (uid: number, _ids: number[]) => + uid === OTHER_USER_ID ? [{ commentId: 901 }] : [] + ); + + const list = await productCommentService.getCommentsByProductId( + PRODUCT_ID, + OTHER_USER_ID + ); + expect(list[0]).toEqual( + expect.objectContaining({ id: 901, likeCount: 2, isLiked: true }) + ); + }); + + test('createProductComment: 상품 없음 → 404', async () => { + jest.spyOn(productRepository, 'findLiteById').mockResolvedValue(null); + await expect( + productCommentService.createProductComment(PRODUCT_ID, 'c', OTHER_USER_ID) + ).rejects.toThrow(AppError); + }); + + test('createProductComment: 내 상품이면 알림 스킵', async () => { + jest + .spyOn(productRepository, 'findLiteById') + .mockResolvedValue( + makeProductLite({ id: PRODUCT_ID, userId: OWNER_ID, name: 'N' }) + ); + jest + .spyOn(productCommentRepository, 'create') + .mockResolvedValue( + makeComment({ id: 777, productId: PRODUCT_ID, userId: OWNER_ID }) + ); + + const { notificationService } = await import( + '../../services/notification-service.js' + ); + const pushSpy = jest + .spyOn(notificationService, 'pushProductComment') + .mockResolvedValue( + makeNotification({ + userId: OWNER_ID, + productId: PRODUCT_ID, + commentId: 777, + type: 'NEW_COMMENT', + }) + ); + + await productCommentService.createProductComment(PRODUCT_ID, 'c', OWNER_ID); + expect(pushSpy).not.toHaveBeenCalled(); + }); + + test('createProductComment: 남의 상품이면 알림 발송', async () => { + jest + .spyOn(productRepository, 'findLiteById') + .mockResolvedValue( + makeProductLite({ id: PRODUCT_ID, userId: OWNER_ID, name: 'Mac' }) + ); + jest + .spyOn(productCommentRepository, 'create') + .mockResolvedValue( + makeComment({ id: 778, productId: PRODUCT_ID, userId: OTHER_USER_ID }) + ); + jest + .spyOn(userRepository, 'findUsernameById') + .mockResolvedValue({ username: 'buyer' }); + + const { notificationService } = await import( + '../../services/notification-service.js' + ); + const pushSpy = jest + .spyOn(notificationService, 'pushProductComment') + .mockResolvedValue( + makeNotification({ + id: 1000, + userId: OWNER_ID, + productId: PRODUCT_ID, + commentId: 778, + type: 'NEW_COMMENT', + message: '상품에 새 댓글이 달렸습니다.', + }) + ); + + await productCommentService.createProductComment( + PRODUCT_ID, + 'c', + OTHER_USER_ID + ); + + expect(pushSpy).toHaveBeenCalledWith( + expect.objectContaining({ + receiverUserId: OWNER_ID, + productId: PRODUCT_ID, + commentId: 778, + productName: 'Mac', + commenterName: 'buyer', + }) + ); + }); + + test('markAsRead: 정상', async () => { + const upd = jest + .spyOn(prisma.notification, 'updateMany') + .mockResolvedValue({ count: 1 }); + + await expect( + notificationService.markAsRead(99, 7) + ).resolves.toBeUndefined(); + + expect(upd).toHaveBeenCalledWith({ + where: { id: 7, userId: 99 }, + data: { isRead: true }, + }); + }); + + test('markAsRead: 알림이 없거나 내 것이 아니면 404', async () => { + jest + .spyOn(prisma.notification, 'updateMany') + .mockResolvedValue({ count: 0 }); + + await expect(notificationService.markAsRead(99, 7)).rejects.toThrow( + '알림을 찾을 수 없습니다.' + ); + }); + + test('updateComment: 본인 아니면 403', async () => { + jest + .spyOn(commentRepository, 'findById') + .mockResolvedValue( + makeComment({ id: 1, userId: OWNER_ID, productId: PRODUCT_ID }) + ); + await expect( + productCommentService.updateComment(1, OTHER_USER_ID, 'x') + ).rejects.toThrow(AppError); + }); + + test('updateComment: 성공', async () => { + jest + .spyOn(commentRepository, 'findById') + .mockResolvedValue( + makeComment({ id: 1, userId: OTHER_USER_ID, productId: PRODUCT_ID }) + ); + const upd = jest.spyOn(commentRepository, 'update').mockResolvedValue( + makeComment({ + id: 1, + content: 'x', + userId: OTHER_USER_ID, + productId: PRODUCT_ID, + }) + ); + + const r = await productCommentService.updateComment(1, OTHER_USER_ID, 'x'); + expect(upd).toHaveBeenCalledWith(1, 'x'); + expect(r.content).toBe('x'); + }); + + test('pushNewComment: 정상', async () => { + const repoSpy = jest + .spyOn(notificationRepository, 'create') + .mockResolvedValue( + makeNotification({ + id: 1, + userId: 42, + productId: 10, + commentId: 777, + message: '새 댓글' /* type 생략 가능 */, + }) + ); + + const res = await notificationService.pushProductComment({ + receiverUserId: 42, + productId: 10, + commentId: 777, + productName: 'N', + commenterName: 'P', + }); + + expect(repoSpy).toHaveBeenCalledWith( + expect.objectContaining({ + userId: 42, + productId: 10, + commentId: 777, + message: expect.any(String), + }) + ); + expect(res.id).toBe(1); + }); + + test('deleteComment: 0건 삭제 → 403', async () => { + jest.spyOn(commentRepository, 'delete').mockResolvedValue({ count: 0 }); + await expect( + productCommentService.deleteComment(1, OTHER_USER_ID) + ).rejects.toThrow(AppError); + }); + + test('deleteComment: 성공', async () => { + jest.spyOn(commentRepository, 'delete').mockResolvedValue({ count: 1 }); + await expect( + productCommentService.deleteComment(1, OTHER_USER_ID) + ).resolves.toEqual( + expect.objectContaining({ message: '댓글이 삭제되었습니다.' }) + ); + }); + + test('commentLike / commentUnlike 플로우', async () => { + // like: 중복 → 에러 + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(true); + await expect( + productCommentService.commentLike(OTHER_USER_ID, 500) + ).rejects.toThrow(AppError); + + // like: 정상 (create → Like 객체 반환) + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(false); + const create = jest + .spyOn(commentLikeRepository, 'create') + .mockResolvedValue( + makeCommentLike({ userId: OTHER_USER_ID, commentId: 500 }) + ); + jest.spyOn(commentLikeRepository, 'count').mockResolvedValue(8); + const liked = await productCommentService.commentLike(OTHER_USER_ID, 500); + expect(create).toHaveBeenCalled(); + expect(liked.likeCount).toBe(8); + + // unlike: 기록 없음 → 에러 + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(false); + await expect( + productCommentService.commentUnlike(OTHER_USER_ID, 500) + ).rejects.toThrow(AppError); + + // unlike: 정상 (delete → Like 객체 반환) + jest.spyOn(commentLikeRepository, 'exists').mockResolvedValueOnce(true); + const del = jest + .spyOn(commentLikeRepository, 'delete') + .mockResolvedValue( + makeCommentLike({ userId: OTHER_USER_ID, commentId: 500 }) + ); + jest.spyOn(commentLikeRepository, 'count').mockResolvedValue(7); + const un = await productCommentService.commentUnlike(OTHER_USER_ID, 500); + expect(del).toHaveBeenCalled(); + expect(un.likeCount).toBe(7); + }); +}); diff --git a/part4-mission11/tests/unit/unit.user-service.test.ts b/part4-mission11/tests/unit/unit.user-service.test.ts new file mode 100644 index 000000000..71576cd1b --- /dev/null +++ b/part4-mission11/tests/unit/unit.user-service.test.ts @@ -0,0 +1,407 @@ +import { describe, test, expect, beforeEach, jest } from '@jest/globals'; +import bcrypt from 'bcrypt'; + +import AppError from '../../lib/appError.js'; +import { + ACCESS_TOKEN_COOKIE_NAME, + REFRESH_TOKEN_COOKIE_NAME, +} from '../../lib/constants.js'; +import * as token from '../../lib/token.js'; +import * as likeRepo from '../../repositories/like-repository.js'; +import * as userRepo from '../../repositories/user-repository.js'; +import { userService } from '../../services/user-service.js'; + +/* ────────────────────────────────────────── + 시그니처를 그대로 따르는 안전한 스파이 + (bcrypt는 spy/mocking 금지: 실제 사용) + ────────────────────────────────────────── */ +const spyFindByUsername = jest.spyOn( + userRepo.userRepository, + 'findByUsername' +) as jest.SpiedFunction; + +const spyCreateUser = jest.spyOn( + userRepo.userRepository, + 'createUser' +) as jest.SpiedFunction; + +const spyFindById = jest.spyOn( + userRepo.userRepository, + 'findById' +) as jest.SpiedFunction; + +const spyFindByIdWithPassword = jest.spyOn( + userRepo.userRepository, + 'findByIdWithPassword' +) as jest.SpiedFunction; + +const spyUpdateUser = jest.spyOn( + userRepo.userRepository, + 'updateUser' +) as jest.SpiedFunction; + +const spyUpdatePassword = jest.spyOn( + userRepo.userRepository, + 'updatePassword' +) as jest.SpiedFunction; + +const spyGetUserComments = jest.spyOn( + userRepo.userRepository, + 'getUserComments' +) as jest.SpiedFunction; + +const spyGetUserLikedComments = jest.spyOn( + userRepo.userRepository, + 'getUserLikedComments' +) as jest.SpiedFunction; + +const spyLikeCount = jest.spyOn( + likeRepo.commentLikeRepository, + 'count' +) as jest.SpiedFunction; + +const mockGenerateTokens = token.generateTokens as jest.MockedFunction< + typeof token.generateTokens +>; +const mockVerifyRefresh = token.verifyRefreshToken as jest.MockedFunction< + typeof token.verifyRefreshToken +>; + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('UserService', () => { + /* ───────── register ───────── */ + describe('register', () => { + test('새 유저 등록 → 비밀번호 해시 비공개 필드 제거', async () => { + spyFindByUsername.mockResolvedValue(null); + + // 실제 bcrypt로 해시를 만들어서 createUser 리턴에 넣음 + const hashed = await bcrypt.hash('1234', 10); + + type CreatedUser = Awaited< + ReturnType + >; + const createdUser: CreatedUser = { + id: 1, + username: 'u', + email: 'u@ex.com', + password: hashed, + images: [], + createdAt: new Date(), + updatedAt: new Date(), + } as CreatedUser; + + spyCreateUser.mockResolvedValue(createdUser); + + const out = await userService.register('u', 'u@ex.com', '1234'); + + expect(spyFindByUsername).toHaveBeenCalledWith('u'); + // 해시는 내부에서 수행되므로 createUser 인자만 검증 + expect(spyCreateUser).toHaveBeenCalledWith({ + username: 'u', + email: 'u@ex.com', + // 정확한 해시 문자열을 강제할 필요는 없음 + password: expect.any(String), + }); + expect(out).toEqual( + expect.objectContaining({ + id: 1, + username: 'u', + email: 'u@ex.com', + }) + ); + expect(out).not.toHaveProperty('password'); + }); + + test('닉네임 중복 → 409', async () => { + spyFindByUsername.mockResolvedValue({ id: 1 } as unknown as NonNullable< + Awaited> + >); + await expect( + userService.register('u', 'u@ex.com', '1234') + ).rejects.toThrow(AppError); + await expect( + userService.register('u', 'u@ex.com', '1234') + ).rejects.toMatchObject({ statusCode: 409 }); + }); + }); + + /* ───────── login ───────── */ + test('login → generateTokens 그대로 반환', async () => { + expect(jest.isMockFunction(token.generateTokens)).toBe(true); + mockGenerateTokens.mockReturnValue({ + accessToken: 'acc.token', + refreshToken: 'ref.token', + }); + + const out = await userService.login(7); + + expect(mockGenerateTokens).toHaveBeenCalledWith(7); + expect(out).toEqual({ + accessToken: 'acc.token', + refreshToken: 'ref.token', + }); + }); + + /* ───────── 프로필 조회/수정 ───────── */ + describe('get/update profile', () => { + test('getUserProfile', async () => { + type UserLite = Awaited< + ReturnType + >; + const userLite: UserLite = { id: 7, username: 'u' } as UserLite; + + spyFindById.mockResolvedValue(userLite); + + const out = await userService.getUserProfile(7); + expect(spyFindById).toHaveBeenCalledWith(7); + expect(out).toEqual({ id: 7, username: 'u' }); + }); + + test('updateUserProfile', async () => { + type UserUpdated = Awaited< + ReturnType + >; + const updated: UserUpdated = { + id: 7, + username: 'nu', + } as unknown as UserUpdated; + + spyUpdateUser.mockResolvedValue(updated); + + const out = await userService.updateUserProfile(7, { + username: 'nu', + email: 'e@x.com', + images: [], + }); + + expect(spyUpdateUser).toHaveBeenCalledWith(7, { + username: 'nu', + email: 'e@x.com', + images: [], + }); + expect(out).toEqual({ id: 7, username: 'nu' }); + }); + }); + + /* ───────── 비밀번호 변경 ───────── */ + describe('updatePassword', () => { + test('유저 없음 → 404', async () => { + spyFindByIdWithPassword.mockResolvedValue(null); + await expect( + userService.updatePassword(7, 'old', 'new') + ).rejects.toMatchObject({ statusCode: 404 }); + }); + + test('현재 비밀번호 불일치 → 400', async () => { + const stored = await bcrypt.hash('SOMETHING_ELSE', 10); + type WithPw = NonNullable< + Awaited> + >; + const withPw: WithPw = { id: 7, password: stored } as WithPw; + + spyFindByIdWithPassword.mockResolvedValue(withPw); + + await expect( + userService.updatePassword(7, 'wrong', 'new') + ).rejects.toMatchObject({ statusCode: 400 }); + }); + + test('새 비밀번호가 기존과 동일 → 400', async () => { + const same = await bcrypt.hash('old', 10); + type WithPw = NonNullable< + Awaited> + >; + const withPw: WithPw = { id: 7, password: same } as WithPw; + + spyFindByIdWithPassword.mockResolvedValue(withPw); + + await expect( + userService.updatePassword(7, 'old', 'old') + ).rejects.toMatchObject({ statusCode: 400 }); + }); + + test('성공 → 해시 후 업데이트 & password 제외', async () => { + const stored = await bcrypt.hash('old', 10); + type WithPw = NonNullable< + Awaited> + >; + const withPw: WithPw = { id: 7, password: stored } as WithPw; + spyFindByIdWithPassword.mockResolvedValue(withPw); + + // updatePassword가 리턴하는 유저 모양 + type Updated = Awaited< + ReturnType + >; + const updated: Updated = { + id: 7, + username: 'u', + email: 'u@ex.com', + password: await bcrypt.hash('new', 10), + images: [], + createdAt: new Date(), + updatedAt: new Date(), + } as Updated; + spyUpdatePassword.mockResolvedValue(updated); + + const out = await userService.updatePassword(7, 'old', 'new'); + + expect(spyUpdatePassword).toHaveBeenCalledWith(7, expect.any(String)); + expect(out).toEqual( + expect.objectContaining({ id: 7, username: 'u', email: 'u@ex.com' }) + ); + expect(out).not.toHaveProperty('password'); + }); + }); + + /* ───────── 댓글 집계 ───────── */ + describe('comments aggregation', () => { + test('getUserComments → likeCount 합성', async () => { + type Comments = Awaited< + ReturnType + >; + const comments: Comments = [ + { + id: 1, + content: 'a', + createdAt: new Date(), + article: null, + product: null, + }, + { + id: 2, + content: 'b', + createdAt: new Date(), + article: null, + product: null, + }, + ] as unknown as Comments; + + spyGetUserComments.mockResolvedValue(comments); + spyLikeCount.mockResolvedValueOnce(3).mockResolvedValueOnce(5); + + const out = await userService.getUserComments(7); + + expect(spyGetUserComments).toHaveBeenCalledWith(7); + expect(likeRepo.commentLikeRepository.count).toHaveBeenNthCalledWith( + 1, + 1 + ); + expect(likeRepo.commentLikeRepository.count).toHaveBeenNthCalledWith( + 2, + 2 + ); + + expect(out).toEqual([ + expect.objectContaining({ id: 1, likeCount: 3 }), + expect.objectContaining({ id: 2, likeCount: 5 }), + ]); + }); + + test('getUserLikedComments → 내부 comment 꺼내서 합성', async () => { + type Liked = Awaited< + ReturnType + >; + const liked: Liked = [ + { + comment: { + id: 10, + content: 'x', + createdAt: new Date(), + article: null, + product: null, + }, + }, + { + comment: { + id: 11, + content: 'y', + createdAt: new Date(), + article: null, + product: null, + }, + }, + ] as unknown as Liked; + + spyGetUserLikedComments.mockResolvedValue(liked); + spyLikeCount.mockResolvedValueOnce(2).mockResolvedValueOnce(0); + + const out = await userService.getUserLikedComments(7); + + expect(spyGetUserLikedComments).toHaveBeenCalledWith(7); + // 반환 스키마(예: { id, body, likeCount, isLiked })에 맞춰 검증 + expect(out).toEqual([ + expect.objectContaining({ id: 10, likeCount: 2, isLiked: true }), + expect.objectContaining({ id: 11, likeCount: 0, isLiked: true }), + ]); + }); + }); + + /* ───────── 토큰 쿠키 ───────── */ + describe('token cookies', () => { + test('setTokenCookies → 두 쿠키 설정', () => { + type ResForSet = Parameters[0]; + const resSet = { cookie: jest.fn() } as unknown as ResForSet; + + userService.setTokenCookies(resSet, 'A', 'R'); + + expect(resSet.cookie).toHaveBeenCalledTimes(2); + expect(resSet.cookie).toHaveBeenNthCalledWith( + 1, + ACCESS_TOKEN_COOKIE_NAME, + 'A', + expect.objectContaining({ + httpOnly: true, + sameSite: 'lax', + secure: false, + maxAge: expect.any(Number), + }) + ); + expect(resSet.cookie).toHaveBeenNthCalledWith( + 2, + REFRESH_TOKEN_COOKIE_NAME, + 'R', + expect.objectContaining({ + httpOnly: true, + sameSite: 'lax', + secure: false, + maxAge: expect.any(Number), + path: '/auth/refresh', + }) + ); + }); + + test('clearTokenCookies', () => { + type ResForClear = Parameters[0]; + const resClear = { clearCookie: jest.fn() } as unknown as ResForClear; + + userService.clearTokenCookies(resClear); + expect(resClear.clearCookie).toHaveBeenCalledWith( + ACCESS_TOKEN_COOKIE_NAME + ); + expect(resClear.clearCookie).toHaveBeenCalledWith( + REFRESH_TOKEN_COOKIE_NAME + ); + }); + + test('refreshTokens → verify→generate→setCookie→access 반환', async () => { + type ResForRefresh = Parameters[1]; + const res = { cookie: jest.fn() } as unknown as ResForRefresh; + + mockVerifyRefresh.mockReturnValue({ userId: 7 }); + mockGenerateTokens.mockReturnValue({ + accessToken: 'acc.token', + refreshToken: 'ref.token', + }); + + const access = await userService.refreshTokens('ref.token', res); + + expect(mockVerifyRefresh).toHaveBeenCalledWith('ref.token'); + expect(mockGenerateTokens).toHaveBeenCalledWith(7); + expect(res.cookie).toHaveBeenCalledTimes(2); + expect(access).toBe('acc.token'); + }); + }); +}); diff --git a/part4-mission11/tests/unit/unit.ws.test.ts b/part4-mission11/tests/unit/unit.ws.test.ts new file mode 100644 index 000000000..8f2e41b4c --- /dev/null +++ b/part4-mission11/tests/unit/unit.ws.test.ts @@ -0,0 +1,51 @@ +import { NotificationType as P } from '@prisma/client'; +import { Server } from 'socket.io'; + +import { + mapDomainToWire, + publishToUser, + __resetWsForTest, + __getUserSocketsForTest, +} from '../../lib/ws.js'; + +beforeEach(() => __resetWsForTest()); + +test('mapDomainToWire: PRICE_CHANGE → system', () => { + expect(mapDomainToWire(P.PRICE_CHANGE)).toBe('system'); +}); + +test('mapDomainToWire: NEW_COMMENT → chat', () => { + expect(mapDomainToWire(P.NEW_COMMENT)).toBe('chat'); +}); + +test('mapDomainToWire: default fallback', () => { + // @ts-expect-error 테스트용 가짜 값 + expect(mapDomainToWire('__UNKNOWN__')).toBe('system'); +}); + +test('publishToUser uses provided io', () => { + const io = new Server(); + const emitted: Array<{ event: string; payload: unknown }> = []; + + type ToReturn = ReturnType; + + const fakeBroadcast = { + emit: (event: string, payload?: unknown) => { + emitted.push({ event, payload }); + return true; + }, + } as unknown as ToReturn; + + const toSpy = jest.spyOn(io, 'to').mockReturnValue(fakeBroadcast); + + __getUserSocketsForTest().set(7, new Set(['sid1'])); + + publishToUser(io, { + userId: 7, + event: 'notification', + payload: { ok: true }, + }); + + expect(toSpy).toHaveBeenCalledWith('sid1'); + expect(emitted[0]).toEqual({ event: 'notification', payload: { ok: true } }); +}); diff --git a/part4-mission11/tests/unit/unit.wsAuth.test.ts b/part4-mission11/tests/unit/unit.wsAuth.test.ts new file mode 100644 index 000000000..3572d207d --- /dev/null +++ b/part4-mission11/tests/unit/unit.wsAuth.test.ts @@ -0,0 +1,23 @@ +jest.mock('../../lib/token.js', () => ({ + __esModule: true, + verifyAccessToken: jest.fn(), +})); + +import { verifyAccessToken } from '../../lib/token.js'; +import { parseUserIdFromToken } from '../../lib/wsAuth.js'; + +test('parseUserIdFromToken → null (non-string)', () => { + expect(parseUserIdFromToken(undefined)).toBeNull(); +}); + +test('parseUserIdFromToken → null (verify throws)', () => { + (verifyAccessToken as jest.Mock).mockImplementation(() => { + throw new Error('bad'); + }); + expect(parseUserIdFromToken('X')).toBeNull(); +}); + +test('parseUserIdFromToken → number (ok)', () => { + const fakeVerify = (_t: string) => ({ userId: 42 }); + expect(parseUserIdFromToken('good', fakeVerify)).toBe(42); +}); diff --git a/part4-mission11/tsconfig.json b/part4-mission11/tsconfig.json new file mode 100644 index 000000000..990f27299 --- /dev/null +++ b/part4-mission11/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + // "baseUrl": "./", + "rootDir": "./src", + "outDir": "./dist", + "module": "nodenext", + "target": "esnext", + "sourceMap": true, + "declaration": true, + "declarationMap": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "strict": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true, + "esModuleInterop": true, + "moduleResolution": "nodenext" + }, + "exclude": ["src/tests"], + "include": [ + "src", + "prisma/**/*", + "src/generated/prisma/**/*", + "jest.unit.config.cjs", + "src/types/**/*.d.ts" + ] +} From 167e151a2f4e987d8fb605ea24ead5748666669a Mon Sep 17 00:00:00 2001 From: shwon Date: Tue, 25 Nov 2025 18:41:28 +0900 Subject: [PATCH 2/6] test: mission11 test --- part4-mission11/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/part4-mission11/.gitignore b/part4-mission11/.gitignore index e6fe833b9..fdf5a8fdb 100644 --- a/part4-mission11/.gitignore +++ b/part4-mission11/.gitignore @@ -21,7 +21,7 @@ generated/ # Build output dist/ -# Test coverage outputs +# Test coverage outputs! coverage/ *.lcov lcov.info From 8ee98a0be53e9e3540d5c8acc3360759be476be5 Mon Sep 17 00:00:00 2001 From: shwon Date: Tue, 25 Nov 2025 19:10:38 +0900 Subject: [PATCH 3/6] =?UTF-8?q?test:=20workflows=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- part4-mission11/.github/workflows/PR.yml | 25 ----------- .../.github/workflows/main-cicd.yml | 43 ------------------- 2 files changed, 68 deletions(-) delete mode 100644 part4-mission11/.github/workflows/PR.yml delete mode 100644 part4-mission11/.github/workflows/main-cicd.yml diff --git a/part4-mission11/.github/workflows/PR.yml b/part4-mission11/.github/workflows/PR.yml deleted file mode 100644 index cfc6235e2..000000000 --- a/part4-mission11/.github/workflows/PR.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: PR - -on: - pull_request: - branches: - - main - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Use Node - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Install dependencies - run: npm ci - - - name: Run tests - run: npm test diff --git a/part4-mission11/.github/workflows/main-cicd.yml b/part4-mission11/.github/workflows/main-cicd.yml deleted file mode 100644 index 912337d67..000000000 --- a/part4-mission11/.github/workflows/main-cicd.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Main CI-CD - -on: - push: - branches: - - main - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Use Node - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Install dependencies - run: npm ci - - - name: Run tests - run: npm test - - deploy: - needs: test - runs-on: ubuntu-latest - - steps: - - name: Deploy to EC2 via SSH - uses: appleboy/ssh-action@v1.0.0 - with: - host: ${{ secrets.EC2_HOST }} - username: ${{ secrets.EC2_USER }} - key: ${{ secrets.EC2_SSH_KEY }} - script: | - cd /home/ec2-user/my-app - git pull origin main - npm ci - npm run build - pm2 restart my-app || pm2 start dist/server.js --name my-app From d178bcef035a79bd719ae3069c3784a9d528086a Mon Sep 17 00:00:00 2001 From: shwon Date: Wed, 26 Nov 2025 11:07:48 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20mission11=20docker=20&=20ci/cd=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.github/workflows/main-cicd.yml | 43 +++++++++++++++++++ part4-mission11/.github/workflows/pr.yml | 25 +++++++++++ part4-mission11/jest.base.cjs | 18 ++++---- part4-mission11/jest.int.config.cjs | 10 ++--- part4-mission11/jest.unit.config.cjs | 16 +++---- part4-mission11/package.json | 4 +- part4-mission11/tests/_helper/factories.ts | 2 +- part4-mission11/tests/_helper/test-app.ts | 2 +- .../tests/_helper/test-passport-app.ts | 2 +- part4-mission11/tests/int/int.auth.test.ts | 18 +++++--- .../tests/int/int.notifications.test.ts | 2 +- part4-mission11/tests/int/int.ws.test.ts | 4 +- .../unit/unit.article-comment.service.test.ts | 22 +++++----- .../unit/unit.auth.localStrategy.test.ts | 4 +- .../unit/unit.product-comment.service.test.ts | 22 +++++----- .../tests/unit/unit.user-service.test.ts | 12 +++--- part4-mission11/tests/unit/unit.ws.test.ts | 2 +- .../tests/unit/unit.wsAuth.test.ts | 6 +-- 18 files changed, 144 insertions(+), 70 deletions(-) create mode 100644 part4-mission11/.github/workflows/main-cicd.yml create mode 100644 part4-mission11/.github/workflows/pr.yml diff --git a/part4-mission11/.github/workflows/main-cicd.yml b/part4-mission11/.github/workflows/main-cicd.yml new file mode 100644 index 000000000..5aee17219 --- /dev/null +++ b/part4-mission11/.github/workflows/main-cicd.yml @@ -0,0 +1,43 @@ +name: Main CI-CD + +on: + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Run tests + run: npm test + + deploy: + needs: test + runs-on: ubuntu-latest + + steps: + - name: Deploy to EC2 via SSH + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USER }} + key: ${{ secrets.EC2_SSH_KEY }} + script: | + cd /home/ec2-user/app + git pull origin main + npm ci --only=production --no-audit --no-fund + npm run build + pm2 restart mission11 || pm2 start dist/server.js --name mission11 diff --git a/part4-mission11/.github/workflows/pr.yml b/part4-mission11/.github/workflows/pr.yml new file mode 100644 index 000000000..cfc6235e2 --- /dev/null +++ b/part4-mission11/.github/workflows/pr.yml @@ -0,0 +1,25 @@ +name: PR + +on: + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Run tests + run: npm test diff --git a/part4-mission11/jest.base.cjs b/part4-mission11/jest.base.cjs index 60c298295..96850f418 100644 --- a/part4-mission11/jest.base.cjs +++ b/part4-mission11/jest.base.cjs @@ -16,22 +16,22 @@ module.exports = { '^(\\.{1,2}/.*)\\.js$': '$1', }, collectCoverageFrom: [ - 'src/**/*.ts', - '!src/**/app.ts', - '!src/**/swagger.ts', - '!src/**/ws.ts', - '!src/tests/**', - '!src/tests/_helper/**', + '**/*.ts', + '!**/app.ts', + '!**/swagger.ts', + '!**/ws.ts', + '!tests/**', + '!tests/_helper/**', ], coveragePathIgnorePatterns: [ '/node_modules/', '/dist/', - '/src/tests/', - '/src/tests/_helper/', + '/tests/', + '/tests/_helper/', ], testPathIgnorePatterns: [ '/node_modules/', '/dist/', - '/src/tests/_helper/', + '/tests/_helper/', ], }; diff --git a/part4-mission11/jest.int.config.cjs b/part4-mission11/jest.int.config.cjs index 7c7379c16..decd38f69 100644 --- a/part4-mission11/jest.int.config.cjs +++ b/part4-mission11/jest.int.config.cjs @@ -5,16 +5,16 @@ module.exports = { ...base, rootDir: __dirname, displayName: 'integration', - testMatch: ['**/src/tests/int/**/*.test.ts'], + testMatch: ['**/tests/int/**/*.test.ts'], moduleNameMapper: { '^@/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': - '/src/tests/_helper/prisma-mock.ts', + '/tests/_helper/prisma-mock.ts', '^.+/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': - '/src/tests/_helper/prisma-mock.ts', + '/tests/_helper/prisma-mock.ts', - '^@/(.*)$': '/src/$1', + '^@/(.*)$': '/$1', '^(\\.{1,2}/.*)\\.js$': '$1', }, - setupFiles: ['/src/tests/_helper/jest.env.setup.ts'], + setupFiles: ['/tests/_helper/jest.env.setup.ts'], }; diff --git a/part4-mission11/jest.unit.config.cjs b/part4-mission11/jest.unit.config.cjs index 72087fae2..cbd68fbfa 100644 --- a/part4-mission11/jest.unit.config.cjs +++ b/part4-mission11/jest.unit.config.cjs @@ -5,25 +5,23 @@ module.exports = { ...base, rootDir: __dirname, displayName: 'unit', - testMatch: ['**/src/tests/unit/**/*.test.ts'], + testMatch: ['**/tests/unit/**/*.test.ts'], moduleNameMapper: { // 1) token 모듈: 상대경로/alias 모두 커버 - '^@/lib/token(?:\\.(?:js|ts))?$': - '/src/tests/_helper/token-mock.ts', - '^.+/lib/token(?:\\.(?:js|ts))?$': - '/src/tests/_helper/token-mock.ts', + '^@/lib/token(?:\\.(?:js|ts))?$': '/tests/_helper/token-mock.ts', + '^.+/lib/token(?:\\.(?:js|ts))?$': '/tests/_helper/token-mock.ts', // 2) prisma '^@/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': - '/src/tests/_helper/prisma-mock.ts', + '/tests/_helper/prisma-mock.ts', '^.+/(?:lib/)?prismaClient(?:\\.(?:js|ts))?$': - '/src/tests/_helper/prisma-mock.ts', + '/tests/_helper/prisma-mock.ts', // 3) alias 해석 - '^@/(.*)$': '/src/$1', + '^@/(.*)$': '/$1', // 4) 마지막에 .js 확장자 제거 규칙 '^(\\.{1,2}/.*)\\.js$': '$1', }, - setupFiles: ['/src/tests/_helper/jest.env.setup.ts'], + setupFiles: ['/tests/_helper/jest.env.setup.ts'], }; diff --git a/part4-mission11/package.json b/part4-mission11/package.json index 68d68a943..e7f5623d6 100644 --- a/part4-mission11/package.json +++ b/part4-mission11/package.json @@ -8,7 +8,9 @@ "main": "dist/server.js", "scripts": { "seed": "tsx src/prisma/seed.ts", - "postinstall": "npx prisma generate && npx prisma migrate deploy && npx prisma db seed", + "postinstall": "npx prisma generate", + "db:migrate": "npx prisma migrate deploy", + "db:seed": "npx prisma db seed", "test": "jest", "test:unit": "jest --selectProjects unit", "test:int": "jest --selectProjects integration", diff --git a/part4-mission11/tests/_helper/factories.ts b/part4-mission11/tests/_helper/factories.ts index 38bf2b660..4963f2ebb 100644 --- a/part4-mission11/tests/_helper/factories.ts +++ b/part4-mission11/tests/_helper/factories.ts @@ -1,4 +1,4 @@ -import type { NotificationType } from '../../types/notification.js'; +import type { NotificationType } from '../../src/types/notification.js'; export type NotificationRecord = { id: number; diff --git a/part4-mission11/tests/_helper/test-app.ts b/part4-mission11/tests/_helper/test-app.ts index 1eb25f8c9..1b8e48496 100644 --- a/part4-mission11/tests/_helper/test-app.ts +++ b/part4-mission11/tests/_helper/test-app.ts @@ -1,5 +1,5 @@ export async function createTestApp() { - const mod = await import('../../app.js'); + const mod = await import('../../src/app.js'); const app = await mod.buildApp({ forTest: true }); return app as import('express').Express; } diff --git a/part4-mission11/tests/_helper/test-passport-app.ts b/part4-mission11/tests/_helper/test-passport-app.ts index 3aae8cb93..a6b4c50fe 100644 --- a/part4-mission11/tests/_helper/test-passport-app.ts +++ b/part4-mission11/tests/_helper/test-passport-app.ts @@ -1,7 +1,7 @@ import express, { type ErrorRequestHandler } from 'express'; import passport from 'passport'; -import { localStrategy } from '../../lib/passport/localStrategy.js'; +import { localStrategy } from '../../src/lib/passport/localStrategy.js'; type MaybeHttpError = { status?: unknown; diff --git a/part4-mission11/tests/int/int.auth.test.ts b/part4-mission11/tests/int/int.auth.test.ts index 2982fe6e1..b1e7b90c7 100644 --- a/part4-mission11/tests/int/int.auth.test.ts +++ b/part4-mission11/tests/int/int.auth.test.ts @@ -1,4 +1,10 @@ -import { jest } from '@jest/globals'; +import { + afterEach, + beforeAll, + beforeEach, + describe, + jest, +} from '@jest/globals'; import bcrypt from 'bcrypt'; import type { JwtPayload } from 'jsonwebtoken'; import request from 'supertest'; @@ -7,9 +13,9 @@ import type { Response as SupertestResponse } from 'supertest'; import { ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME, -} from '../../lib/constants.js'; -import { prisma } from '../../lib/prismaClient.js'; -import { validation } from '../../middlewares/validation.js'; +} from '../../src/lib/constants.js'; +import { prisma } from '../../src/lib/prismaClient.js'; +import { validation } from '../../src/middlewares/validation.js'; import { asMockFn, type Awaited } from '../_helper/jest-typed.js'; export function extractCookieUnsafe( @@ -305,7 +311,7 @@ describe('[통합] 인증 (회원가입/로그인)', () => { expect(typeof refreshRaw).toBe('string'); const jwt = (await import('jsonwebtoken')).default; - const C1 = await import('../../lib/constants.js'); + const C1 = await import('../../src/lib/constants.js'); const decoded = jwt.decode(refreshRaw!) as JwtPayload | null; const sub = (decoded?.sub as unknown as number) ?? 777; @@ -321,7 +327,7 @@ describe('[통합] 인증 (회원가입/로그인)', () => { ).toThrow(); jest.resetModules(); - const { verifyRefreshToken } = await import('../../lib/token.js'); + const { verifyRefreshToken } = await import('../../src/lib/token.js'); expect(() => verifyRefreshToken(forged)).toThrow( /유효하지 않은 리프레시 토큰/ diff --git a/part4-mission11/tests/int/int.notifications.test.ts b/part4-mission11/tests/int/int.notifications.test.ts index b1c732456..f192d875e 100644 --- a/part4-mission11/tests/int/int.notifications.test.ts +++ b/part4-mission11/tests/int/int.notifications.test.ts @@ -1,7 +1,7 @@ import bcrypt from 'bcrypt'; import request from 'supertest'; -import { prisma } from '../../lib/prismaClient.js'; +import { prisma } from '../../src/lib/prismaClient.js'; import { createTestApp } from '../_helper/test-app.js'; import { loginAndGetSession } from '../_helper/test-utils.js'; diff --git a/part4-mission11/tests/int/int.ws.test.ts b/part4-mission11/tests/int/int.ws.test.ts index 1eb88e7b0..44390f64d 100644 --- a/part4-mission11/tests/int/int.ws.test.ts +++ b/part4-mission11/tests/int/int.ws.test.ts @@ -9,9 +9,9 @@ import { closeWebSocket, __resetWsForTest, __getUserSocketsForTest, -} from '../../lib/ws.js'; +} from '../../src/lib/ws.js'; -/** ---- 타입 (any 금지) ---- */ +/** ---- 타입 ---- */ type Wire = { type: 'system' | 'chat' | 'contract-linked'; message: string; diff --git a/part4-mission11/tests/unit/unit.article-comment.service.test.ts b/part4-mission11/tests/unit/unit.article-comment.service.test.ts index b571f89a7..94e9a3aba 100644 --- a/part4-mission11/tests/unit/unit.article-comment.service.test.ts +++ b/part4-mission11/tests/unit/unit.article-comment.service.test.ts @@ -7,15 +7,15 @@ import { jest, } from '@jest/globals'; -import AppError from '../../lib/appError.js'; -import { articleRepository } from '../../repositories/article-repository.js'; -import { articleCommentRepository } from '../../repositories/comments/article-comment-repository.js'; -import { commentRepository } from '../../repositories/comments/comment-repository.js'; -import { commentLikeRepository } from '../../repositories/like-repository.js'; -import { notificationRepository } from '../../repositories/notification-repository.js'; -import { userRepository } from '../../repositories/user-repository.js'; -import { articleCommentService } from '../../services/comments/article-comment-service.js'; -import { notificationService } from '../../services/notification-service.js'; +import AppError from '../../src/lib/appError.js'; +import { articleRepository } from '../../src/repositories/article-repository.js'; +import { articleCommentRepository } from '../../src/repositories/comments/article-comment-repository.js'; +import { commentRepository } from '../../src/repositories/comments/comment-repository.js'; +import { commentLikeRepository } from '../../src/repositories/like-repository.js'; +import { notificationRepository } from '../../src/repositories/notification-repository.js'; +import { userRepository } from '../../src/repositories/user-repository.js'; +import { articleCommentService } from '../../src/services/comments/article-comment-service.js'; +import { notificationService } from '../../src/services/notification-service.js'; import { makeArticleLite, makeComment, @@ -88,7 +88,7 @@ describe('ArticleCommentService', () => { ); const { notificationService } = await import( - '../../services/notification-service.js' + '../../src/services/notification-service.js' ); const pushSpy = jest .spyOn(notificationService, 'pushArticleComment') @@ -126,7 +126,7 @@ describe('ArticleCommentService', () => { .mockResolvedValue({ username: '댓글쓴이' }); const { notificationService } = await import( - '../../services/notification-service.js' + '../../src/services/notification-service.js' ); const pushSpy = jest .spyOn(notificationService, 'pushArticleComment') diff --git a/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts b/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts index 3e2db19a3..407fcfecd 100644 --- a/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts +++ b/part4-mission11/tests/unit/unit.auth.localStrategy.test.ts @@ -2,8 +2,8 @@ import bcrypt from 'bcrypt'; import request from 'supertest'; -import { localStrategy } from '../../lib/passport/localStrategy.js'; -import { prisma } from '../../lib/prismaClient.js'; +import { localStrategy } from '../../src/lib/passport/localStrategy.js'; +import { prisma } from '../../src/lib/prismaClient.js'; import { createPassportTestApp } from '../_helper/test-passport-app.js'; type Done = (err: unknown, user?: unknown, info?: unknown) => void; diff --git a/part4-mission11/tests/unit/unit.product-comment.service.test.ts b/part4-mission11/tests/unit/unit.product-comment.service.test.ts index e1b081bd1..3464720cb 100644 --- a/part4-mission11/tests/unit/unit.product-comment.service.test.ts +++ b/part4-mission11/tests/unit/unit.product-comment.service.test.ts @@ -7,15 +7,15 @@ import { jest, } from '@jest/globals'; -import AppError from '../../lib/appError.js'; -import { commentRepository } from '../../repositories/comments/comment-repository.js'; -import { productCommentRepository } from '../../repositories/comments/product-comment-repository.js'; -import { commentLikeRepository } from '../../repositories/like-repository.js'; -import { notificationRepository } from '../../repositories/notification-repository.js'; -import { productRepository } from '../../repositories/product-repository.js'; -import { userRepository } from '../../repositories/user-repository.js'; -import { productCommentService } from '../../services/comments/product-comment-service.js'; -import { notificationService } from '../../services/notification-service.js'; +import AppError from '../../src/lib/appError.js'; +import { commentRepository } from '../../src/repositories/comments/comment-repository.js'; +import { productCommentRepository } from '../../src/repositories/comments/product-comment-repository.js'; +import { commentLikeRepository } from '../../src/repositories/like-repository.js'; +import { notificationRepository } from '../../src/repositories/notification-repository.js'; +import { productRepository } from '../../src/repositories/product-repository.js'; +import { userRepository } from '../../src/repositories/user-repository.js'; +import { productCommentService } from '../../src/services/comments/product-comment-service.js'; +import { notificationService } from '../../src/services/notification-service.js'; import { makeProductLite, makeComment, @@ -78,7 +78,7 @@ describe('ProductCommentService', () => { ); const { notificationService } = await import( - '../../services/notification-service.js' + '../../src/services/notification-service.js' ); const pushSpy = jest .spyOn(notificationService, 'pushProductComment') @@ -111,7 +111,7 @@ describe('ProductCommentService', () => { .mockResolvedValue({ username: 'buyer' }); const { notificationService } = await import( - '../../services/notification-service.js' + '../../src/services/notification-service.js' ); const pushSpy = jest .spyOn(notificationService, 'pushProductComment') diff --git a/part4-mission11/tests/unit/unit.user-service.test.ts b/part4-mission11/tests/unit/unit.user-service.test.ts index 71576cd1b..83a1462ad 100644 --- a/part4-mission11/tests/unit/unit.user-service.test.ts +++ b/part4-mission11/tests/unit/unit.user-service.test.ts @@ -1,15 +1,15 @@ import { describe, test, expect, beforeEach, jest } from '@jest/globals'; import bcrypt from 'bcrypt'; -import AppError from '../../lib/appError.js'; +import AppError from '../../src/lib/appError.js'; import { ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME, -} from '../../lib/constants.js'; -import * as token from '../../lib/token.js'; -import * as likeRepo from '../../repositories/like-repository.js'; -import * as userRepo from '../../repositories/user-repository.js'; -import { userService } from '../../services/user-service.js'; +} from '../../src/lib/constants.js'; +import * as token from '../../src/lib/token.js'; +import * as likeRepo from '../../src/repositories/like-repository.js'; +import * as userRepo from '../../src/repositories/user-repository.js'; +import { userService } from '../../src/services/user-service.js'; /* ────────────────────────────────────────── 시그니처를 그대로 따르는 안전한 스파이 diff --git a/part4-mission11/tests/unit/unit.ws.test.ts b/part4-mission11/tests/unit/unit.ws.test.ts index 8f2e41b4c..a5023d825 100644 --- a/part4-mission11/tests/unit/unit.ws.test.ts +++ b/part4-mission11/tests/unit/unit.ws.test.ts @@ -6,7 +6,7 @@ import { publishToUser, __resetWsForTest, __getUserSocketsForTest, -} from '../../lib/ws.js'; +} from '../../src/lib/ws.js'; beforeEach(() => __resetWsForTest()); diff --git a/part4-mission11/tests/unit/unit.wsAuth.test.ts b/part4-mission11/tests/unit/unit.wsAuth.test.ts index 3572d207d..3c03c9f65 100644 --- a/part4-mission11/tests/unit/unit.wsAuth.test.ts +++ b/part4-mission11/tests/unit/unit.wsAuth.test.ts @@ -1,10 +1,10 @@ -jest.mock('../../lib/token.js', () => ({ +jest.mock('../../src/lib/token.js', () => ({ __esModule: true, verifyAccessToken: jest.fn(), })); -import { verifyAccessToken } from '../../lib/token.js'; -import { parseUserIdFromToken } from '../../lib/wsAuth.js'; +import { verifyAccessToken } from '../../src/lib/token.js'; +import { parseUserIdFromToken } from '../../src/lib/wsAuth.js'; test('parseUserIdFromToken → null (non-string)', () => { expect(parseUserIdFromToken(undefined)).toBeNull(); From 368b6fa93ef0aadcff22ba03d351f3c560f386bd Mon Sep 17 00:00:00 2001 From: shwon Date: Wed, 26 Nov 2025 11:31:51 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=EB=8F=84=EC=BB=A4=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EC=A6=88=EC=9D=98=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- part4-mission11/docker-compose.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/part4-mission11/docker-compose.yml b/part4-mission11/docker-compose.yml index 0303f1f63..04a9f4e1a 100644 --- a/part4-mission11/docker-compose.yml +++ b/part4-mission11/docker-compose.yml @@ -24,9 +24,8 @@ services: NODE_ENV: development PORT: 3000 DATABASE_URL: postgresql://postgres:bugloss@db:5432/codeit-test?schema=public - UPLOAD_DIR: /app/uploads volumes: - - ./uploads:/app/uploads + - ./uploads:/app/dist/uploads ports: - '3000:3000' From 08c03d50f6c39d3e9599a8fb3a5c13d0d1534721 Mon Sep 17 00:00:00 2001 From: shwon Date: Mon, 19 Jan 2026 11:06:28 +0900 Subject: [PATCH 6/6] =?UTF-8?q?chore:=20.env=20=ED=8C=8C=EC=9D=BC=EC=9D=84?= =?UTF-8?q?=20Git=20=EC=B6=94=EC=A0=81=20=EB=8C=80=EC=83=81=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 1f2813c95..000000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -DATABASE_URL="postgresql://postgres:bugloss@localhost:5432/codeit-test?schema=public" \ No newline at end of file