From 927c55af0cd974e328cec8530cc3ac5c644f4bac Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Fri, 27 Feb 2026 08:02:39 -0800 Subject: [PATCH 1/3] save --- docs/features/sharding/resharding/cutover.md | 70 +++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/docs/features/sharding/resharding/cutover.md b/docs/features/sharding/resharding/cutover.md index f983a29..7600287 100644 --- a/docs/features/sharding/resharding/cutover.md +++ b/docs/features/sharding/resharding/cutover.md @@ -1,7 +1,73 @@ --- icon: material/set-right --- + # Traffic cutover -!!! note "Work in progress" - This section is a work in progress. Check back soon! +Traffic cutover involves moving application traffic (read and write queries) to the destination database. This happens when the source and destination databases are in sync: all source data is copied, and resharded with [logical replication](hash.md). + +## Performing the cutover + +The cutover can be executed by executing a command on the [admin database](../../../administration/index.md): + +``` +CUTOVER; +``` + +Under typical conditions, the whole process takes less than a second, so applications shouldn't experience any errors or downtime. + +!!! warning "Connecting through PgDog" + In order for the cutover to work correctly and not lose any data, all applications + must connect to the database through PgDog. Any applications that connect to the database directly, or through another proxy, + will not receive the cutover signal and will continue to send writes to the source database, causing a split-brain + situation. + +If you're using the `RESHARD` command, the cutover step is executed automatically and you don't need to perform any additional steps. + +## Step by step + +PgDog performs the traffic cutover automatically, as the last step in the [resharding](index.md) process, with a sequence of steps: + +| Step | Description | +|-|-| +| [Pause queries](#pause-queries) | Stop the source cluster from serving traffic. | +| [Synchronize databases](#synchronize-databases) | Allow the logical replication stream to drain into the destination database. | +| [Swap the configuration](#flip-the-configuration) | Swap the source and destination databases in [`pgdog.toml`](../../../configuration/pgdog.toml/general.md) and [`users.toml`](../../../configuration/users.toml/users.md). | +| [Reverse replication](#reverse-replication) | Setup a logical replication stream from destination database into source. | +| [Resume queries](#resume-queries) | Resume traffic, with all queries going to the sharded cluster. | + + + +### Pause queries + +In order for the traffic to be safely moved to the new, sharded database, it must contain the same data as the source. However, the source continues to serve write queries, so in order for the two to synchronize, PgDog needs to suspend traffic the source database for a brief moment, allowing the replication stream to catch up. + +To suspend traffic, PgDog turns on [maintenance mode](../../../administration/maintenance_mode.md). This pauses all queries for all databases in the configuration until the maintenance mode is turned off. Clients will wait, with their queries buffered in their respective TCP connection streams. To the clients, it looks like the PgDog deployment is frozen and not responsive. + +### Synchronize databases + +With the traffic paused, the logical replication stream will drain any remaining transactions into the destination database, bringing the replication lag down to zero. At this point in the cutover process, the two databases are byte-for-byte identical and traffic can be safely moved to the destination database. + +### Swap the configuration + +If something goes wrong after the traffic is moved to the new (destination) database, PgDog has the ability to rollback the cutover step, redirecting the traffic back to the original (source) database. + +For this to work, the original database must remain in the [configuration files](../../../configuration/index.md), so PgDog performs a swap: source becomes destination and destination becomes the source database. This is the equivalent of running `sed s/source/destination/g` (and vice versa) on both `pgdog.toml` and `users.toml` files, making sure the clients don't know the databases have been changed. + +The configuration swap happens in memory, but PgDog has the ability to write the new configuration files to disk as well. This is disabled by default, by can be enabled with a setting: + +```toml +[general] +cutover_save_config = true +``` + +When enabled, PgDog will backup both configuration files, `pgdog.toml` as `pgdog.bak.toml` and `users.toml` as `users.bak.toml`, and save its in-memory configuration to `pgdog.toml` and `users.toml` respectively, so the new cutover configuration persists in case of an error. + +!!! note "Multi-node deployments" + If you're running more than one PgDog node, you should consider deploying our [Enterprise Edition](../../../enterprise_edition/index.md), which has support for saving the configuration files on multiple PgDog nodes at the same time. + +### Reverse replication + +To allow for rollbacks in case of any issues, prior to allowing queries on the new database, PgDog creates logical replication streams from the new database back to the original database. This synchronizes any writes made to the new database back to the source, keeping the two databases in-sync until the operator is satisfied that the new database is performing adequately. + +The reverse replication is created while the queries to both databases are paused, so it doesn't require any additional data copying or synchronization. From f2e8e8e5644819a9776ef7852b6ff252696c50c5 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Sat, 28 Feb 2026 08:03:11 -0800 Subject: [PATCH 2/3] traffic cutover --- docs/features/sharding/resharding/cutover.md | 18 +++++++++++++----- docs/images/reverse-replication.png | Bin 0 -> 45869 bytes 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 docs/images/reverse-replication.png diff --git a/docs/features/sharding/resharding/cutover.md b/docs/features/sharding/resharding/cutover.md index 7600287..ee62863 100644 --- a/docs/features/sharding/resharding/cutover.md +++ b/docs/features/sharding/resharding/cutover.md @@ -32,15 +32,15 @@ PgDog performs the traffic cutover automatically, as the last step in the [resha |-|-| | [Pause queries](#pause-queries) | Stop the source cluster from serving traffic. | | [Synchronize databases](#synchronize-databases) | Allow the logical replication stream to drain into the destination database. | -| [Swap the configuration](#flip-the-configuration) | Swap the source and destination databases in [`pgdog.toml`](../../../configuration/pgdog.toml/general.md) and [`users.toml`](../../../configuration/users.toml/users.md). | -| [Reverse replication](#reverse-replication) | Setup a logical replication stream from destination database into source. | +| [Swap the configuration](#swap-the-configuration) | Swap the source and destination databases in [`pgdog.toml`](../../../configuration/pgdog.toml/general.md) and [`users.toml`](../../../configuration/users.toml/users.md). | +| [Reverse replication](#reverse-replication) | Set up a logical replication stream from destination database into source. | | [Resume queries](#resume-queries) | Resume traffic, with all queries going to the sharded cluster. | ### Pause queries -In order for the traffic to be safely moved to the new, sharded database, it must contain the same data as the source. However, the source continues to serve write queries, so in order for the two to synchronize, PgDog needs to suspend traffic the source database for a brief moment, allowing the replication stream to catch up. +In order for the traffic to be safely moved to the new, sharded database, it must contain the same data as the source. However, the source continues to serve write queries, so in order for the two to synchronize, PgDog needs to suspend traffic to the source database for a brief moment, allowing the replication stream to catch up. To suspend traffic, PgDog turns on [maintenance mode](../../../administration/maintenance_mode.md). This pauses all queries for all databases in the configuration until the maintenance mode is turned off. Clients will wait, with their queries buffered in their respective TCP connection streams. To the clients, it looks like the PgDog deployment is frozen and not responsive. @@ -54,7 +54,7 @@ If something goes wrong after the traffic is moved to the new (destination) data For this to work, the original database must remain in the [configuration files](../../../configuration/index.md), so PgDog performs a swap: source becomes destination and destination becomes the source database. This is the equivalent of running `sed s/source/destination/g` (and vice versa) on both `pgdog.toml` and `users.toml` files, making sure the clients don't know the databases have been changed. -The configuration swap happens in memory, but PgDog has the ability to write the new configuration files to disk as well. This is disabled by default, by can be enabled with a setting: +The configuration swap happens in memory, but PgDog has the ability to write the new configuration files to disk as well. This is disabled by default, but can be enabled with a setting: ```toml [general] @@ -68,6 +68,14 @@ When enabled, PgDog will backup both configuration files, `pgdog.toml` as `pgdog ### Reverse replication -To allow for rollbacks in case of any issues, prior to allowing queries on the new database, PgDog creates logical replication streams from the new database back to the original database. This synchronizes any writes made to the new database back to the source, keeping the two databases in-sync until the operator is satisfied that the new database is performing adequately. +To allow for rollbacks in case of any issues, prior to allowing queries on the new database, PgDog creates logical replication streams from the new database back to the original database. This replicates any writes made to the new database back to the source, keeping the two databases in-sync until the operator is satisfied that the new database is performing adequately. + +
+ Cross-shard queries +
The reverse replication is created while the queries to both databases are paused, so it doesn't require any additional data copying or synchronization. + +### Resume queries + +With the reverse replication setup, it is now safe to move traffic to the destination (now source) database. PgDog does this by turning off [maintenance mode](../../../administration/maintenance_mode.md), and this step concludes the cutover. The entire process takes less than a second, typically, and allows PgDog to reshard Postgres databases without downtime. diff --git a/docs/images/reverse-replication.png b/docs/images/reverse-replication.png new file mode 100644 index 0000000000000000000000000000000000000000..f159babe5800720dad88485bb40986f8eaa8b144 GIT binary patch literal 45869 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 z zeGDhg^=t4^9InSIhZ_+;sb znn1jb%}r(M?&taW`G#U15U691zwEBI=l!m3eFxYQD5`V+?W^?7k!nxD6AfGZ`sK?S zlal~3&Sx+s`tHk-&B{)3g{>1b#|&6+FUnOXM9Obc&8ik!4H5tTyCd|GK)lkjGFUau zu&>la)9J`Z_-&hMs_7?>+t}C;U^!>Kd1F*J-bBpJa1>(J+len}O!Lm2Pth$OUNjUt zb+VB$cL9nJzem-jCt<P^Bxc@#9eEVUzjG`+<^^3u`JMJHE z2=UBzq)PgNqIyDr|H+a4XlFnL2+*AA2t)ZuPC|83(6E|3f4-mA`&TwYE}SvP8`AGB zvFf8gMY5=M;_qLG6H(9J5};t6LH_+{d^}RvRMMzB*9p1cwooTT2KbF3s)cFR>twl%w>I};S#%7$E~?}?A@gKoS)Nxd{?I<*#W|^K zQ6wZJG_<#ST3pMoMYYfk;~i5LxeySL$vuIML3a{+K&~l9&stL3UJ16w1!&yg;=)J_ z@R!fGIey^VvdiN48S@02A#3f2mz_5kho2!aAZ^q6m)MdOrNEXVng&brTt~gtSKJcn z4Ky3a@59FVMxLbB9)@P|W-eu|qriCiRJ{h1nv*p$vG@56b>pGZas3M#z|%Ypru2@E zj%WF18GYAIc#*3lTEF|=O(5SN<9v2rUihh$dEgg|PK8RRDQy~v``FJRCKxH{VTQ@s9w+*on`V8x7eXiVCO-P^dEz-eB-+8+vCE zrR%%r4DzEBJbR)UG!O_zynf3;pwg*y$xCHng_l|k`>sS&$TN)8c<-e2l6qY{k$sSd zr)N)3kLqf)QE(Fe`99*X=5Z2oavhcCq&54&oyFnGSkAORcTe<+Zh6aVdxF(B3&aHS zTitT>ueTX0wHR*-w>DLpf?OLkoT#KpU$?yS?9_=%(g^S(`mwzH7E(PKq0v$sV7`@` zn+C8lS<$?s@>>cLa#WPCAY%)~JDc{|3AauBZ?Xo=0NxRngtQ;I1TKf9h68TYw>1h6&>fPSL`=G&8nre}{HPhVLkYA`spPHY~ zg7RJ3jj&zV51EOjj{(vWm|c39mJ`s$!S=R0+2E)9W^-@2TsY_o<a3Y_hxUR#Je56ytKj7l2B5rbG*#`w5KA=_Tt1nzQyqp(xWE$9ON?Pitj?ToRX->Fy=Z}=>{EvrLwY1fE@wdhb$sm&r5XTuyO4xhe79*KzUMY=QR?}%Y*uX%E`aV*KpeGS+G(7l!{W zC|r9!Ml?JZIbl{1*v7-Uq=$9-V~)UY@Cs0*cMey&f^N+DcsK}QT0=?RH>WBoDLI@= zseyOmFK~ZKCnvA5@!m;O0(H+)$;PKh@3I&u)mcYNIjr4LH8(Z-nwvnN;u9)+gTL>! zEw~V+(+h{&48eOdP8IlMlfthL5@2Ea<6vXnEf zWuATOcC>fDI6}Oj9f$JoH=14uNed2G_uc>~OZr(DJFsipAZ*|{WU%#P%cGYro(es7 z0GSM^DznAd14?{d>B`jyR3tGx@n0qAs%04b8jo4r9WWqY*S9oUTdQ#AQj?cpG(zJz z6%tY9KP)ypiwCSJdp;=R6Q7nnR-{as;<_JL(rDQaXoTLNfB1RK^lTYkvc-5EWfl>x zA0JedmAec+Bbbg8s3b-xPer)n!#SQ4drcnp;6&89?;kvPaB0ArTd66& zif#t55YpD7blTzVjUl^?D%~X&+KVq!ej=8Mj`?x<<`CDPV0P22%5M?GMm0}3i(D24 z?*;fFevlmrR$rV<*k?CyAiu70QH0+xY|DCKu!IN;9Zi4bSl+F+`uab@*iG3!X+OPJLKS@jt}y z6fZ#Gc!}>kh5{ZQo(1g-M zzamsId9Ue3gM8CPAo%(C)X{QqBB>DGE3&+ph@J;WR;0*X9RJKMH2h{088sQY-|Vp> z(1)U==J1xGW&RPZSr#!u1>HQ-8X0UJVD)6R2}k!pg>cHGR|Aq!Gha z=&?SF*>lQoRuqF8wI6-y2uk4^1tq->JrSLJbtsPsE}w>Pk9?O#_NB(N#76Rmd{IIZ zSwGfara|jXef?zi7!$d-i@pcWK8wE8{zuRe3+WhcRcJ0 z4QGe7TlGCWv|?HHdM8?Axda6Tm--*!k~*zT-?bTh7cBaGx<2q+WKZ|frWI7pNc$fm zIznd0b$G66qk5U1g7SRFr5Uejn0wl%71qp) zitbmhUJZ=Iz`!`C91QWL#Hbl>VW2p}K7mElEMK=8S&+V^_-$!(?ql#JggxI0cWDMxyml zz1^R|WiM+-+l3Fb^}JSMYtLBszrE${?LAm%)U3QTHQSRD*j9Pzx;#Oz!WZEtC^cqF z`gG%otYti`wLLv6bv+kKLb^E*{%~9OFZcf*g`6Ic7LZ6DYt0`~$w-R4oVjD%;K!$x z@n%mI*5fczlZ%-mW5a!Su6P;`d_2S!Gc^QWWKj!fHo ze`{(Gjsmzw1ce}y)ydQ8W`r?^CME`;dGJYgax%3z&C_~!*TwJmITN=)e*>G5Wv5p= zzAeG-7pm^V$$L89NcQygsc$^7O&+TBSkK;{dA&aq9ADRc?nD(eVlHb;zh|F}RKe1q z@Z6a1SX*;4Xdd3htBmKi>9i`SPN&?PmK3j?NA1E+W+{T4|DEHMyqtmpQN^X-W$dor zHK#G~zQoJ#zMik*_`70#@~nM}anZN?)0;aeu(RH1 zpx7)D)H^YxAn!%N95Ad>ywRAJCvuZX91}?j`XWL_R(zxCl!Na6flltUdTGd{Df+ z@=DN?qH+%)(881wuqdS4auSPPO)f4e_w?xg!ssjB_4m5pj!Inn*)*DFEX)Tcr6{%U zFBC&b`)4RCcB1bVL*16GU`9xwepgpl1u%5+d-<= z(BWLJ#DoNwzY7d>aFPZ_BM9iP*0BfxiNj8!Id|p z5ll_MjC0Cyv4&tF;?3VHT?>|199$Qn4^dKDYH4r(?d}WB^T&}iLL+8^t4Uyw=*#3J zRyMlI$oIDD-9a};)UKh8fjVVsP~C{q>3XkedcpZ=evh@x!J(mZ%D$jBnuWvOu|~tS zA)UmGMokOZKj0YWm2{hSMa#jq_BSYW?CtGe*LTp0wLQ0D$g+wpXr1G@DVt{AO_ zy}cr+NVd5jx2x95_Y(XY6CFwG((TN8%@eOytH_RbD9=ocFF|wRl&JodFSwbLXI&kK z%N;WeHxJC4e}0c>n(&BtKCSj8C>x9l{BeToJeXqOl*SCMlG>>wZ-)@UeOa0Q10391 z@#{V7kx5!`&pqH9u*dbl^yx;YzDHDm(a^uVV+kG^<<-H3o*UCFe^_7Mz5?_-rV?G9 zrrOAXg*xx;Z-Kj{_te>(A5i}D=T}Qq;FEQD2I;Ins4RCVO69-l0R0qFw#?!Lln|F61^1 z(qqkBbJ4Eh5iS5x9`iM;m3wUqN=$uglNrNPK#`M|SL0~~1+V>&U}}9Us~nV90JZO) zST|l_K7$ga{m(xu0A39|LRpQ@Dt)g_Qu9Wk<+r^SNM|? zf|woAxQtcwPHr@$7iS`GHWH)A03Sg0+J?&CKT|U#8kHz-e_l^ubodS8|JRBC|0m^% z-=kRh42DxA8-phhr!xS^!GRIbuM7#OFdlL#q`q`)`bmpdjM52_K7hu+SI}S$!9A(C zP^hyVAySBsPx`51ESdJuLE>>8)m^R4;%b!)(9SptUhXfk(d@-Uqo&n~*hL_YW&sXm zVUB+8Y{0*v-H#8Apm1S6uF(`Xp>b|2tz}PMAJ1c_MBn|~a4d-y7Z0!V7}=X01*e>$ zk{Y^10aC zotrf-3nYNN+dDAxaB+o8oxFc5LD17BghiC|AwY7!kTq_z-C0mX8-#e>iP7~W$v71z7cC zI$fp~pgRCCI}|M@g|T0!T%d?Pc8MbXBxGa)H)gsF#{sB0qU^k?liy<8*|Ho8wz|=H zo&0Y%W^Tx?cGym{_jciZ6zmLOtwOw3!U@zw(mSs*?yK^29WyP6dJN>J8HIm?rFJr@ zp{aDuuHv$LSE&73DG*eTg>F^o@qV$@R2#A{{c|=+t1tg*S()uU}JFSN92G zg0W^V*7b3t!WXbxJPLu#(o$~h$3?PfN)=8s&&C-Vl`KH#HKW}P{vQpLaG(~w4poya zA#xvh`kVjSY!j?bBQI881@Jfk)ye|VU&Bdx2tpglTybU6fW)aubv zlq*#KLA(-12m;tAi&b;fhM|=5aSnZkVnsN#1j8AjZ3ymWUFkPEz^%ZAKv8OFmKzqn zu>Jo2Zl{ys%-G0f09bm`=EV(q=6DvreE9+@@Sh_v0UuDcwK)!YfVnXM_#42N*Ck9= zc3D#w2@I)M+_Vcd?v&cZdgZfEzJVN`LU%T|y~1s!t$^}H>x6FXyHLEk%QvYlJ{IM+ zs}<-9)<+uyxuhB>8v~uO6wEJtl|m1EVO2PX(-s#u9QF%F17yF}xJlAnSb{$8hGxuq zMJh!Hokq9>t#@~KH)l~aw>s*8sA}BJyihsfHzqczIx0Z=Xc_qo?OG*@YuP~x&AL8E3HMX6Nra6o9=B^0g>>QwYnI#D*G3)NrfCh>QS zF0r!D&-PtuTjI42bC-qY$hMczmX{E~kC%lu0K;?>h!CrJ4wDGhLu#;Vj+fCkLo#Vf zGS{MR5K?KytY?8NQPxhwdI1&{Spcs?fig`%Ho{VMWXlr)?1vwHHmSRFQlNgY1!(lw zbd#me>-alrs_x?U!km{bPt$xCha6=ahA*^00U>Agns=$3Tcv?XD_AOU8Q{?>e0r9s z;DK|yv^s&PrPcxTAl%*W2R9m=wix>4wGY{UZAVC#p|maaDom{Gzk3#0o~>II`+sA+ z=W#x&7)|m3uh;lhp5I5-#M}jddsKU1b~die_)4|{^vwGE!A1Nrg4Bje@o;wn52}CXR|_I0%uu?O zy!Q51c5$&X%=-XyoQPsHYh>*m9F(A;l7HL3yGWkSC(gus3lMn)4=77tOZ);|NRmc2(%?!M{VDE@G?IdTD61i6g<|d2X-GM5zz~X$?S- zL^Nw(Z%7a3n2e;B{JU+^S|gofqPYZcghwjL!@8=FTDS8!IP)A$2~P<$J}>;)^MOu) z#ZakDz(X#^*Y(YYg$`Z~a#F~a{AQs1VHFau&#c0G{Syw=N?G~!l3QLi_1(sY!)wZY zbq2^p7V8=$A77RVV~Mtb{z!CcWElHvh+q*aM&Y?Kx<3Fi&8DLrgZ3qKhG3E@{$U+e z0f{s1Qz?3i$Q#h?S~yjDH~@7aog5{@=Mb}1c0H|Mr}oh;Xa(=IvrhCvvt(KTh24u3 z#=(S~6H*6rA54|;IipvVXm-)PW$9dOoo{y1A?8oJf`<>=YZ7Jpr#~(2-$WuSQtdQa zi)ilfqppuKhWg=aP!!9lduu&n_>=|>518@0u{%1x@(CIN^$oioLAGU{x;!ae_V;aB zo`B0aay;O5nx}kND6#YP5r1f}Hoa)?&DZfP9E4s>F1GfE&_xoIhAu4hK#hcTmQ+!I zLT`3$JQz|l^_gqvi0+&k^KMVQu1al7kH$}H#73uLmpN+$A;*N`+5WdrzM0*j7mP6w1=H5Xox+=P2`sfZO=7Y-w!MCfRB=-i3 z(`w^7x6<#Ki)Hl1tm%b99~>t~O{~tnJ&TOU44Eht)jF~9+#?@m%3!Jm24U2RD2hKO zE&q(;vWn<#;9)={-4~oEuJWztKvqQ$vB%8KlkCm>`m}#_R~!8;)bJub-U=I1vmFi2 z=XTzGN*ht^hQ2WQJ}UX`DmH7E?;g6O-5I)R9Y6Q4sWBFIf|7uwCk)L9zqk^v?ORl4 zGQO`%zO{?T_N*}u2Owe|`r&78FLjhZFwoyHiZ(A5v;Ro^Tdw--!$`rY##hA9gMenj zbw>8YMUVyL=bA?NbkL|T)Ual+q);F>+EAb4{t1~w%j9%9Me7R%l^XlE%Z`NuMf)o` zdk0>jjHfklPKhR!-aZO-9@;GGuh}Q*E|3VBa^qB)gl*Lm-|QG1M0P$dzCg78Q?PPG zU)rjwu#M_-U8xNWP}Tgh6>Tkwc*{bKNFuZj-%n??T9an5!i_P{9w^eKqeXxFY4i+$ zCM2=vap~3pReG}ajN;KFXF)+eN_3g+H|#LNn&+V@{FZ5*VLbo^UN^mX+_eJM1I=f3 z2pK&R10N098x0GU^l)gvYX)K@ggu(Csy?UOiJW-eH>osQ1bbUM;LeQ9SY~Vw#KGYM*i_ zhy0ssWua_To~xeZ!DZij(@y$XV^mhShUL+Na#B*5h)nK#DO2*90h^kyYCR;Z1_$4j ze$AMSA(ZZXy(s+c_0p*NZ0$ae_fCfJ^JUv7Pw@R5p)^r^9hZQ^NcUd{@vz_g*Fn6s z^^J{L)N~zmGZ1Q83}Z<-<(i}3KGnTv{2j{jpIfzg=1nf;Dz(OOt!@uZSXwGgj(ES+ zZtG}ojLt#7_tlp@7bs<9j zsUsdB^FF}QgWSWf>7Bj^X!+@;7nxC{(0fJAbnN;Ft2Tyw!sw<82r!GJ6mHvCMEIHX z5ruo`Mbr>+N$ezq>GgD`)Vj|sbr+eIjPICh7Hg3Yw~2|i{=%yz6Wo;6TMLUVfQ(Ya z$ldagJR~+1Wb;Z<=P?Gt&~JR5`aQEe)?n%SO^4mn#usK2{)l5D-db;`++8~Dc;LY> zrZ2hKRIlZqX8uaB&qB&PY+zj^Cm&jU2n1(L#@PVW=pcoyQFW3R?q8sZk{6S^{3*&d(J*{{9 zX_VO}Ur91D&>gOMCO(0KCb0_;;y;28Q0k>ddGOqWm9DH~RM{~wE((JyWOCj-O$qwh z?1&^K=y<)>+{{H*@U#u3xwY7B$HjMdl-zC4_3WKt2nc{J;r=Z2`_|HJST^)E&OZ}t zD_oWgePCo~bE(+#Dk5o~Te5xK`0JNG2Vy*rp#!Zs-DxH(UJbYLzVE5dtWL;5EO#|3 zvm(6%UXKX5Y9Ke;U*%_C>S?c67zNW%(!7u3#(rdkNgHU9-C+y{0 zaA&cCuJvxL$I$lFS~Vp))eto=Go~APt=_c#Yr@w%lFJjS ztyx8CDyL3Cm^6F`v%}es;$S3rDfM?rB#S8GgOW|~EB>d-iz!_zbS`Vp*sPS9PXGA3rC(|MRjEM~y6MDZHx>d=T{CM(vSQwXNsnCbFM9M^t2?QY86 zyYzOxYTw2CAW(klI`JiHT1fUYSy@^%H}%D7M8 zGz22ejc;4Go5SIq#AtR5p|g{XN^4w?>hC}IdUJb6tJYk#dOCm3qZ`q%O16t{eTFQh zyJnYQ{7i-l)DhQp)J5d%JH^ez+!JNc5DC+v64k7dqm{N_>WkS|)k@xFzNxIJudA9I zXrAPxnr?RRA&YTez;SEESeC0hNTk1m;!8@ z1*FBxo>^61y#4dceHApct<`X8(SgbPy(Y7y~PQ>I=%D ziZqW*0>lps6p>$dHY#W(g;}-K3VOF=_w%zGU^Akz<0NL+iPwMKi8-_fiE>E93B8m_ zan3>!mPs%h0>drHuaNbjP?1;W^1Q_MYmQR|ukK22N=(K3sXUk*aK0$mE-=0pji9Cm z*J0xTW#MPh)6*2Us~KHvNR4z;WDtImHW9Dp80g5nOoxkSr?c}Q+Da6bOOp?iu7~|j zj5*C0RlPqx&A0yvk~2lwr5#%4_ib8`46BOj0Fiq!jjTKfKlf4z->&OXj%0YHdA{;< zx|w^zrTL!8$~JSa9gzZTMmUEXz`d^-Q}ToKJ75{v0TtaH9fd#c8{x!9BM{i7K7aN{ z5(@M06_M?Encq9mW=PiRxv{e4W)`;PfeM`ypMjH^J}gFe^pnwYg&%vsh)yUjmLeU( zkG2{-q?&wrsC;wZJ>K{IQ_qzbf1*@X`xY2h&sSAzzvl5|nM_&jApko-*%R5C5}c9y zJ85#wd3>hMPa@CK;=ap6 z_NQMvHrwq@;3z7uQ+zj|ti02BTc^k-o(6%S=z@6ARpHx2yx_>;qbeH;9xZ#oLQzdp zt2b8-ggRWkr?c*?w6n_2BnY(z$|7OoHR=%1Sn3< zfTo}SvNspt-^SJ6`@!ORGP`Nt>AZ>&BEj*A5U`R=Jn_@@w`p!YSB!-@D~3~uBz>zj z{|^u{tfU3yo62%^hnL6nb+f3G!#pTnsOs544*LUTUK;N3qA`awyx7#-3@?gwHrTV7 z74^}bNeH`6=B4c@8+vHxxtgGVB5lS6hp{GCK$1MbdeYA$N+xYO;tWEHQSeytMy90*IZvT&W?l8S_r~*Ft zN%nZ&OBn4rHhYfpL7rw|maA2*L{H^X2NN?V_xu0GW24QhF~VHecujQS>b zZDBRt#>4`l$3*5t*TG0CJ3q-AQ@A0}OM&ipwv=ysIQkzqR-MJb}O@sc3Z%Mk4jFg0t<=K>Fr-_s6koFXras}Qfj^WB#=V9GT z1W(D!U-#luYlq`qMhx%6%hjkkPL zfu+S=NuDu%I#9v>!_=dUZhNH9yW^&AHj2uX{Kf<)z*b?lIXfusiA)-&fWRF{&g)PG zlbimc9*+c2nQEvr%^0@Pcn7yUuB;1u%bvUUh7uhmUy&_lMyfl2B^?bp14IhHDP4<7 zCPsV{IdQM46xYY^9l6&Cd;2R~L={|paG1>NW<`hGxcozFKDg9ot}{*6TI*pp;P%cl zopinAz|EW2$#8hDEN$hOb$3*EY)xLFkDnY^r}(#L-71f9aNu~^{p}k*HFdUpO)J;S zJ4!eRbEE)_N?w`xETBOR>1#8|L|BXUV=- zd-8~%_Cqc^tbM=7H^G7=SK!qcmf73>6Nxwlla zlmByt_jzLx1SpV%Llw0&d{n4{?D_J zQ(&IHk?TBMZ0WlqK1KQoAC=xR#f{6!$l$61eCx9}r+0IL_;Qq7+~tR*nql(Q(%H$bdwA$Td~|MRy&e4dA;P#4{;c)aW>Bh=MNAA7n%evr{Cf z%7OC5P9GKqslxC1zRv$}>}ejb*T!-}MK`F^e$)z@wJeD6$wWKWUV zs+U)g?#a!8xkJkXaudezB2=dU`#yJqix?FS6Co&BT_X6I1?>;iud!9VNwhGJBn_1r z1K)?U2$fi+hB~ue!JLT2@HW>P@r7!48(Sraw1VSal9o^jBm8J$b{7Z6SEk_}QS|6i zA0VSL*bb|=444Q3F!61OENV&l+$lMBM+LO z4vekcO#_uQEYxV3YRAPcI|AHMmn906$d54h9)Q1PUP%Z{g=6dZBNQc%vM&cBIB?S? zJnqunz7Y#4dL!@E)!G`@UkCfI56X&F&eLn^C;P{kK)NXsp8e^R;1 zW(Z}TFxW4e`~;vVQn~Jzw`r0|d2G$Syu3QJl~e4{c>-FnpYB zXy{u>3uU8m=hg_pr+9Hn?aUh3D6D058z#BZiVSjp2y zYfa)(N|U%?8iye___nL^>z6vdv3cIJrRjyzV(j#2L%8WNM3OO=Wh)jjN>xb1)}vM^ z_uOkuIoNyGi&G0yDTRIi==M2Vs>MfW7rcF|2y*Cd3MW<7(2#n7MkOoo%X8~V?(l+f z?hRqR)*SWhBsYe@1_HX)#crF%#@Pj-91YrMy9iNHD!Sgmf-g>$>`e;K5mYxPSi8v^ zGstUyxA7yLXSnG@vwmo9HU#;tidAN!TJ z{#L5j(|AKE`kbDtrY$SDHR`3Mo-W&2RQ3()TeIez$gU^JaCJL5>ToH3=E+0_JnYJf z3a6hRgZa+Ioq8Z*=zmE%J2$r*wXUjaT1W^sH}a*ppr?li>IN`e=3HN2|JoObQAdR^ zE(iMG*+~WSe<}CSN}rL9wcN^n?l3W>ERgDw%zxqH#=%BHeVzX5>0GsD0>PTPO&Mlt zYBp6)lHq5@m}5X-)ma%S@VKa`=r%pU`SnSUI7>af*D&g}HsZNNw^&?Mq@=2{q1cQK%Bh+ryz#1E9oZe8&r6NZ6V~Vll)mVGIsMr`wK}Gg) zp4H_X_PZ*Nv~Ay=r=orNe0(3tivt2aa8e}BNEm&ojK)N8{E1^2rcm_i8yBHUf>BaQ z81MOgQU1&+v@@q3e1w}LZsx?VW1l;> z{!Q#WUHXI5h@v5}nuZ)B?(KB4NB*u%mCCJ)dbh^xTeY{`wQ4NW@)MRiN^YE%$GhKb zz4oWiE2wNg-i%1+?k9IJ@I?^O_%r-MjofgM(4@?eZ$zYma7?OlhP>QBm~qWVv4*)y zqI2iYsls+vS66RO8Qi^lmqzi9*#i-gWJUT5yRdB-Rk>E9i-Q^hUmW=1nRU(5$WA7` zyXDVn<&x6YuapCw*UbunUh!qyr)47xmbGc{KV$96UHY(T% z4t0qyeJ{VO_IGvNWL17*#(_j4O-@J8T_z;VuBsAPIY>#Nf#0vyH~jGk3JeTXuDFo+ zC^X8y3YwuE9d`j~3KUKLxDZuKbp8y{4Mc*xSI|rlg~ww>e1yZ7N0j>w%Iu{4mShpv z$v%38)RvJw3P`(P#hHo-k2yp<2c`7Dgey5)Rg7<@srkQ3KZ?GxbY7V)+*4<{Ejl z{B5L0J`!mNs$!G*kkP1yde|mhv(Bun^c?AB3MlR~?#Wio&d*mfF`-MQLi~EaUemCX zSE36glG_3HbEe9udV^chqu#MG1O(GvzXjXy-u70GxM~Che7e8Ko%(_dWGr>g?(xJV#OK&TsUV9D-cs|OcDta2Vc+2RHnWLj4DU92HiG3ZaPywt1 z+Xp7ec(GED!1SG^xw#bFxu2bzYu%n{S)qDcRi&MlmImH|Zw})WLP>4>_w$JUANT1r zKM6(H<6F4i6Efsx0gU-6F|ovX-c*@ztPVe^w<1#HVLg)G}<+~yr8yl;z<*2FoG9)A-NwJd(>Oym7q4;J@7AG{e^EXKz0KXNI&)YL`NoFsy;tiwuTzIq_2 z;`1NS*X7-~apP*(X~eGtm4-V0nBgqe_e*qSw+9_3rYt}sbk=vA7e4z%iD6XmV9-TKnpLd-j0p?Sk@DLb%Or-e*6y%) zj|uSvib-tOdv9j%E>pFxH6DJpLRud8Vgy}(q>WE_Hz>m}gq({bqA3=x1~ZOfKZ*IdG*%}Yn~1~u zoXbvVSAliO-FK%rPv!heLt|s(S~91=sfh{qOhSY)C5-XnsDcs+LHeTjMS@k!YA#nb zyrh)H^i8vsSCC8=zF&Fih^w3Lox(Tr%^CgfXHrYRqjnN~-$YW_h2!OIl8-1%Ji)rw zOa47^&D+MN>%nP^T>$Hg&ZAL3c|fs2?!#g(Txp)0Uiri^^5d$jG9ALvqIzlBhfgDx zaWOP2Z}_ZnK<8&{@0I<_ZRg+i%1S+U>ihO>IU&j!Bb;|w^pn@csJXQ9YbZxP5hmfyq`3vAFYCat~&jY4wbh(V(zG1 z%^QzIqluc@0%rok@~}nILIX@3yY%4|SH_(1LA`FbGIml8>LL2LhPb~X$e znXwl^P z_=VuKPn8lUMb^_H;5^EczF+Aw!Km!nBUmDY7X^y^c*eVa8R0~=8XOx>b@}>;kADyn zQwFinN%?)z9>;`@RlkMH-_06`^78Q9CJC1IT3Fv#f^MmjfJ|5YOBO&p+)sQ&Wi4y% zpP&LA*+aS_p&@9W*TA$!A9Y2duCrX z>27>(4Adk0aS8oPwkmCSq;;yl=*iW<9&R6ybD_c7#e8};81(E39=2G z41b);?a>nA;wlg$3r_o7f>?o*e6YqpUY7`2ibpic22==8rZgW%J?{#f`B9>Fx90u1 zP5J)2Q@6CPRFB$K>suG4v=b3pX+fQ$dTx)r3_eN_iU2ieaN7TKqD!#CjV@Fe0aF^W z@a(Of@dH-1ad!($+@-Upd5JF!EgyV%s;3dQr=_BuvOoSr*PrJhys;(_qH^mN10~wr zeCzZGD+gECwG1<8r4FcnGIHUxkAs}ZwKpjwv9YmEsI#X_N>u2+U$Dcit z4Jxb{zdJT$Z}CCEp6(DfJDa66f`&i-4Oomh^q&PE|0RC}A*NK(6zaC+J58U`$1@P}0L z9$z~j@~0!DWB2pK=S8paTzhO06smjZlx+v(=*h>?MckO!lo#EKmX`c(cXLz zZ4$;&K6vRDRX1JTM!Bxl3>5OsYTVrXi21^F?Lzl8J9+H#;M?fvqR5TY$4~%{@s$E0 z)_Xjw+CQW#)J}+(YJM2_BEy~gQqyzGwx*is_Me?xmXf7}y2M=jIQ6BKD`e+SJHQEj za_@?MsCzIPH=<`m=RYrUn7}ZzPcGI4$5!gJ#_#-~UFOb;O5_Me`_Tb)D^C{BwK9vq zlw`G=TMEA3sqE32Jj8+7A(C{d4KcYgnv@q#KWgndP_W0hjX#HqfqIdcyE6qp-($X5 z9uVr~Ok6!?8_4;ajlPG9868uSa?j)y9vCYhKYw`sA?^KSrCZub@2M_Av%X!-?DpdM z@RT(%7u7lJVzo<2)zi72ZwJv{Ng)Ru49AG?=D+E|93M_6FZ#Xuoi#J=yl+ zMLs^h(&V;}%I#(?mP3LmZ}o3omwhFjykfVjJtC#0tDE4La|iX+9_n!fFD5FPXJ;G4 z-$4b|YnIisXcks)eS2qwoPC2Okt1sYIc(DWqW% z6>nT3IMh7pWBv8oL}>k!gs7+}zE8(c#iYQv1a;=?#SHwBsIb#=*&jq@F|rLU&Ob|o zGwSWqp7q6_(MoIEF8(H7u>|7jQf~81XRaKU6%CK6xhYEXKhyy-$}loGAJ5RMn@*3%l1XDWIWy@V>IxGn=6q4i_}r z4ZYs099@)KLz!q2G4(&+9!fp0mV7k2lUN>k1}_kd^({TmyF2w#Wb=m$&iBS5GZ7Nn zU5mo&EMAhO@FUVoe*Ro**IcPrf|1jQPc|2#8Yq=g>7mpaSR?d2b$SC)MZzShRSxxXM3>{ zbQ%gft|6P#q5m)zaNd#H2W9>^FL5{DQ5Ccs`M19-X|n zjAp~KwzU+OZ;EA>@80oPUcIC{|AN16nqr?4g^G~}#%43ynqSYwj(v|0S69VH&3u&+ zv%6*9;7xm(KzPQ!hM{WXpl~%h#Az6zECp6}O~-UZ$XxcS7-ZIX|I)#gN!y zB*fTtUvaR`Otuor>JP%-L5)$U%4L)|7rPwlM>Ssaqy=wyq8v)Y-LWaAe2C!mPv@Vz z=GI{6Mkenok`cCb^Lv=c6%&)ixbC@=-`;D?TOrsI;U7%UE9Y6+etAHRU9r)9 z+}rr}ylCR*-;?H|vEgr`qo-dN(p)NO$zFNC`~+GXDWOc~hc5w8yuv)O>&WSmF(LGV z=l7S4DB?Iut_FLuDYx(i{o7+f#(&%i4r$-FzdHBr-Sa67dAj-XgU|EI>-8IRmVde< zQt|`Xxzb}pQ|P#Ecx$R?+t)5IZVd@9*sQdu<&5w!+O#z_@Y+3DZl5Bx;%~5L+9QP~ zsAYaWzMQwcS-u-*UI%GS+!;gsk_2dC+P-lXHR_7UUbrHmQV6kV{g8Gfe>+V)XLHRk zq;jcmYV7JUYwqs4{vZbthr)roJvpWys}jR*o%)XEPaAwnB0H=Y6%MqYqeHQTLOAnE zZ1By;rS|O}r_;?PxH=3UOI#O7f4S?Gn{Vy>yQ7 zt*s4p_qUgqmv=!#@7e9q*uYeCGvLB{!0mEDiYz4SkD($Uv}@It(&rkkn7`s*1!x)ivS$WaC{5RI9 zpT^EMZ@aN^r;(s>C8LqtWySag1%+(C$aUElIjtifG)tQ2HV91JXN$eYwX76Nv)2n- zMYSw~`sijJ3`yue%iiGQ;pv>3n(As-JcIH##Fx-d_zXcZ;V&Xu(_9U;yS}J)#dMR_ zuyAwZ%Yl+z10L$tVtG_!+Og%y`JmJ-i$!>Dg{`(yY1sS;br8azMh=%7J6<~XkSFvK zrEYCw+pIjWS=haOtU?yGGZ+I3Gl#5Tqc{~e3ZHNbtx8A4ane7>q@Lf=nGwhy**z5G zbhOQj(JNQ`j&3YF-T0gyM9y>I9aj6PPp8YoI;*fAtQ^J#Ju~0DVK>n{6mJ;lNjgNw znh-CjrKRN_m`^=2nuggP7Q|v{otkdXMk+o0K3+$8-)Q)H9OspR>sXn6MdUuH zcgN&8gdTHmK$L~-ydPqy5m~ace}(YwA@i5n+5r8>Iho9d`?h}}U>(G;#%gK~Fr+{8q1o`t0Xgpg%@U-`!6drBf z*Q%gUW#OM?t=BLQE};S~en^%pmBp%_6%HG$h^nhS0t7T}+P$R_UOx zP}rGvdUWjxgV*blA^9$ARssrvQ7co^jPKvSmst^0zQ{~&`?J!}Ak7ch5Q9dL6`fZ& zfdrx=!!Y3C@lPzk`5TKadHF0^$739;C`aNg7e#yLpIo3xwQFOwL?<`KCj@?5sti=B z5#)1UxgtAZpzXP$0;=G39nZvu*H-)+r+Z3FmnqtKvD;}3QV=D*+cVnYo1^{knLdrp zk38&z9`|4b-pA#bEo4Qth0l6BE_Fi3FbfST=y2w03%QzRVlAaSsNd^uY1wrFg&4BMYbGLpxeDrfGg@~Xbs83G7e+OEl zk0GI$rNW7xw@M{53~*4;$CdI=$ijwhbh8%y4DY97`kZm=^Rqlmx!tBR&KCOO6*?xA z7UkZtaeGyJ&wo~}s3N)%VF%Du8!P#GpTMTM4&=|EC`{>`6z?^WzWZyd6{qvJdpUT) zK*_O>>&D}tevR$rU<_8~PY9*qj;N!%wBeZ8#p_4DTPKXC?CR*SYWme3q`=DWsi`58 zpcUcUNU4zRMTiklr z){~YJuZ-!tZ20UJOjofVPPjjd2iik4eZc$W5o{%In@Dj=v4-AI(ZCANlsQqLWaof` zdJ?wy_p{p_ukwE(GzFdftvz*5@<}ME#zUl&8!L3JAP?w02w)m1V;p~$tlTz5qdBRb zOP~U62)LMX)uls9-__95`}!8HKW+8u+N~lV**BE6$xm6y%LZElA>Gf1OO+ACp@m>t ze+DWq#cF9e`0WkXZ3RYo+(BHT%I?)FbcELaffYj<$TK3WF9s%IFb;qA zpjUj6D2<}br+PFNDhg~*#J-_PXWL|AY|h%GWT{|_s?uthSDx`{VPZu69^X%9Yxm8~=bg}PPG<6yxHO~DVeUcV~(;&MAnI7kWuHBCbeF?R`aS+zh@ z75jZUChnN*b5X`HK0)N}mANa!%-zf<^L|ZJw-%xq=Kc(F^IdxLOV(fe5MZA;Gv1K4OBo z2=1x}0@qTko6N>W{awpc|4_W~$T!sTpp3jLWNK+C$}&wm=E=u)%zGZntBt}Ol|5o3 zHqKhy+~n*!e(RCYmmatHm%jNjYSBO4-y8S|mmGg0YnA|uI3ho0yB zvbZ|2ZXT|cjSv*(b1=`{QV~ok1hD920)F<#6;>mn!>y>WRB&J}bS?JHh?Qh}I=OpD z7JZjVWC7j z|K%?GTz^NUN6!NmKLw~pb{ugWun5&e4{-+vN+*L8f<)cUBM_i8jFbtxMOmDfaEgTn zp<$Q$_K!^p84fl5v}kRNuTPUCG?d?k?z-lZ3S%gC=f!>T7*vYL^vSm7D1l^{us7L& zGtt@630(`O^p+wHl(c7jf#C_Bbb7nb%PdkRltIPSg(x|tZhD@EZ6uaRavTZ-Zm}*T z#Csa9n!z>ooIVZQ29=hk9K-=1A4H}&<)1dviol@Z7q&M7<>8YDobEZ}cGY5i#80CF@1c*uT>8R2P% zd8AtO^!HR*8<~z@laNS>eeCNKFO}wuKSooa2+;zqo5XIM&9_PsT0jtDytTS#`ncCi z8qA*l&{Ar+a+z+ZuC|)9aY=Sh^Yx7!i#6w$AE^o+@Q`h=?7U=DegJWE9N?C|lD+HZ z1qWwG3rqor5Ggg`+1hHF`q~fY@b0ZQza>;ThbR1{s|P%=Sm=i*AT@-G|xu|O?s&FH-;cg8Ct`7~uY78En#NPTiyhy~?n*Sx^hzZ!YK^kdArUXKH_X{K& zhJ*jH%RxxXROT93X4p1CeBnV(;uzN2N2fcnZ6%#G)gaDU{Irn{4Tc#ELv6yUYelNs zc@!5p?$IO}zP{n>GdooHx}^$Zc{D&y-RaYA6rud;ZfEdb2WDZKyQA0+<_lZZRpDjL z1t~9XZfwjzlZ}wa?q|sPIrGECHX_WY)8HHzLS1hEHtgaWd)L<6?_{kA)u!4uNg>Iz z@P1=5!ytpg%cv&nos#X8Pzu2hJ$ha`wY9aXmDsN*2>;|_cXKf=YsSN*;8?tNY|Tj~ z+#zrxLx;-C3E{I*4MLKMq`o#zo{i%3UH0Vcg@FW%WZR~v-TjHAhGxds3Z%mQkW=|q zLQs>I#zZM-JNeT3emDRVGUxVWLY>U=PpB*;hzE`KxuKJ+dC6#hH1&Haz~i0s6LesF zVLC6psx|S+Vym<0f#77R41+CCbC`-F_i67RQL4wrprvvhI(Fs5AqlbpEe+6vt_pBW z#pSxWa&mGE!A{ozGWwkpRM^@5Nilhp&gl|zw+4OU#O#8cfz#trrYEmKrnSz#s|~ge zn&fB7-GmP@cb&K#8~M3qJ23V8!@H1!vzt;Azeb41ID;p){SWk0vC6XCxX}h3R9)@u z;l&3~>|QPm1Y?Mhwwgo@6w}Nu2xZC$D6HIK&6klxbm49&I;5eow%V~(Nv!JxlLudr zi&NS_HU<%DP1=H((*{tCGd}n2+c$DcuhD<-E{`Nyc7#J=NyUJfk3I@@R10vpI|prG z9VUq$Q3BAiW!&#@9y)8{&yXQl8)q2ehljhn)0{>qv2NQ|hrg{DWOJ(yUB_dfd_tG1Wp+?opOwz&niqy>f6I&oxy7tuB z2-!W76q_O;x-Tw3eAcfE)UhGK31fN(vWTKc>x;z?ZW5!p8|D)Y&Ips95I_Ar!#fYs zt(W%W0jv9^cuq=+q!^4eNEg`zkS6F~Si-M1fb==E)2_GOqn_EBPE54bf|vh*UfJEV zwcRVRo4#BG_<@fV6&3jhvC)<5spKKTwv$bt=dLFRJ1Id+YJZhim6@5DWpPDzHhfBv zKdbec7lp9nd<z?_!GHGB(Eh`WjxjLr6;-Cnre3W5%ko(#;oY;y-(= z!#$1e^-o6ms2@BjpY!wEJizo4L-KkNs;WVW?yJppJ<4JSpDVEkOUeT`oGU6TD{qXA z8itB60o?)+sc757t=+lY*16wI5ldAC1za{&SFc`GZJ-o(ytyI(#P=ECW?U+CMK*g4 z!yAN8rk_7H(aL#vz?|r=qMQ2&b}KVTg62Ms`mF+9+(t5d3?9gU>#~epwE52HOh@|EhU>=mM5yw>scTE`0-Yum)gi%nrhmM8z}*>nK@hhi7e$p0 z*Wj~P?m!V*3%6p{cnD#pZoG9!1|&!J8_`H&;8d0dP#Dqu(zvrE3ybV zLh*G%!RvdsZvid(1KcXc3+sHPc6r%){0knHvwnXfzsrF*vuc#dUQC1_!0~(zy|HMF zzNsY2uIn?W=&1`5b*-K8EX3t02j(i~urrK;GYoH1AfSJpEcoMk=@egBEE2xRBsqYr z8fX`{is*00eu7p~tmQ~P+R09Hu1*=>rIh-f#ksk;4&dwfKPj<;Y)*wb?##I-u8j;i zbN={JXtinxyl3C;aC&cV57B71I1p7peV88Ym(@ngJdvxruK^|*&RDVS1$j$WZr``! z9L<}sxzI|LYAgQDc%Fu*VNgB*sdrKk7r1>p?#wTsY0E#}1LZD-Q0KC~-k~fXKJ2-- zKwi3ON&J<~__{!!w*7`8fudE~b0vJ#*W0d03KQ~UJ5Pg^RZI(3R`mVDZt zxdXRdp&hf2OW--JvX&4NduO-zI{nd%C-$c(hMKiv;4r*}pC4m0lGl73&hV2-H@9gHJJ z1&A9o_V9pz5P=VKsTd}ATw(+553i60ko=7ui}PiMjUnXS>#Xp9fmp>Bg#7JRD7^M3 zsOLc3mK$`0gM1Lz&D}~vUqC?U__JI3F=)hCDG;Sa=|4b%NVUf1!9f&?mnhHU^y_Qu znDM6pO?BvZ5(2%Cjb8O!B!C)jfnrCfF3ID@7jRzI?-t$JZlGsmWGp?{97xCCPP1Da z6a>b|Oi3~N#`7e7Yid2FnM2K;(k4w=SoiGdr=$51h{NF*{PoA6*cRh@oK8<<_GM(kkq1j}{yG;h-D6ci7v zoLJ`M`g?@H;(mY(#F*BGjwh7SyNH2Vr|AVxSzH;T zL7~KF5vUz;>DgZ0B?q$04RjASyzG@~37jhH$H^YfCaVyQB#&)8H_Y>4GQ7bu9aqdu7J9x9oj0_ia%F@8qdgWV7Wc5!y60eDW z_(v>9kc^rT50~^uzOs1ql`Dj2pH6=Ke)Be$giP^Qy0JX)z{SU2U%EFD+$jqwchoI0 z+##zYITWuP&PLiX4FLt2VsW}F7%Dprv|*>Z(W|p~u=C%tqKxpueV?E`UZ(xshM4=z zN23HeK2fU6?0OiLol~cXtf_o`=ywmS#B3>!A`cr5xDJa$93)?XE)rgNJTPfAuOX17 z{BvJ=Oh2rqB_C%e+^{G3R@s{$jIgABCGINYe&tsT&+#DA8}#%E@TDG;G~?@${z~Pp zvZ*xuj8R;&${bNdZs9jI?iNV@$A8+`QZ3fv`9DztAd?q&5I|I0Im9N&@1L;W?+T^le`sSoS=iF`%F*X{$(VfW@##j?9+J6Fw?Y^H?U^(y{4j zaJt7{PBQKl4UV?lIhNt|olG^8NTLQ*O`0`9YPXB2UzSZ5AjE=RBEVgKA#(Yp3d3ad zJMlr(vr9dZBO3xE&*<^sE_GxL7Nq}G0pQ^yJwkZ`xEoSJ!wr!~Jc1KBq8TU@?ePB} z@$2=!#jnQglSq7FI+g75%X`xHGe7WfXLLCD7<;mD0^3uwxL z**WKE_(}>14$Lym##ZaV@-LMjrDKN%w@hZQ?APj>jlIV}juN&zgM$hiW%^H;>3}-E zBd?ayox5*2@)(E-c8s+(SW-?zAVyr}$S%H=p#9{VRp&;I8kJ&RM8ZN^zBEkaYB&S@FSHNJ`08_-kg4j zxREabu%GvjQJC%&&yD|QW+n-q+&nzcaLqIS7;13z|Mh%}MtC4))Cno09tz9yCk#~( zXhQ^-OFEpX5kYhcDaRu2RNy#cG@7Mr8UoP8qLbrT@Po zDXc^riF?VlOZ9ejNu`E8L=Z-e?)HDYjG}pqDEMhIJBrI8FKSJxFH18~O~lkTJ`3u9 zrNB8x1IKyVPBt8~X~K;U+kc)M!b)>R8_Kc&5vS?P>w%`@uK`M}2}uM;(bA<5djbd! zy?#@3r@3;oa=Nb{aT1+?RmFeX!r;Ekf}a>Vg1j~|^&YSponl^^g8T{}3v_Nu{a;ab z%Yw>FK;Q#JiG=W;>dp76>ou~1AP(En4hMurAxRQi+iCzMk1G!i1+d4j%FxuF@gL2G z1eRY?E?&Hy_%ipxpZ2#S0wbn<{b^eei~4;P_^OE@M^=wok#Cz>Z0D>n8NDGCFEgVF zSvWXy1I&)0j9LE^AU%|FE5CbC)dP{EIBIfL1E!=KI}W0 z^4_M-J(s7zVg;>lyz`(uwxxekc)4Pwft-wjBE_}o3=kbMDQeN^`j8LGTd?bYNz;U_ z#z@V^50nKB4-sf>R9J;}j~D&rfO#dyOXTNXAhWD4U#44t`tsSXM|xdQ4-_;J#OVou z)2OvEgcZI|W`kaB-u@de#lNd^5f?7yCHzmg)P)h*Ul0DVvAU23S)XvIx<{aMp)c|? z%-dQAc-*GuQlEluJ_Ou4hU5PYqB;V0oCd=OP|u~mt$U2QUEw<(-m+ryg-JE{6 z7z^RI?C@bZM{9_N=z45Cgg|J#b2J+M6)}cnAwyMoQD5EVco{B)1_2=u5}oz4+NlIK zfsPTD+g#(%ZsW+@(q?G>Wqv+qC@0g56fG@nyCTaN4M20F&SwCpQu7(2jV7OcTkMt0 zb7G|(yIE8HlTNk#C8AzwoCbMl;$qC^pG`w_Llk151x&QWI_@oZ{NjBe+MF4cQ4e~u z^S@)SBf$BHkw}f!W96#HAU0wyB3c)%TkH*?GCDm)M9K3$%|-o*%Qrs(Zi8CQ9a2L? ziF()nf^|B_`Y>JJD*qU{-)6Xg=M%C-4;YZlCZaMoC=f=uhr3QU?dH>v*`#(TFb&|L zx?H(E9te##M3ME+;g2`SQQadCmzjtSr?~CB%mzKU8Va~jZS7oEzBN)lO1U6@8&v*= zV|re507em~S)@Q5*{UW)+`(>IVY@dmxgIUo49&uWgC*$zuq%ooTOK7o#o|mFHylj+hfuy`tL{Q>Fe-3sy`lG}S^@1q0P5NTGntpjbgH*=q>Kdc$PSFsb zCqAT0`oBIr7>iK0U)W0g*6`#fl{fPIxgEDl-t=CF(_V{;t7Y_aZV)Hq%D6BLV8A`s z3P)zPA$%lqu-*Y&oZcQ|hfsf8sOO}!+{*TnIC6OFpAQptS6N=nWeJvC{M^5GxM`x5 zA&N@J=m3TEH1}M^X4+`Sb|yz2w11}iY1Rwd2rm2|Q^h<#}uE zceD9VpFTxkzq_-w8d;Ac?LY`*y-K_s1wT(d=~>lRa36+H6AAUa72yfCo^L3*Y%7d| zG9&dbe$_T0F+?>f*}1M-nw#4L-q}RA=9YN~^YtG(fX##KGvEp{^m!TY8TLbu&24-9 zQPk2Q%Xvz{FUiVqH`H#Wyr9rcMECsJ>&)5mCiu9MXnXP z-C#(;^C4Fa&p##N0(DBI^soJUuB~-yAN=@#I`=YF{jX$U6i*@s=GSq+mGhqee4Tk| z=ghg(m7g`Uvt}SGBqAdt%S+E+zj)?jW~MyoKfA6Q0)1^jg-qR~xOYXS)flBqiMX^r zx(~GzkBgtwpL_V|Q6`+vVvQj2(&c&R(**3lx!&mN% z5d)a!V78^PEjK(%Gylm8=rU1z@Ss|n`3Bgcv(VlG5ivO5&Ym8AJtwJKKz^u{8^gq_7%J*oFM^aL!bY5P84pj(Zc0p?{bT59)&9xF0 zI+@!8BLi$^+EXoX?=J2N_-@|wZ@w@uZLb@`ZvMDCT-D9Z%DTzPTLMjQaO#gKDZrqH zW-e&A%Yc?YkX+}lo^HUGb#2kyQ-@R@IW_1z6io$qMdFU%lzZ^_@@b`p>hvTW!Ygl> zes>=>p}7d^qSzoJxTZz|*(LOAwYg}hsl7Qv)bSX8d7Vh^q!+Y}!O{V_Bxi@7!+P*z zN|$`-kPdNs%3x{qXOwD~>H`gpkH80Y*uYn>)HF1pNoHb>l9-rSX-3+fj9rOf6#<6mkhapz;H5E=a^B9j)Q-ODh}ii#!vT z@3hr2G)x|tvWh$#Vo>kcbpBQQVkAl_7p@TRO})GkTWy+($D9=t(_ zwF$vx{JjP_NSKn92@^wRozGl1bs*r;!k3*5^7Gr-*@=fnBOZRmrhteohkugX#?dLe z#-vLZ%?rB|XfGmb*dpyCkC6gw7)_xFL;uRObM8fw-_idh#GJ;LXj7tXQ9?%cPW!;y z9ZJMAb=V&TV>Vgoc*<9TIjK%NYNAIl-MjK~a=kX-%b=Q|P+Qy;Dx2)@(Y1T~(@qiglPS4CiV`Za5fGQ>*f{n=al{ z(bu~n1}?t7zW!$WSy^sF4v)S9&|k((HBQ8r)G`6TwzA1b~j-wVWAR5FLGDZAcfscb32@WFq)%+1aH zd5;6pp?<*dLH#ksAI@3a4eqLfw>miQVq{&}z^Y&P`p=0&1^44|<;dqyAs`6PPn6!z zW745|1o;hU>3pcGn}aksUcH(D?P#EJ!g;3LfH_q|?C36@VW=c{Apwvikq9<8lO;7J z<-_Yl?W3dbC6exsyP2jal3pXWT?JSp2r$Bom>-GTA+_E8)1PIM^kI2ONUA|4_;%?L zzXSYi{pB+!LF)hyf#698?O9!Y2e_Y2(;JYbzH9E`>Mv#v4<{z^ku|L$lpf=T^kd{} z%*S^33$guLA9G%Q1bc?2vAP~0tH+NgknYBf4aS<D-;fP9m*N({yi-1%% zTmUk1!1AV1k^b!q(Cpm4I`th|3g2RYyvC~y0OA2`m9Rgz<4i2Vb>)k4B$S4cZ=vo1 z_h@lnx*%$jJ(TS-OAOJ_Uk6(wxzH~RLY!_P{d9UPyaHIih;BvzA-ue>?n9B#8-pP; z^o%0VdGTN8UdWwTjT{OxFBVxr6Z2~Et013{&?jg(MjElxm|A_314RyE{vj?kKI$STbfc6*L&?o7?JW?-h!b|1cBxvGY zM&6dKoW}n;2mW^&Ccl_7jK7E_1HnN@^Dm^W{^3KZ2Zc>9&Xd^BcHW2wQ$5Nv1UeX^ zzhg`)(gm*bYpbhf(*?2rMJS`)rKds9u5aXe#hccJ z*?+$?7RH%21J*>g-HL|5{~WR;J0kLu?*F-elQ>g;qZjlf0V@iygwMkxL^!9UIw z)j%pp0>%|U^!vO|f^o*$agB>j9<(V+R`QP873JGWRR;rAzy^<5{7Qp48@He#(v5FR z{%Ft>$~qpY%8j0MKH(3lRpfAc!u9uClV0DGMF@rfOf2?_wZ;2{+5A=K#?N@t7qb-cicb;4(7&`r35;gzbowTRC0ZZPh+FVjldf*b-UXH>n2MxS4ERg`1Q1%q6 zgv-*)f{{2e{7l9{nQKu>ig0;UWaLandIB9Zu|n2VMMoz-Ib*52|DZ#W_wRfO!N%s! zak!#x3Q1{yEA4TbCU*SOK7Kh^ren0Y)tYWx8S-&xZb0r3iovddh<6>+iPaV2n~1_YiC;71lrZB1;8q$^SJFy07)x+8>3Y4iSIz$oUG3?1OWE-}+Q4 z_mIYe2X|hCMTS=t!C0_=&vo7;$fnia&BaAfN zvF}q}-mSii{C}5ofs-RTCb&2J_oh*{f2Sojxg_29r=u|$893VaGPcM`EZ-vDq|$qY zo)N{1LCFhq2hP3zXZ-`qMdfUEOY&rv`-F=%j@+@o&G=+V44?9|o0BH=`92PAh#=V8(u$hWGyE)tWCqbu<_l2Et_y3K>KR z^<&0&ehN-z8gh6#S1p~;)Wv8%JV}sZTT(uDw8>wq0DAiV424XpifJv_KR{sbr&?ND zS&y^rnV&~Skb6h*3kzqS`8;39MuVJ%rf$;xya#9TlmK{7A}Mc70Cy1Lk_w87H;&`U z(U0jPd36+uhK_D=q$>9e#dUxW#}7W5Y+V;&nJF!tqc3*5b;`CRDIfPh@281ghb45s zY+DO(-_(E0Eaa@~KMgqh@PM!9V2K&;Q=6|~y6Vdw zsw^Za18B-m0iO)U`&@nQ!I;?EI5}z5F?}?wJ7EF@^8=PhqURn-YAp32k@y{Qa8Dc+ zWQmju3JE!Pwr>rf_Tg{R7|o&1oulpXzWF}24aF)Jnl%XzGt|am7Ph79P<7IU4klcZ`;Uk1$cMuwAvD`IFihM*!yyL1iN(alna{dduJ;k)9)AV@#pAORVKp+2ym}y5+~%q0?-`eAoB4OlVigc0Bd+0 za^|5DNxwQ>U@~YUsFAQ z4m+iHn401J+9&(|^*TIi_lrfALuP;=Y{X>)y4HEEg};b`KpHnQ?fo6u@S7>7rN(D8 zvegM2Pt(%PJ0azK>zkW=B2xkq_h^;7ul;~a5fm)R2&wjG?ie0%Uu$7gyy5u{pFu{W=)Zgu!WadYQV=z-$7n$|-|1c29A(cPneTuk`>JTz6)jJ$ zD0#c@BVA(aJqU^*bOMnL`>Ttp7|UvaC~n-}-;YYn1w3|XE32gtPh%XL<3HBaERAMp z)ZANE}ROiACF4AD0XmRLH(8nuITqYEx>cHRy2lE=epch?3gIgUbJS9E{x!0%g)SX zg;`{Jb&&Y^!gxK%KPDj|C)W<}YOVlShz$&KX)-Q6R~ZO=2s2Q{V3$Rys@ADcb0`21 zQz6;h#Ydw}@kyzu63EHOH2wW~d&u^ogeUY~ov&H-&yz1MWeT4Mh@^3-Mg>kM2Xvs) z^F@!d<*hwEMM2tD&G0hy6bz^a^gvJtBsu98-3PC1A1IJn8d_T_yc5{ux(<+x0~~JHS6}-2X^CYq7=C^(6lq45b04)2cFo*|o5u^Hk)caj5Poy%7D7 zB@$T^d=yDgicj*37bu@A&&|vPAoK|}tDBO4&({DVN>^mV%gcU-dCpy|X)r6Jf_Wv^ zsHu?+QJzhQje`K%-Fco^Ew#|5J;MqZ}KLd#M{|M6)Ek z0w8O-P8+~@XOa7Z-{HAxERn9ukKh?#eJ^hSt)ph~}(WX>%TJZPH0N zqL1pC4>Hs~sAP18=DOz+pR4?cT6QrLR=~nL46Y@O%HgEnyMoW3*B^v4SY>mkV8`nN z4`A5gl~1Qy=4NMI#|*~S)H1tv(Xb6@Ba1c*M|Rg zqr=Oa?$g2}JLuTRJimlK`-+K2Iof?rBN<-|ZP;#Qsb_k&3DZP0*TJ=ZNKa=*s!W%5 zHm)U3LmXv}ss|ZeCf?D`bHF1TzHz*!7G~Kj?D#ij5YGp}UBZYCsBNcv;-Ig=68Xf_ zQ};Dr(wEvbC}!KVpy|DdG*Y0vTjf0&&3wdgMqne)>LpH{lsVFNhZ}N!R7RIp?ScVi4#QlIa;$kIv&$0{}b# zTCIQ+36zfqGrrl*%r7p60AOPyYi_x%emCJD0j_YN_cP=R4j2_XlIMbDJJ!=3d45Zw z>j`R%;p~y|WJfeoTPv4(dCJzM70>^z0uyK<CSJKEcK-mO+AJnn#~-aNy09uE#W z&$8hd2H9bJVX|6;QfAR)IjP$0_e!)wz#<_eKri(S2l{_hW63;TFYTn|>6%^D-wJv< z({mA|Ye-1QL$5+!9Ch$5!1PsW9RQ^m!Y@6u#{qvk{1(aD^YFrEE`${f29I^6A%>iJ zeS3R52R~Uv+DsXY#1;LdiE<0YDHXQIx_Z`6d<^`kVJNf|qUN5U+;G(~-fUU}=>~Qy z?bSIL%BL}fa*W2kCM8&68!up(dLrMY%L!OOwLi4qS)EG$gqP=r@4&ld$L|X*(-Ro3n?~+ zAb&T-gxxRiFX~Spy*V$G3fsX@%!63SjBoMVxQblgpN8b&#HX`)B1cazMcxW@-lI$T zc>x_Gp4-b~iQxYpLik|)OOAwhwhPV{alRxiEuEtW4oe3t#nH|qQW_vn5$Zo8>bWlf zpI>B@o0fehb;drIj8M4&5JccZ3TbYi)L_HS*xq~&X$ESK{p}Si`VV@%&m_Yc62D+D2WEoL zbO9*ne(CTEGO6!6UU#Z|bhn5lZrbps?-ag*C)uSc?ZrbMhg8$u2AH0JHKLU3Ju>Ot zzQI&gF~CIqrswxQtbsyz@%AY`SsZ~SeC7g;>c&zd6vBGU{OGtvjwrptb;AmziRrtv zs=za`LCc?ORq)bx8biDC3=E9;4WpXg!n)Wkrt4y4ZtoOLpo4~pTF z&m_xId5*XoKk(Y5+yw+R=aa2%j z3OGyj|KI-1YlRt%b)B7R;1R-9L2bLi(NTS7Yr|@)(c+5U_x!a)!fntOTwIQ z@5c&E(AnkbgFFjwE;ldlRT#&`DJDkkM?m>%$#bi0g%G<;*jiz{P?_kl`PhADDtcoJ zdFMY%OQA3VHrFK)Ik^)>P9q*gm7Y%)xT%Efum6k_EM(~o@;7OKrYi>IU#z@TsyXKtQq0gfw`=-Rb^bcu&P#-fehNJ!}NdwI1Tf>Mtze|7SLU!wh%U zVmtw(*TIb@E78vJ9RBe`;cmxUfWn(gba;w4*^xBjN9|c`HVEGvhtIW*j8rAhu_OrC ze4sifs^jM)2gy88LZaNaZe4`y-OveYY-o4_*QyjJaLMFnTmVwwKpQeVXndgBtVaB9a0~0gNXI1g`hv=6G5dvv#N_- ziFP@Z8jzoUh79IWKhPc+O);M8e*t6|=q?I={NY>7=^jlyn~GKs7+GwRMwh$4gN(SI z&BZ%?I-%syscLVCGTS24;nM68`K2o*ic&(oT?ky#Hdu6X@m`o4)fmePX%VY~uaU$g zBookm#|cb=oJUTTaoT=P992b>7k0}lx5{$^YNli?TH^#&muLo?Z?w4KYCci=iE~R! zxp-Ev^9(;9jA`Qlr_?5N-E7=w(X#pTD+#~R9qB~sA%77iJOvcLfuR)JU#>lIupjf} z0^C4eDDZK2*~vtbZfFb>0=+aVX4R;P~98{mQ-Sx^l5b*_|>y71=8Mp4VgTJn{sNQULHZDm?0tgcrG2@4y7U-K|}+)>d=cP@chDNX}(_PeFPA06KS zFBOD2?m#)ln;fToFa`H^_t@Ck8-UB~9UU9MvUcS8@eVc$nNaWnn?fwrRzEDcglU)B zn+{E+T|?4U^L8*WFVm5ISeBLlVjmmFctSQ{|G_U%&kS&4^#9lYd_VP&<*L;Cr->H0 zsDt$=SWQL4D`uEaG88gk!Y9+(;ofuft9*yOLB#~L=ig@_NKwi7+=djKKn`>nOsMIN zkX8tuUdB^7(Yon%6hA!y=omA@u8kmfuLhhjO*Rph4L^(f%CB?X_-D?)cpfY#U=2n- zWLq5?Z?drs9kBx5aPqy-MX9>dxr<5=TP4E#1|{^8buhdf7ib$DE%Q9sl`#J$<%~V_ zcrh+cN=-fTtVvSxDE#{Dtm(T$&x#4ayiE#W?Ii?!Pw<+9UmmbS{uj3U+5cWBl?M^I z0{0;_zg&HFBI&hBNkxSR-QQo&_2hE=p-Z_6>QFjiA{3elr|EF|L>#^IEcqCO>jEf) z`-&iNN{=R#c5~Zv!}Q=z=>1dRQ-!+Kh6`wzriOp&W*!O5k>oGf)UR;6_3!F2Jc=U& z&wfB~RzX>rm3U7MrsYCd0>3ePo+{`l(ZOa61Wl*dF=D~9_;1`c=x^MXoV4`Q|E%>M zUL-yg-;pOrjpg4!EJQ95UD9RdFk~Ye{zGI)@J&)k`y#%dfu<=r|qoMC5V zE;ti>ZirA~dUOM$^*kSs_1eKZ?f>Sl3V^0)teMevZjN>d*UEbA(c3YCN`BYObbabWNT>>u#JT6MfSa2)dfsfhdbay0D2f+q)p6JTPf z0jU`(KVzcMMw{6LKv<6#mv{kmXuN zdc3`~t%49w1@+7YzS32J6uZiXGaQfyXRBv&f=vQk{<_8ZYN$>`>+}R9d{-bk3*%!I zJGNkE=Wez1#F0sHX$2IBA`jVRQP=hBNVts-2}!+b4EdzSvf?MUPm4@itpoZc6Jmz% zf+DaD4!Zh3f#x9p>qO@u=&C4a+}PPoo^`4{7!Kp#i_dB|mw{-gA%yYi?5`A5AW>XI z_`#gwWx_2!j<~UA~ zK`29zsdqdbwqrPK4;bGS+)ty73>XYq#PpDBLn&`+;55Kum*s?R>>J%6%>{pI`knHo zuT}_Y%th7>4VfHy9QFhxOnS8wnp1#`C(*=+V&nJAro(w>a4 zQV_OB2&&MgCR?Xk7Wl-`ICr?T%bz}hW80p@vDblP%kXuLJ#6^ET4~0;q~QRcojZbk zBX2DH2XuA9>Cnm+U;mf7l7_dS7Qq1~W|9o`9aHcS+!9NHficlTJjg5uNxUbM5tI@? z!QzvuhUmHCI1yT_z^p}5X!g-kZZps=&BZNKM^}u&4m^$lyCRlp*4v>Fh}zlI$^kp z?1%Ax*r}Rql}dG<$V{%vLx)tl*e-P=yt2B~O1|(sh5aLUHHlscpgpKozdi3etJT)q zl;lKi;Hq^3(!PGxsIyBr{-Ld(87qtaIV*%%a0p9@VjAOvJUxIl3 z7N6GE1;}vCK|GkAar%o0kkBYWFw#{x9R1rD+oJXxHd%FQDnsN;dVDg*GmS-@mn~_e z<@&bW)bQqKDf;D8`z1WHkBcLQj27A1*{znle00i7c_5+5h4~1iAh(KN4e_KM&D*vm zBA3>|!nWtHC4uE+1wB_r(@~d?cE_I>q1Zl7m|3U*G&L?6|I)o@GiPgY22bbLZR)C( zHYVRcUo;*BSK(J*Fzzun(uf{~r19}yJhcN|9DXObdvaAfmC==Spr}BPC(}daEi##` zxbT(Jl4!e9l!)FwbOtTSrrJI=O~2&rpr?#AraIe|q#xEulI| z0#w>Ku7gyS9&~ke1bfhy;Bva}w699{)C42wo~vnvSjBURwcK~hWJ~|BVj>8MjYoKE;}Av literal 0 HcmV?d00001 From e2e9b1b2cb8dd4c482250b2c4b1f245d290cd6f9 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Sat, 28 Feb 2026 08:06:19 -0800 Subject: [PATCH 3/3] note --- docs/features/sharding/resharding/cutover.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/features/sharding/resharding/cutover.md b/docs/features/sharding/resharding/cutover.md index ee62863..6b479e9 100644 --- a/docs/features/sharding/resharding/cutover.md +++ b/docs/features/sharding/resharding/cutover.md @@ -4,6 +4,10 @@ icon: material/set-right # Traffic cutover +!!! note "Experimental feature" + This is a new and experimental feature. Please make sure to test it before deploying to production + and report any issues you find. + Traffic cutover involves moving application traffic (read and write queries) to the destination database. This happens when the source and destination databases are in sync: all source data is copied, and resharded with [logical replication](hash.md). ## Performing the cutover