From c54f6edc1e333aa8630aa5b9683a6ae68d23d30b Mon Sep 17 00:00:00 2001 From: Amirhossein Khalili Date: Tue, 14 Jul 2026 11:04:49 +0330 Subject: [PATCH] docs: add architecture documentation and slides --- README.md | 9 + docs/README.md | 21 ++ docs/adr/001-use-python-grpc.md | 18 ++ docs/adr/002-redis-otp-state.md | 18 ++ docs/adr/003-rabbitmq-sms-worker.md | 18 ++ docs/adr/004-sms-provider-strategy.md | 18 ++ docs/adr/005-fastapi-demo-client.md | 18 ++ docs/adr/006-caddy-production-ingress.md | 18 ++ docs/adr/007-compose-overlays.md | 18 ++ docs/adr/README.md | 10 + docs/architecture.md | 40 ++++ docs/assets/diagrams/clean_architecture.png | Bin 0 -> 37075 bytes docs/assets/diagrams/otp_login_flow.png | Bin 0 -> 50630 bytes .../assets/diagrams/production_deployment.png | Bin 0 -> 47634 bytes .../assets/diagrams/refresh_rotation_flow.png | Bin 0 -> 27750 bytes docs/assets/diagrams/service_architecture.png | Bin 0 -> 51804 bytes .../assets/diagrams/sms_provider_strategy.png | Bin 0 -> 18511 bytes docs/diagrams/generate.py | 215 ++++++++++++++++++ docs/implementation-decisions.md | 34 +++ docs/slides/index.html | 103 +++++++++ docs/slides/slides.js | 28 +++ docs/slides/styles.css | 178 +++++++++++++++ pyproject.toml | 1 + 23 files changed, 765 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/adr/001-use-python-grpc.md create mode 100644 docs/adr/002-redis-otp-state.md create mode 100644 docs/adr/003-rabbitmq-sms-worker.md create mode 100644 docs/adr/004-sms-provider-strategy.md create mode 100644 docs/adr/005-fastapi-demo-client.md create mode 100644 docs/adr/006-caddy-production-ingress.md create mode 100644 docs/adr/007-compose-overlays.md create mode 100644 docs/adr/README.md create mode 100644 docs/architecture.md create mode 100644 docs/assets/diagrams/clean_architecture.png create mode 100644 docs/assets/diagrams/otp_login_flow.png create mode 100644 docs/assets/diagrams/production_deployment.png create mode 100644 docs/assets/diagrams/refresh_rotation_flow.png create mode 100644 docs/assets/diagrams/service_architecture.png create mode 100644 docs/assets/diagrams/sms_provider_strategy.png create mode 100644 docs/diagrams/generate.py create mode 100644 docs/implementation-decisions.md create mode 100644 docs/slides/index.html create mode 100644 docs/slides/slides.js create mode 100644 docs/slides/styles.css diff --git a/README.md b/README.md index c05ebe0..570759f 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,15 @@ pytest The production Docker image installs runtime dependencies only. Development tools are installed locally through `.[dev]`. +## Documentation + +Project documentation is available in [`docs/`](docs/README.md): + +- [Architecture](docs/architecture.md) +- [Implementation decisions](docs/implementation-decisions.md) +- [Architecture decision records](docs/adr/README.md) +- [Presentation slides](docs/slides/index.html) + ## gRPC Methods - `RequestOtp`: public; creates a short-lived OTP and publishes an SMS job. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..1d7aecb --- /dev/null +++ b/docs/README.md @@ -0,0 +1,21 @@ +# Documentation + +This directory contains the design notes, diagrams, and presentation material for the Gapido backend code challenge. + +## Contents + +- [Architecture](architecture.md): service boundaries, flows, deployment modes, and runtime topology. +- [Implementation Decisions](implementation-decisions.md): key decisions and tradeoffs made during development. +- [ADR Index](adr/README.md): focused architectural decision records. +- [Slides](slides/index.html): static HTML presentation deck. +- [Diagrams](assets/diagrams/): generated PNG diagrams used by docs and slides. + +## Regenerate Diagrams + +Graphviz must be installed on the machine because the Python `diagrams` package renders through Graphviz. + +```bash +pip install -e ".[dev]" +python docs/diagrams/generate.py +``` + diff --git a/docs/adr/001-use-python-grpc.md b/docs/adr/001-use-python-grpc.md new file mode 100644 index 0000000..a8bb5c6 --- /dev/null +++ b/docs/adr/001-use-python-grpc.md @@ -0,0 +1,18 @@ +# ADR 001: Use Python gRPC for Auth + +## Status + +Accepted. + +## Context + +The assessment requires Python with gRPC and focuses on microservice communication. + +## Decision + +Implement the authentication boundary as an async `grpc.aio` service with protobuf contracts. + +## Consequences + +Service-to-service calls are strongly typed and efficient. Browser interaction needs a separate demo client service because native browser gRPC is not practical without grpc-web or a proxy. + diff --git a/docs/adr/002-redis-otp-state.md b/docs/adr/002-redis-otp-state.md new file mode 100644 index 0000000..7fc08e3 --- /dev/null +++ b/docs/adr/002-redis-otp-state.md @@ -0,0 +1,18 @@ +# ADR 002: Store OTP State In Redis + +## Status + +Accepted. + +## Context + +OTP state is temporary, security-sensitive, and must expire automatically. + +## Decision + +Store only HMAC hashes of OTP codes in Redis, with TTLs, attempt counters, and request rate limits. + +## Consequences + +OTP verification is fast and self-expiring. Plaintext OTPs are not persisted. The local debug provider writes a separate development-only key for demos. + diff --git a/docs/adr/003-rabbitmq-sms-worker.md b/docs/adr/003-rabbitmq-sms-worker.md new file mode 100644 index 0000000..091b464 --- /dev/null +++ b/docs/adr/003-rabbitmq-sms-worker.md @@ -0,0 +1,18 @@ +# ADR 003: Dispatch SMS Through RabbitMQ + +## Status + +Accepted. + +## Context + +SMS providers are external services and can fail or respond slowly. + +## Decision + +Publish OTP SMS jobs to RabbitMQ and process them in a dedicated worker with manual acknowledgements, retries, and a dead-letter queue. + +## Consequences + +The auth service remains responsive. SMS delivery is isolated and easier to retry, monitor, and replace. + diff --git a/docs/adr/004-sms-provider-strategy.md b/docs/adr/004-sms-provider-strategy.md new file mode 100644 index 0000000..8e474b6 --- /dev/null +++ b/docs/adr/004-sms-provider-strategy.md @@ -0,0 +1,18 @@ +# ADR 004: Select SMS Providers With Strategy + +## Status + +Accepted. + +## Context + +The project supports Kavenegar, SMS.ir, and local debug delivery. + +## Decision + +Expose a stable `SmsClient` port and choose the concrete provider through a small factory based on `SMS_PROVIDER`. + +## Consequences + +Adding a new SMS provider does not change the auth use case or worker flow. Tests can mock providers without network access. + diff --git a/docs/adr/005-fastapi-demo-client.md b/docs/adr/005-fastapi-demo-client.md new file mode 100644 index 0000000..aa3054b --- /dev/null +++ b/docs/adr/005-fastapi-demo-client.md @@ -0,0 +1,18 @@ +# ADR 005: Add FastAPI Demo Client Service + +## Status + +Accepted. + +## Context + +The gRPC service needs a simple browser demo for interviews and reviewers. + +## Decision + +Add `gapido_demo`, a small FastAPI backend-for-frontend that serves static UI and calls the auth service over gRPC. + +## Consequences + +The demo shows how a separate microservice consumes auth. It remains separate from the auth service package and can be exposed safely through Caddy. + diff --git a/docs/adr/006-caddy-production-ingress.md b/docs/adr/006-caddy-production-ingress.md new file mode 100644 index 0000000..1d3539b --- /dev/null +++ b/docs/adr/006-caddy-production-ingress.md @@ -0,0 +1,18 @@ +# ADR 006: Use Caddy For Production Ingress + +## Status + +Accepted. + +## Context + +Production should expose only the demo UI under `gapido.amiirkhl.ir` with HTTPS. + +## Decision + +Use Caddy as the reverse proxy and TLS terminator. Route public traffic to `demo-app:8080`. + +## Consequences + +TLS automation is simple. Internal services remain private on Docker networking. + diff --git a/docs/adr/007-compose-overlays.md b/docs/adr/007-compose-overlays.md new file mode 100644 index 0000000..b7efdc7 --- /dev/null +++ b/docs/adr/007-compose-overlays.md @@ -0,0 +1,18 @@ +# ADR 007: Split Local And Production Compose Overlays + +## Status + +Accepted. + +## Context + +Local development needs direct access to service ports, while production must expose only Caddy. + +## Decision + +Keep `docker-compose.yml` private by default, add `docker-compose.local.yml` for local ports, and add `docker-compose.prod.yml` for Caddy and production environment rules. + +## Consequences + +The same services run locally and on a server, but exposure is controlled by the chosen Compose overlay. + diff --git a/docs/adr/README.md b/docs/adr/README.md new file mode 100644 index 0000000..6f01d19 --- /dev/null +++ b/docs/adr/README.md @@ -0,0 +1,10 @@ +# Architecture Decision Records + +- [ADR 001: Use Python gRPC for auth](001-use-python-grpc.md) +- [ADR 002: Store OTP state in Redis](002-redis-otp-state.md) +- [ADR 003: Dispatch SMS through RabbitMQ](003-rabbitmq-sms-worker.md) +- [ADR 004: Select SMS providers with Strategy](004-sms-provider-strategy.md) +- [ADR 005: Add FastAPI demo client service](005-fastapi-demo-client.md) +- [ADR 006: Use Caddy for production ingress](006-caddy-production-ingress.md) +- [ADR 007: Split local and production Compose overlays](007-compose-overlays.md) + diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..d5949ff --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,40 @@ +# Architecture + +The project demonstrates a production-shaped authentication microservice built around gRPC, OTP login, asynchronous SMS dispatch, and a small demo client service. + +## System View + +![Service architecture](assets/diagrams/service_architecture.png) + +The browser talks only to `demo-app`. The demo service acts as a backend-for-frontend and calls the gRPC `auth-service`. Auth data is split by responsibility: MongoDB persists users and refresh sessions, Redis stores short-lived OTP state and rate-limit counters, and RabbitMQ decouples OTP generation from SMS delivery. + +## Clean Architecture + +![Clean architecture layers](assets/diagrams/clean_architecture.png) + +The domain layer owns roles, users, refresh sessions, and ports. The application layer coordinates OTP, tokens, and access control. Infrastructure adapters implement MongoDB, Redis, RabbitMQ, and SMS providers. Transports translate gRPC and demo HTTP requests into application use cases. + +## OTP Login Flow + +![OTP login sequence](assets/diagrams/otp_login_flow.png) + +OTP codes are generated with `secrets`, stored only as HMAC hashes in Redis, and sent through RabbitMQ. Verification compares hashes and deletes successful OTP state before issuing an access token and opaque refresh token. + +## Refresh Rotation + +![Refresh token rotation](assets/diagrams/refresh_rotation_flow.png) + +Refresh tokens are opaque random values. Only SHA-256 hashes are stored in MongoDB. Every refresh creates a new session and revokes the old token hash. + +## SMS Provider Strategy + +![SMS provider strategy](assets/diagrams/sms_provider_strategy.png) + +The worker depends on the `SmsClient` port and receives the concrete provider from a small factory. Kavenegar, SMS.ir, and debug-local delivery share the same interface. + +## Production Deployment + +![Production deployment](assets/diagrams/production_deployment.png) + +Production exposes only Caddy on ports `80` and `443`. Caddy routes `gapido.amiirkhl.ir` to `demo-app`. gRPC, MongoDB, Redis, RabbitMQ, and the SMS worker remain private on the Docker network. + diff --git a/docs/assets/diagrams/clean_architecture.png b/docs/assets/diagrams/clean_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..b54615364a08dceea4e8cbf0b94671f0894b08bc GIT binary patch literal 37075 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 !sL$4*f>Q`PAw^s6iE#rbfuCzc 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 PeUz70lFEJX;@y7%L;^JC literal 0 HcmV?d00001 diff --git a/docs/assets/diagrams/production_deployment.png b/docs/assets/diagrams/production_deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc2cd33e2f566b6e6d79a6db6a0f882177832d3 GIT binary patch literal 47634 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

F2`PHH^5ZB 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 VA=Y*D`5M$tgr3RIB|kYn`X6WQsZIa@ literal 0 HcmV?d00001 diff --git a/docs/assets/diagrams/refresh_rotation_flow.png b/docs/assets/diagrams/refresh_rotation_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfac08a18500d01a98dc3903dba6314b1808049 GIT binary patch literal 27750 zcmeFZ2T)UA)Gr#u4u~CTf)YeUKzfrV3Pc1Hr4#r|=)HwbKv7XTp-D#w9fI@{LR2L5 zULrLp(o3Y55OPo8|GoKU-rPI)&YijU&Ad=(o3(DrEzaRok1*> zx;-+R0*<;5etPD%W^A4!he$@|oBrae6Px^%a}<|ltXU<|)~V2XxtM;)H^A1#x)59W z#MkaQ>Rk2NO0(j#I`(HiDj&NWa^-pA+qa2~vrC&4dXEQZST&JuU7BU4-OX9z!@jAN z^5ho!ZgNp2As!&=|I2@Ra$dWz%44V7Zr<_EsCVl6-wIY zjV*dgLzO_sK%hXO_YwE*h1Ja%scapCsO~|TWwIyO$a)5HGE#-VKEfA=26v&)GEXZ4 zeX14GWkp=S=&~#@v>=Ooh#&+xj{aj2P~+cEUgtHyh0dR*I}N;M6O$aUF^HrHLFg&y z6OiqKMf?H0Ilhu>531&S)KSo#Ut{~>3Naf26!h^sIxq{tk%oC}HiD(^>ap`c7uvQz zK4dPPe1X&NV?_|&ROBU85{t(74<6zeY{I8J>3~<}`cqC0D%}096=mM`iO9tE+$)Fp zuHrrDI54N!)=r^%Wfhhk=&3%z-`C`%oqr0Ou3@6$k4FDUFA9M&)CB~~G1KslHrB1@<158ZWax)n)ofv4%nhd6U04ZH>>EjDQh~>} z`OB***L`%OGL4anWzxvnF4D~&*yTr!r2$)*)69q5fQZ*js^>nD`A(AQiTN3@iaGXg zyTxUhZW3EhqrL`*S4+(UTzk|Jbs{i_e4=D z5(t$Chcbvdrka*gOt%&)B^}QE3b>nXYYmLdBrOE)Uf#7yIG3B5& zQ87RJN43Gi3*W!%D9tAPngf3=;Yn(UiS0MD3nl9#sam0VmzIZq(Yvo_DbTS(|2gQz73CiNgD5r*p_>=Q27806gpo`NqQ|gRnJ8kmUQapnbCMZ|N&eZy((R{G;Y0N*Dm@ z`kWY_-_F9c_sURxrmk^%yXL&-_?B}zU-3{-zppi0FU<#uEwv!Vm-E|8+;8@knl9&d z*vq5&*h#m6QO;XEQ+m{#BK~DO_*0IuM_N|ttod5h0GQ`cj;G#=hTlq&)i;oqUyw|YzEC2bIR7rVj z_1pb(EiXi`bS-^8v32v1y~igm@Jh2uJvbqH59)oU{T{qD7G5D3k>AV)V^{Xm-Ax4J9Ce0>TG7I08lHfTZcj`z- zUtd1U$_aPXEb(oKa0yf4m)Y&0vyX9$pdJiUJ6Ek0rLGc@(2EX3+z4kQ5=kO;7K#Y9+N{Qrt>*(IZJ#Ru zZzj2i;F=vR*7~!aoFJcEEdq5)88VC@^rl5mmBmJ<{!R{f+E2}Xbo*xb1Hp%&1@O@~ zGO`HoS!O#5nqH94%sD;-43zl)v9Uh@2WKMC2xqyxu!6p#*4@Vutw! zL;mC^#60W0rs`|&M8nQT%yTlkEZ;fQ+S9T7u(CgIeP?G*39#~9xqKl|=Flw%e!Y*k z{!>b^=!**IyHa{G!Z}tnC35rQ?^N1q@{iQ3tT$QZeG(=z52IYd&f+alLN1%GM;d{j zeDh(CS+igM9~(w+WAppzzpe5&>NNmbPKUix&34*S6|rGZl5XU%VAg1^^1yN(Np$jU z_{qW z4^+u_E#NH8)~$z?m0u5Ya9dsDS{-e~0RBEu-sx+P7zs3+g$Ux1{uPMA3Lct6M)#tm zROdF8V^Wo|wM8Q2%O&IF!+Fe&hQ-EB_4^CUKkydk8ND65!in>}aAFlU(cOOf%_w&+#`x0+e3E; zwtomoOns&uAFri5&dGnJGG~1++L&B*%I;(fPJ_!w{%FSaSlLYZ@RWl)+>*D%hqC>D znjGoAe2I(G({S>eQc*=%YN0-lsG`F!)>05Cqdz1>lhsj_y*oji8G?+iMHQGeeczFo zYHN#dD-s}QhF_2EDBJOP%om?}N7b~tPe<2qspZ}W>8>1iiV%Odo^Js8enfu~zn z2iuS>>X5YQZ8n@Z)T_QK?ydf(fWIx-f0MXYvyHKX1+z+HvYR3b({-`W4_vKE zn3qGvpO8J8F3%ITan#76Wt>R`nnXPV2n#Z+!e(VzvvO(h$~3-4roBzx zaw}QO9^RtMv$Vf%{rDFQ`55z0)`zHus>F zb^K*yO0T1ey9ur7lEWn@V}oHAfkrJosfhLIr?u+>l|TdE2>!)O_crI|L8GCO;qfyH$d_2x>Bfo8 zS~U3$xXH}J)^qR2H?wf`)=6`ow|h{u852UU*X=?e;HtE*YHI<#%JV#UYDEA5f2N&2eE^zPN(PD?2&vZ8T;uqrh9lO4i zenW?I-h$zHA!u36?L3wwym=LV!5Mn zRAw&Df0ZDNaDf)4J3^dboaE}AX-5-o5xm6c@f&wG2UOE4`^*SQi4(%W4_!lhz*26F z+%nN=3VA0oqhPVDF%_y_vL504s|k}vlWE)qY;o~Oy@h*IQ&Uj=>P?9~KM^#0=VNy0 z^4I7&Es~sIp zB8S>l2P8k!w&ZNyb^U>Nv@fiRI+HHafUO#coNqF+TI{3(&g?%4puJW?#AMVr-So&cL;qOm3hu;}+@m%Brq^8e#b}!!o4S zwuy-t;*b_rlsq<*TdNexbAVrwcS(CYvnvPjk^EseY$@EYn!LutzGKg*(^3>FzEM#{@JA? zm!2WE`dTuZr~hXje)`Y<-j*L}h#%(KG>naTvWso=vf zB=GC--g9gfT76sewKj~XsV7dIoJoH~vu4nFsUgE+Xv2$A{SYe+ZMi$J?CuHsrxf_c z4Vr?1#N2k7JmdWRyHXf&i)xixh1<5XczkR`^n(6Hhc9~@#SOwSaf0?iOu$lW`Sjk# zQ&`6Z>|DCB#4wknc+ z;}_9m{-@i?Ro){x5P7MC4-K{A*>Wmr`5QQofV zOZEb7@=|6)#Nlpd>rwI3mX?*OzK1*lQea=FF}K&2WFsij!Oycq-pe63LfY+__E5D|^2l=#gGqb*2}UdW!4I$x>I?w|1bK zb%P|A%HONSGGxqdh&kL}PfGR1Ci5&f8!$8pTYp}5F7Qz-)Y*Zt+G3`lzd4Dg57G#wd2=Ft@vo1t*cTQl?*+F?u!26k zm6_taef{~2O7VoZWBS&>mqnwpBMd`VpRiE;xN>Ao37T--l1=;3a5P}-q16iR8g&bonruIXaU1&h0?iJG`BX8UX=9j3iGC#JHe2jHXl z&boQU;d!x_eW8c{_2q#@k%z1cTx=OnW5#RgieHw?=Xjdt#jsl}@C_ezeacqe=2=tB zXoZvS@6l)54AXf5U{z^WdRg%yw19B2Nxfb;`Lx2nQTW9#zs9iz`^w=99=uoIly&~| zE+uMBL>2r1pXPurNVn(@dU?2i1%3R|*X*>UJ56duz}u{$_Z)qu$#4v z$7UZz|8toFTtoBI)Cm;SD5-nGTsA0K4g`O+^;t%QT$4jAj+6J#QgV_nRV90T88wnQ zqRlanQlTU?j(eUwQ5Yi^W#QV$WByx0{>cv*7b6G}6V6#e%qZ; zW}+Z)FJHQ2PkeVZr~7{D_Rzw5vAF!pw_b;q!~Kyh>p8Z3rZFf2huh-eDo|2CYHyX_ z`O7n0!|rb;te0G6zgc?I>qwW74!eHITg!!Zd)U&_=i-&JenqFRA96p+e6(uNb{0LZ zfy1Cj@16gq@NZWhOCwoWcqe_NO_o64;XVTdHc(a$@>m`lcTq-h9!>RivG^!OkgoVJ zxB=by0-F`YsVnjyje2%zqMSgw*mL%1q+=LQ(kkY7#St!tQWRrzaQRU+a&G?6n}M{y zjtCu#oRVs5>DVY``2Iv@k-gQMTaI z>_L5O5_zxsdF%KQ{f{La4va(70t|p_n569tQlA943OauBkZ#3)4o&_4eT(@D05us} z`kOO$NK|%v{Ne(Mk})Vzy>DG5n1*-_w%I?En^RoXwT9-MxTGbQIUSmiV!DXM8d&2V|4_(Un`JWtL$lbs^og7DD5lo-!MA6c z7v|sL21{n-GEYP*WIKpgI#i|W>lT?(7p&Oi?enfD;_f?$Z@b@n4Mft4WrJktolS+5 zti%Kpzn)d6r#M9d)md|o;RzD>(y-3H_Ex&M&O1}KERr92&12M;?(d#miKePIXPGW} z|NnuptM;UK3frj@Vhn$z?KeKxdF`F>f$tKTZ56;mdi_EvIXX@ahu1udW`9)uSkC&y zYW#AS?Dmo_xz2uuvDjx_T<&i_#(kpJO0tsF@o9Nj_eJ3@Lt0N$zmT;@xPw8Rz4t>( zPLfMSCy9-Q@c^4t5~so`BG#@NP5s5;zndbO6rqv$00NL7;XxW1FItYOHy-zB55Id& z`r(w8ln(7W!J|4?W#stac9h?8q3IA3S6{Tsmr~GPvhUf6g=v+w+ zK~sie45eVX@^YFkR(3@U#}AUw(crkaw4avjB~|2rUFV1XIZ5!bK?H&O&=*9x&*u3U|Hu5@r38n8U*vskPg1OtnP;f0G{)KXIp>cMLyGuui6 z`UB}}UR1D=nV~GD+G+W*3o$lr4^G(C$yoZqY>>&JivPu}b}^v2deY(V_D|ZQ1F3R6!>_ zQh25Yc9s`1%}=zhPOW~~)xC@>77oZC-)SJV-#m<#K;ZE$COcw<3T_n>L1W`KtCY#4 z6rh9}&GqTB?13{AsX~7o^k#lJyousV~oy-po zT?*>QN+*}2FuGPzUg27$+^DTBd@+(VfM-fh_Rt!wc~$O6Sxp@oYP&kLyz52btFy*S z!k0>6l?$B&_hru#+p2yeJ$x8(a9NhvU>qF5mQB;iojfn^$yw3esczXJ*q&CjNK|IGiCvY5w-jXUlfq5@t?AuZQMUNMzbDiz))It0fm35$yBE>n(F!I>8Wi3i{NzE z#amuPi~LJ8TwGQ&PBz#6G!z|Fdl9~oVJv5`sj}O?DtdiYK~FE1owN<~_2Q-WmO4Ll zdgSLT8VnN2FL-_VQ%|#s&zFMC{n1sJc+y{Q^iuYOKEBuADIozzoPb|W)%VEZ@E?Do zhpXoV0J)=D00Wy+o^tM)pPqWaTdCGK&duK5-JQiaRA%Oj_oE&7b?mk-9?=fq9>oPd z{_1|d{pYV=Aa=DFU!)$;&#}?C9T@cKliaAVr2+hLZ9ahFxo)E3{Oj|~e>2(yIOj=z z-W^KHAHt*2z$4q!L|f&p+xfdi!35Pp(Hr;!2=ZZsTMGD{z4g=mRZAFaczZ=@A`KyA zBfnp??W6&Bqjm2yksn2ivJ%W9t``Bl6y9yiZLKs4D;&MFT%9E^BNOmU<8dydr)cIn z*lL4?^ig!A^FtT^T^S26KO@OLDbYrFdLHl{e$Zf*q!5Uv<*EXMifDk@{ynup_Guw? zWSqY-l1*dh0f6U4IGR8WYE6&@1tvso8jP39mM35K5NY122X1}e!P*(o96o(b7FSm0 z8VpX{Ybi(mF%&H?Mq>>RkwQXgL8hN!CdFewRdtrR;7<9fpVQO-gcUYdLjl0?dWj&3 z;%On|u;@bvK1{ox6G7K_xj(m=AE4oV;X-$e2G(vNNI^B#9fgH7TFg+V0QilDbpkMx zicgQxxvL7g<%%<@)mu4LdlNW&E!+E_mudJD|6PGp8Cq{vd&_x|5na{h#fc-XPifeg zZ`i;qcF^+Fb#A~JbsVaoo>S|B5_@0J=eoc91qFoaAHf+Y#Cgdrt+JWB$*dR^-OhMi zQ{>=$>HypK>bs&6N){T{y1G21c=V_S&l;K7%97ZBom69{skk*B z6ToW*lhlnPnZ6lB#$DxGruX$XeDGu;+!u~f~W=cIA_PWhC2+to_(9AV3FR8Tw)LblQqaj?(fDgRox_a8_h z-pr$bDG^sOn7cUV#Xs%4JpHphtgyV^*X`o`k?r*O`cC@CjBRR^L}MlZ4A543{RFqT zmxwSZqZK#qtoLzBhJRdtCyzL`O$pe6YGqnNsWHsFau1wVm^}BO44@1v*hyO9%71qs z{y*NO|6h8l@{>d>O*n6?9DFq*>~Y7-*3^4;cy+d$`RPRXXN^jvd{vp#+oE{;(ftE{ zq#1%`ko9Qi05v%%oiZOEh2b^hDqpqkKrdd5;h$IIaeHs)4s}HQ%2k=M5?6kxKv)=L zLa-#9K3tHv9Zqr~b|%O6zsnYzIqAcME}OP&dj#tb*Vc}*>CH~FAjU~%7r${yfllYy zp?AG!8p7U75B(Hs@PNk&L2g~f{#qM$tCr-HtXl0^!d3$yV6#R*HfS$o?AN=;1^s4_ zECADLwZ!YsfBbgh-FlT%$1YCWB8zyX@*NO?(!r?|VlmEdYfLokd45sD4s+b|pwd0d ze$tTnHJdZPPAPi+nTeFs>U(%tbCeG&vSbqc=~g4cOx@dpFIIW(hit&kaDa{j84nn~ zEiQI=L!mHihZtTu6nA~IToXt{PhNO8t3DHXbN~38(k=Tziv#aJEx!*Cgg!RF6CBqU zNDYu7gnH$fRx)Xr0oY@wfV%$Fv;a?T-3puYFBX*HQ_zz$uQ2e@F+`eb3 z7gFWX)w0rM8&)5+k_6g7c<;g@;yQE?1UjO{dyZ{B1j_|lFi*GrlR_N7V@E~B-)Kov zvFjv}a8%6Z!ON2wdgZ^Uv6ojdj2j>o7RFXCqZvMvG;df5#v^grXz~RF zRB*TKP|`E<22imAG1+0u%S4h!cSRg&qB6uV&-!Mo5PTJXzp->NGmFZy~6n1?bn>k8U%Ohm8*rZr!)`1ge$F5%GI zkgcx@bRe}%U9P%RM?e^gF{a(v1315&9EnfCi$F32_Jt>^_>Ko&w{$+}4VJ~rH51TbW~vLq*z2vGYc zd5zO4+*?XAV5*@0&38A7;3<&veL%1~e6f<5f90DCjQd&EwdrcGf{4c|dm+L#D%|Y->>cK;4Jjhu&5CV9s@3TstU`8-OYmLmpq2 zd9m*wdiCL}?Rz+&j)nWTLJKI$HX>wSkWMaY&;^kI0x1Dn7I;}y7pTz#+H@L-ydcH% zw8=FUJq^Iw0lLT;1MHze=N}z9V$kcOVz=|x{_7T4$o_xE4KcS)afR*;%t>yY?+6xP z{()&0rn=)LLg{jzvC#;Y@b}ceqv?nM3{jk}^{|FaQFJINswnXuOp7^~ovUtt4?_jl zMxG0MPxT`D6IRwS@)@#+NQBe}VO=Cgs}z1vZ~9ZoGUMYcy^b`@&$#PnmN{zvd=5t2 zZ(uYt%4<&1Ha*Lt5@7!37IQTjVvC^bsg*I0rlndO#%yb>oY!t&@PgW9S}eSi5#XVT z-&kA`q~){3btOuc-Oj43lz9Y-TfRpn0{JYf^4{^tA4LX#lYL8kWy7;j7d5%#84-e!5qzoSs}saq7DlmE?F<{R&i(*f!j#QiASAuRHIVlr-PRd!X%Ql?(X=>u zGH7qFZtgHicR1d3`Rt10ta}#fL!1P}=ezJ$bnwi?UzMaM^mXBY%K`;@u->t?XjHKb z7T?;ASnLRxOIwUr&!JejDl#9zrTk$<=HW{w2J0wcAA53hFm~-v3`_G?dit`Hw<60S za@P|Uy~R3AtsHtVQgUN`mrSBMV*iuOg8wWfid%JY5J)nCFDI4q0G3<7{~Od0MkC;V zt~B?5sgC!*UjDzy*g$!Q!Q>Jf;DTeA_TK-S8%WiOQg|4nnU)6tvo>viAT(?|UeE|V z9boi1JXwMaHF@H#Of#jwa7UH(){i|NV9>UT+SBCdCOAt9k zh0QP;tI!7%%r9TOD70(vfBb^zIe{q0bHE?<_tn!fB;9gkuNS8m4siuBV45_{{;Wzw z&(0;yLEzH))^ee4Ii5ZF9XDieL=RWQ8{lm~O8_L8?veoXJVo(6_p$SnL7A7@yDEn6 zxf)X{>N3Y(0>Bo|&Xz$bha6VXOk#V}LgwyyA+3wqN7K!P)3P-viu#1%6zBFxrTYjf zMht+_1q|y^`3^dR3vcmh04fjZY$SxNJ)xxyDu%cD+fCxY8p%G64`~s9w&<<&A+a2* z-ru}QBHqZZPkx5wRgoR0KVQ;5f%NHh%kh1-BdMQO4CLbQhaw9mZqpJ?Q9eVq%4Otx z_c;3PSsMiulE#;e>Z{@dDj!U&%|^uQpxhGG_K{3Z`5~wrd4@GrwGrH<*zLV7v^W5} z=a@pL6WG-@#BZ_nThxHn@uB@ZVE*2O0mD|Km zy<;(*@6&$2!+No#WCsR?3Py)n+)OJgGn1oqa3wG7E!qXdpmOeu`)u6kjHt%5I{|jI zS0YQIiEK~^v1`XEWBW395poqaR{f$+xTo2h?uM13CQYGDF!6Qkuc<7!{Yr#5=>nv0 zlVDOzQ)&~xgZUhJYydvs^T1krUIa~XtuPX^*jv?_XnZ3669#Kx zPb-0Z&1sf_-MtZL<4qet~rfR9wQA$D!3OVfs>d-3d zl83z-ioDg3VI90WSNN~qa!nNopdpF^&%3(YPZm?df9s$3C(@ij}drlyEDOr;OeL5 zD_CYRqgx`XlGY;wZg8s5bw?j)duc%-F&dnTSZJkrpSCAj_8#@(6J9KxJC^zgc z63g6!i9X1t%C1ld>GJ8oxHzZz-}5Zi11)~V2IX5B>sbJ_Q>k7BQEX<1mi0zt_ z=2munt(U}S7x0Evz ze-XW_xhPvySuq)HDo!T2(?QqgS}2VB5% zz%#p{qUC7jz4dtK6!*Panc4c#qz0E%#IFP66@UI=!@wut4)6By`r*Va8jeip-9-=e zv#Jynjn~YqqCCzX??@82gLiqeK#(i-6iZq@dfc1biA1?|Ve&eMO>C%7NdRB+VUe7L zwBCZ99{dIM7pnL&Fqle1G!+6fupHq;Qt`5*)|9)|Y9?dmzCrnKS|@ zYX1E0qr=ojJYcE|fUNSv*(D^gmQ(LL>o%J`w_2$38^_1!kAtJPUq3JyRpA>jRo>CH zz*n`6B!>xm8u3ftLS^>#+34`=32LfvIt<3ONCT+?B>oBuv9zwt)!)t`sI0RJHb%k> zc^he?WGP-mM!XZ<=$hr^(9qjzzw3|gUbzzfLTAu+d7=_CKfmPWSo?WcB$}3M{?Z%l zVZ)cRW8usx5D?SgrEr#^xnl2I9%j@1O=Scn4J;WK1X7w5U|x^^P?vT`D9p2J+Wl9%l-FG0y(diVhVVwgD*~yvTev>cY8G_K>y}o( ztMgXSfLECRP`y-~HSN^LqW%cIyLCll@c=8(5Tm1YGiT4f_Fq*2ruWW@YZ$At%@%FLG_Va!-IJ7k|BFM zDGl&1@PRcEna8-wmHQemJ!!lCWP0sBY{|@^zX%N!!Q<;zUc0&I0;w+OOOe%!t@4hd zFoIfLttf#&uqSRDEZ6d!ZEl-O$BYD5^N*ASY>Gn2^c`I3zDfjB-%TZls}I%+b0oG8 z_P^D%a*YduxHV$3$Lsa@k0}!KV5r18y9OMn1$dof zag%d*E{k$0BYe^1nd=D)F7pEP+mp^RmjIFq3K%oQGW$5`gCQ0tk z#Z1?f7k9jbyPY}XSKg~nkzqSS^!&%F$fVV%Y|u6S`{>|PActnz92}(Ip}DydWV5@s zvLOi+3A4eH<1trKrB=ankeH?su07)Mn)Og1)l;0hjAj04V(Pg-`gl%Z|8Ef|JTV~N-7q-3SFip; zh;7?Yv7N^*^mNoYpx99y*;l=C726bEnLIQ$?Rf!fc4n;S^E)0O&J3{P#EiA=b6r6A zlpnKme{q`)D(m&=7f$^wa6(o@M^|^H1xWn?GF@CC1Cm<;N}bt5hw~-OWw1=HHz~EW z`sW5u%?NBqjSRoRHuWV?`u!!05)7BKoVnam6$RUevQmz*YN;Stgym@ zO^VZf|9$JbLwW->5lG6*-w#@Ep0GD})D?mv!#rw{EBWIUGr_dn06prGsG>E!s3PZm zfC&m;@b}LD%Iy}>&Sw|rKXv7D{621LMM1t`;VXG(d+ZGN#eu+gfu}3A&D2kuea|?~ zUf}UgCr|g0b9Tj*&;If9x`^Aw4_|zVxrQRFq)6G`^QnbaqZ)w->0pIa|mpHB0|FWw70wG^C9wmij= zt!_wyUlY5|Kh3^qo{$hfCe+3Z0>{1;P`s0G6AJFsIcD`JYko%GVP#-CYj3_$I=N_&x+-%j zN$1q!PZpsaW1^k>0XeM>hh?;G()2f2P-oeg8@-cXwkBf-&lX>>L`8JQefD<^_DJym z6{3FdvTWPw3g3Z2uW_@Sp2J9`)6`=V9?oh!hXfk4j&d=THmReMI#cODJ@?OeGCzA_ zoBj*g`hp)LeSNjecVuM!B&WRb26IUa2(gh$p0$uh$B=Y+p$8q8wkb`E4_1@zI~**b zP;FLMyD7h9O|0m?$|+W!2@p_x;lFGBB9f?9bLzHkgkQ&o+`Qi&Pst0A zHKZuoT~EiNkJE&Y4g_v^dsi|2<*n|hf%Zj?zn{eW1$V|08s^}PAc4joHVki&g5~&# zZ5am8WLOb_4t4ylBD4MrFd4lBN;$_f9BS%Lx&%B_4G*VM0LUw5J zDNx2YxR?FYWEcx8^dS8#=t|WVLyUcDp@<-3$Ak?UgU2%-GtAm-M-(S*PKs?Vc-#D0 zH2{vjt#BF*3RD(?^V`fm@dG%@;qL`7vL&=2dSyJH^yV3D#Q!#O0wJzPveohKt|tdg#?IS%5wp0UrxF+*%}rZYq}-MAT@gu z7s)vl6{$U+~q-PbtyM(;zN{Cvx+GAYpI z(r^Fh^C$9P+wv^!cN-Tu)b8olO)N5kE+$vj^|PfiQXNt1TH}|Fe^tiYmJ?WQ%Mp#Y zI2Ak|tdT2+_3W%QtA?f>KG+Aq+ZU0jXrA{FWJu`t6J&$PA2x`#^Q4Y=m3p6^8#+Af zQk9@n(EAzl#X@PqP)kqkix3n2&7v8FhCG$skCIvrwv)MGoyZeisU+@{G)i&b)rqhlY|@F69V*nuDMFs#oL# z(T#vLKmAlU`GMflHTOwYai&7(qk~;h?c&y`o|gZ?Zm&+-pJN$Q!PI@FC)M&oElF<= zPJMKi{@B2mCsE?y{~}9uJX5wA0RBxzrL1IBmPqR9CZCnFgV|GNpEf`FXQ{!?< z&=2RrvBZc=JMU2*CRX|FGXkSxVtkkhA!a5mPX^O>AJY!5%4tHIKX{COa+-gq)4lMG z^~J{2u$!GRBt%jx6t+1Q%(XN+4G;VB_O>DtcG29x8634%#$!4BW6H(nE>KjtO9y6FRJcG0%G^nr8GYZH;fIWTP0i_j6-mX>( z1!D%=g@9%Dqq%wWv@WYX$rGy8`rsP~;Gn0QlZ?Vk9c=x3^1@xlgo$mPawUl{x(^rf z2DErF#6=FcxBsXSaQG-WM=Q}7mOl>+KDgrovt43O+qx=C(I_y<`)57gA^P1})WTy1 z38&$!20yq*_L!142Fj+B#9sM@PyLAD!#M|o?~s#}kOg}0$OkxL|D>Cf;LzN+wIJVf zUa356CxEjRYc*ZamBgHL`u+0G_q_E}Bk8TLsz$_eFi6cPERsYEP(X68QnNqkvb&s&n{g=j%1^!10X>xkO=dMSDxy()e>d&cpOx_iWS83DS z@%8)Ny1w!nH(w=8>`TCnsbW0s2diQ`PU9-Ue1f=JqSr@b{|isDxU1zzQSmMHc_`>R?UGCyxQ zGLC~^c1?D>I~2-$F7TAROg+g$x=yo?i0yilV`WaoU}OAV+>GbC^XjS+;BV#e@G$ro z@8CLdA?<_}_{7~2Ka(dNPN-A+Is5;#R)q@HnyFdDb&6_pm8@q#^jSqqmY%f+J&7Xi z=QGjxoq5mSeuTO$Lmyb~_J>lvy*bxA)fND($vEV7Wb6|Bme|#DWjwZe|5@vNp*;9n z&R061&SkiMd%~A`Pe>rq%3{x8o)wbrm3n6O`;xfsr8ae9*Ik7Qp{+6=Zgr6}(dOKi^ga zzWe*sVE7=CS1w?Ix#!O(TE!0NtK{JmkYCU-8fgDtw=_QeALIs4>mqHyKryj=x9uP- zG_gxF&VdAH8$kEDv_Vx#9KO`$EE6kfqs!dDYhE{brx{oZpnXu48QntVVYFRW4481O zB7r$wa_9XWma)V9N>jGprS6X$^MIv3W{sr%k6aCKj`<&k>6#K*dI zCVk!}vk!wdkiFpAnaxn`{wmLfz3f8lxywRlY4w>&8c!Bjoc8AWJ$%ClIUubjv)^h( zwR_mM!(#{d<4t?AocK!C2ZCv86KLu3oKWG*Yn6&>ukU)JVg)95Dq2|Nxoykqd2!A> zJybDkGvydBZyIXuB%tz;dYRs*D=ciykQW$$(^|;ss-uB!TUiWq+&w zZ1o*z$=obFYUEiUKv0jl;DS%nHZPfEGOJj=cpFB5&m$)W7r9H1`oG8mC&_)iMt)0> zo=oi4le*IF#d-58V3EKtS@?EM(&jTNkf1b~AD}Vs)6{7a{6U3|cD5@^eST#2TpFZ>pB-XULDFotbhTNZ2@`Ga^>qJ z(_#&AOGf$H;XvVS`o1v))+qfjacLIQl%d{5j*CYRI$9XlWauwyjuuF4Jt1D*c2Z=W^F^>bl&)9yrW0+B+`Wn?`~a{_<-He45&s;M3qg?|%dB^N5{OcFxV zKdm(oY6J0#hXiZrs;Ibzi-d`le9t$$|7vev@=ubf0l{E>i)tOjURj2V_B7z3;*s0lZ5(Je<-g8Y%DGv6!N$d^nHu%rI17kvXd5nw@KyxH{j{ zWLzs7d8wIG-g|X-Y%Ink`1pb{Fm?+5_}u`RS9@7pzNz$qs>V!GQ&aepMPQ!FxDBDQ zuD=YCo>GYIirvDnjj;eKp}%ZMLj7e1%^3!MP_*c49&(Xnoi{UZDCro^DEQVLL}0tQ~h8zpXZ zOiDn-hOM8@LL9)$3F7UX&Cpu&14_V_44ZQmjcC!#7Qgp| zV-2s|ZBNk8MwJ>qx9D{1ejpD|sQw&?r}YL>WQq{S3HN>Hjno*|^~W*y_|Q1|;gTL= zl0}^>dCPQAL1SIwbkA|1zbNkS{e>N^D0CIHiD1!r5h5Z23q4y^5;7qvD!TstY>e1g z9JXJLC#>S9l#iL-?FucVNZA`L!+Fe%xi%p)Q&K((wbAkV1t-jh<;vRzmg`ffGk(^n zre6+lix5g}4Y#?7$VtzSU3Xx7NtYZ<7`cRW@jBlYfofq`cW#55P0OOT9)h5|DdOrV ziNE(nJ8jDLRWH}Wl1HRb$!kj_efE8OKY{p;_&L}kt=FMl(^dJ`tilWwm5v4enDycW zfu6;T=9n295ui}x^CI}cO+a5T zF>d8gwA)96-Atw*|C&wR`%4`U3;PBI&%c=eKId3#1tWHbaQrU zVYeotw`!s8@6T0pI*?Z=;3v;mdcHb zo}80?_St)%@8{$}qRr-lsEI)*Cqn36WU0nn|7mElK66+1gNwMFf?P}&RwfCO&~Png z3c7TID{NSsOTKKC#v?uaciZN1mfbrQ2xH^kUvo#FljYU;KR0A6w)dzp^_xDcJq$xA zgSA-zQ-Ar$j3r=_yl`Jhai+2FIl@WrQh_$n`ID6xGK_MadrJZQ<7v4~ObOhQL&}p$ z^tZqN$n6UGqv`an+_o9Qt-rxe9aUa-WiPkK#e5t1VeeLk!BJ<&`_=rLjGaK&#?QnlA@Jem7rKJ@Xapt8A~r6r zWH=~8nJU4;$sx5(uZer9F^yJ--xpYEYJ7ySP=-GeyPfHFrDw>4VrUZVq8fZCQ84S$ zW#7?5U~$3V{2(-<1PzQi3^`E}-XwCe=V?8k>6hZF}+S3rH8|&XAe4VizO}H+SEW<`SDq zq*CW|t7~JF%g(S9#P#g$e>`i7J_c)f1QujVbwO@4BP+^u9CO|I01`6Rw%=GK9LrDg z9B8imYvifx%g@msq^fz(6h9oiRk$4y9@y)u8x{zp6EIo$A=_-5P;Rc$QANERizjrnc4*w3C zNhr=X0h~Ew#IhIc@CqK8BF9+8@X$EJ^{YtV1PG-QZ(CR_S zw>D`>bztgdXRlazjJxXeWQ^}9zqKce?8QjIjuj=KIof~Pq1WM@%{LySE0K?`_ z?x!Hw&^>Nvm}*8%hYU`_9+ybJf{a4&dcgZIFxdu$Dh7Wkw^S zUN)q-X>O)Ej~f%^ecwX2S9$UDU=W9!jqB{jtO||)Ja#uL$>4M5m@F}uny@U-16rIp z&U93?ZKjBPDrH&G{dRQj(1UQs5P}jLEu0(}VOwzuR55`;w+`G0zIvbjM2CCp_S8U` zMS5h!WdtPx!Oc{D8x-?_w=@pis4jEZOg2SfXQQNa^U{gBS{Oh2$TbHa5^il-!_93m z5R^5)?`);+uG3df94=ALN919Suy;X7iMGK@TVVmip{=#CJf`-384X=v@iL|icAkXk+nTwg?CnL=L#-0tEiM} zwFx5M%$Ch9yx>1Va=nr_bhS+r8yXQ2A!0p$9K2K1oxm0wrG+n10a^`_QQm8WaPO;O z3R-zX1tw2J?@Ks?7mE)&7-TXsbul#xiTcf{K4@!VMc;V%6gOdjVF7-vDFXVE|H?-g zRzilq-GuI!cgvj&?SWuJ|JBt0JCFJgjin<86bdmw)&mv;k4K`Q#Lv23)REm#Y5&U8 zVL%)SZTqeIa_%U2b1?L$Mo@{YVmE=lCgq!udKU5q$NDp4%&)K&y6%N-ZNAviP0o(< z8;`~{&D43Pk z6jY^+vF+9Zx|Z@ohOrzT;BPR2E0Jf7MO#7JKUD_tv}s^w>vghZeCWL^hQwutG!{#E zwDbFIyt2${!n?7sdbslRVNsN<9<-;=Jd&1f+N`bDUj?+Q&{DkZ*xJZvS6P>DJrf1P ze&MLGEl`5MUI-S$%BU+GgQXQWfg$0mv{31$e9z+E}>}-4-ov>l|S^^i=cH~6s zV8zyQTd*)T>Kw9kBbA48zg-xT554tDO_%uVv+g`eB8z-r;X1R?eq#o#G4Mde0ttwp z_mWtV0niiRnB|Y=2xGm63Y^{c)>-f6dQq`O=dX5Um|MjnLeENMQY*ijX1<)xS2Efm z4oFR7Cmw7AW%QaaP^)3EEbSX?=a8Numd1NlS%$@*%Ke7jB3v}SHV7ai1w+Vd8$gtM zBlu^LuF)^k!B)?~6_CY(&uJPw8x_$b<&{87TmVw=AVKd^33^e^l8Kq~PmV`q-DJr; z;c(t>-d`AJ!F7(7XHsFj&~6S$`YO><-3*b12Jvs{t;w#f0t1G|26=m#wY|VGfb>!{ z=7)#(U+i*PLIbrHtcw-opF-|Lqd~c;W5P2_@*3q{vm!Bw0S~&>JF{Hjg3j>|Cp(Ku zzliw^n|Ey&Y!4?K+V?$GMx;KIrr&COl*e3z(Fi`u=j>&rOodv#HZWMn?P3Y~Hz75H z6_RVRD{uNn_!w21#^@hxgTy&P!x&uPBbaJwAXy)tXn4ExF@-MfmuP8#dqDQLEkC6n8|6yyzl`-C!=I9Rj0^+l21(XRyo`QHwXX_@t;hM58G@hg3Smd3TXMC<7N!;q-ibi^cqZ_drr(&Xf0M~)R zb~}@p^}p=yTvR4nnXK@GpTPdm4*sd>z(ODYubA_{TGsza+520MQnduc3cj&HC!c5s z3l>XIBz$^h-xRIsa}xeLP*_1c`!&0%vX61pk*RoJ0t)h8OYvJ-HdHaZWb`rFZrrLC zdC6kKiEF>eIyd6N!j1uQHWcC+12O>r{LWH#9dIg$c1bh-a-w%GwbhO0^Tnrv&i`0{(`ZXf&GpD&8Ivhl^6a_s8n& zKw7Mo1-B3%2vr$tw{^o5-8Q4@;Y#!v%{!Al?{9_@u#%5@PWo=9Cr))^yDk$xorbX0 zW$+Q-wJLADZ+GcD$(6Ne{A^Sbgl}92%Ah77btQps=@;|uJ1$)(K3KXfgZZ3l3iUXf z@PG`E0weg$Pu(Y2->5(X$|N8A)w@cX|1Xv$^5;A~rdt4cLE}UuVrQH@r%5z0EYl=H z#Q~J!E9|qxrdlnD%Ozr*-91IuK;n!>R0QNm<+=EM)Q=39SN&&n1nG&sI*HE!khQeL zJ44UlTVmF^mx)-=kocfIhurzFGK*wk9IiItSrhKd=7ZkyP8Wvz2uE>@itzN7pD`&WM>xUkE~Dn z*!GlxmLAO0DI(!(V|zrm}if+r}$wl(ZO86_?%_$10yir|5w72*KN2y|m0O5Z;8$oD%#4URQsYnayR zhoFkM4uLs~xVyl-mF{=NSLnSr0VP`sL7x>B?gkLZsA{`Y3qRd*y|?>>!EELh1ZDrF zvyQ?leu;evRYAkEmt3%*I zG8r+oo;xaUH~@#jh#nxj`Dwo? za&BK1iqsQ6Fj^b>VwV|z3@&Pza2Ng*Y^XH*&aAt^-~3{k@KG}PTjjw)HNe%PixiYxrW&;R`_km zLsIIZx!W^l%=8wR8>px~70nmstbj7f2Jn)eZugbZ6~yK0p0|`ootOc1-B}ASd!?ah!qEF>oN?M7&%+aI-w@6<5ec598<= z(?Bq`mdVBgWL7C76v_=MgKbOuKxym*Vh&~+3NBDV1>nBgDmPnWR0`biTQxeUNNrCM zM7loEZRrQEXart+2F@+KY6cDh=#QFJ_*(VZP7Iw5nJ%+(cm;OjAjH~Idw8uJ96x3} zy*o`gNrSj>YY!oIr^^~);#Y=7( zG-W7`NMOnqmmq9!%qfPX_vUMa&a~G4Cxy7V=dnE9XZc?lr~eVIQCogwNvV!S_KamH z0{9Q{U5-M4PECmqTvj{xJ5(t#dalKyO$>{P#x}WiNl(hw)c6S?t+_oz5kj)_BzS*v zI0eA=Fn$Fwr0+jqUV6FX%+t>73mUsVbqub*yUQ#u7!^bwTevS{HDFMN0W_Z)&chn# z#W9n5-#QWz9W||zHVQ33x-?eWw?h;vVL_=5J;fJfZWo}{IP>O5!B0RlKkB3$`9jd0 z{RyjM7S5cuAsc=X7R@TUmK|^%8r>i>`($nYM8Y+Ki=(brGOxJezzi)n8MDpjmpSS8 z0=0g%kKa^&HP-6+Q8c?Om=meeu@t=@d&zm9iv$RR43U+MT~N3oly>=pFBsBnTn6*9 zTDA0jO3l|Xy35N&lW0mz=V(adH2R2k7yz;%KXd1Uxr((xl~6#R<-Y$acCB?B9Ek7? zB>>7RIF(;>oTlajk56e&twOee#inJTZ8d-H<$!gJMM)ilt@WpGfE$JhWY|q>k#QXk zn=Cj1p}Z9Qgsu=c-v0(Wz4UW6UnA`Kt=)>rnFTfi9?9K%(R($S_+1z|;^YR9E@EoM z#mxz1<=4t~o}p(tGA2HNIIVMt)`&}#?;8BDv!&<5i+~#rgZB;Ki?jEl0zaW|c8Qq1 zAg^uN<<^5hLfH^W61!SOm|BBg#WoS7{>_Eyl1&Va(pS98gzPkR15Vmmr#!+w0v)eN zp=YQ^2Iz085WhX2sB+W@^UBt0 zQU3VrZ^y9H>$gNzh-~veH<49(%5uJo?W0o}&5Zf*FzTgCyXPyVH-kNzM8}_NpDCTZ z`jecIa7E(&_4v2Xu5NOIp6)!dvHfA~KA46ZdN}b`ui}&;|9*j?2u@k`U14B|A+Av! zgA7H-92K6py$6?@3^l^G7hZMW|E>n9^MPrl-pz`8tZV$&FMKdBc^i7d?vh6|4|d3d z7|*LQ7~q%KeIHo+zwuCA`W~!*VEsl_=DW}V`wxm5KT56@dJ^v6AJK47@PhQ#uw&&s zWfjHeI>z=wPbPNv@?{iukL!F_qLuu>FyG$bbHuz@_dTepJq}6fOG2 zkSPAz8#XFS3+)_@%LQD5b+_FI*=hu5D7A!l2iuOmj&$dPl3vDo>E<19lmMDge7FU+1u;YdbpklxN>Sp z{0!m4Mc)Pkm-g6~$8QLZl7{h~56Yq|d3IyBeW=+k{AlL{td1klut9v~zWbDF)*Efo zfD5riMI|PBcZuupZXSNR!;4j~2U0hZsyGcVOD$AP8!x-;^A^9H7r|{l^ssA1o|7|3 z2c0;&&+8O1n+vMhEfj}`aDf#;2J2@n~v#%?$bGrqA+-0k)o zwxAUq#>RATUGR;^)%joBcs)uu2zwEB@Rv_Tn@64!&R(42LwbfA~I!06lF!dS1&M zD9>GZhxvWkg}xjR&O~i)FWY`{0MFQ(de%UUK|9wob$A6)<1^`VT;NivReJ@ z4MUt2qUEH1BYq%|w2spsMy9MKY2Uy}Qbk^oRPNO( z7lN^MiVJfMrm4#@WZYZM-c_iMKdSQw!OF0bcJfZY->`FYkyz&%z2_Ys|2U*xuKSrJ zT!A09ehkze>sq$V#6~kDiIkT{IPKD4Jn)^jKix6ES~ECn*^)77*KLdhLE$z849Ihb>RQGw+2Xn)Q6A3Cxk z-S#9T!Kk4;ot+XYI zau*K-@`HL{-Q-Ry4}Xvw7ul0?PLa|mVIOR?^H>QAB&~)t2>#Uuz+xQ0*_x;N~Aa6V-?f7}X~oaH&ODg(ZoW5w#-A9+0g5>5Su<5`i+ zIO8n2bnwtgC2QevWaki`O=;JmUq$#KWPGCl8U5S%&^vE%8(T0~6$F&5`&pT18tULu zCV9eo^2l~X(>HeJnXg>3?kN;|5SA8^Ol+0NA(BCw|ErWZ{0Z|kpW18Gy5cq@>yFRL z^^Eu*;;OCWNDt}X@*E$V@2IHTPbajj%2%DBKo;CQc~-X7EI(!F({)^R#;9~Bh-SQeW5Pf-_L?`%g9M7~HU}jzO-t24%TGWQcuJV5)PyYYkMC#2R)3{ig@?%WWG3ebO N)pT!V-?;bW-vD`cRucdK literal 0 HcmV?d00001 diff --git a/docs/assets/diagrams/service_architecture.png b/docs/assets/diagrams/service_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..f4915b2c6f06193ef64dfdea6a74095ac7764f21 GIT binary patch literal 51804 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 literal 0 HcmV?d00001 diff --git a/docs/assets/diagrams/sms_provider_strategy.png b/docs/assets/diagrams/sms_provider_strategy.png new file mode 100644 index 0000000000000000000000000000000000000000..5c99dcfd80c6d827c185c7c996a7911371644b8f GIT binary patch literal 18511 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 dict[str, str]: + return { + "bgcolor": "transparent", + "pad": "0.35", + "ranksep": "0.8", + "nodesep": "0.55", + "fontname": "Inter", + } + + +def node_attr() -> dict[str, str]: + return { + "fontname": "Inter", + "fontsize": "13", + "style": "rounded,filled", + "fillcolor": "#111827", + "fontcolor": "#E5E7EB", + "color": "#334155", + } + + +def edge_attr() -> dict[str, str]: + return {"fontname": "Inter", "fontsize": "11", "color": "#64748B", "fontcolor": "#475569"} + + +def render_service_architecture() -> None: + with Diagram( + "Service Architecture", + filename=str(OUT / "service_architecture"), + show=False, + direction="LR", + graph_attr=graph_attr(), + node_attr=node_attr(), + edge_attr=edge_attr(), + ): + browser = Internet("Browser") + demo = Blank("demo-app\nFastAPI UI") + auth = Blank("auth-service\ngRPC") + worker = Blank("sms-worker") + mongo = Mongodb("MongoDB") + redis = Redis("Redis") + rabbit = Rabbitmq("RabbitMQ") + providers = Blank("Kavenegar / SMS.ir") + + browser >> Edge(label="HTTPS / local HTTP") >> demo + demo >> Edge(label="gRPC") >> auth + auth >> Edge(label="users + refresh sessions") >> mongo + auth >> Edge(label="OTP hash + rate limits") >> redis + auth >> Edge(label="SMS job") >> rabbit >> worker >> providers + + +def render_clean_architecture() -> None: + with Diagram( + "Clean Architecture Layers", + filename=str(OUT / "clean_architecture"), + show=False, + direction="TB", + graph_attr=graph_attr(), + node_attr=node_attr(), + edge_attr=edge_attr(), + ): + with Cluster("Transport"): + grpc = Blank("gRPC servicer") + demo = Blank("Demo BFF") + with Cluster("Application"): + auth = Blank("AuthService\nuse cases") + security = Blank("Token + OTP helpers") + with Cluster("Domain"): + entities = Blank("Entities") + ports = Blank("Ports") + with Cluster("Infrastructure"): + mongo = Blank("Mongo repositories") + redis = Blank("Redis OTP store") + rabbit = Blank("RabbitMQ publisher") + sms = Blank("SMS strategies") + + grpc >> auth + demo >> grpc + auth >> entities + auth >> ports + auth >> security + ports >> mongo + ports >> redis + ports >> rabbit + ports >> sms + + +def render_otp_flow() -> None: + with Diagram( + "OTP Login Flow", + filename=str(OUT / "otp_login_flow"), + show=False, + direction="LR", + graph_attr=graph_attr(), + node_attr=node_attr(), + edge_attr=edge_attr(), + ): + user = Blank("User") + demo = Blank("demo-app") + auth = Blank("auth-service") + redis = Redis("Redis") + rabbit = Rabbitmq("RabbitMQ") + worker = Blank("sms-worker") + sms = Blank("SMS provider") + mongo = Mongodb("MongoDB") + + user >> Edge(label="mobile") >> demo >> Edge(label="RequestOtp") >> auth + auth >> Edge(label="store OTP hash") >> redis + auth >> Edge(label="publish job") >> rabbit >> worker >> sms + user >> Edge(label="code") >> demo >> Edge(label="VerifyOtp") >> auth + auth >> Edge(label="compare hash") >> redis + auth >> Edge(label="upsert user + session") >> mongo + auth >> Edge(label="token pair") >> demo >> user + + +def render_refresh_flow() -> None: + with Diagram( + "Refresh Token Rotation", + filename=str(OUT / "refresh_rotation_flow"), + show=False, + direction="LR", + graph_attr=graph_attr(), + node_attr=node_attr(), + edge_attr=edge_attr(), + ): + client = Blank("Client") + auth = Blank("auth-service") + mongo = Mongodb("MongoDB") + old = Blank("Old session\nrevoked") + new = Blank("New session\nactive") + + client >> Edge(label="refresh token") >> auth + auth >> Edge(label="hash lookup") >> mongo + mongo >> Edge(label="active session") >> auth + auth >> old + auth >> new + new >> Edge(label="new token pair") >> client + + +def render_sms_strategy() -> None: + with Diagram( + "SMS Provider Strategy", + filename=str(OUT / "sms_provider_strategy"), + show=False, + direction="LR", + graph_attr=graph_attr(), + node_attr=node_attr(), + edge_attr=edge_attr(), + ): + worker = Blank("sms-worker") + factory = Blank("create_sms_client") + port = Blank("SmsClient port") + kav = Blank("Kavenegar") + smsir = Blank("SMS.ir") + debug = Blank("Debug local") + + worker >> factory >> port + port >> kav + port >> smsir + port >> debug + + +def render_production_deployment() -> None: + with Diagram( + "Production Deployment", + filename=str(OUT / "production_deployment"), + show=False, + direction="LR", + graph_attr=graph_attr(), + node_attr=node_attr(), + edge_attr=edge_attr(), + ): + internet = Internet("Internet") + caddy = Blank("Caddy\nHTTPS") + demo = Blank("demo-app") + auth = Blank("auth-service") + private = Blank("Private Docker network") + mongo = Mongodb("MongoDB") + redis = Redis("Redis") + rabbit = Rabbitmq("RabbitMQ") + worker = Blank("sms-worker") + + internet >> Edge(label="gapido.amiirkhl.ir") >> caddy >> demo >> auth + auth >> private + private >> mongo + private >> redis + private >> rabbit >> worker + + +def main() -> None: + OUT.mkdir(parents=True, exist_ok=True) + render_service_architecture() + render_clean_architecture() + render_otp_flow() + render_refresh_flow() + render_sms_strategy() + render_production_deployment() + + +if __name__ == "__main__": + main() + diff --git a/docs/implementation-decisions.md b/docs/implementation-decisions.md new file mode 100644 index 0000000..1b5c469 --- /dev/null +++ b/docs/implementation-decisions.md @@ -0,0 +1,34 @@ +# Implementation Decisions + +## Python gRPC Service + +The challenge explicitly required Python with gRPC. The auth boundary is therefore a `grpc.aio` service instead of REST. A separate FastAPI demo service was added only as a browser-friendly client. + +## OTP Storage + +OTP codes are never stored in plaintext. Redis stores HMAC hashes with a short TTL, attempt counters, and request rate-limit counters. This keeps OTP state fast, temporary, and easy to expire. + +## Token Model + +Access tokens are signed JWTs with short TTLs. Refresh tokens are opaque random values, stored only as hashes in MongoDB, and rotated on every use. + +## RabbitMQ SMS Dispatch + +SMS delivery is asynchronous. The auth service publishes a durable message and returns quickly. The worker uses manual acknowledgement, bounded retries, and a dead-letter queue for failed deliveries. + +## SMS Provider Strategy + +Kavenegar, SMS.ir, and debug delivery implement the same `SmsClient` port. The provider is selected through configuration, which keeps the worker closed for modification when adding providers. + +## Demo Service + +Browsers do not speak native gRPC directly. A small FastAPI backend-for-frontend demonstrates how another microservice consumes the auth service through gRPC while serving a minimal UI. + +## Local vs Production Compose + +The base Compose file is production-safe and keeps service ports private. `docker-compose.local.yml` publishes developer ports. `docker-compose.prod.yml` adds Caddy as the only public entrypoint. + +## Caddy Reverse Proxy + +Caddy was chosen for automatic HTTPS and a compact configuration. Production serves only `https://gapido.amiirkhl.ir`; internal service ports are not published. + diff --git a/docs/slides/index.html b/docs/slides/index.html new file mode 100644 index 0000000..138d16b --- /dev/null +++ b/docs/slides/index.html @@ -0,0 +1,103 @@ + + + + + + Gapido Auth Challenge + + + +

+ Gapido Backend Challenge +
+ + + +
+
+ +
+
+

The problem

+

Secure OTP auth for microservices

+

Python • gRPC • MongoDB • Redis • RabbitMQ • Docker

+
+ +
+
+

Constraints

+

What had to be proven

+
+
    +
  • gRPC auth boundary
  • +
  • secure OTP
  • +
  • refresh rotation
  • +
  • role-based access
  • +
  • async SMS delivery
  • +
  • production deployment path
  • +
+
+ +
+

Solution shape

+

Service architecture

+ Service architecture +
+ +
+

Code organization

+

Clean architecture layers

+ Clean architecture layers +
+ +
+

Auth flow

+

OTP without storing plaintext codes

+ OTP login flow +
+ +
+

Token safety

+

Refresh token rotation

+ Refresh token rotation +
+ +
+

Extensibility

+

Selectable SMS providers

+ SMS provider strategy +
+ +
+

Deployment

+

Only Caddy is public

+ Production deployment +
+ +
+
+

Reliability

+

What makes it reviewable

+
+
    +
  • Mocked SMS providers
  • +
  • gRPC tests
  • +
  • RBAC coverage
  • +
  • Compose validation
  • +
  • Health checks
  • +
  • Postman guide
  • +
+
+ +
+

Outcome

+

Interview-ready microservice demo

+

A focused auth service with clean boundaries, secure OTP, async messaging, provider strategy, and production deployment posture.

+
+
+ +
1 / 10
+ + + + diff --git a/docs/slides/slides.js b/docs/slides/slides.js new file mode 100644 index 0000000..054c5e9 --- /dev/null +++ b/docs/slides/slides.js @@ -0,0 +1,28 @@ +const slides = [...document.querySelectorAll(".slide")]; +const counter = document.querySelector("#counter"); +const root = document.documentElement; +let index = 0; + +function render() { + slides.forEach((slide, current) => slide.classList.toggle("active", current === index)); + counter.textContent = `${index + 1} / ${slides.length}`; +} + +function move(delta) { + index = (index + delta + slides.length) % slides.length; + render(); +} + +document.querySelector("#next").addEventListener("click", () => move(1)); +document.querySelector("#prev").addEventListener("click", () => move(-1)); +document.querySelector("#theme-toggle").addEventListener("click", () => { + root.classList.toggle("light"); +}); + +document.addEventListener("keydown", (event) => { + if (event.key === "ArrowRight" || event.key === " ") move(1); + if (event.key === "ArrowLeft") move(-1); +}); + +render(); + diff --git a/docs/slides/styles.css b/docs/slides/styles.css new file mode 100644 index 0000000..d8ebdfd --- /dev/null +++ b/docs/slides/styles.css @@ -0,0 +1,178 @@ +:root { + color-scheme: dark; + --bg: #070b14; + --panel: #101827; + --text: #e6edf7; + --muted: #93a4bc; + --accent: #34d399; + --border: #223149; +} + +:root.light { + color-scheme: light; + --bg: #f7fafc; + --panel: #ffffff; + --text: #172033; + --muted: #5f7088; + --accent: #0f766e; + --border: #d8e1ee; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + min-height: 100vh; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + background: var(--bg); + color: var(--text); +} + +.topbar, +.progress { + position: fixed; + left: 0; + right: 0; + z-index: 10; + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 24px; + color: var(--muted); +} + +.topbar { + top: 0; +} + +.progress { + bottom: 0; +} + +.controls { + display: flex; + gap: 8px; +} + +button { + border: 1px solid var(--border); + border-radius: 8px; + background: var(--panel); + color: var(--text); + padding: 8px 12px; + font-weight: 700; + cursor: pointer; +} + +.deck { + min-height: 100vh; + display: grid; + place-items: center; + padding: 72px 5vw; +} + +.slide { + display: none; + width: min(1120px, 100%); + min-height: 620px; + padding: 48px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--panel); + box-shadow: 0 24px 80px rgb(0 0 0 / 24%); +} + +.slide.active { + display: grid; + align-content: center; + gap: 24px; +} + +.split.active { + grid-template-columns: 0.9fr 1.1fr; + align-items: center; +} + +.diagram.active { + align-content: start; +} + +.eyebrow { + margin: 0; + color: var(--accent); + font-size: 14px; + font-weight: 800; + text-transform: uppercase; +} + +h1, +h2 { + margin: 0; + letter-spacing: 0; +} + +h1 { + max-width: 900px; + font-size: clamp(54px, 7vw, 92px); + line-height: 0.95; +} + +h2 { + font-size: clamp(36px, 5vw, 62px); + line-height: 1; +} + +.lede { + max-width: 820px; + margin: 0; + color: var(--muted); + font-size: 24px; + line-height: 1.45; +} + +.tiles { + list-style: none; + margin: 0; + padding: 0; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; +} + +.tiles li { + min-height: 96px; + display: grid; + place-items: center; + padding: 18px; + border: 1px solid var(--border); + border-radius: 8px; + color: var(--text); + background: color-mix(in srgb, var(--panel), var(--accent) 6%); + font-size: 20px; + font-weight: 800; + text-align: center; +} + +img { + width: 100%; + max-height: 460px; + object-fit: contain; + border-radius: 8px; + background: #ffffff; + padding: 12px; +} + +@media (max-width: 820px) { + .slide { + min-height: 620px; + padding: 28px; + } + + .split.active, + .tiles { + grid-template-columns: 1fr; + } +} + diff --git a/pyproject.toml b/pyproject.toml index f42cc06..8dc42c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ [project.optional-dependencies] dev = [ + "diagrams==0.24.4", "grpcio-tools==1.68.1", "mypy==1.14.1", "pytest==8.3.4",