From c56554f4e5d04e7a1acbefb5c7e88994116ee182 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Tue, 2 Sep 2025 13:09:31 +0300 Subject: [PATCH 01/10] RDoc-2293 [Per-feature reorganization] Compare-Exchange articles --- docs/compare-exchange/_category_.json | 4 + .../api-studio-quick-links/_category_.json | 4 + .../client-api-references.mdx | 60 ++ .../studio-references.mdx | 29 + docs/compare-exchange/assets/atomic-guard.png | Bin 0 -> 103098 bytes .../assets/create-new-cmpxchg-1.png | Bin 0 -> 160427 bytes .../assets/create-new-cmpxchg-2.png | Bin 0 -> 72253 bytes .../assets/delete-cmpxchg.png | Bin 0 -> 159929 bytes .../assets/set-expiration.png | Bin 0 -> 75777 bytes .../assets/the-cmpxchg-view.png | Bin 0 -> 165735 bytes .../assets/update-cmpxchg-1.png | Bin 0 -> 153599 bytes .../assets/update-cmpxchg-2.png | Bin 0 -> 80850 bytes docs/compare-exchange/atomic-guards.mdx | 47 ++ docs/compare-exchange/cmpxchg-expiration.mdx | 34 + .../cmpxchg-in-dynamic-queries.mdx | 37 + docs/compare-exchange/configuration.mdx | 98 +++ .../content/_atomic-guards-csharp.mdx | 357 +++++++++ .../content/_atomic-guards-nodejs.mdx | 259 +++++++ .../content/_atomic-guards-php.mdx | 273 +++++++ .../content/_atomic-guards-python.mdx | 248 +++++++ .../_cmpxchg-in-dynamic-queries-csharp.mdx | 494 +++++++++++++ .../_cmpxchg-in-dynamic-queries-nodejs.mdx | 256 +++++++ .../_cmpxchg-item-expiration-csharp.mdx | 140 ++++ .../_cmpxchg-item-expiration-nodejs.mdx | 98 +++ .../content/_create-cmpxchg-items-csharp.mdx | 564 +++++++++++++++ .../content/_create-cmpxchg-items-java.mdx | 146 ++++ .../content/_create-cmpxchg-items-nodejs.mdx | 308 ++++++++ .../content/_create-cmpxchg-items-php.mdx | 112 +++ .../content/_create-cmpxchg-items-python.mdx | 113 +++ .../content/_delete-cmpxchg-items-csharp.mdx | 355 +++++++++ .../content/_delete-cmpxchg-items-java.mdx | 130 ++++ .../content/_delete-cmpxchg-items-nodejs.mdx | 251 +++++++ .../content/_delete-cmpxchg-items-php.mdx | 79 ++ .../content/_delete-cmpxchg-items-python.mdx | 79 ++ .../content/_get-cmpxchg-item-csharp.mdx | 514 +++++++++++++ .../content/_get-cmpxchg-item-java.mdx | 121 ++++ .../content/_get-cmpxchg-item-nodejs.mdx | 346 +++++++++ .../content/_get-cmpxchg-item-php.mdx | 73 ++ .../content/_get-cmpxchg-item-python.mdx | 73 ++ .../content/_get-cmpxchg-items-csharp.mdx | 454 ++++++++++++ .../content/_get-cmpxchg-items-java.mdx | 98 +++ .../content/_get-cmpxchg-items-nodejs.mdx | 293 ++++++++ .../content/_get-cmpxchg-items-php.mdx | 55 ++ .../content/_get-cmpxchg-items-python.mdx | 55 ++ ..._include-compare-exchange-items-csharp.mdx | 681 ++++++++++++++++++ ..._include-compare-exchange-items-nodejs.mdx | 468 ++++++++++++ ...ndexing-compare-exchange-values-csharp.mdx | 556 ++++++++++++++ ..._indexing-compare-exchange-values-java.mdx | 66 ++ ...ndexing-compare-exchange-values-nodejs.mdx | 323 +++++++++ .../content/_overview-csharp.mdx | 345 +++++++++ .../content/_overview-java.mdx | 246 +++++++ .../content/_overview-php.mdx | 368 ++++++++++ .../content/_overview-python.mdx | 276 +++++++ .../content/_update-cmpxchg-item-csharp.mdx | 236 ++++++ .../content/_update-cmpxchg-item-java.mdx | 140 ++++ .../content/_update-cmpxchg-item-nodejs.mdx | 178 +++++ .../compare-exchange/create-cmpxchg-items.mdx | 48 ++ .../compare-exchange/delete-cmpxchg-items.mdx | 46 ++ docs/compare-exchange/get-cmpxchg-item.mdx | 46 ++ docs/compare-exchange/get-cmpxchg-items.mdx | 46 ++ .../include-cmpxchg-items.mdx | 33 + .../indexing-cmpxchg-values.mdx | 42 ++ docs/compare-exchange/overview.mdx | 45 ++ docs/compare-exchange/start.mdx | 40 + docs/compare-exchange/update-cmpxchg-item.mdx | 37 + sidebars.ts | 167 ++--- src/components/Homepage/Features/Features.tsx | 2 +- 67 files changed, 11010 insertions(+), 82 deletions(-) create mode 100644 docs/compare-exchange/_category_.json create mode 100644 docs/compare-exchange/api-studio-quick-links/_category_.json create mode 100644 docs/compare-exchange/api-studio-quick-links/client-api-references.mdx create mode 100644 docs/compare-exchange/api-studio-quick-links/studio-references.mdx create mode 100644 docs/compare-exchange/assets/atomic-guard.png create mode 100644 docs/compare-exchange/assets/create-new-cmpxchg-1.png create mode 100644 docs/compare-exchange/assets/create-new-cmpxchg-2.png create mode 100644 docs/compare-exchange/assets/delete-cmpxchg.png create mode 100644 docs/compare-exchange/assets/set-expiration.png create mode 100644 docs/compare-exchange/assets/the-cmpxchg-view.png create mode 100644 docs/compare-exchange/assets/update-cmpxchg-1.png create mode 100644 docs/compare-exchange/assets/update-cmpxchg-2.png create mode 100644 docs/compare-exchange/atomic-guards.mdx create mode 100644 docs/compare-exchange/cmpxchg-expiration.mdx create mode 100644 docs/compare-exchange/cmpxchg-in-dynamic-queries.mdx create mode 100644 docs/compare-exchange/configuration.mdx create mode 100644 docs/compare-exchange/content/_atomic-guards-csharp.mdx create mode 100644 docs/compare-exchange/content/_atomic-guards-nodejs.mdx create mode 100644 docs/compare-exchange/content/_atomic-guards-php.mdx create mode 100644 docs/compare-exchange/content/_atomic-guards-python.mdx create mode 100644 docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-csharp.mdx create mode 100644 docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-nodejs.mdx create mode 100644 docs/compare-exchange/content/_cmpxchg-item-expiration-csharp.mdx create mode 100644 docs/compare-exchange/content/_cmpxchg-item-expiration-nodejs.mdx create mode 100644 docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx create mode 100644 docs/compare-exchange/content/_create-cmpxchg-items-java.mdx create mode 100644 docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx create mode 100644 docs/compare-exchange/content/_create-cmpxchg-items-php.mdx create mode 100644 docs/compare-exchange/content/_create-cmpxchg-items-python.mdx create mode 100644 docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx create mode 100644 docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx create mode 100644 docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx create mode 100644 docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx create mode 100644 docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-item-java.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-item-nodejs.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-item-php.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-item-python.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-items-java.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-items-php.mdx create mode 100644 docs/compare-exchange/content/_get-cmpxchg-items-python.mdx create mode 100644 docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx create mode 100644 docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx create mode 100644 docs/compare-exchange/content/_indexing-compare-exchange-values-csharp.mdx create mode 100644 docs/compare-exchange/content/_indexing-compare-exchange-values-java.mdx create mode 100644 docs/compare-exchange/content/_indexing-compare-exchange-values-nodejs.mdx create mode 100644 docs/compare-exchange/content/_overview-csharp.mdx create mode 100644 docs/compare-exchange/content/_overview-java.mdx create mode 100644 docs/compare-exchange/content/_overview-php.mdx create mode 100644 docs/compare-exchange/content/_overview-python.mdx create mode 100644 docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx create mode 100644 docs/compare-exchange/content/_update-cmpxchg-item-java.mdx create mode 100644 docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx create mode 100644 docs/compare-exchange/create-cmpxchg-items.mdx create mode 100644 docs/compare-exchange/delete-cmpxchg-items.mdx create mode 100644 docs/compare-exchange/get-cmpxchg-item.mdx create mode 100644 docs/compare-exchange/get-cmpxchg-items.mdx create mode 100644 docs/compare-exchange/include-cmpxchg-items.mdx create mode 100644 docs/compare-exchange/indexing-cmpxchg-values.mdx create mode 100644 docs/compare-exchange/overview.mdx create mode 100644 docs/compare-exchange/start.mdx create mode 100644 docs/compare-exchange/update-cmpxchg-item.mdx diff --git a/docs/compare-exchange/_category_.json b/docs/compare-exchange/_category_.json new file mode 100644 index 0000000000..6037ed5859 --- /dev/null +++ b/docs/compare-exchange/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 14, + "label": "Compare-Exchange" +} diff --git a/docs/compare-exchange/api-studio-quick-links/_category_.json b/docs/compare-exchange/api-studio-quick-links/_category_.json new file mode 100644 index 0000000000..be90a8f2ba --- /dev/null +++ b/docs/compare-exchange/api-studio-quick-links/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 13, + "label": "API/Studio Quick Links" +} diff --git a/docs/compare-exchange/api-studio-quick-links/client-api-references.mdx b/docs/compare-exchange/api-studio-quick-links/client-api-references.mdx new file mode 100644 index 0000000000..b4bffb2b85 --- /dev/null +++ b/docs/compare-exchange/api-studio-quick-links/client-api-references.mdx @@ -0,0 +1,60 @@ +--- +title: "Client API References" +hide_table_of_contents: true +sidebar_label: "Client API References" +sidebar_position: 1 +--- + +import Admonition from '@theme/Admonition'; + + + +Refer to the following links for managing compare-exchange items via the Client API: + +* **Overview examples**: + [Example I - Email address reservation](../../compare-exchange/overview#example-i---email-address-reservation) + [Example II - Reserve a shared resource](../../compare-exchange/overview#example-ii---reserve-a-shared-resource) + [Example III - Ensuring unique values without using compare exchange](../../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) + +* **Create compare-exchange items**: + [Create item using a cluster-wide session](../../compare-exchange/create-cmpxchg-items#create-item-using-a-cluster-wide-session) + [Create item using a store operation](../../compare-exchange/create-cmpxchg-items#create-item-using-a-store-operation) + +* **Get compare-exchange item**: + [Get item using a cluster-wide session](../../compare-exchange/get-cmpxchg-item#get-item-using-a-cluster-wide-session) + [Get item using a store operation](../../compare-exchange/get-cmpxchg-item#get-item-using-a-store-operation) + +* **Get compare-exchange items**: + [Get compare-exchange items by list of keys](../../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-list-of-keys) + [Get compare-exchange items by prefix](../../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-prefix) + [Get compare-exchange items count](../../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-count) + +* **Delete compare-exchange items**: + [Delete compare-exchange item using a cluster-wide session](../../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) + [Delete compare-exchange item using a store operation](../../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) + +* **Update compare-exchange item**: + [Update compare-exchange item using a cluster-wide session](../../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-cluster-wide-session) + [Update compare-exchange item using a store operation](../../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-store-operation) + +* **Include compare-exchange items**: + [Include compare-exchange items when loading](../../compare-exchange/include-cmpxchg-items#include-compare-exchange-items-when-loading) + [Include compare-exchange items when querying](../../compare-exchange/include-cmpxchg-items#include-compare-exchange-items-when-querying) + +* **Indexing compare-exchange values**: + [Index compare-exchange values](../../compare-exchange/indexing-cmpxchg-values#index-compare-exchange-values) + [Query the index](../../compare-exchange/indexing-cmpxchg-values#query-the-index) + [Query the index and project compare-exchange values](../../compare-exchange/indexing-cmpxchg-values#query-the-index-and-project-compare-exchange-values) + +* **Compare-exchange in dynamic queries**: + [Projecting compare-exchange values in query results](../../compare-exchange/cmpxchg-in-dynamic-queries#projecting-compare-exchange-values-in-query-results) + [Filtering by compare-exchange value](../../compare-exchange/cmpxchg-in-dynamic-queries#filtering-by-compare-exchange-value) + +* **Compare-exchange expiration**: + [Add expiration date using the Client API](../../compare-exchange/cmpxchg-expiration#add-expiration-date-using-the-client-api) + +* **Atomic guards**: + [Atomic guard usage example](../../compare-exchange/atomic-guards#atomic-guard-usage-example) + [Best practice when storing a document in a cluster-wide transaction](../../compare-exchange/atomic-guards#best-practice-when-storing-a-document-in-a-cluster-wide-transaction) + + diff --git a/docs/compare-exchange/api-studio-quick-links/studio-references.mdx b/docs/compare-exchange/api-studio-quick-links/studio-references.mdx new file mode 100644 index 0000000000..bea5636bda --- /dev/null +++ b/docs/compare-exchange/api-studio-quick-links/studio-references.mdx @@ -0,0 +1,29 @@ +--- +title: "Studio References" +hide_table_of_contents: true +sidebar_label: "Studio References" +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; + + + +Refer to the following links for managing compare-exchange items via the Studio: + +* **Overview**: + [Ways to create and manage compare-exchange items](../../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) + +* **Create compare-exchange items**: + [Create item using the Studio](../../compare-exchange/create-cmpxchg-items#create-item-using-the-studio) + +* **Delete compare-exchange items**: + [Delete compare-exchange items using the Studio](../../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) + +* **Update compare-exchange item**: + [Update compare-exchange item using the Studio](../../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-the-studio) + +* **Compare-exchange expiration**: + [Add expiration date using the Studio](../../compare-exchange/cmpxchg-expiration#add-expiration-date-using-the-studio) + + diff --git a/docs/compare-exchange/assets/atomic-guard.png b/docs/compare-exchange/assets/atomic-guard.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2a12abe784fdedf6350ea04e0bcd08f309f1a6 GIT binary patch literal 103098 zcmeEuWmFv7)@>6Au0exaa19=UTOhawhd^+5cPB`2cM0z95Fog_yEN|B@G9q=`+evB zf8+gnHDEMU)4Qs+%r)0sa}z2rD}jQDj|c*RP$WNzDuO_8>>v=d89Xd-2F&bf2fQHI zd{Vauflz<_`G$(8M1c69FlA=P&E@?+A&T)iup41Q4 z`J;T<)O!J4FowwFlF=~!l0Q7+OhWk)XR9a+jmy53y<51j`*y6ka3NLQR-NZKuTouR zJWyXstyz%s_7^fb=m#90^eE4b!%4B1_mzXpoWt#Q@(EOXro9bnGkCU4SLHVEdA3b$ ze#*`nMpRT3eDy=l!))Pr?O}Hg3e>a0Ri8^p{y#_aNXP+`PsqOy8f@4U;B)_b#8u&$ zyutX_q0sj=OY(o;2Yz}R?o0KrKfu8F#_<0e`G3_X+YY#be~re0it36_v9=6LswK!r zo+hN|T)$SE2T2758g!VdDX%kCX(7N>k=ASDO$}P#hL-F8>bU+?BH-)pM7P6le#|8v zV>r!8DClL&!=TCwB7GA|x_5#isGa1l}`e`zt? zllgo0I8gsHksRQb=Iod+!iP3&$8s9B2tiqmwXkCODlDlCjV?E?B98|H3g4ry-W{78 znOUqjmgcW@$4IdgeMC@*ThB=C)3fGP=75n@l-E-AUkrl&S!&rw!2C@A;J(Ph%BeT+ zeVdUB{~CJVs^hE6Dqk#~Fx8aDz7lCfoE zSocM)wuG4*O)Z^>0%&J4Ld1=-Ij;nkH`Nt2*!R6Vm5XWc!NN)S1XBA3z@5p@j5m)O zyi7d)Q2P=F44D?s%Nz2~W(;VsoxrS~b`gl6flu}Vjxk?r4>HNpP9 zhI4pP=Ef=i{M;#!!y$8K34WR^8y<70gV;`Z1igC~EXr1<+{ z8VE0LRDWM9@W~4#sG#oXhNPZfUF`Nd%n#^|VOcqg$8&l!0w|ESWnyelGAo9Rh_~}n zH@^(RQro4yNy`IOsT1`LNt3mC*t@^mY>r_0&;84MM>x4{UvU!+yjId-`Od zA)fvZJ|4p$vxokfE+={hJ)TK~1j3T8jA8WPb(`JJVQN}j5an~lN_cAf%a@}-VM#u1z(i1MRqMkCYy9ZtAbuLryN``wxa6D06(Tr?>uU<@U;twDYTdUJIqR z1>$n6Ura5bx0e+@NM2sK{p(WB1wN?rX!JMB(U#|^U4>Mwc|2ey|FuT$w!iU2 zv?2UENjB{e;?WI5oXU~#P$*ng$BxeYvHAg1xRt$XD)e;(+{CyC^Pq zExDu5S_i(0)t7))@70G}j3?#Q?SPR!o?{k7hdB~(!{?N6nsn;@HeY=GvY)k%z`FD35yDWVW zwx?A=VRr9tppiru8#qfF+3jraxz#hX!#d_-Hku~da(Mh%zT|(D*6NTb)WF)pheSN4 z)jUKB40=*24GlwiK(CPmfTTeWycozX`ZeFOYt3+Bgno_C8)M#tN0OJyE$&UlxWuj6hItox8tQWfyxfN3J~LEwjbqy*-2lB@J@|IM`)o-^nHb zC&qdJwz5hn!POC;@{OgTE9)-Ob-~XS;Y-R)1+V}>NV>8hN=ZDTLor}A%}zUypY{N_ zvN=8wOa|XwF#8Xx*T&{^j2|7e`kqfbe_INP2`FX2l^QgUPLHh+I31+#_U*ade2C{l zN3_G&Sk%G^=U90+ZdqDe3L9T1gST(l4=RkKAkSe(2o~nPob1T0u1DzIsry-M9z+T+ zuYz5pWYFlkBXj4O5dg8f42w=xi>n<=RU4&(N#St~lw6Yij*9ncr0!~I#S6O!TKlKv zM|fajI-T+$f`Cu!j1gMt@PuzXkM1yceh_0vDZ|wj@iwMEOhL{0nfE3i+i_wmSR^R} zPkgMb#D=-Fp-Hu73UeQ9CZ@8IF~X4gPbiSUys2F#S}6Bt)E23^oSngj9&vGU$HBiL z^c}F6$h>@PZG4&?A}o?jJ^WSFfAx~-x+7s)8eqj$#lp7h1kWLG5h};n0?}N1`T){v zbayll`4@ZY9lGOS-*WwE-{|tZclOx&V2@LR5;4MPS{i1>#o5C4r@PEdlMp~VD%Ug> z()?}2|N8K8r66XA?70JEkU)NGc4J_aQP4}@6u%^ADYVy2&KbdhKnlmGk7fFwMgIp; zq%8Yir-0BAVaFG|X3n(4W=_~uL>dUxS@T<9nnxILja~^-zVYqnYl*=A_k{@UnvuR# z6oq2kwO&>(5`sWAy|8LttbZ23G8a8H+PiNvHbzaPLt)Pz+*koid=XvkvcT$^)l!nR zf*PcE?)qxK4-qHFfbsW|mizwIrINtchgrWP-#onBXr#|C2XXp%wNOB|j@Wc+HTO60 z9F%Xm>ONQWu#uq1Xt|30EHw>S`07szKhBP=6l<_=*6~V41;rCs>ogVR5~@zbl(Y{C z3NtJPg?$rio@@s^`Q%b>q@+p|5z!*rD`1^48F?wz1EluxCI{+BAsLyFE#Rotr36Dg4 zuWTs9WRY&v<`Uk|=g0!LRfj9(hEPmZHbcLKM(Q^+jgXZUKa;l0+iX1$NM5r8H?TJz z0U{am{mJjm_6}}t$0Jn`Y>QfHc4IAmJV%6ENK>tVgep_YEm5$s7b;gp=9KxD$X+vl z26}l8?CXf&^+9^6MQ7mFc$xxf%|`|Xf)~DOp1TZTh+?3~1pnBglU~NT<^Ka10JQ|V z)N3IddEw%c+ITG-oBXdxmVd>5$Wgp@G zI%?#++4nlSyO)Anj1UDqj5@>7& z9KbYci=d=8G5LT@`oWH!fB3t0iHjd;7Jwb)Pn+MOwAUQqXBR=899Oi*&{R?pIxe=UrO(VAQd6WCY$0m5W7QVtq&VhW@~h}|2} z+39Tba4q<#!ssxd2~vHJS`yC{%b@z|(k!Q2FFrg>F^mZJNPKYyra5Miv`l193j|*{ z+b4T%Fa;J1O9co;(%(@nR>i*fZ%)#I1X=HU96(;OgX% zg#gOV(nVwU-PcIj2y`SjFmpO)3rH@SEkOzvX`FHEs^rh7q@S;I7qHUeO&sTM*9Gk# zHU?E~wC6#b>U4Ybbg9!8n54g>l%E=M`2yFTW9qPiza&oy>Ux%?p$aE`cu-o$rmLJ{~jIaKN=3mE}Jovm=Mk^dI+Ck;bHyW)I>{Y(S#dQ+G*sR zll7DQU@_|)M#$$+%N4CZDmn8DiuVu90x5@RXz1q59e1!T&647*;Vs$_=I}tm*`Vgd zitIu#tf-JQ{OZ9?CrfNdh*Q{9R0r3}J9NuXT<^PMhs3{=HPKWH2{|4lQ6O?~x+iSd z>IflNI2As-I5b-KULW>JJhJlgl?#lHGWxJB)me1JV)jV(47&gjS*CA9gC&Ju+lx&7 zmUVt=A*H$_+soiFZTT0iH@zAD^|%^JuuaW%_XP(mG~N+-oCFs;k$H(2w7XYedwc;# z&@ZT(9er1alV{Sze?GM(D;LSwB3@ijjLc@Ogv|CAd;L4gajr#@WH-fhlN*q7j=P(y zJfd7V;}@Va(l7+NJ4t!BI*k1G&6v4Pl}*9d;55+&I?s(B64)7W`P z1M6#4XV9&@{evHMx(0vnq{>pY z-u6oWY0GD=#p0|X*5q)L2M%|3SWEUvBm47CGa`!8g{&N-zCre+;#zigL_PGHJwfx7Uan5xmtJKq68!kB9BWJeHf`SkCA01 zB;hj%x68vpW(#KioQhMZ=ocRL(OctqX5ZJ3`LB-dp^@r?c@wpf-eF^wbNwLQFi z>ouImLChnTNm5=8;TJ-`Dw0ctb@a+~KFEL(Oo)#sSfK*Cecz-dKpO?_T3#tZ=1)Fr ztIh$i`STx8$X9jtkl`ix9_c?J|L-HGtRWX#re?tmkM=EMU_CoS^+MX&@R*hQOGAqd zO=CG^Q)0!adf;3i$m_D)=5!h_!broy**<)ZDGg3lip>Qs1|y>~^@Z_Yv|wViG8cNJ z_33NRR?|W#BVWcGSf>di-{E=K{(wn;D6ogjVYwAv2h&PI}qp(eFB_$KXfwp%N zvx@5xsO%lW3}YAknpfb)Z7;um7|N4j;ar9TA#?m|A=HO7+QklU4>AYM?2ePbJ?Q{B zIKd*!EB>C^4Al~7bNw3Q-s{t;7ZTK9bVNp3O9EXu#*5)GJmRJF1=C_m2o-gZ?fKIf z3b@Q@Z@aLHd{G)m4gnlXuybdaW}qqlv=H>q?Edo-v-E?4{k4LqHiW;&9@5qjQ|~w? zL&n0p35EvmZA>U#DrOAkIOvZj^+nHD|Q zunoW@vgJQ@M7|FE_Fz)as~|eX!akoLwH@y5Ju%9~xf~pVBeZhjDcNA3x0}8v(G)zT z{R-n-Qh&jklrsWs=I^!mlQ$vtzcOVUO5N9DQVL{B142Sf>`|Q8J~<-*gvPXHOWXtq zK#<@QUrOd6p&Fob@d%_Ay(}C$&l+3JZi^$8bQFwTKDOt*4A^dMT^s^%@qLcV+9jn=@kDSidid(i1FH` zn(@lLkakou(4D8wvPE08T_!L~m6bX6!CE-+%3qz#2&bkDXm4q0ipM1!UrlsQ^YO-y zTYqze9!@anaJ_$*#F(t*1oPF(imVuXo3*to*0_gLXpo+c&s9rb@>A0ZM(x{-Rb0Yc z!E%P=L-SI!t~{(l7_4hcD(c3dW<@#ot2%%=z3$yv(NrdXQP87768 zzeZYg6DjmULTF-bV4;94pNK_R30-V^8%J-Q4r2K@-xg>rbnxrPzm?`x>M{!U5^##V z%2c#n3y>oBZade?0Za(8+pDsoaFUTK1kjcvGj4bxbW-?Nh~e}=Mqi#vSkoD3Uk!2Yl?xecE&fM z>$BHLCiCuwz4l`;Te*EDrR@LdF$fs?9ml>0ag9WvdN=O-oG^QiQP};S+tVx zEBoFywywH5thUzf9(1-}m14?Fm0+!v@~h2aQe10PpRQ7)|Z-H5Ok6kJiUqayvUDd1Va* zZitjP3Kg`Z64%)bNXXT%a0y@*g?67XSps?TO zdDuIvx)|zS?3J~M&7 z%)CJr<@K$!Q9Ag8qAgJ|DO4cm)l)`M(YS@XOCZR=qpMj7i;5C(@GnMzLeNV zjY_(#QhjofqU{v1WAYkX^7Uej4mu18d5=_>_K(K;=W!RsGplB)P}sJ3UcdFWT8bd_ z-2(LgyY%S4p8mb~#52`zBc(~pj4H|DD^v@6vA^>BR507DM(uA|h%G#R28zsP(>hj| z7@JqGmfv6?t;w-pNR&F=xv8#N^WZ!3LHNIJ?}SuJiKDc`=KY52+Ssb#zWCS;uBd2j z0L>7(C<2CzjEhcOKD&xoToWLeqh@;Gg$;aPy)g%B7-sWc>+`0Kh*BUB^Yhu#0gbIv zyz+Fm?Tam_6A%Jfm)DYa!`?3qz-0iEq|X{x6qnAOQ1ehWa>L|pY~4?5D%KP2oKoGD`Wt>@)JOxpX9S*=ZXHaIf~vJwRX1)W0b%IKI4Bmj5yqQS%U6Tu`UnL%hH-hXT>37!xQubobOiR2c!OGjO zKwnM-Vrpe>`q$8^Sa7E@pDvsd#NUn{)lziWs!dw@Q3@$y#S!sESB|8d3MbRsrf1ub zhD^|Nakh=lu$&eJZ&fJ`)rZ1}j4ul^Oj*kH||D(X!6JnZ5iJ2YgsT?;o4sjD`djcl7c-1^IP8CISAR+s`*P;Q4!GU*7k zt&3FVf)>IYqP^zBF2@;Y(4DP`-9o*H20+dfYfI-l)X~qF^3e<9w6MYvu|hyTf}%ZH zIGwj5TP{58{w(C+kI;+Ay3Xv`Up}=D_bINSMQoWrXET2>Np(o2BK&ISD!R4gi#+IA%?>O$ogJwy^~r^v2) zLwHKjGRGxMs0`d6J>?6H8k*h@y7<8>=s>k+UN^AJzh`b1cS$Q&vO|VE5m2@!5*^%Z5VS#E$b5yH0 zw-n!b^(#g)KRlc(x)}BBi4kD>!CD*M+qinkx3YQs#|to^NEr7va!B1JH3m+gmJxxS zgllJ`HYPm0nAg&G_tt;QMbx&7>Gz$J9wj3OL*0(=Zm3d}d>pXxq{k6orS^Oe+C<`Su87Lt?I# zgcg3LV@x4V^hZ%ENUU=RYv9C5`JF?A-I)~**;I;GC|;*eDYuud%Pz-FFV-UcoSK#d zi<$MABMHg++V2mFIg~1X^dxgn2^M@Axy5YZb5AWMYxaEdtwSu_{#5~aH4%W8I&=<9 zsSdDZzci)A{4>8&)y6p^qpgMpD4J}&re5PHo)F}tGZV}V2W!J-g|Asdx^Be-*P+i8 zs1$w9WKRY?f^75dsH@OZ`+&)RHd`;A!eWkISH8aXWhN;!;QZtse8AM>L-D7|X3}3N z0AV2w3xN@VZ*{~>zA01~<8o=(Q=gQ$#oZsuQI9)HeE-c!JC&*WDad>kn;E6ri zRPy^FUxMtzab?Cw7)KApuA6p;#KbtQG&G?ERjW_D8Ei{H+G9dw5jl(uj*(O=OLmI@ zlrJ3C=&~BeY(vRo(K@AJMOl2UA+2{a>|LlA*s~9TJZTYUu*2_t$7`> z(Q{@e=`$nu4}fQft_O~@>!6OT`|rN-;Nq@dRU#)B?XYT41j-i4CPUCNk$6Dx$r*Wr z#4N(qjN!3`$UuD~j5*X^3 zpyc!Jko6L%^8Qb?3cZ`Nu#w2@v402!5H>N6Mj&8PKG3Eg)F*KDLV0Dt;|Sm6eWeNVX=3)IKByad96arD z(Btx(`@nL)F_!~0+|+w47npwNc~69*-E_igOV{8en{-bon9;hgCqrwJuIZ+a%4rr0HYC34TzwkW zmckrM6znX1dhTe$GLC-`jAtI^C7&ROGiM5Q$x}kFm?>C~17MO}q<-m;vvvpK6!&BE zpI@R#d|Y+;epyh%C3~Kp6G{ z!v(dE$T$L%8^lVDZ6KyWxJk8Tp0Yq0ru_#b!H00ty6}I!vtFDvKeg=`Qe2 z#++EO>fTJVa?-`mfce9W0FAt(5-Wz#vm!uP2ykBHZauvIDJd?K_&3uqNeN5zdXfYA zR3E}BADj6t5TdvM)s)evr!_T|7rScvOWU(w{^()|{80qPy3hLE8b0r^9eY_!H6s{xU8a!{K^(;~=x*6AL3*}ktXmosuT3hzJNP%_P z-87Bx^Mq{ValMwb7~=~MM9F?GTT+lTX8{D&6Toze}DP3#2a zuVWkTAW%9Nb9O}yhiMDY48U~&P zr=0ifCjw9kG1s@{C0Uf&&wq5~y#6rS5-Y)PmbqROy;5_DCe)hvMsDQz&*O8U^^K-_ zFO1y29ravUU)Z-WS8x7!KAr+Q#wvANom0a>ATN`<2Uvfpx35;M2K!&~w{!LMuhdC% zHUQ$l^-5%a_6gz9V`U=XYgfS9t&^TS()w0{6k%LCI@Fapl*iy)C;}r4@Yx!c!)dBd z@IpO|0Knh5vt|b(d-j#D=sv=oTbR7+-)8XmtrdpI`oR0S1E&*c*M;q4;?+kpQ6zpt zre5L!)EZJ@=<(c#GXaPv!rs~6RLoW;y`Q=*{U-+FU0$7r!0b@Ay2t98!TerQTHtMJ zm;$3ZS)X<;^Xmu9(Qjga`Vq)d$yugLKn7vgHg2Tb|MAnjXx- z5kI*xowmGRKcIiAiZpKjxef&Tqu674QgZZ(GYuD1-HY3I+P54F?!O5X&i&V6+A#@b z=Bb|{Qw44)r$6SwH?O^!AL;}rABcg#ZJN)r@kIcM@wx0YIB22qAkAQIQ$H5T6)8KL zH)k`L)=cYgDY8u-G>aYO$VH{-Jl=QaEJT)lN0}bbAoNxj zOeqoU?M1~;f#m_~qaKIoq~hK@oOSHfDD3eC_#nacqdJbv+}+6MDk6j+(j+XwsVrCA z7tn-9pYG2&JF9ciLLzk%FZ>&4fj2A6rNYtgl2AFwA7eZG?mJ${>|X8!gep^TD{5wt zhuVTkv71=V!QQpI_7scA&zE!hR>jaD8kPJYK_yz|pvz-4!Ada+9I;yXEK_u8s-)CI zy<$55$2A>66TNE+t(w(Kyts>Aw7##psdfs)X{T;5?OaTUU{~=cB;AsYN@6qdC!wD9 zbHb=}KUX6(G=`Uw z#-T?g_C~*XH)Rx-17obpbW^t+K2Sxb)pqutJO#GG7&X=a`Zsg2PfxOcT5ES46b1+@ zQB4FL=BF7Rq|Nf-lH>YOzRg`%*gbqE@^5?GufVxXe`hbwZ);%#t>tqJR25ms?orFR zaGoGQS+f8vTEHdB>xcG_KWR}H0flFj$0&juXq<|LA4=Ar;Ws%o%v-;l;V`Q@Z#{4Q z{At;pUo%DlxYEFlF_c^Dp>RLqV-qW76r_JH*1-k7ig>5G!|Kg> zPdQ4h)cNZXdYY~#HSg+^=g{{fcKW-yQp5n8fk7u?ycc+ClPArRxdsyW*g$yJz#N3@ zuUAx)xWZEeh-h{&Z*}WWXQ7Ev1Zi@*7(%!icx~maI_DInjgdeRF(@x18c2`Aq~yY) zfhK*pme+UdPbeOX8vZy7Z;x^Du|no47S7e`#h-%q#JeA|LGldAXS|B9i4}6VaNuwb zi_k~ztY`6`3~aF05E-6j8ALiI7~@?8)wL?72^91(DW|1WJr-7d1mrMacEhPY{@mUa z(4-^lJLU?_%3hhgmNz&?9g_7>vg+IO;B#S2doaEi|45S3w_=A1Bnx+yO@tLeM#vSe zk)&Jx32#81Y7mhJ4(*4K$A}40gv! zlc~uX!@{|#c^&^DcfkG_PAcif$}ahGnc>#UO)Xin_&`w9mq7(G4dl}w8UtY+)m)po zNM!o0cNI1Bj~q^=U&hfuxZPHs>66N*_Iur4XsKFvL}O)nr~OF_pYRs^kWt2=Exnh) z=&~576@AK-4-E+<7{9y@-6-f3d$$Q7&1L9}4~}R;Qx)#IG3X9O5v{8PU4KbR?=yf@ zM#-KLMCwu|;=TF^!PR>V#Pp%*zL}>Tra}M+EpGMmrF%|x0<+HovnO0TNgMugLpCDM z*c07$%47fpL<*)jo$VR!Yyu}eP707Ob0LFlyw)YT`Okhek5YrVyfHS)$%Z|iQ{n3X zaiiM%MNQ9r6YG~Bp&{htk>$46dwhx4dkZ($H?yGY5`w#NKPq<}{a!Wrc%lW}15D*1 z;7ZhvJ0>Q=uMlu;>8$^Jn!!P+Yg(%F^iqBi@Bq->Jh&h2BpvO$m#NPc6BCI|-cOl& zO}FUNZ@Kzb&(HHL=iICi>YgWi&iEe@cVBMSvLj`>ZpwqBAxj-F_Mb7gC-=2u*u1Ye zJmU(%a{R9@`QWnHmAlTns99e|W+ITu7Nr4VXQD$Qnu@KcQ?H-875Ydz&mdp8x9)l_ z6YwEdX>w4^)u#1W=hN$^%5?q&7OD5x{jr7Fakvz3kh@-XRb19WU=#n)OzmL3)eeH$ zEjaW;d_fn(R~fjY-Iv|!^QXLsLsces@2}%uxJ=jTl^6kKLP9j0)aC%z!&+xXB5F~V zIAEt-~ZUh{LPv{kSIjD{! z!2q+Ufa4>YW8nk*SHDN-g-1>xESja*&+s-xBpi3{7MbK~^jQJOqINsXh-m1gkfowR?YTW+I!IkJ8Sl<%)%k5HV}3?;WHW zJ6<)rx*j9O;+5(hsI=txJ*@lEhRv?t+7EZYD-TKE4@DxQ__5s;_qAGYZNfb}$ba9W zEhO}u406ZOatlE0^wDb6`G%JZUpR#hQ0V|1rc7-&?d7R>L}AY-F{x?+fDMm~9ufbB zsAu~w+N+IA(Y!SVsH6;Ex$`wT9?Q6Vv;ql=IYLX7ICWXnlVc&5J~p1~?_T|4X|~oD zAzk-p82V`$0(+|3GIf^mMG75;oun1XNdgCO0FEzVpb!9Mvxm89@R&DA4rT5^C&G3k zA{5BF)#OQs7%}e|#F}FYxIqM+tf10(T+u~Y$wHK|Fw<iVJ_tgsSN~<>w^Me3 z7fJI{MR~D6j&!|N(!F_t;>Ua}Qn~1Jw66Uz-!GqPW?3*pU=dkyyH6bF04&U0bRv_J zUk^2L>6`P73~V0u^O4giw$&Q#woV#iDGs!ulGM9}vZvLUarNk%gO(Ew)Q&#Gt#^wH zGkPlW#B~bi^q^n~IDOrJy(nP4^ty#~vnRpsDYSw*drUX_QtyqAz|Hk~M4-XqYlO_Y znQWcf%|vN27k>7L?7#_kAP(Hp^8mb54O-;R)CN&sR1XKnqfaBeEe5*7j7bvTM1yRD zYh=fT@uNTULoNl*$Y(3z`>ZCI!fiqqa{TuF(<$??2*tT9S|uEcdR9^70FfG3i?Pu#5j z5H-fsS^zqeRe}O&uUL^uAEp$41_~qWH@TFH4J^ajA{~#eweTN-{80nycOvE}bfTZT z`B_O=61y=GwsKcBAKWX%Yu7L9-R56obeJ;rQn!V3$?|1ygQ4z8?whYCn(uS`Ui8aE zfR?o=zZ?5wy6~Mq@LO<>Q_wOmulG6rbdk=N@Ed~!DL#~hwy#&=|B^@> zpqi>-?9{u$j`Ld6;>I*(Pjqcx&ej`=_bsWHl+Z*au*~p3u0hZs_u~=70gI2>?8*mV zbEa?JYfGd}Ilf)XYR?L2Y*3`rv*G8u_v~TM$KmMq=?IS+Bz$iz=T@VNqP!<6M<5LX zKI^qz&sQSm{F$9#HP-84HRQ1ouZ`2JqcVR*?c(4D*7}AuIMCViBRvodoZlRxUsme_ z;$mgTrO=(%h1*s06|&glqOP?`1>kWkVhZHshwd`+Q`P_hdKrA0I$@~khw-e;TUEKC z=2?5q!OJ#WmfLvmX%hFB9iA^F+^?oqwW9|SH=YY@2N#Qs+x@z|pFiepeoVTVwVY6& za2vTn?cT2JN=a-f?&nqibqsBx3ZKx6!F&@eE9|g{aSq3FD<{Ay%}79;{%iTxD<}=E z723|0f7ty{4H;o)(VtYlx|Y*OHB`fQVEAF2b_>(pcNhAJEz0emUPSFt@7SyirX%;sOOK? zfMegNFoGnD{e-u`y2D}jK0qN4@XYpH{elPfb4b{_GP?05#Xy?YjCl>h~YC(seD7|iqL{O`fvYin9=(xNm9g6rlK^%G4rxJ zB=G*b;Ens9?Q>n`dO6%Gln}bSmO_tUtW&FQOY)MP~cB>NQB#BIuA zr{cKv_Vg?KcIeN$rB0TNDpi99lOFR8b-rO3AJrLuZ`ALb0NVqkS4nU+B02wtCD(Vt zD^X>S!KKhs?i*p4v$!IVcT;8iel$)e^O$ZhNwGfSj3A{S^F7>|iaUjtpC5D#bfU`E zZH0wUH_D9v*u5LdV=p%hLWfD%>h}wE-3I*^7VqH4}Hu#EczRW z1_XxiCSKho&E4@{NmG8eh6y^u_{>ABpyk5J?#nb2{1~rA7@c+|(u3;}&Q<&|dpp-b z|6w^_i5QL?!(&7spn}Y`OaNYX-5U-TWz3VAJ2KXeGlh~jazH((@^H+<^Dc!YAT;D0 zwvMaE{!bOCWyfNUuz)iJxfXqg66&1I4!4#w83|0F5@zglc8%F&AL6kDft43bIrAITX#zw+H;Ll5eI9&|P1}DNDPZckL!QeM=eunG>GYd#^)hsq3pF zWvN8N^zL0a43M_vW>CHPc|CG-=N8^^5nCcwCw zl~a$PZ5ev{7;~{dHnwnJE8=7LUZM~h`L0z`qD-9KvX{j^SGY@1IO*-w+ERfWg~gau z>wVer;6fZkR^~e?7P25~a;)q^vjWxUtDXnfTj|L~6^_C36b(9(_dy_PYK z4WK>NsEx7^lA6aUp35ZYS zg+wHr5-%q&kDZnJ&C~Pd?jqNDTEQIgFYweIP4@-6VzGu2$%biRAHRPRZp6M+osR&P z=ysUY0?;d3VP8+kS5yAnieGD3ZGNTJcD*?O|#HfAYC?@?VeBK|@XmQJlufL@bJVwQYJ zxAE|sncA9CLf{NzQ=BB9d`IHtH#TAYG=$Nkn2N^yaY~*^171)JgNMY$Y@yyS?MZ}g zQQb~^0%QnmOk`Q4U%e8ZuhF_=`#4@#lr08q^%*qJ;bM`AKqC;x>)XbTKlDBNEjU&U z85xo8-u=x9ZGEZ>~3Rs8-~IrLa+2)`}z3>9(0s)#;G26%Ui?M zrxph(>Rg5tkgeZ#es%0LtD&~6QCveDcDrj#_VW^8P=&M83jA%0U4Wd^ph(k-cb8mN zR3YbmI}*3VS(YG=etGg1(5q~A5-BaloW#6OiAWCpX+mh2oPnwP6`s9Jm6vdIe=NA@ z{5aY59iB8KyVBW9w&QKr#xStM)Z7@3Y>_T1`8$^*0};wxf!jHcE}GYv27*`=M+Cdx z=Q%y;e0}}HMOBXTpys5zaf3`lU6uKo$&`%qT&XSp!kPW>yNOqY{0}x9)7Tel;Gs0{ zscsHB3>jJpY{y$2!#zYvPc6Ty`G-kWKnUyO2k<*dN;B2)- zR^Ps9lsqd;lORol{YLj?-dz|P`Lt-h&Sf$#sv-Fz_QqW3N@f$C?d3Fa%-%H2hBXv*z7|44pAYaVsI4WiX z>xLV${W|oa5q9{JXia!4l>ZVR4ph0xnyRlck`%L%>||)kiJ3pHd7=WpjH2-)(v+KQ!uP9mpCk+8WmCJiYTcRx>e*~I19N*n)7_8q z)g&U+K7L2vSKne%M4xZ>?G%d_Bt{C#oqN5S#u=LR5e4N|h(F8FQ;TOdhShB;O{I&^ z`Wq0YhWfq$mO!%)gvWDReesvf?=1I*HJ-9ut%r(Ku8By-f$dSi<}aGE`PTr~QS+)I zD=qs1uk7!o+no~7MpQ;aSK>%cBCV6U#Y^&EZR5_>B!<=&Nh7Qu$=F=0$Q+?AL zYQsWe4_6Ah(SVh^mUVQh+L;RKm9ht)KwSc)*O<+f?Kb2$+8!Q(rsf6|gh;>QtxGlO zT_bX34EC%f&)N2~wtw+Sao$Lw8Zwq5>}!dPH^!k%cqS4kyv;4Eq`EQsQ+~en-FGOh z0-Z+1mWtrF@S7uqa}6?ma#6P3s5}ylz#|fBS=hSrB1{pDHSA|j4j(UYMKL#db~bkq zj|~4j8y}$^J_8e@hhFm^FTm&_XKN5aJc4dR=S}PC`Cl8175ZWjwdI}Epg@4){f^n& za^c2L(ih@s-Ls7QqR%_Hqx1-Pzm%Basf~8D7LmF#rhf8zsZp;Pg|iPGvr~{T zCR&g*TKvr`YRYX&9_j%}+3r+KMfi81(t6W}&!T2-ga49(s~)%9tZsxX?q zyMJtA(w-YVVPm@;9z8PK%XoARLyR;XtFId*7SP5CS7EI}z~}uI>A{~lD23=?Ggfc3 zrQ?*aLR?V#V=FG{gM4JjCv`VdM{$KNR+P6t=q06Oi43XOW2c_BzGl##lYGwaeSP7w zT&-a#B}-!A6r36z!z5W;M5ktHX+rPh^GsQ$kgq30&y_Lr=<)DvWdcX{G$cKOuBLA> z$1n27oUT|ybX@aqoDyqpSo*&Gj9Lj}db$=7kr@;J`y0wKo1l}IP@A6d1|kvmsaXgg zS=;G{T+{k5BUQa%I1G`U`0WcHT^cBZp6JHXUdkF>m zG5Tmh1dG!vk22X3EP%kjs-yNH(-QjOegCx9WmSoS^L)Eo;rBC^BL7TxM$@0qM<&kI z#~WqmYM}A-qrk$_T6y>S3Tw5c4C!%=GES61LX6s$g#srljiTbgYR)Csl<$mRl(e%i z*u=siX#%+cYB@rmws|rmPbLE~{cL)OB2%?# zP=&xkzMm7zEq(BImUe1${9U~ZU%ry1(K^;P@;GqxnttejMhC zyt%aAW+n#pq3)^cgc3?U+cW0nZ_1qF50V;m zX87eg-KSK5n`9rtsW8iwPzX}l2-Yp06av!q!)wFd+L z>BLiK#Jpr@Ic3g>cc~J&*W*6OXiSa&JZ3pKvVo`LQB-?((u=ctm9Dzf z=jEBqvugC~DO}}oR^z4BxJA1T6`5aL`140hK}yHC5*NwAAbJsP5d1a zraT?GUt&g=mDefQBt zTtez&1#kLTJ(OoWABDC)MGd87M$G#eOWwq%v$UdUMm}{QENfRY$>|pzsrwsBhQtD= zPW(3Ojm@ZU2gpq~P2O(k+er^2%%fh(p~UO(XI9K9#}F^K$mEMrbC~wUS1%k7;-!=o z558x!ol0s^u$$Z|1z&Lz3ZxY_24Dg1=&l|+2O8@ZMYsp%`8X_Mu9j;HNy!P?c&zjo z{VE#Iarubf$uy~aT9QT391h!!K2@mh{!sqGsqvNknR4#}sg-S>D(UD)lOAn$zs(I` zV62qc-nHtae{hm7j3kPiF;nUrxA+!8NFUx?Jgm=C%&kKeWAfR8z|rKZ+Gmfr}Io1QbD}OP6k;7^-xTCLq1{o}dUSReJBe zhTcgOr1xF|L_lf?EujTM-r?S__xpWoy+7Xit@mcRBWh>NwCyQ?~zKbONo#c@yT;S(2pTcN&_4312-yu?@lWhb1GM?J9 zGQCim!VNY!yHYedaVTT1pF?G@t2Hsu`lhDy@hfBZV@FeO^j4ip?MWA<|5IiS@`==v z2a;PwS`k7Djb$zMhKqN6Tdu!t(_(|d-qf-^D4Jym)_a7V|H8$vJGqXUI7J8zT~ZCt zpEh-?5y>m~v#LpXG|JhPt0 z9V#iXW@uk!t-zvQvw6LrL*(tytnMVrAz$zCiJe(q$42R-McRz{{i?C(_g^;_ZarDQ zH$i<)cxbvDGix>DYB1=dr4?(9nf3hbal*+~)n%C5@M%?qFD^sWQ$u@c=C_I^ReEni z^`LQGC_$EKE@PjtR?$xRfcrL8`_?0f}3V_R-2 zv~6`rAED$w#wU|g7L{xjK4M1E?xu760OJll>*>d!ar;6#m1N#{q@v;$d$OY=-dAj) zVnZbA(ZKH#mR2;DAeH()bflvCYg@h){Wc+W;AnE=TY;;YyN9OIEklTEg=l1g!Z*G{kS3H$ApvSoFs3P}kdK*;%jgWX_C6Q@Ji{g|wo@It2BEarvXn1Z8FI66Gt` z$;q7sKiCxa)|xGU-aqjJYza|Hi{6T>M%z}js&Ar4iOD6Q2SQ;n_g23Q7tUE*+)e}i zC5p0HahU|ES0}#W7JF=DLPoe&@^Sfdzl?*U8aQ9gJ*Z=SoS%-Z9x-O<>^O4l6``u4 z;ewmlwottmad#EtqouZrRJ9JQqRQBUf5^+Nu;ol3daWfD37&u759{07!U9gEEi8R)3+mgbAh(hSBrMP?nw_XO!yUo6~G9}RTe z$?$!sPy)5N?m!|v+Y9mK?=$c9iYaK`@X=aMUo;mV?7rQZ6L05y3K7VoH}QGsQ)(2M zl)0AEl?+jpU0FY@aKk+NmMgUFB5*>`{kdylCaqG_xz4L5inDcd2qkIj986W#RjKdf zn0rd)K#R*Z%RIq(sKyl!MHHL{m{mm6yUY3~Nxp!D&~eLiZZz&!Ykeo}a;@qpPiY^V z|3cS`sVhM4bgsM9rJ!e97yxJ(iti`EUR_tPiN_x167eS6#kZ$Vm7vK4ZA@|q#s0|{&sDmlH#tP+2>#+G~Xed zg6~l*hQKglvb@IYP>-9{eLDKk5H=(At@(_NDzpP=Vhq}ooSNA!>q;eTkqDumJBK(7 z?4eqWCLE7zW?E{YQ0@LT8eA9ifzK5VRr+!0Y;kurNG@Y6Z}Tn^72RNqL|oj=5-RJA zY*BVbV%Z|+KdUAi&ZYx4QLFOt&ykysZ_8*c5=PcvHrF?43++HP{1>7!`wGFXaoNx` zPDQ&KW(!sApIbfqqK222Nqh%2yW^0s?VrU9x~z|wUz)V@QwiIAX_F(}%P^w}y_Ybw z5siBNtHXW`_9&#qEBm&5!+j0c0cUA{_k&`?dgW-%W``86k*J$Y8Qh5PnjQ0%x>At@ z`DT*?!m}f9e;3B>q+&-m6@PT&Z+ADlkAUGFSSRk{l)xVx5kKHC^(D1OOv50vX?E36 z=N?UHaK!zB;t+v>XwLbfGo{LX4{-L#asekZhum_3Q8qf`s)spv>ldSWI31h3OpRPb zS}{Ju;bv25;`CK>GNzn)#MCv-=A=H+8u_I5uI{I|Wjl^}gVVaDhfVFGMw}It6vn=q z5hru=_ETgzeI~qom#u>sz$Lp`Tf}s*;wB zrqZy(C(4*1t?qFh;_c?c^7@BKTqnrTd=TQP{HNgCOk;};`pc!#^%02;KWT;<>jc9h zlM-Ve1APQM%$q9r9VW|<$DKP^bDxOusEzRLov*2QN@Z=hO!hI-ly|SMN~XHyHGF!n zoCt2b{c5(_-thZcPXoJaTxxn&NYx#Cy`yq(BhsOy+#j#xOJH?!DO0UusOa5w!h&a- zS_lR3&8&X;FV~)ujHy-I@aC4jN&Qtr{^1JZK_xfQ;&&#mh$*lYP5<)mN zw8=!Oa$>{ESiLRTx`pUj+~kZiiB4l*%{=9_e%rEp zmyjrjwpy_4kr+R=dN#+UuV80_aeRkap0l@N{U7(&rpA%O-vNyggxa9LOqBEcKlBT@ zL)r{x6n)9#Z5{`KYvSg7DlFh&ikU;wBy`+b(TIXhNwMs$o(WbE0U=(HM7f;weuQzcQO;C^PGs{^uNl$fByXADz29MQ9+v||*l-_|{v#G1zQ^2g)= z!jmvm?9fiu!DY;)KS?CexL8&k=h|naC3%{xr#72dP@%bj9`lT4aJI8 zScb|)X7HrUmv3NbHh+&?5%c(o94H>J7z+qnr28iNQoBUUL8nzAM5Slh<6ycj74X3T z*}QQ7e#Ty+6SYuyJ~1B^*c>bTM3F*`ua}lzfdt4BXs`?|F2Q@Abp3p6)!khg^7X)2 zx45W$c+r2rm)of^m4jWP{CD-dpO1t?+OygHW97yeOLoALcvaoC;k2MaefPxi_3PIP zV_#Cg0tN}-6v~rtIZSyp8K?*p#ePdIfB47+uz?F7J~|U&+?qaCYmOgFKNz3T27JY` z@eg{%Wo3Mnp%?KhF`Jfb(|E{Mk{kZ%;W1kTg~%i6^3??-tal&R(cVYFAffBSN9~Gy1xYELUant0o)e% znUkHZx2=XiEF#D1NSW%yf9Sb!7#CgPAK;1P>poG*l*D za%knOTSYSy6K6`Ik!zv_pp{{|jieq#{d225n|ISFiE1lM1M-|)Eci(m9c$9m9BX{f!^e30&PybUUzPgdW} z?Qg&~{e7M=D~f6poQ;<;>yJE>&NU$~fxasE8@kRR-mmW!s?oi7UPlNK*EIJ`e{&92 zzJ&%g2}u}U;a*I(kDQXXEXnHgbC}m}Rn_^-YEvXB^y`^4uwrEfO4T~0pvuts453#_ zrI=V=$;v*r>$t-?Xxh3Wc7#~-pSq`olV}p~%e=1NMs2OD_1k?@Rwv8IGk#sbq=?&M z9jxPNP#LVHVb539mkmH8#4~-eTn<5BjHzQo?&OEfu~!f7Sjm=n*c;`jij+-G7gd97 zF0UtSpH8-y!Opjg&$&Qi?p~^@pT=xkqMqtS_bXH{Fq@utgh18@Ert^Czd_ZeWY4E; zUhf*XS}1;bM1n2*O%Y9nU9wcYC*i8_9b4(1LM{0~i$pIFA;b+jSc&79YlW_Tl!HzT z8?Nz&=$FUZ_61~}hb~HG5g7C1n~C1s;crA@r;$7b zr9Dso!$s5(v0-PJcj(8*xgR@XrJg9}u=U59)c73?pbpl@luNYK-FU3|-|aeuGw$rb zymlf;UvO^E=1BHgw+tvFbjyU5)4hYTm)}B%pKwZ*+0#qg?Fm%vfu+5-0`@)pMwhCB z%~hXriUsbS00|l=pwEZEN`WAY{rsYV5~Q|lBf)gGzpp&z5p&bPa!H=Y#y!2>Bq!%# zZ@|VlbTBTcsJKDOBv91hUL!J@e>+qb@O3!se|^h@DxRC!BXCDonlsS9eDuZ6S&NEW zH1#K23z8DJflyJ)%$}f2Kb86I1Efs7^?^QGL2edplI*-;I^V3=#wI^p*7P)_j;Pa5Xp7Mm#bX?&rd!KRMtl39o#74!BW)OaFm#><`i zYbW9?ssvg6D>_w@%m(3>r*8$aM3<{NRxu}^53wbmES|tJhK1TlUomF%-{h-7%Tu&p z*c1cX3V3;R)|=0PMiyC;dY{SIe4t_1fk# zum*FPZSpTWTe{~{(+!)-;VEMB&R>hFbW8Ue3^{ltidq;3d_hm1Im-Y+I3X^}X!TLz zK8GVu+08vKO&}`$@htE~vo;zeF6>`w?OLv;=~j9XGD$9W5m;Q=Yp8WT(7y-{_fs^6 zgha%x*sTQi=|Qu{y4?4>rK;~#uu?>=HR(xuRGb`-hcomd%41H51?{jhK)fS%Vpa9M z_Z&|eyJ#7{S(q3Ns}~|ZvWr7(jDMprdtW=Va^RzBsFl@%Mj^slA6=-gl7&2q#u#dE z;f*OLzx%Vz%I>ujA*u>-(74`+!Ol&LPpvPCjzPRZzuomQhw#IR(rH&f@o+rLztSw6 zVg~Z?XrF))VvFPuLuA~SK$d6T0{Z7ST9Nwo zCV8ab(bSJteJz7wcf&BIxmMZbd_(3Q2$|3mpet2NVmmRTploA0u+B8KlS1n z>ean=Z~Gb`1pZuS=6Ct9bZQVzNw+wDTBGJ?Isoco8S+u##llCvwg)-0?OC^|=0AS2 zxbbZqh}96WK*ha8J}|ruF7VW9yRuFQzC9Gj0z?yrnom`L%WnO~o2na+rtV#6Ga#B3 zB3KIibLlBDOZSo7ktlQD-hcD?tHbk`0x}oe{PIVmIdsr(O=KY5lVPiA&w(hjRmE;@ z!Q&Cpx-4^!XT!L%S{;3wb)2TLNRY=;gHvdFFghYi2J4d0Hc z)UYI0+L>($23q@5hOd$gFbaBX+W9wG*NQ4%ru=h($SRF>{F1>Fx~4e$!u~V2F&n_m ze*9Anh`s)&w9*5&ey2_Pb4>Jn?c4CyrSO;}P3sHs{imSiUsk86C6W9&CURpW8Tczx z;eQ^)bSL@Wt3*EB`h`~--UyYC=IX!w_w<8jcak5!IuteDX-6$odNPJ?gyV&CS2$|L&hvUs1d7f7*U<18DmJKZin+UONjYs6ds&@koWV zw>#E^Hd)L+UK_lt^5xN0B5aNApdE?(4Wi*mKR`Xxc#@PX$X%e~--AThsp za1Zo!aZ?i=XtZ#oG3z$zKed4W*T-I4d3@NK+lywY@5?KrpHhsDV3cA3g?tGc-BrtZ zMRT#1{y$|nA!=AcRj*y1d56uJ?vs`6=l08U}65zSG;){4g71Ry`}|CsW5# zR9y8Eh?SCiNjgrE4J1mc2Af!IePYMGNB6$@^k0U=>PhNnS=aVB{q#5<;&;g6!ffx1 zyg`_a*4zVTkD_w}PmhFs{ig=YfRJN!u9~Qsub}WBqKGo3*98m*-?}W{5CG2ovq!+) zZvLZ%H=ilq9e3Md_VP(>lUt2649m_QeP#iXkbLc>ld9@6y%5WP3NDZl?Q-a+*U255 zYcztlQ?O}LAHDuMTIFu)8)bL*VUJUchi&)pVsx%Eg{blS z{BDUSUbs?4LH|is`$4m6gb?rmdjoir_^T^#f4fXZ^>2OllOp)iGg44*zWLLgbr*k& z+XMMr%QU@Wr<@P=vcy z*m$Ye>_r=fbWB8W=z?z~8ZCu_(--+QWr zy}isK!r@(M2j}!7Bv^R|j-U00(l`8dwq7Y;>$F(=j}rO26}KobAS_7@GLpdhzyS-( zst|CSk_DrL)6<_Lf8I|(`LH8pax_Fq`H{a{VLQ?At4&l|bgnyU(spAs<<IWF%2CGts(>Q6hvvH+^DivV&kx$$xAe>;%{o?rRza0I}@FR~>5 zQv!@a{|}G)Xf}z6GCA#Mnkr{p6O4q1{J{IU){^%r{xtoJiA7M{WGQwd*>xk%zRp!F z4M=bpS&$U3wMEc0N^UcLA^TI6Xk8jW#+-_Zr+NA0Z)|Wx1IfOPQhN0YDU(n#cim?f zKxi`(J+%3A&#$#+DG4x)9~XZA!`OtZtC0~-BYWIQtc9p!Sn*PoUZjC%Z%K&)#QpwN*93sr`!!=RJOuxa{NY|yQr2| zAsP)-;$o?;`IqJ9zHat((C{;jrr|y*U81}b7n@p)ieFGLH)e|emPot#*PkYccxWH) zxJ*{9S7MBUO(M5GzHU<0v;KO1IL=hFH3)qo%wrVD&+onwcMH4N>=-O2==Rd!B@#$e z3I2@<61(X}+0)wRgNg``w010%`M@h}(0~vZ~3{W@bw88l* z8F_I`EtECr3W}LzVY9kBG12DLr31eFw7_@3MT6jvtq*pfisdaL;nW=g0 z+ZD`-riNCYWOJSEa?`}6WiRk~pRtCUQfV;LOc5ZMC~ZhC-q*9X$-Z6g zy=`ZzcSxkFV0{^IrCEBuTp6W9oVK=Ka@VH6;VTC_&p1XE{~}t@z0)o{6w>C-*kD)?P@zhyO9>{(LL&@k@$>FVk>FLZ6ct9(mMbMH|? zwTjf86#sOSV@?6I37KB$&FLPXi>id)=m2v{YjuT=ks%g-T7IgdhL^)kp19&z0#u7S%IGhDYI%OiCRb<}c zu|Q~uiY*2=vC8k#rK%1nx|^QQVpEeRxk&~-+)L`E6IPd%EjZX~cI?qJF35UREo3&y zdh^z;Db@tzvgzroLE`s&5tt%jsPQ8ZU0h5F`r%u9)>C-k;PY6*V5CqK(ACgNM7dP*ymrrKrCm9Rghap;)&Vr&o`e(%8E-k zs2P@3pXHO%7E*R$SV4CUC3FD1U7&+7{rLpLfOeG7PF+i3_aIOn}F2o%-A2(>VD zNeaHr@UZ=9a;;uH?vZzkkuuz?{C4|ruC>6xr);VQ$Yj}hq25##pyHAb(ers78I4-( z)>i=Vi3UtuIzb?RApdU0sp9jO^#DE=+)~+y;00>|cBAHDV!%NH0GwRy%LjtKSRQ5aubg z%SPPY4D#8000QVIkDH&^(|)f0FkmwVm>Pe(6#m%llott$rBGDe`+OEH9qsEZ9Q0e$ z`(Ifgb3lZd34WwqEvzqGD#TQfM}FJO{_H1vbgqD?HXR@?9qo4f>s&iwB+c)p)YBZm^3gI6 z0^n53Q0tzcRDD<3X0L*5$ImB^SLbLmH?9a!QEcoyKG^-?UsewPHBLf$Ps{++)5Bd? zR8(xYSGzBeXTfT*39X@j5VBa(DZ3Fh{ON;1B|n^HK@dX zp0S>TvzHn`qEETGa(&NqMsziGhYwyHehdCom^bpQ5D=8#MFN7}n_>oc=3=IWYxwqvXl+-#7l?x+84G$#$QszWK zp<^Khgu>idP31HxMWAx@fP;?A``rA=~f0-KI%h`Ow|-s|Omwd?x8YpcTwwHY&D zaQDfRBGV4mq8$MpVx!o8935WrSF2Iv$uoA=S`9PlL+yhD_i#pWEp>IOHY>6G+`>1G z@WUz=_D2GW)x53h?CjP6Y}Hux4ESspAwNHRNi_eESy*cP;UDDz)zlxUH04!9C=Y9y zE-wlBX-2R>m|ez#g;s5^6{sXeQc}hw4IVx$-ct8qDDrEoTQvV%lFs+`g`JIpG-?s2XPiH4@ z+F%Yo#&l`vFJ}zWrn08gt}M+|QWhlku|IR4^8*vo4J|rWhZi5|8_H>rq9Q^ftlgzv z$%R7Q3xHbz4p7|R$>=UD{PuH1YcQ53B~pA}>R(nfumWCV!0}I(`KmLXj?R;2CJAQ= zVeMK>CLI=L5< zpLB{atxQBr#c}lYtvJbWh&|TUG4yQ(lvSy7Oup6k@3$rKU0tl8v9peQ+530=uxu=XLu1_|W`Zu*L?BaHg3-UqAx>DR zxbXHWfV@+d4yP^Z>Z5=j%RLEou$$~$!&swMN&mJ%rfiB!4vyebMJW#WmNo{myxiQ4 zCVEHf$?`3wA}KJz-nFT);<>(v<1o-Az(}|d#v%a=;!;e`(Sqh=1qGnrs|L_$9%##P z3k?@cO|M;!LrhHDmA93{syQE^)&tUHn2<~Qjm3N|Ov__X7gGz;u(U$uABaUkG#ky> zIOZ0uCi8z(=E&Eq<{UM#%KaJbfO8-`DdO_KZb!U_JNM>cL+#Rrw9WJvyMaUjRp-jR zzvC9TCNT!-bZ9LnQb*4k6x#O$FkfN_N4Cl-qWYqZl>H8-^E?T?oV_*9Xa)2TV$2RE z1n|I8+gLJq&!D5TqwneMMnfJ3NuOy0OE)Eh*ObW)k@`>=*3&Tb01Sx}KPf{&*K+2ZY#Q_To4nRPCLPoUALSEqq6V#Y{$bMw5} z7L&3Wnm>dQaSON<^zR3W-5`37bVt@RIvgBW680@Yqebllj=AeY%%;tj_l^Hk9oWQ& zvv<~E{7YWS(!VVb1z_Y}{!bhUD*ON45!QMSbcHHI@WHsrFRlf0qK2ot-jTORy2OW_ zQ$>gZ%Kv|R@PDX#{{JO0|F7CKzvT|p%S81jx+)jGvYNnYIerrRqhFBw%N%f3*Eq~K(p4<0#o_9Gf5Pc8I zk_IotTx3fE&u6LtzQ}m3q;9J20&n)ZB-pV>=5~LLl*oVaqNNuF*AN^^1H{0d z;^sSUW%5OMW-dQ-B>L4hoFTn)+NBNDz&<=$@K11P^ez&`*HiOu?h#G{MJ1ivyd-f< zQc{H$5$D^B1hC%b6qy{dh6LzhjGSvOt1xM6pMGO5grvcbFC_ieZyzc@66#lwp6ivYjowxIuova&0l}r1rYGegr57U6i+4JcYn)7gHKTz zwgX)|!lxg6vv4z!5ZZ73r6px!ee2)q0#;{Ti0nOHxm#d0(icpX;w^2ORFBIV`wPr)&Kk@cJ~$e^|@N~fzJV|3sPW@@ci_YgJ@lf+py*dH@mtu zNG+qmYj0{zr*L6Iu)xgBwB{_r9Gxs8BqU3j%<^HucPEf1oV-;Y@@zrhv{Dz_h;ZE4 z_3Lwlm(gdFIGi0jS6wYRTra@&9UiV>^7nRXI+2e^?@->swlnz|htlw@#~(wf}U;o>lB{u=%QHbg`LjJx}AW73{P3HaHB4ZqP}dx5s``Ab^gjJ2C3-E8pTt zeN03&f`VjcTg+2<(w(DD=CB)M*l~fOTG1V45gs)!-9%BtH%@N}ekXAbUn#RDj3bUF zmD2e2fN?90E19e-!GAo_sh!1J==62dj+>!2NpbCmhew$Fjh&kDaVqW>3t0TTU(9_9 zGSGR-wQXGw#rm_y4OX+7n93>CgyT7K=U_?Nh-_AvTd1~giX0&F^nyqNFvCU^0JcCJ zGBllcrU;>;Io(g!V6-)TUjQ)r%9b;d~cRpK*_gBIO9b91>V+Gfgc8=Y25;}txvfvCm+?BdqO)IO1 zkv*`j_;Ln#D|g`a+v_6-L2r$b3%6EUtV=5@UaLwSl!A{lq~oSgLK#fYoB}L_Phjge z!@GXWS9=7O8Be3##zyG{1v!t8H|JSJSsUf2?%MeK z`|{>u@{52$+Oz`ya$=aDU$F%_gG!(xD&Wh{b(;PHa8?^f4fHgUHae-u(SKPg{GQ~j zQUl-(=j$YEW?#jObumuNHCFd;z{|WwN`bYYJmG4S-;`wKl3h(@BWwWrYa~5tv8bsG7T{cm^faWg*j0LMa8&*RYJmXe-eM0Ub6}Wyg3t4 zJS}4E3#tSnWi0iGGI>V-(hil6Z+&eES9zuf$intR(X^-gEtNR)XCb0-~dg0AtPM#Q+89QO_w_f(4 zBm*cKL$mY03QTW2_q1;CT67WBZ?zi9TwDs8u!updY<{>Qz6u?J4!7B^rI?xK7ZlWr zrT+?hJWmWeS|GkOMm|T-;%;;>sopW!n6t#!6lq}Ne3@?OwN(fpTIiUhj8g$Qg4Ll1`(lfbRYL6xqU~s7%`l zlhO&kxp;!1_sWXTF|joN(AS57#J0nk9~c($F_MJABf>g>ul{%#)aGz2X&~6LLYGTH zS$U*NU#jFQ<>U48<{bfJ)YhSq|H?|!QHe2`505zW{bUL2?9NE~663Q?5lJzaFGR|5 zcC@BV*b#YdVc&G>PcLPcsIH+QCSk1eB_wPVf3#3$3vHcMVi5-0FV@}?G->miZ?W^P z_SVqQz%DbLe|G5#BlD7y;8HT{iWniB4?%jy3Kfy@5`Y$K!u9s0qy;XTnDjCVy(H}I zdI~vi-xo+aJttN8Or2-Xhv>Ao6hA`;~J+I&-q=awp&>QoPRVAOYLm@ zZH(L+01PD9-uKo4p0;uEp?UT>>}PZN`(iGdfR1!&zC!E(EiNWIMuid*>!zYRLa{R` z4!6CwcX-dL2SP~!Lt~1UfRauzY$z-#yOkIL5C)hS<1IJ#+Cq7+wLml;tKRnczzisH zv#wOdXT&A6mjlX|+$QT$*|JwMhNf)c^fzyX)_C{T1+39 zPxd)ivGuTXApjO|7RYvGY1G)L`T_8Ax=w-@*wgS*P2Ua*mRl=-$G*q!4XF}`olG@c zt}ddF=MrX`5>NBl=N+nPjPTuoDHZ*SkR;kFL5e;M+A`d#muYg+^#QbEW&o>~Pyh9Mn z-LyW(sj3vmo9n&Bj~obdcUeKI=Zl`bgN)Wvkb_!ofV+7wFofPgcWz4_o8kyZl#9FW zob)DKK0NJ>v&EiDOBLmuoJ5})a{6!A>92fo>ZWk+IRr9S{>cSc9Il6-1i+lN%kmkCQ zG-eLzw%5M_#1tpD=Y0>hFq}0$17e_a2QJ82j(q=~h-+8aWdFukO?eN0lfET9a#-3P z0eb}?!h1%-6=JgCeew8>BFpq!R#Sp%m>-{+>b;jW2iNTY1ny2P2dr;bPNU%%RY}eb z10l2aH^diQ9KZ4$&x4TO?QB1(c%=d6%BHCb;B z_Sqg1_OZqTL!nz+QMlDB#(b(weql5zMk06#N1gY*5ArM5e5ZOrpdV^xHq1^=#kwG0Rm zVQv@{-%`(jaLyNa5W~g)AZz&3C+Y`5FB7lzzRr5n`y_UP|5i{{mia5|C#bs*O8H;D z3?Q26`$`FAS@5vytDBtPAqQFZMBDXo^8pdB{99LzNG9orTPJvQe(u`u=FHfni8XwGZAHiXA?kWDpjZRLS~ zz%2;}*^H?~b6tJh^~jAQefJ+{%ghe&9h{i&nfuhvx^hbWuUy%JA+>wjoXTKM%_6BgYQe4=r3ybzP7Jcm2wV zl-%%~r=q6})RUSLyrqg|%D}-L;cK3-=~iEI9=J;o(sxW7u_$uxc53MJl+r1K7&v*Y z*w*G!L*Mg^#+n1adfc*VrH8$33gGPRo>J?Wjs7G7ujQk~J%Y~czFNIA`+HrQ!jziU z#p8il$G`~E-!6?lC7>(m?7g2jdErzATzcc%ewfw4y_9n-hBt7qejn|500#({y`_5j z7i?tP_sYBD3WNR>-_jvmyUR&$B9e zibxfC-$SZ*W2@XR))0-Z3Fk+`0zA+bB&plK@e;G~w}5SVb?}G$euVbOhmPB|t#4rHczS&A*C2jV zU6hM4xK@rg=6XYyr#@z&o+v<;t#-kxZU*gz4i{rW2L|CB${Rtnegbw<=fY< zc{G=O)}Qo-w(dO!6htAi=Dv{4)y{~XvA}p((r&19^_CX3XUpTP-F@`o{kM;NA7bCxbcyy2w()f-{rFFallpv>bxVEos{YR*$Zo6;1#a)SkhzU;GF=KzNSlg>;x5vE4@2A_t`(n&9v@xDy!nKdiX<@R~^&`gL0MYKr4tMx5iRq%e4n7QSzXwzjJYK7gVv zkLQo*u@@4|%EtS%syYD|_rX?t;W34pr#e+mvrOuP=dtfu9<#ps>(e)kujAV<(N{?? z1DQIRPw*m`-_1K`eS<3L>)TJ4Qb@>;Ga~)ds@_vDf`38fm7Z2tBjp1-o+FV6pY=s~ zyaM-Ny3iHZwVL<_X|LTkG83=-MAHT<4r@n8uP{KlK5a{!i!~1!yNtNZxp!swuqGw} z+$drUAz{OtzJT8hAF1b(pHd!Cr6|E8Nj3|TLZd8Kc=WsEdo#n)W_8z{8 zYpJ6F=7WYYT^1ZMpL zuH8~9#UC~Y@M{ck4}iz|cwwa)da;~HA7Z$!Q%m|iF~YI86?WrCiz6hA`0tL~R@&rZk#Rr&blT>!-d?cUs{$6O82BUjjqr*acMWlfZR__p=Dp9{S3TWqY;F#UTPB^0lM;EX?Q|4m;K{{3 zw%dTfWd$HtCUM?mT`TZL+8Mo9SZmuDY7`95nBjkZ?T}{cm8>kQk=Hgm99i6IQo$f1 z?uqUs`0rB0r?qNAwi4LV1B8&Jq`2l5IM@LXQef+hFDofKNLi>@WSetCWr)|}sdWh2 zypXcuVz5$Z_7_DSiHxaf8OA`gANkW)7i*jqBJP(w+H=1!I!4UI~e{MZ98lW_aGH;RRE^n+BM2F;B;N_g7Xx*U?=X;I~nvl_3n()6*koW22CO zxT~NO3Ew_u@b9!PIKHN-13Mt&Y1~q1Y21fTSGnu|M4`HC*kcahCAK!s=RpaJ<-XhP z^(gqxSj5f1y$0{CuLbx+PcxrEL%9a(F`d=*%V`?UkIAoru7F1`cc}W^ zxw98Q=&N!OUPmgAodrs47pD8DAki)~Bg&wWSnyT~vYSeqE za0iI4zR^IR^E``oeA{x^nW9_el?4W;@!1z6G4#S$$s=mGRdv+w=yp2%*uyl9*Uip~ zv9SESVnzB_E&e<_GV)fVpC_1!l;(;*gnYHkbD_O<%3$MY8bvU=x90<1XwYNwoh*FP z;B?~c1>i*BU(BST_Ap{mdZ}YzUyL<0*{=mIG2oOehub#7J zRXy{msxF~(USs1xC$;Pbvxhiftrd5aYN1=ul)W|ISTl#=FrZb+2|lt>7`buS=#U_T za0m;dj!hc9X)NlW&LQUd$_4-JCEdWM`kLA%p5)q_y} zLxPI{we?z<^R=N^bjRqAubUA-3Pu?%F*oVg$1A@80bt(q{O?`IGli?hR_#{fp4Kd_ zpwGfFu|7j8tX7Z-n`0zyCGX?DH;Q$E1 zt8=p<|LxbBI>qqr2f*G)=<53R?iLQYQ&FBE_W4_MIvWum^D;9qFf=S5(tL6LJ8~kZ>`F(5hp-MzWzi9FcbA`1$tU%%?=xPGu< zBOC#Y(W@O?^*);^`+B)FUx5_|AdXUF>Nvp3#XnrMV@m`;2l@IIyKD-3@6-hKgyQG< zW2MmC!(**lIejD%1Xonh%PJ}LeaFwM6Wy5KtrHBCA>;Fzc3$Bfv$s)3dtItbqL*t) zV=&u2MxemmT(pVNA&>k?{J8f<(Lurxi@NxI!XGArPFg{a^xcjr+d(U~3edO58;@%Y zm6eaBwD0qdmYvYj^1YS6Iuv(4{<)U!IVP$#+=grz0PaNSvDf&fz>KY~=ZdVnvhsah z+X<3^_xXI_^0vFxRR3!+?XV z3iQ`KG@|wtWxEXqy5F)=SrCWN9faU1u`J}qKewh1|cRFWfdHG<6bI&z09gFTa z1b_zkO*Ala?C~zGlPA@8)#waZRk4Uk3;uaC+*G+a0)otp%W)52S{7dS-1$JF@ZI zkO_8J$?rdu=htH-D!nyl#@Ul%!bKW_?G2+1ws-V1FHh&7ovVZf%E9h&UbH@N6Y0|(yu8J8h zIA-Q+glQYSi~HKO(}%|sQ|DE6J$w@U>VroPxvIgF4Su) zvZ|g7fS-DNa)!VYv!0WLW%D@q1!;AEbf4lU3htDcSyp&I4E#gC&jZwd7t+%S{<`J` zPXibL^>n70{Hn_8-(z$yV_oQGz^we4a(ZlIZ#xRTreyi9#HE6o_8$#@$0n7DLE>l& z$^VXZ{&oD^du?~Icw@{T)5fuJ$2sUF%6Mvi@)cLBXdZ9wE_Qwd9tt4)Hoa}1WQu}> z{-V6%7+dvJL|&ty8WBUlhHn}MVav;--!UKR^DK<5SbQ&j@nP7T*j?Q4!A6Uc$VcPO zBf?aDkGw#&dMev(i^)VJk~2wl+1)-6=u_>Xsr#ui2IA3jy; zx6YDyU95bR$@f80E_>lVqH zcyzCh4~@4P83Us<$*PCC10oDJCNFDy5La8zr=7DZD`Q_L>iP0zE2QVCYwT2X#$n|f z^%kWNV834tXFvxqO@}$&n4|$`a%ZeezdN_rX4XOhqHE_S=mq}J*hhCd+s(+`dMdQf zWV%fB&Ltu{EWqOJWJ z)_>iE?pATzcg{5&rLA5L0v=`y-@?w;sc(vicRNya1IV%cYZe7Ha&a&6CLVn9ypggI z5QIC~wT1QJ*S1}cISl9xQO#1TBm70cmg%G4-!J0B(;sgC;=d|pL2IjW(0J$6=Ix>X zpW%+(yVH})BYmeHY(Rl%3u;b#HiMB_x}kxEg>>5UP`D0ZTwCn4y~bN}na!^k4656_ zym}q%@}Y4rpqag$mvu--;Y;}7S=Z|s#yazX#AkD6R>5nOt~od7Ag8aJuIR6muajMU zZ@xgoxKOPdrT^@q{c5bM?@hR!zWwDno7}82R_D)ECgyX&fQbBJ(=za;;&EJA+x9+c zdij6}%qbyo-Jv&eMP=-eG~+^04;1hEy>)flg|vo-#!eO^>u~uesy}~UZw?3*P3Kaf z?puQ6s@Ksh5SD8LOdr%WCaM+8(+Af0d;vi=0|iM*oKoDNwwm=r<_pP-1 z{m1g9JCWs!@%D?~<(mQ5s`(D0sd*0CACmp!QPX~2l7Yt#uln8JAMZPk{rKT}P&avL zf=F4EM=RIZIgS&Yby7*%Wy`KJ37HFW4Wf-DP9&l%>MP`(f*AfZFkZY;6zSmc!G3L` z{ga&2`Jy4v+_QCp9DsI=0MKpWo}cEb+1zL*KVezhjG-Lfjf}Q&At*oe2mb>pqA6Vf zGC!~&MyP*Mgdmlf}3MuQP9E+s$hx=KiL@u3V}3lIO>bQ@`QiQSja>I5g? zzAT^j@5e&ve_Bif-_{eM{%N{h#KtV>PcQlN347((!)zX&?AA5zpZ3(iH?YXRyGTl; zSwqNLROdx|U0t^Lf8Bwr{9lOwpOd4b@0qP^urM)E#W)Z1))tk3QT^9(f;awu^Z*Zx zBYfS+!;E-uewh1Tr)vG*r~dn(|G63E$yb8^>u&#_K4q`l2?WSnO#N3rA4t!b*Bpa? zX%UrN^ic?yV)(pETej_IWgLD|UdcH~LWknfDUAxR+5hg54#u%|S2yN0?RDcj0|f&s z)M%CFA1Xw+q^Ya-&YY2BR2N7x(EI`yu!aSF=Zk@fiYK%=YtsLeOXnu!6kX1G?#EnN zmn|k7{LfUq`SZ58p)Py6uFavf+X?zVP2E2!pPhm+{`0?oen#{M|Bnvxz@KjPQC_9| z--l|?_y2#LLJjeR0ak7K!#MwOb+^;I&IKSS{6A&^lf*QmQ0_m9^3TsFynjGFxZpVr zae0$d<`v+-9wYf6)J7E9B2ZX~crr*8haBmRqS{SETdyemCM|Viii(yVOxD`@>q!~c zvPDciF4C_G9Hkz-5LFie#{1v512dyegW}`{N(MSAuFa-ayYX2E=SaKx$GISunM1Mt- zC5jxTpiv1)1tKNh6jp;z8kDi4$4+it?vidb@SI`mqXjgcr2ohDq2LL1c&|Pj%ybs^ zt#VT=MR^E3QDQ!m`H&9c>DSI*`K&p2{KireoV^Z8Cn*2NScFjViX)p2$M_)lU<(@L zBx*4XKbBqsORRd6%6L^>N~4##koQ3zg+D7q$2;9?iWFg3X51(>kic65x7jo zaH#FBhbR_Uhh=s*&Pp1zXo!1d!8ix(59X<%vf!Gu(nQ4lb9qr93nwGIM59~1`6`|c z(dk16KTat!N`(#sb)jU_Hl+2*<=t$){}dM<=vT%rdAA42#lra{hPg{ha)f5>n{P*S zmkXZQP`yn#7 z69x*SWth_sQ8aGAgR-9B?RCKVHDd?=TY+opGe=m~9Q(g>bKkH{^_$J9|1C&NO`f6q z;ec^&e*TYZ6&-Pzf*dH=p)a~!&EYFNiv<5b5&~xL@TA@oJ0W!1=%@}Qbw3l(i=CJF zv(9nl$!DI3Q#%Q;a_Ww1?Xqh`4SA8JOf*f-TWXU^n-Hj?=R2Af%$LJT@sO37^$BXq z6D{`H8I$oC@!f+;udqzrMP=!;Y7f3j{rbZbR{w?wNy(=ukA8Z#oDX=Qg8fKjD&r7` z;HyN)J6ZXN4r}ybZzQ2cWU*WpTsf4p87cUU!YLt%1%*G!w@PfWvK-$S z8J$bI!i8nwkOHFx7wpX`qKuNp7_Rd4TG?OBbik?(mb0g9y9uZy^?b?JlLcVZFH|e& zU?w6q_lqkOJ5q`bcg<76tj#t*+9nvP)j~O ze1MUP<~{7zy&He6Qe+aoFCP9wGRwa z1jw?03dn;Pfp_2u7+C#o-Zka&{9tZ-I^zzqTYB?9Nq+6N&s(HrAOr-80y8bylR$^a(ActfsR*LRJ}X(V{zKl+*Bog zgp>#D@9l`fZ=A~iMn)+IPL5~G#gW>}X%&O*{W~)TtdyAo+c#)wI0fywPsspZ^8R*u zJFriY70jJTT*t@oE4H{u`)j)j@TQAu*H*B~p@OR)TNADPn%8G&D0HGI3Vk-|Z)Z&G zU|t4Y3@8mdv~TCtLw?#YXak6#da-`lpW&Q)l8RWxSLLpJ&-+XR4Ebl8fSklsBy|$x zBbzoNBT+-Xtjm(W6&5i@Sj@pCk)e-9)a`Gbqkymc3Y6+6cD_~1^PQ`uWU(-H?Yp&ZR2V}7PO zTS%Y;H6@oEf3yS}FX#t;Lv&JazY6BdO$go}j?V`d(=(X(>hh5DQ^SnX6P8yBg@-;) z_|;#^Qbkk#9#R(nU}oY>tBPY9+ej|Ri%zIJP;Y%mLtJ~>m2ACHJuq0(OzxOs(lBT? zt~zUCZ#$I0yxEeyPlo_K6rUfdBw7t2F7ww-~ z*ruT@Q(Su62?>n`e=VUNAeR+;>X3k%qR;$E5ICh6jR(V37F$ZfU9Tv65vGNOc|%c* zICOduo|FYu&M=poO_7jKd}SBj20K#r{03BTvAnUrMW<>!%Y{1H@ao@s8~=g<|7OaA zlvL8~r0e50Lp`2fv>ipFe8%7k&-vhrl6DXHM$FilkHc+<088SYo%KdlF9W@5ejQna zTNv4vkUz;1Zn`g{r^Cd$vl+J7?)t61G zy-6@vS?~usZgEjHPB1U08`t=Ojcl^Gv9r2543E>@4`)M(Mj3K$VIq)a!*F$T(rlV2KApkNYM z80UPWwgz-LECquXl!A^Qj(akc-%abgNfUBdsQUqORRGaZ9}c-?+InL zfa;Mz7w&!}Qc=k{(Ls{a=UUOn8>pUPX6)oo0qYjgR)m%FAw~YY*6Z0}Q|!Ppcm zP(NC{-$lp48z}P``65MsJk=0WZ@!$gBR{64wfAq2`i z3Mo1PD=|Z?w2qyh5^y}lcO>vxj=`lAXAcWpZEOXEP~tf3R*zgyCJcf);r*fKf!C=x z2gS`ktdSoH5|eqBT>+t4Y`hiDAgtDKkTVrQOT{ti-)jd*AI$Wm(87VC0-Kjw(hru~ z4XgTq_95ACeDcMc(l;1TDf>lucz!Ep*=QQ_Y(*b|BM$VS-=dv&xlYG4V=I5+XciZ_`yJDKPbS` zNB(Ce3x2EPvzD`hlrA;{BN{mc1upObrZr%s!-w|cx&!BAG_?<_o_bbn~ zTI8v_3d|~?H}-}B!zGUbmp0lp8gEUzPbn*wY)<;y0h6=$>aG+g%jel7W(GE~aHOpQ ztKpzr%{vB38jG-lcd6t>0I1{9Z!n_aAzoz2#MovjBvNLZJ!Q+eD{DdlOpPWdHr zcLHYdl|8@ICTnQdOYwI)pcfp_-!7p_z{YkPv53%{L4pGM&OE!I3I(ccBu0mcnq1cf z-G92I;;vT{+oLCNfe+d?G*tgQg0Dc}mp?TO_MlC)%Vn7NN}S3U{+nIPm{f!&@_r~> ze+?p1*HrL_K*z+-7UDzPktp%_6KrA*Uxi6j$+y%b1P)>w?icE(jAisWYnY8R!{PQE`s%V&!EJR z4KLvY@2vfPtl&D{&rJkHj%F@UHCAHE@y4I!AcL!fnG8mvkuVh2#tT0SGQYd!zG@;$ z;Nz4w&cPALN%}KIokF_3N1K?Nx%{b_K=TqVugd*J2BBw3+k75k zvs9D`xYVvT)Rz3ty2R9R8w&$2@Bw=a1`c8tvWo_H;mNshxxPEwo!!${d-lHSuxzm9&cf>>gXFZqqs z_ZSW%S*=i0yZ7qCKB;u-JY)guh6@#pn871GxO{D?NW@4vN!d#daRB}5OGn=-9gZz{ zT5Gwo50i_YoX|k!3x)5Hu8@H?3C8%J84cWrTL)C153&mg z0YX29?pKmRSm*cqZ<$ZoE$^X$wvB%%23!hC$jMimdSYW6j|ihS7I%nJ|7g0FxAA62 zmeV26aJYfm{2LrL8$~QyO-=i}BxQyv1$dxJ={RSi_KMELOgm5ClO-cpwNMlV=kvCm zxGX`h6jj(Q^(lg6<&_s-Y8gZ^etqyz6pBm~`qAa2B=LNkpX5EqPExyQWiOr50%fIu zvV)yM2+$!XP~HDtg-AHJ)?kT!i+graReGDnH{vsx5%>0ek~rK}c&v?hKLf@Fiy|g<_J;SX1|r*<=>@yoL3FaHwfW9VoqX{h!?Lp z7{r@j|63)0{c>L3Pa^rJ@jjLDb|MWH1i#iJHy#?j`$cCwt;n^m3x{aF_XItN4W*Bm zUMv4Lz`2&w!Yl+QvGe>plz4+g7Ri|YZ>q`UaSR+qOlAs&BR`nr?!NhVEpX@pXa$N* zy9$e@25-wuYjKEvWk&chZ$Mrs{OK2}P)D@0ukxziD13RF!$Q5yX-$G=>lMIH2wlr# zAqM*^q-lsXgI|klS4#rVOsJ246XKVd6R)d=qP27j7jW)dL>R>Jc3=llE7qlF3Y~ty zCDW1BNwbk%s#)x&dJ%-VJ4h!~3Uu6S4NV&UVevC`^)vC455iaBzVMawWH^}Gq*>Qc zoWyL$2vaz@&PHQsu{4wZ&qF8{$kKcTCzmnKY_q(-E`^7Ej2}4KTS^Y6DsjD6{UIw6 z0%@+tK5ug}ir?FN;loOW`YJ+83vuDY=dZ*Moa({EbT21>3i#I_QYn6h&$&xeT`ZxT zb)M_n-1gc_0%|PboQ*c7DmQIVv)V|~d~!PZcUJ?U@n{i`dLn+jiiXn9?v4Bl>4&?7 zLG?%|&`A)=w_AIbYMEzE<6h4;_knDHK|)Z5cknibZ!-|1y-bu(u|C?hTFL+Rb@r6v zMDW6uV|WiihsStm4Utj}OHz{1U*sNgK&#ny+)zZiF6~zoZJwBRwVtqGo}!yIhX2bj7(LSdmi*7 z_AwvfwEJ*;H7zF|lFMz#U}_f?F$Fio`ECdFXS~t2iaMe zU{*oK`X9Q*@RfL@h;53>!>~W&Pf;@OvZ?BuG_5!4W-X?yx67~m4I+d6KO4l~#uHW+ zagz%faP{qDi;XR2u`9(#qKG?R!bNI~e=;+j*ATi8D!=62aQK0|uVGMTVWu!m zlpsHjWu8Pq*QPbvJJGs;{1~^VQG$r{?EdM>WdqAqGLiO^FO z2M(V2pz~)BAro}sA#$T6*Usdy_l7M#eX6yWs~f>attPK#j4_ua(c3ws8_k@ZMSbVU5>`S+z0M8BcG2GIFT)JITT{^!(w zrJjxCyQG$Mz+>EGA(OS+{do$xN9Q*Ze}wjCYYGe?L=);F%rcB9h?W)bCD=K%E)0~& z+IFyAKyrE&vk4Qx>|3msx+d|&>{O4_J{9EuQggs}fptR#gI*yt~WbZ?Fh_W~ao87ntf|*a0 zw!6B0+V@|dWK8?#d}WoU(ENRkRaH0CIzlpujQ$D+_DA02OW};e21kM+kFh`JDq1ly zRb2{0GmYd%=`;BKML=6oH=8I~CI_Qx(7^P!WMT8JBHf6Ax6ne@OVvc99wktfN;VbbiV|xTF zxw36>`p>yy0D;;#(G|!;*P>|U$GeT|tb>T9^wtWk$5Ej62(iZHc;86|QB|jo=Li4^ zOBFoZJ$Yh#e0{_oxzf=(`;~p12^>8E52)7Et^SPx_;TBxHu_GoAyOC(3ikcR=hT5v zryLU@*^W{wP&t&;?=H56B&{I|#)P4v@Wj+Ws&TM!S|udlxvuF)orA~cgTZw#Z>eMe zYh+I{;Mk$i-SD~&TfIvHX@|jlNpzfRV&LwKt%M-eLssgZIGAVC5+iKVem2&TN(KGx zW0hS}TMI7o4-7tl-bow_Er2z;q^q#f=<1X~w}PGy%LHL?&jfVoJfE=isC`{HpQpPU z&?9~psF#2Oy=5ASB(@Ltw04{xR{=t50{e}kVr)|4>s`3D&OJw`2N)4bvp|Xt1D-Pe zRr*+bn?no~wsdqfPn@3n?K53L^LHebo*bS6nw+YgupZnpZ@Eysku$$E`a1%5h?*^QvyjEDS=`UBzVMkfx zs;K}O0`&2@o%%FWOTswT`sK}`o#DvhUC7vargJ1gF?7R;EmThn?$^ z`hi#Bny@BmBofV&`|saYDZF{6l3qd4v5eHY_21-pthb)rEp%lXVx`K+K04M9Sa_iiFkH(^!w5KP`ri zc914W_f%g3(WN3EuLjjNJiSR+^V^RnsU-m*ulvk zC_Wpy&Jz1UkVvOQYhG^Dk7s)HR+0WoNm=iasPtYT0u^f)=$$lP^9jk)+!<1l^O|`0wrM4g<8Or!M1dHV%I7W_1pn3zQ~1vWQtj zCNyxv$xWuoB@4)RldxP9X(Rq;Rdz1|cGpAj;3Kp}EwjT`)WF2Q;4KGJu(N-hvkAXJ z7M>C7vLRqN2kEa(V%?mnSSa8C<~M?valWc@hg^{cIdU)lPZcr?0yIFVvU%P^JFGXe zRFi)(^RO=GYDp^TGjIg1T>&bOjueN8S1kfXTzJecgj&x7+0yTu+OKJ{biF|eZTWSyW(_!>U+HnGiomv23AIA^CsPlJ-rzhDZZZB$ zd6OdquuoK^8DUxP<5apj=xltofbD4s0fakX#n)F>n3wfP;5!{8kX9es`SX&(>Ltc% zTRSwny4okV1-gvLp`zdG(9LJ|K?GR*Mj`v<7JR3UHV$QPnK3av6S%yJM4U=@Cl2|Y zXh<-*lqAehTrOBG#`Bp>2Qe^Jhc?LG|ITpz*=FiXGx^ujZJ5&=I}GLRAW|@`#Oy~% zVFfNsmg&p~rz}~uJ!kzC?%za;GIrClvs_QGjAM}n=KQy~`U>iU;!1_N+05Nsn%`eH zsd?i`I0}v@5XM~PtwZme&_jnG zP*P>bOs}SX`D`ttO)TgEXg&XGjJF@sX?ofU~!RADHhW){qY#tUe{;%6@XP09(`G%-LC>DW(n zaQlZ^gQKHQw{{(f+yG;ik|5Ex%6UKudZd!ASZ-xXaw#HC94&%t&jWQAMzJoSh6c-` z;cr5kip|-F%FM+*2y#(YR_!|)jiq<6tx1Lm#({0Eboa^`Z{$J#X9rL(O-qnwPN7zo zq10$G(Wij(w*bYQ{GKdiZ&v1&jyOp~Qf=x`$=8l`MAeH+OMu`y-&((wCtHs;^_~i) z=fwl!Wf+{ys9Ea~9W7BRS1ZbGSpEBvpGYA5 zN%y0O6Q-)nnr_TBZ5-dJ4VVj_skCL28Wy44uok zf9*KaR)4drHg6I06H-ZG&%nVg5^}hf=7evq-af$nu!>=i#(rDvIqyv%MntCpLUe?- zqJ)N7bxmTIYc7y?zw6??{=x@9IT5dUaP@=rd~D}=-;r3DUk$hKMq3M z1{*BrmuKVt&Cp*>`2mK`n`9UU7l}Yvc1VN$jeCg>5Zsdh2oI$1vxWVY6+Yt|u7{E* zf(y)=OP1}lUnFs5b3sslCSBe&hU*<%gX<)`e9qpHl zi{M*gv71F7b^Fb7iD7(u!Gzi($TGEWBaX`4QofUk}?N;b?hz?<~ zIO2UaKLchNbdy|xZMcETCnkaAkrIF>Q_T(K^|FYoRaGE@& za%CmLg)a}LA=MTc@Ls`-NB z&oD7yq2xvh=~&j*omM$G+<|I_%6?WDjW%caqH(;zzp!5ff#`E3Jcpy{V?pC;mMK>z z1yMg4gwa6yeH{<^qpMU*bUAKV=BKNKPCoVc?+mb3GdHE~dpOac)^e@KcI;(;!|i|e zR4Dk0e5$d-vJE#6OVEfZlE?r#;8mVW^!1x$Qy&;tI+}ns^QvnF!=w8u@4Pa&yGGcK zvoz)>0Ye741VSc-K)<@Or#G+V8E!fANRk=5a{SC{W8Zu95{#q{H!k`r z`i>Pf@(WkO44F2R&;{QSe)&ov&$c8zX)zopQ<4Dj*SW><9A946_c>oF@2=_fckO4iwY!<3|HF-o)sOrFCddySc>oZ(vd)80O1~M)X^;Dr8g1SrBeF2KQ*X1BW z1+qWzJPy+}$5Et}RVp4Hd8Pq{9XXaHpiOQmhAHV2n&~pk4sUIc{_g03K}2!cc!>BFE3f3{N{qaNdg_&yHT(-VJRXIHMO_Tbm?^f zIMt32VGfyKCoS94$HSXEO4{Q@;S;{-O9NCDC|QgK3CAJLR_G69JX_}Jow?xXrLxv7 zzt!$wj-k!A6Vosx%-(jlBY6f#$XE3}*m%rw6)2%IdZqjDCkzLbPc(EoPQU69l1~va z7HlUA`o<~VLA>RWW$JfjBZI#rKXd_m>|n}Z z9obx#It4@PIuGLk1S||;>R$#$7Sa+4#|Bzos=nOt+20kSfG`A^Q6p2gHW@=H-^C(3 zM`y^|dc7oIHRQ4L*o$1QCvX7iT63a4yC^(mk>1^2Tem?xrrw{hC&h(k(r4kgcx*4k zN=sV~tU1I}gfa>Vp#WbW;BQ~CF!G;VfL7DNqhcr!|G+RMJ2lJ~DgWs;hlsZdvPu)u zcG75)s)K-_>;E2dPiuJdWS3Shb^2oukqToM(NO|vCuZ2m{|3SXuJW_;BAVlgM;afj zhPGGaan3jAojP~0)sw6RXpY=Fy&nnwT>Tj*?s2O$@{&QmyMvab9>YXD*R?%yQZ{hw73JxE{u|Oe2E2c-18$GtMbrO>Z@S!&B zth9Mi9t2kM4`NjHR6=!YCb7STW*VvOO(x7~Iu`p0k;~XP9{eOr-If7^t3Nex;r?c` zP15qMYZ-iKG)my1phtz5zuj>$a>##@VACH&$m0R|I@f!2PE>Rp&ALUM<#!33chij!*NuZAkTIst|o zroK!y6y>BHpi>o`DSeZ9e`T9D)7__12@3Kx=keL znxRO?sR9uZz%BzEwpdbrz)FI+m6=Ufy`wlF*yk7pl=s8Pt~(=#V~UYJz$L5Q-LIPtg>OUI*T z@nP|dsK*%_GP`ynro;(?B;PM?`wSZ)R@6j@p(ubW&)K$Ys`1b=1qkvu@*PZbmJ83+ zlhafRlLVYNg?+AQ43~CC)@m2iHX8s@5NE(bB`%?xbtdwLwBEPJ#{abQ`CI6>ImxYL+Nh};p->Dpsj3(y~qm7EX#Z>ID=6!PzXd$;I zR{#soLPF*3TpcSi!R~8GBp4gD5((#XyNYU!*_hEQX}kNUou-63HmRiVbDm9;{gU_e zlmA+7&gkaWULw>4f@WH}*sKN$nJ1T|sw5B$90DS+CL&6+Dw?jntRwIs)SHV2%zv|q zkgVLfq!Y8TJoGg`M*;bA?E^fSMNDi`x&k><>C^&fY23C? zg|UD<74W$Izgb6~9TrX!0lCH)-WShJE*;|H693G-J15($Z+F*_azdG7ne-lLBk$p4uIl8=#J!6^M zdqw^izBw8YFmU3rfC3lDshi#sYP;7hgqpQjE3DSJX_;qXeMAxOlbL|R27RVNAu*>=>7YV%V=~3Zj~n9Ch{uN_-TbWM4Kk9zYu`sp_tUIkD0c5jOd*+z>lv zAFjcrq_GkUrZoNG(!}2$&J191Ki)X%6pmR@qi4OEe3r^s*~Yy z^}8Z+bKr?)OC)n>sKFn=T1xXUr$8P8+q=QQ8n~(zi~L$ZF8~z=Muj8+4s>?+R(@E} zOpM#tcxAcOBY~WOWa}qD*}twJx%RMs9jl{O`{=T5YDu60QqF%Oa!Ef#{W=hg{l=;B zayUSq1qf)7YOUcqu8@AUH@vwI^v}VGBA9x1E6NGJ@q#?80-(m=uO0G2#~T1j|4cmP z>tQ#gW=ct6*N*)j%d;O=;jj7ZjXuLdfJ{9f|0!`iV&yEHV87e&XO1zlbuJ0}?33W$ z4?MywPT-wR$E{4jr;L)C%T6SF?p&=N|o}1yk&5A3(*@4~H zm-lhf5O(t6>?Ft|>!0D%h18q(V|W+#s~F6+O4Ka#S#vU}5DB$gXlM ziIWQ*anzRWjsDm?ABoqTM*6PUmC=$z->|E#lilDDsxc*ys0B3k#l*D?q3dAv$Wewr zv8z(iOHE9(vakD=muJ@WB8htnh0%B?8MjTXFL&Hb^6sA$F)o#w~2XilNMte(zR;JP4 zPwgzm$zEmO1O*xEZu1U(cm0JX)y5t4HCHDw61^IHXR|O7M+}BdCw^Ei+l}j{e%9W- z_MOK~Fvm`mS#C7tKJU~=^D$srSAm0A}JzRaG}G({X2Gp%sDzkBNEAUciQp zV|7~`hVqiU*1H<;`P*=1;leL$c11Nl2T!#}o~D%j$-bbTKUvtjj1?0Gr*&m3zc71C z=9R8H6_FE{Nr)TL)7rwW%Gdi&l~bqgXx+jIN27T3*Krii4cD|WvT~h#bFnY@dr!u5 zxRrCNlI`!3f{3j%asP^O90+{d@&InbS>tpy{j2m3&qb5BdyBIWs#UPsKtEJ#C;i1p z^Y4uHmxoVSvny0$zcZ#!Z?R^J*uDmA9PeB>cpkkE z|H8XIDB&fzctB{X>EZx0DVSG1}n97>cM_w?yM-qJp{QfoWAIOHQ!T%=iaZx15AY-YGl z^es-=iaI`bV4AV>b#CpTuT`$y@9Nf@Y^tQ=W}=LQ@GZ8nJ54n2Rq;TPeih`KttPi1 z_^UO`5ASAl5r-aj30KBGitszXLMdP}AL+xlS?$p;-2yaLhj0OAtcQ)n8Lj@jX5MAx z0aHxSyHpvbWXFbxUZQQ83q7^wYnJXyO@Zy_8y`KoR^*?C@iFp@^3c)MC)iiW*5yx) z7jKr|e=vl%uM3FpfJ_wq{v($`9XMW(PMb&3P!X3VS~sDsjV9eeJ$dq8xc_eKVDD?3 z<@O+_M^9r432#pb$@QeBv1Radv%H#Mkw=eEeGl(MJz16Ps^LJ<;<=TNjR3&v#mk3~ zOUqq3;YEDy3}d>-Ae3|J)A&?-3YRVDE!f;rru&uoJ3aEFfomY)b=lvmhoQh0D}nQR zr|b@G*_Zgg$oTXZc!UzAQ+mB^h#yPT<vrs3 z)m ze7pgD6Lh_MB+GTr)BHaCgzYopbVz$l^27qE*}^$^gBh5#v0;5NKad-^d6|!>JzjjD zt8UwA4KvZB&b?pw?yz%Y>)4a3(R+h9izQ)qrvoj)ahDG*A?4u&15H3N*W_wa{hfiE zH2o~?$F=VYL#|UkyMce_!Wsh>J(p)3t}8A*8r`rn(jsj2{z6wgmwKE|W%pdO2<1I& z??_p@ZOz!$Rmrt|bL;tvNw&uoUOA0JXzt~({yOJ(Fyb_dS@N^3AK{z3T-w4b?dm=n zxz8R@5EMp7@5K+XsZ00BSp^TDDPJ&V)ctn3={cq`YV7=*(~~F7IT(~>WN#Miv`Ay7 zgTrGZzw7d~D^4HcJ}E^gIFt<)Y;^t!vNvFowLKxcDJ1FM8*7ruwb>eJ2yr4f{`6Xi z6V1tnf^PsbF!IF7j)FhH7EOz){0s6o;ix+c!6a zOk+`fOLelJ`-uFlyGKk}NE2rkI>NG6V!|b)Xyi#sR0i$mKPgk&ZWM~COInoEji)}f zjLQAyEPIJ<9GFm0=1r$vbZOS@_tnC6pFqHkoUal-rs3_|^`cE&Ixj)H#?TR}<5y*A ztmOaBw9D|~VBH*g^9*REPwY0k9iN-e*F?(y@;)?mI?^&4`DU5$g`Sp2wMUPrsASM{{7Do1 zX_~37ITUH>#p|8rXka$)@=0?-N{bsU$%TYc`n}<$zEh}kNo)L?m=y4E7V$r{tgTW6 zXW3nq2C5bYdq=e#1QJ3_`IZtC^rHsM>)z_NQ%rOr?|e8~!%`OE5MnA8)~T_Anjx%P zKcgB`YZqFag%I(N(*uhpY^Gu_DLj+^rw#2-o5Li>_mX=qKRcQ#rW{wlI$B;!Pf$@& za?CulcBRmAkQf}34LeZ18)Si_-mFD z6ArzZ*%Gs!YkBfYyxI-NTOHuh=7Axa>{1ysp$EUvruQh&__LfWC!X z{Z-=D4Wj)%d@KVGAOXFnDL$s9SoD5$iG`@u`fgT2b)~bfG5$kAX12V#W|rE>8sz`2 zmwf%jtsX~<_Dy7n?VF6!2-~bz{npiqFjgWC7JMo*tjNJSpiK z8}eNL6sRM$oS>ktAK4>JxEq3>ynHh55MkA=r)gUHrxehM|2`~mMl|UTLX`&Cx>RPl z*p-mSn%S6H$Nz*XT~?XuNMeKSTLnHmc<1IkER%e=Oe8t8nJ^J7rd{$dNMG=Z>Lg3N zYU=EeD^*gQ?FH_T^0oP|k%}eGzboKBpTu#pcd$4;a7xONFLItJ|*-Y1?Da z?07_`RqH$TYis!z92;QK##6i(_8I@SIILO?YctWg zQHxzJ6eBWc(xH|9$NKuDT2qGVcx5tsjO!o(*Jo9WTeI8N>@B$V*C)O+FWU8wqNsMB z@en_41U)Nv7o97Df7cKe+NwT>P$%UmNus2$spU}B2vY|399JW5RwR4LLt2AONGYIz z|2ak|3Z3f_Ed~_)R;D{>YPYvKton$vokZ3=Nd6z*-U2ADW&0Z?5FiN_f;%Bda2eba zEI0}7A-K!nHUWYJ4G`QyaCdhI?mD=`;O-3YHs{`Z{`Y*}`>I~Odi8b{P@CDir+f8U ztC##%cU&CQ$kk1r1gC&`i2wBfjctfsJN9cfbh+_P4pa&@6RSAavGk0&jXJ#NHXfx( z1Zr8*b12!yUkGWljSUiG)f3DUk-?^z*1s4GL;g7`F&V|u1j}&?LY7BjIqDL0aM_(& zn}LhWJrIY;8gy)$MEWQwf;pUgduQk*dBFxjYcPK{c{X{Zao~tTm+AO2U90Y-HBjoA zRzG*uOk+KN+ubm&tDAMOMmw6e{P+Zf zHMfVVRXvIg_a0}tYEqr(xV=MLHZ;n4!8xwxU}uv6vj4kyZ2gE`MI)&d~v@uS&UYDH$nlc{R-@3`0a<^HEei2*Y((-VWu9&!nyyT6#`KXeWv z9lI%*t~~LfDNZVxb)2_4&o;nUvAp<}RJ>bWL3ZFq+a@$j-N-SpH|22=f16#ZTj*o% ze(JJ`DBtn+89P|Sln%6lqiRIFn4A#sal~XwTirwQ^ z^JfPKE=|HUxmAVe?EmDVC{@p9`N+u3znaGMaOU6}6Z^XiJJLJ;jSx^k{$E$*eeQdp z7e+s&bCll*eG`icpWFHk6BA!Q`n7cFz&m=)!r|(^5Y*H24C#i9bLy{$|I-!VuOzeT zqY~;dV0}qXwEa4iAy30GGw|0Sm7qC`mfv?BzP;D46koJ~NE@>!W;7H_Ly&!l8B@ zU?~-+bE7DiIRC6QIzsqQL4PX6hH(jb;XkKsRN`NR$k4f4 zmsH@r=9H1?mvVp0@k||=uDo*3?7qebQ#e%bl9^c`G0RvA9NS{ibLmlD;@c8OHYg=_ zF4k;~{Z(5AR;B`r?|H`#^N{7;xd>rHoce(EmxLIp5LN$+--sHwL7R4eK6WE0Df5KG zQawX2E_B}rG7tsHBCa8rv57Sf>i2eRFLabIU83x;`FJQ>U(b0G>fjR&Hy~DtqaTW$ zXh+M>$6AobvhNQf7W`Cvx@%tQd&O@5)mkBHPI*v}Bgl|@{KY9I1fyHq_-SY=!(Qek{nM6eFK>^bfmWVWR2*l3^z_7^ zHD5LbLhfpIkFPxiZ+Z+p?@u52$HZP?6IHge;k3d|!6&OATnlol1G)Y6CLen%`&WXg zHWaa5Q%UbOHE9aVGpt;quIC_X9D(kj_=mcVs*ob#z2fKcn}QJedsw_B4m%U^0A(5$ zmqT$&;sb%UV!%CJhz*;cC%s_UcjSnYkyj8rS-9$+zhiP9AF_teF+oR(K|i7k?0BX2%m`BH$<^M*^Uj>xZ@;Lh3{|&IERWLcX1~VO zWDg^^%4bpP!kd0IIjt$713Q#rQUQ{{v8i*Kpa|ZGQU9#Dlg~^QSR6nR3aT< zf^l;<`aTPx6@Ds4mtWufbMbplW4&Nmq+OZaCq*GxB**#0G20K52TAn10egSwQK~3e z_jTWueJ`nZD`6y8cU+*qxl>T`DW0Axu#q`ws-hy#H7FX5i&^>9Qrgz`R5hw~<=#=T zVa8mI@T;n`t*o_4qZ%K4!j44xcv(zDh+ipE#SBTp zF3lBkAzt=R0EQvc{9;^whV#ywrXg(_U379)x#;E||iOOtAjO_n7OhzJqFuB?oD9tk(n7|HfSZYt`~FN7%7 z*5F}X$d}WuR5zwgQhRDNMgEw+J`1M)b|+nafmzM_z7Qt;i*_Y)%*c+Z!5Vn-TDSn_ zS0~#d!>$3MH-c2yk!?xBhL~%+bjN$q5l8J6iVmyvAw)ds&BG4D{ei=W-3s|l$*u|) zs!G;ZZv5jPD~hns#+Lf?0i}*%KTa`TialYV8BPy{OSs( z^aj(;%Zj;Re_Hsmu1)%=cgw>2BS(bdQ@T^n?C67!WA5tWnKzszFTl`@q|+Kzmc(yF zm3G$C&i$4WP)mpdvtFCA_|DX)kXf~=C-=5 zw?8RLD;TMSJ}#7eKgmvfHh+VLHfz@u55OMMnnc}cp2Sk*U_qCqW7NdUT)TKK7hzin ztf91UF$Tj&^lMk%`1O%$+Ij*V`Njr8+P2G*(^@xppgo#*KeU1!{SBnSSkr20>{P19 zKhE=O-ni+x7L*O0fuVrctCx>7hRo2k`)HtunnR5ynjRt5>w>TN`mCxE-WT#O`qC$Z zPJecq9&k5b&M-^)>4^kIWvyv0ZQ5*j%16a z8F0!ve>J*=Lw8e?0?arQMiN_eMbq>WCdk8keInU@_gU};!yB+~K-)&!_vHP8Y^K|* zFU5o41Qze4*=DHMV|(JIsVIy=A|xs{;Hddji_J*KrTh^Y>05}J?3gYX<-VBbwYh2 z+C{!A|0{m26vzAX6M!wTJE+1shy{jfaFT8WAs)?Y7V;u#Xxw(0B~L{*^|~uq-*qe- zwn;Y*swY5-DtYPelNVcx*oPI-z_V;BlkP1eBp~>{0Hjva%m*8MQ9Q?>zdWF)NmV^A4gCI>fw<`(9g zjLr>ZW*8FePT{t==M*+ZT}zQk3F5DPmpU+2w`BDB9F$mZf1N*Kh@bis3)Ijc;I=aw zI6b-J)#EsDOverjdh`9~&zHLgw}G)i=tE&V-eKm-IVbbr;fOOOadDI)wt=U)c}2TC zfY8kr6zbQwX9n3) z)^BZ_x+BS%iQ)r|Zs0G2PbM0k{JaU@O-hH8!{ShBkM5VR;GP)lk1z+O6sW$WP&HLE0mUT?Dy0KjZ1jXZ4OfQ{%%*%Y#` zz|oS5QW`X#?1C{I9Z;BtJ~8Pq6$Cjg6d&R>Ttx+#Mk!HNY^Gm; z%+9r*5x%-p$!f@oIn!B;TL~U1Jbs`?=E~fNg(9MO=d!ANM7=AnWBjxPHPk08C;omY ziyzdQ;}`AL&=RnlVTpWsj$ogNCnUOo~9bX?l9vz~G z7d|X}PRJ^Ji@Or_OgBY{;^vA;UwB~eU}ycZxgAc6g!FswZP}ByBg^mJE6bYd}tU zE5k;;lHuqNgJkSwDhQc=i0%4JsQSKx_pbm&R5}<^2Q6JM1Yf0kqy1ONozr}hML(*F zFmMvlQ$wW3}!YFz>flr&8FO&ti=Ayz1?Sf&3-6&o`b6H9OSzRwwpcjB}RimeC? zCBJS&zq{b>DUaz@KAR7!vJjrJh>X>S)b}D!D&Frd$QCm*idkk^EB%3zb1Bq3f1t1k zr=o2b+KTxAM~5e$V2Yyn(jMNt7pF=Z76K$@eh9EyJ(Zju`-wsa23C^u70G72CC=P6 zdp+la0bQGVbp$8-gSrn@XIhJaZ8dK|35F5~tjT@I?c+sk&hNfnWRq=B>+=bR!d**V zC>WKMMCI-tHT~IyyG0jd!#|X!?zV?99qLKfSb{Cfzbkv;O(eYo7H~VSy(0KU3FZ{2 z?b*nBb}h}!EmAqqeR_~*VYQ*BKp8!xQ1L7VEapm#VG@J}ubPjx*$2xNqfb?g9c*@8 zN&YUD|88)6*Tb|kNV!Cx&}#*1FNvDFmc5uJHHbM{icI)PNc%`olH)M1>PK_S!Il3q zXRem7ju~R3kAH;NgaZ1L<#RkAJA3I-_^G2WO?KFn|2plD$?qBHpQoT!^^WlbBj_&_E6P zwg%&uagpYiLrF(J9kSuw(%*>t6CBS!dgY5gk%`EsQNl5}Em0qF80JSnbTatFyx2*E z!;%!Z0+K!mEn6uV-YgK4C758}&OqDJnR>9y-OJ@q&Xn(8n!>o@Rbe%MN;w`$UG45T z5Y0s8ptNV|LTq`Wf)IN00-eEq0VZQieH zYlTL`RA|aJo(UqUM|+_JQ|`!mCyFdHMM!W9wbs-A5B^57U-}33Jec zYF&vqSsI)_Uq-#51V9L+tf++zl#^W@9!n2w#hdMXHMFr02x#Z=PZkPib<=7HjHE+RYHohWoPXjKOKcN%TdcD zUv=EOm2{_8l|pgU-VzA%5*ertYf^9bddutcs)KrmA1+&XS!Ux@-n}GmfT)f_w|U42 z2;+&z$|_l23Y=zg%+ga<*&0s0qAJOJq58=d<*w^!kFIA=YaZ2BH|Pb8n)#nZ&=AlX=qOmf#xN}p!cLa%csj*f3tKqSd!ORKj^%5Jkp=xBSz zxJk{oUz+pB0M~G-E>;x^&rr|W_``_*SrQJITcrp6!|NS#U$3$irXa`WI&)~x!oE(L zLfY)HofiQx{J_&kXVfV6Qs8s9t=gG|(_GVU|H%jV+Xl4FE+!T51+FLFyWfm+H`a`E zX~EI7pZJ$Nys8&k43u_*gGgCkK^|~=Jq{`F=P0o6+Hd6a~fk~QkV8TBrVfV9V!SM+nlzIQDa<1j&3)2@+O>3!;Vvt5%Q5+F| zOjj#O9-uRc2VXMo9sE|cxGjIHZE*cLyU5Jn9Pr|e#mbdE@vbR%m|E2Fc0^nDoevdj zMk5zC-H^~b0ekL&RS@GyYkVmgm68+LGxlX2GUm+?&VriXu4vnZQ;R!9_lUUOW z;U=+zGArj-*Rf3=?t*iR7hArc?W)MuY-f(WsCbDeP##{LXblSgSX4bD9atXQ!MBaM zaJWb==D3qM)Yqq0@o1(D@@W2mx1!Z8fR87+^p!TJ#iDnfG-@&+%^r!j1q>TYovh&7 zw+WbZ#>L@XREIk?z^YL^^zgL|TrO`t-w)dlAyE_d`jpZoIr^^TbfpSwjeh-%W3TQF)P1WuR*b-%^(JoW+ zEfBqN{7{qZwS8?G&+b7UU{JbcZR)Vj-hJF{LQ*uPQI_-E#@_GJfK?NJog$kbGO0jtn(VhrPiiJG|hIve*08xGWXW4C{% zeETS|!CI?&=S0^>YcZk7c~1E)$>*Pmcc@$*v+7l=Hgrg|6C_9_v;%t{46RSx7#4;A z`;VSo?lC?fl9gC1(o|sfL+dTn_q_LPS^EojV!G!@71cNd`U6^#Ui2I=CpBzbz?B=S zN;ZzG9w}JI%mQ72w+bHgLd6tDZ;rN(Bz7XR2|5=#lrJAv_5mX;dcbXIfp|k|6vm+5 zwBh3D>|SGGUH+h3EL7F_H_}qpiMJ z=n-Du3?dEn8U*$p`^+*a37RPII&8*OqXE{!rhJ`C&LQ;m;Verr3>`7C(G37*R6jTv zqB-D`9Ov&~U;}X$FsIe<`CW3UBT@CR$KBlIfabOB^m2YFK@3q8+o z9C*(C6F6)n9sZ{u20HGL!d=KFx)7#1j=5;cr7Uwgggm$aXD?p2ABR4)>a>qDnAIC% z96NalNaLNTBhw36kS2svr?6sp?x4T<%zoD;5sxjRz%+PMBEqxmBq5$DN-KZTEbvU% z8)Ned$jUtDW$t910HSY^JXSv0hFEv&XUqagwXotjK3HSOvw-(M)l~pXlP0;`^|`e* zv*6{rVIgFnNnN%yiC85|SBF8gq5c~NSf2)LSQ;usWav1KAq(VTP5vw&OzQFHM^x zaG7eEs~GRiqL@fnwiWl{8I^Lez>|WB;VW4a_WLN!OfBHhXfLuNSr3+=qqs{ILT!om zKH)h9tozfDFrKEKLR%(U!6M%i9J){5tK!L-g9mgqWotDhhTS*!!Ub-(D(GmlX|vqR zcZ5$u_(XW4musH^bKaGtM?E=KL#zWh#9fQiAguZsHhCa-)bp0x%Ev?c$uMpsuHTLgn=`9o=Qk z99qdLC5Au}CD@{4xJd$W**JlvnUKPh%dxl}1lzy2h&{*ohK%6{!H{3U)$jau37VHd zeJO_zwziT_vvcEg2RvmQ&kd#v)sw6vPEsIV@U&vZdcx_-=J!=&AP2uAv#miV-sLB^ z9qOG$p=iLQMRdZZ^;-X6vBVxWnFc8wZv461e1*GUi++#z!^>Wo+p-uE3Ov@O%Mo(o zkHgj>Y%ye$c@x@eb=3uSWCjXR>Q2sj5h{f%?L}|d5b?qHFm&HFs@iIT-v@O-8j&cu z9bx<#W}_^C_s2nvPvFf_Kv*2p?#ae++(@n+-S&gLDm*dd{E$5n@Cj;Nnl0JWxiL>}#ya z#OwZAUZA?dqVvRnBm&5!p^Nw@AVF7VRS2iNQ5nR{!|_(Kdzj=J@v|;7wE^}0E-8uD zuRm;M8}Rt|!2*8A`3s!|Wh|bA$t1a((QUn)@vm9XLSa)X!+|WYo2JV?$dX}duTLMY z3Q0H!u`tK=*`(R|!0YK9*He+r_w7O*okH?`YRm`D!NVj8Xdse-mye-j>lVOHijE#o zf4@m>M`-#q-cUlrx;vNa&J!evL=wmk5-r-!nUn^9Q*Ed7jkf=~L@;ohkTlLw9>MVE z3*bjlyih<`E_OsCxZTy*D_9pUC{jdIp+FG{cU8?bCq0m^IaaApVOEIBwS43oAYAE3 z-qFU9x6Et1&$Ersp_8r|>Qs6IuaS>`V%4VzQ$-|^7odASoxm9PCHmJkz? z{b8#PAQRH?nSYH{$QOvpol^+=TDQ2TtY4%;f2+FNvC4h7-7y-!jD4b1|0}!;q8HS{ z(32TK)|r&%#@nK^4JY=+k^Nq@An(xM%;*CI+q~$DF-V&4L)+!BBVT`(Pl8?SvvC0I!)Ub~jAhUH9#nvuR3@o4w5d%FAxx zcMY@7hIbz>g6#KU{6qR2vrjnHA6p zNMhnVuI=>QFbLSqE#>L=y~Z#!PntUx7o%##Q6G5olu=qno=NQzeiH(y!q9tso8;3C zTWy|^n(zSJ!ShZJFr1wfl3&uEqUBTR4>*27TnZalEisllnTvXp%LexpI8cS&Rj)t0 z*K(#_`aVEy74IohR;Mm7$5Y<6Mp|Gr^7_UpJpg`f5B?%BY&sX~%{@N?s|7Nk(oICv zJ{>U&1+{!-DLg=u0wzsH53U$aK`NY+>NKvg9RF#J<&oHO^7X=l61MSKuBII><;q~o z$Ih~^*XFO=&(~tfcetz9_CU=|KR{~IoPYGhw&PzeKsc~=ri&>zJ&27pL}zL@fooTP z-grYPEEX8GrY~dW9=FeDpbnnhydh$ zq^TQ4GzNSbi+F4_;vVj&*A&T*E-(WCHNM`$6JT~g0{{w$yl_o07m;S1e*p=>P26v; z9{FsT-W`$BvFcgXi_*ZER)O#K*+O5_sj*2fBj0PuEtgIBRILvV4!VVxWShmqI+k^P z_z_YE9oPNlJ;sW7T_H+3sYOcj;{tFl6{8wA+kBT0DGC(*2szVOqOK>+Y18wzNmK75 zvYPUkSo*@BFK1tw0B~|MEDuK1Ery@YZ0!hJhf*lkM7Os6 zK`XtjfL%L({1xk__8fD)W1NDv`bVpQFZOcZ$RE9a#frw(?1e$x6bi>Eq8;#@T`rRY z<}I76ZR>6!5K$pl`kE#{Fnp$tw_sw^K!fxw?DDdaG*qJbh1{?CBMdV+2fIvXcLH`o z{GSve&BJ$XH=hd2?+WrAUkQ~|gu`4Al!p5G# z>cBTc6uj>7tDPy(Q55oeUa>iJ=rZ#rLbIm~H~^F~M&{(I1M5uF1pduET*Mq(xZseY ze*-V(=TG;dmfs60*K_Jc8bifuB{a}RWGRr-O`-7aCMo2^Jh^hq8p+k@E{WfoR*F@y zY|9H|GCT-bnwbGs6>RKb`|i|IDCA$leE%5tb?|$7h(wtuDZhK~H zqv}mo@FZEW_6YVe&}rCV&+0I?v&wFcv5DV`%&51Gm1oq^a@MKWIshTk`H7}76 zb^|e|CWcqTz;=)FJxLS?y>bF`Xj-wG?E}cM>Sbql?*?LSbh71Qo8;CM~8At1pfPg9Z04d-ngj=od8`?wX6X9A4zSu{oLz(JKf1&ZlS0YExzc>Q{i z=Lf!p7hvse&qt*c@!F9))jxya1@P;|7%~$8@eujR((`aD-z&(1B{yw}TuxdG z@Y(X8#sisibqa~n=A5Xq3;6cH_2R36&r7X!7SeB|9yX|mAKVN|UY6e!N-`*1lu?=0zv3X+NG<;a7M&PtdLfl04iC+B7$)(dB3o8{>lO|~M z)%_Xd(?yZ~D-8$llF#Fb!by*b*k=-U+DX!jPP@;-0UQs?mn#-JR4r%j;|aru{ z7aRJbeOo7~)4+Q@kBv^x9t~aX{`P3ajN+jNj&Ud5gQiGmY&;+<|paH zjxZpB)W7G3_DqVZwzxl_My;ZvE^qk$veWdM_p&|Y`BPsY-q9=gaE8Nads&>BEMzO( zooe@D8M&JEkX;hchkR%B1A=Tkf2K~0deDgh1=DDuv`h=cTU}Zx>Q5 zR)AAdO#SV1J7Be{ z3P|g0mI0g}7~lid>m-#6rDi0RPloV810Qp5IY}!!%hbh~3Og>Lms#3%RiB6Y^=Yet zkTQcl#_;mmsH#K(8R~Ae3WzH^?G(6v<7`|KoyY$m|X)Pyj>iAuZCquov#;hDgaiWdB{9O#%v+xkM zODR*J3?|;-ura8qF2vCzDmdChUGP@su9jPcIaLlo*6>P`beKkZya3|N>H8E(C;bid zNlyB10oy#u!GK*ATH>mk@!}GBq^>aG?4T`0`97Gk7%9EW!Ne2Tf{|oCGzII+{sE^p zWD$g+cs`?yFn#xD^Y>hTg8SX`Yc|k$$``nY3Fuy^;#SxDGFp4axqsJ>xFM(~z1^k# z%lkObT3CQDV%(VRz2HMrlQZ72z83{TMdK@;sW5DM8rS2%=X!91d2#eN6Uupqdlobo zekGzN51VWF0Coga=tJ8IV90X3E?I{74ygbD$ayqLUfR5d&WbsK8EDcl1m>R zaK)|pxB{*d@C1-yXIo-;EILc3hA7sQR{k>HCGtK*I%wI)&fG7VbPny$V5}A7jjZsR z)T1hvacozP^mEg7&m0n5nAlghmm z;|m+CYhZC`7-N29ZUSKKa_|&lMCA=!eN4`muSvjm;L=|hu`=hbbV_|t7(cL)aMS?# z{ZyNcR7XZ>=mrx656G4Bw(_hc-B_V6cLQlAW)8n?llTzCs`(TP8o&OkQ7*W;E5m8w zD|q}LouqD#{rTj1$uXyy4a|o?^R(dN&At)wq0`BAic=uV>e9?R{q;Xs0Gy-{waSA* ze7at|(U`_1kgIqoK^SSm0Y_(jp04p0!R5Ov@|;UEF65Qd+WUn!6Mk~Fj^wJgmaPou zh5=r@$LPmlWSk4ti3fOoCGLtBVpJ@>&mOrn$#YWXNLOOiPFxnGv26unRXEt6um93 z_J(3S6-#d1ax@uAl#)(>rcPB`*EjIb)Y>o)3!RELTU3lxK_O4RT5I!wVb%{d!|YRv z7Rx_7WeIt_zueo?;ymZJ*6Gf`T2ObSph6YKu+t zC5H21f7>@iq;%L=t@&an7Y(Fb=7TKOiQako+5<4D6^+qKb+0~O20zxkC5{*YD+xkr zZ}=%B&qS}L;rqeID*j1yd*@$?G-`M;*%5SOWN?=+YtKSm&v^UwJDpx1wvU}Q#2y-M zm%$Jr%xN#=S0B@>@zZ064gjWx0|-hr_?d-x){Y$B-hsB?NPY6ScXYnrXLg2PgaNo& z^dCbmk!|C?Hc@2JaS2tX-11Qwrz@iqgjEWaGh=Ef4@o3xz(zPU`zQPQ9L!MeAG z-B0@)2&*Ty1b7U?vHZ+u+(eU-CrU$QF_B{1!k0>ZZ;%iAKb9X+aS*=22k@dtr>O5U zIm}hf!`TB?03@%2*~fVLTT7ru6p;2eLZKhm{N?E4oLk!1)rbgCEaFXLJ{f3Sy9pW= z4@%OtWo$19CeKKGviUNqX5Jzsia&#)l2#}DKg6p(}L?n0qP0cSl`%+?hDYwjn071aGdE? zHMnwlAHh^&%2u-E=zt8{$zm%nfQ+&)Yr#bQP|F?Zn?DE`AtY-gk~RQ(^zlM`JA%u% z7auFZ=4rPX3#T39i>wxNxxrLaZ}tIzs9@~kpp@_VKoylZdPtB#WS2om z%3~xob@Qe(&6BR)IbEp+vWi_N(s-bW5b~W$MlHeQn9cjJN&$t z`d7sNU0O;-B_{iSfW`+6UWuZvob=u4i7d_tf6E}crBz5mZ4JjLxbPtH`OvF`VJi2b z^Y?Ajfs!Bv@SQi?mrbM!j?E$Hsd_xX{lx!HsK02sUg|=L_x*25JJ|h&#Qz(A|93${ zD2F%Xb7r93hcSB+-7`-BY)^i6tA|O)za)X8SV98iy6ICCFm8oa|L>=6z0?%h4=AVj z*r`DKUj=7WZa|gmf3eMDCBt6?5VKlHV?ek>sD4SFpH50!ZQ8O^i;;rF7wawzwh3b} zeP+&QAe|4WE(U5Qyn$vP(wc6=BMKVF?;#7YWcr;+hiDxmE5oGEhHTTHTeEAHzrB>{ zX@AAtpZ$a8c~W!If}lv$0^RH9Zrs$Gv86xW$G(*LI`aN4it>9@lC{NxdM3^Bp}Skd zU~26s8qKlL{o&hl4&uQ9KA5oaH%_Q$%Vp%ZT{1#mJsyN|^No@`OcBzL>CX}Vb5WXN zn<4(^2BAmuY2x2E2oCr@w13}yO_uoe|LV03V~@WZLFf^ZR4Znz3y*}!q%sm2ZtzNm z7Z$RYb6?MYP}vF6qVbGgc(+z64t!Iqfzb+IoQcOXFZY$++j60&|7zr{t*4JLkCI8A z$duD1vB1zG%tYRq%U;fOZP;wy0yx2>9-p2(PERv+gz@lpcJXr+4^`DcRdClc9(K-W zoKODKlW;S&DVgin+qHS&_=EP2H#&+qQkTMDgAq_Z(SE*(ibRijkkX_+8Wt!aq~3ebhEDBH9hAz!ySwL zHY0z2RDw>Re#=O4xDgvlks7jnCqH%|Szwl|gySdnKlHTwQ<~t$I?OvXn!|#=6R#!Z zmY$A9LNI*J3CS)n?#HRWWVLT9>r>y=`)(nRj{85;(u&=dPib^sCh^2;l}T}pAq=r2 z8F#}!Y)Ei%e8M7QNstH{4Usofj|QUC6XFm5nQPKa37B5ynu4I_VbgVDs{8uA6&5N2 z!Y?#N%{<i415GSad#?Xm3+L|L zzsJD#Ar)rciw8ApU#FiTe}RC|>K$4r87Gr=Z6*pEzQld;!AF$iJ!u|gMZqd!Mg%Kn zE~U|#NJMv~MMaE!815F@zlYRH`K{f+Yqfqjzq0X@Q-gDUxrJkOATaloy?yLs@eUag z%qM4&{;85N#K=f>*u(*dlCb2he4#JrkBu1A z5NJ15bWQR=B1L}BL9T9#qB3iswKv1J?Xw>bN$nEs^qPgwuUQ#iqVHzG(xzfDcF&Fr zM1YULe!Zp-skn(f5EISLmP6cy5PFt<8>75*bS5 zeqU626t5p^U8;&BSHPZd$BP0MbK_C_D+olXq29QOg~T{xci-I?$mY1#=XiVR$JG5M z-FZiU2^b0ldfo-*lOU~C^)OGx{obt_IvknwVbEPwGph*O3W+=q&JkYnWb?*O{5?vW z8|bh#txrN&L}OFuJeyk_Q8;*E$0p7q@Fss)cQ*1`7+3IW*X7rXlPKH!6n=r?y7Aew zyhD6awu!yzxngyFPX&wy7xRUknEX^;w{MbY2neODjFwsK#$*0;9$F5;1&O2K?eBW+ z9e602nA!Nf!VBaDJQq$K-`g*}wD_&Ar+jx|74axfO}Qx?x}b=ZH`4ips#$Sy!Ufsc z0Zb7uI3eBw6ms{60Ijb@rj%eLNKoB}XeBrgxz=5ZFqF$nO278Fy$9|$| zP^2pH-SI$BokD*v&;4hHZ)xPNiHFf0$Ud|{0$il$wgg2@iZ(C_$BU+tBCQPsm>Hq` zw`DxNbSl9JT$v!RvQjW4quq{wlzF1gCeI?pt~zjxwf`0KtX1^8KX>16Uh6+-;7p9t z>N8q5RL^bwD0xt-`XhUf?#eMrbRrzjf1hM6E{mh$ur|UDQPWBPr7D{=dU-I^FB6|o z?Us`_; zphA-B^E6nDbW~~t&WMv!y*88nn0`HJT!UdlK-PPFLL0-rXj`?SrC5@*8XFtg@QnOW zK<7Cmc#N5!DDWwtc=h&%Jp>}W>1J4#p_6lQ-2S3YH)N-(WrlkcaN%cgK4^b;YMpep zE-SCqKr=(M`7Oc!=4uA-rjKha&`}$YCVX?)@qAv}zUibncSJnm${Y)j89#1Yog7_( z>hmiN{t3qvvAs8OyuZYlM@VgQ_&S4opwZv6t*~fJ2OLj0XP=%2FXeO7lnaqA|Ej8_ zTPk9pA1G2>IkZ{T`ePXeO(Y|>c-jnK}L;5p@jRUFDAA5F7MY+{I0o5 z9%$WQbFN^P)2Wx_X6Dc(H=U*!Oz?9D=&HMQC%M=8R9NC=uZzkODaDv|c%Gf(NuZ#n zCFtR6@m~vx!-xH!+gf%zL{XXQ`dYIdx!dk1h~M-BlSZE=64CKVFo04QkLGX*AU)Z- z%d~TY!W5?Aa-`(khceB~AAiJ=l$=KS8X21yqS?kFh!(%_J|N*(5v0-cR{MUr*mGg` z72BX_GWXSX;;Eq5?d&gM2Q5*Y{Lqv49jC7gOBU-thB4cFZLS$s-lW&L!*f9AP<@Jm zDy-qbr%5h?wcrmmnp*2-7r0WL*S*yh(sjoIR1QeYrhvRUh(q~61j+6JdRjLGO*dno zQfik~RKtj%`*nGB}t%Fk(2qHsm-{#Q=ay!>_97Cjo+O2&4leOhublQ-1sHxCgd@5Pc^_+oHsyWk|JO6go$(_3lGJVe4_B?SHcdO-#z?so+ z=`^g+aeA9{M2CsbYd79j1&fz+G}15+iJ8Z|9XoD3is!zst-fT_Rrjr z+J)-t-7AI3nPw5)6k&3Lx($F(Yc*|$BUpyoRmN%8@`0=8ljp=gGnwX>`2) zH{W;|Kts8nMMrbzX=VGUg2IH28@oCZza=wdihQ3WP4aQlUS_3YdZ$lTs6)QA;B7GB-4sT5e?sCeuo z7O69xCflM|IvRe~p&ba#E)J8hDLX)yR}OoAUV8wZ|Kz{EMFaT^4pso4IGUOz#@22y zaN5-D+DB>^ruk=Y@#g%3ZiH;?0LL)Z4-}|O^9E;y>lfinDZW=$+5P4rgpcIq<;GFZ z$IA}Jkm(iW@G2g%lL;^uu>~jv3@3m8RXxgvS-5iU!wdOI#GG8{{_3)IiQ;`@B0K%< zsakl^hj4=q%te+bUv<{VT|SvC4s0p5Fm@WE>OJE%qR}oMN;W%Vg+4vsVD!^s>j$)* zsYZvKw1u^znT(SL-4MebuyipeN5i$t%Z#@~&eU~2bKbtCn{;sQQI8NK#d~yBG^=gn z6JjyB8q_SN_Gg{`d`mFbM-LsBB$=#vlQfb2O_0d{Q(C_V_2MthHqSwa6IIHZZa!pI z8UGZaDi$(h-})hvjBcE;8)K`S-{mJpj$WTbhn!`(hUq7O3<@K>35odB-zFhAv_RE6 z(3^1XHyQV}N&j<&^k(eBk73WZ5o_ciGMq9|HXl?cvI@v3WI4|@_TSPl9^+@X_cW|F zoY^(LuF!wfK9xL@-Tc?}>}(1mLDmbl*JzDKcuOMUQ)Yo-^lvjtkS#fZQo@?|lZh55 zXDYv?TY~nLbkt(H#*5nM8Q8*Yo`p_gL^|E^qvX`l05UBTb*2u9@Frb|M;F#KHHO` zGP0X@m8WpLo=G0x$;6HIT?)Uovy`puyK21Hf|k=RGtJ);BGRhbC=K8G0Vx~=zo4NR zUP3x{m+tLrmu-?ETf;R2W5tw4Im+xbicDl#oQuk=Z_oKWXJG5Sd#KsU9=KN_R@6tE z+IovKC4x$~1&*wmUF_h~+>6bfq&?dJ6uZ1?mjcJ@1=8e9#I-Gc+sbC5h1w+tKR2(t zBK0gy1@FzP%#uUL&QmVE$sdO>z!+wB44E|Xx@)=OZc45vueUkvTIOvUFAH#!4U|4j zUAHuHmw#_tGIRhR*%qzvvVB;5OUmV5NK3{gAEl!5(=#kqHGHg5Ss{+vTBAay!NrCm zAQG`Pvh(N9-i9+R=}&t;`n}vdCT`-bM`cs_jUOJ}ppXc#(}b&(n?Wy8`ln8RaB$UT z1lYsNb75*_7a#8^v;0ejQDVaVZOSWo>f=Z;1ca|lJIn)e1-YbI*EvkFKMN-W$J*tj zU-XYcsYp29z1QIe-_o?GMygCgqsa3)(bg>_8A#oD@kpIEKGZW;i-|<+_f%eo_V47B z?ORm$S|?9rMU}O9lg?$g>}q6`h(k@^<4L;@E=8M%c_i{2o#XdR1}Ybs9V$-j`nY=4 z{J1D{&G06ldo8WCg>Pw*&X zwR6#CBA&Ba)pFwrHm%icZ*Fbcyc^MK5lag%+~%qjT4Ic*78)1Zop1YqY9un34kft920vncYzqd@`F0cA7=*k z&(15ys!iJm&cNOzOGUQgJZH67!0Q#sp4Qcoowp8rGlP^AD^B z2cIu1M2m%2)jmYszp3WKF>zklRQ^s2sKjzn2^#bsWDqTACoNWp zV1NBwG$Kc39&_Ps@O0ZU^9*1+1*YL;$-ug(P1pK}#~~ESKEvjWSFbVcG>= zk>cAmw{Z1v9gDQmO>pC%0O?>5R2HOi!uVMobIe>9ZeF)& zYC&cy2`o!gtCElB9?s9!_i@HEI}}FmKy3D{a~CvxQ5Z(J(-nW0dOPPAY8Sr^#}0HavIN_xN4`8H#c>5KIt)*U@@%*dloU>jJ#Obl5HOBODE zETOz5(tfy)o*K0BwlL9;1<`qB2+IS=STcs77pxJx<7Wes#8 zYo)b?E(Omu$KF3U1gD_+P-QwcAs+Z@&PL5!qdO z61{B)1o3=#m074OAwRKd-3LX{O7E3vTtG(!yh3cQxOfS*aN}&6=Lg}!8aYycn{#Ze zDV5O>%KMAJp6HJlH4Mjuy*TM=3(lf{+iYHFMJYFyxVomjs_*g`QrKjCl`-Q=P@uy{ z&!+{PF6Iomo~%khSP5wHvY1;`K}z7ElvW`ksMp1mEp3*s{wo*0*3~Gsw_W8>(DbQ4 zQh&8n?x)UAR_GUmW~x%pz<%kTE0;>;HVusrFn=88XX}%kR25l@`H+g+L3ipd#Dg;$ z?xj|H@fM`bdZP#AFAk0ppYDJgyZKnN>mLvJn{Y#uwj7=b%r|Tm>+Hx$R#C(RB&?`B4jZ>7nCG>x>y6YwVUsbI$ZOa@BU)Z?pekyF)}n4 zDaoj}TEwg2kv^`nF=;kb&>Gxq0^5#WE&+QwTo=SDR_N>N%j>r%p$RAv*k2@7)Q6DJ zR0Yelk&th$c>phPB9T5SU<;fo8;{PR;5*Ta2R9PpFRPRCWRN{O%HHWZ*-FLP51;)R z{JOT-hTdh$qE|>dw^sdAc8LsyMCe(Si_rRuS{Ah*+4Y|^WisUMgWp?|f9C+s!(uA~ zKobD!B0BI^;jD+ORi(x$DVbS1}K{hq3-K||AQ_4Nmf zWnz@CZ{QeyDNy#MDL(Y;+iJmWU%o7P2-!h4S3dpd_~YAa6D-H{Rsk)Ubv!$J{BC=% zBFr*&iYM6gSW4y+gK`;$KSob2v45o)IldCyRH{JWMVGT6djkWbT#v?ITZ|>SgVK(S zBN?bn|2!dfqwcnJP5(4(&u!{hY@x|))7aYvd*YV_C~L*a{TOQ@qe6ATjo>|Q7=(a(ye z=mj?WPFEAe`_)G7v{5b$2YjwOuFYQC^H1ZJ<}8su7A(?BLmzNYMkjmQJ7Q42_*xPU zQAvB@g|ml-ln!e;o6;4NXT@i3n~W}dW)y>|o94Kcw12f0Qa2y3QPMI$<8}6UsVHZq zPa(xL5HsO^*zNa7t$1gacxW_4?ftjiT?FJQfu4W}%PX0Zg6he!{(9IIG6Lcj*fz^t9`~DC5vr+QG zizP97Bt`5&onVzq-?F;Fxg^GHWv}%3GF2Ddz`ijt8kgcLI4xF@?75yD7?;^`0!^l8 z)#tWt^fw>q{mqaj22+$jy^ah3^Sr7kUDcx-KQK|lFEVqN+EI0rw7nXUi-yHv+6NK< zEIm^QzO-xY1=Gm~f^*KG8HV;C$rYEY)z|hK|qg}6`>Ef zD0|24#3}})m}nR{r;>$M6c=-D=hhJl1H2AoT}G?KbDmf(O3jKIHV5RY8w5cU>5PAn z_Js?tp2T$hDJaYsEI59I`}jPFu zi&`D@Vk^s2Yl`vN0^?UjU5go%dJoQK>3E@|AKW*;CkiLb@6x^P@qi^#G?6loJ!=54 z)U6lN#^LpyZ5=)Sbk`GLG|>~J1ZC8x{r39k?HwBkLTFr$y(nM zU2C^{uu<+bi!y${*n4dCTK>XSK~AI6s_Uh`!>pAE?gE>2pGCKxUi?d|#~dBK>ZYT@ z!F5VgjaHE$0`NAs0qO<)>jy#z!3eC2U8hkt`Cn5QN(-DR_gut`M+pvuwl}K{VW9{c zdvjLNcHZ*#wt%Z(EX4=M@=}GF=*`4mEJsu!T9Q%=4Al?8y$drx<1Wwc5M!p0@@eC{ zDvg=Pi`P0He6!(CAaCRsg=MO2-x+^j%4S#avKT2rt0r`oyajjP)K(#o!@J8?bRRza z*$1Z_`V*bwVmhxVImVeNu;-Z?bS-@@p(HzuR#TGJbe7e4wCM*B@Rv@7_)ErJy{{5A zhENvlj_(gIzOn+n<|CcV3b`4_qkv0nG%3YxWV$I@amFuL&9$xU>W@`$?h7dq?QPWn z#{F}zPbvp))cQkh=_fp{nwf+@b{%e>oGhx=SD=oJU0ElbNZiR>bwo&V9nSGF->_BI z7Fcsy)t9n5_vAk>7<6g_PR+c3yLT8U|6} zVjstQm+5?%;s@3NsNhJZ*Q`#;9L`DkfWz(0hjcf^K~M?lQyz_KnV;P*vaSeIEIAj- zRENdjGNy}5Rx6s0fFOPFaGDk{!*QalnNdbT+TvwA4yf#++Pt8M&cr%2-6#F(IeS`&3VFp7Vy_=!eFI z>Ib$OYKygFknM37E>ee{qyc5{TuEcf?VNwT;-mv_!CbLo? z?ozO>ABJG6j3tkKbXm8=MJK?0;jyWJle!2VR&ry=(KCsM{QwZ1x&~BY@px69SMv!i>GKg~{>cm%qns>_V+%Hbr%S7B7-AcaMfq21cuKMxB9ezVJGrqKPGPzce~Km2Yb?~-Kz<}Sg&QM_ z0{x2d2oT1|oQF-m3QCOo@huOA+Mll)e~xyXsG9A?(VbBvBjddv6;%$K5FV`LZ!40t z#01JdHeMdx{!ve98tB;6laYlgPyBp)b^PadZow*$v~$25-hj}7LM;(%ccSCNoa@VL zD%}GfuOp*7y&Ji6Sl^v20F&{mlBjK!U#H40<~)DJt)eF*mGs`H)ZJ);#t4PFQ0iS7 zU-*InV{G1g(ET6!Ce^3xz+YstNSSJI-?jK<@!TCHffWM>(yMR!l1cW1-jnu2B9Ex) z41Tl6f z+e&Qx>YuTixMbz}hC}Txc!w)U*SFP|u*$8Man{|}IXN>{c$qxJy~G`c{gPY>5V~$N z^+foTk*E*g=HLE$g%mKGTOY#2>D6&)z6WQ(RQD!ap^X4*jG7VG!*>db;`H|eh;P0^ zphCRJvE_x3CmCze_~NoK&vEaOPiqUkR^lg|Qr1>m2|%A0&H5Fi`6S`?gLywg50O+? zqesiz!F7$?)sr7e9!v+G1=Q0Tj3L`A z^o(^s($8>ZrlB;SEe41AL*>>d9){|uq@nDl-hwEi_}Z=B`FG6@qawcE059+9>~S%Y z@!AWIZzH6bj)yXQ6=7AV;9yW_Jk{`#+h+8>m6T-7RMn4wv5SqXZx&2AlunlYFEqwX z^QO;~lx5ymDjBQr>05p#`zp)89dw16e^lu(_en`BoZLq{XZ`Jd&zWz^m&86Bx{#RQnG}eXT1+8ufTL{ z+v}MhlTT&)#k=#`s-pv#v?0AJoy-}d`YY({RR$D&cC$0bU}Z%Uz=<~zZJ^CtrR$v# z^CmYN1PTD~Ud4Iw(l-aG7j8Nn@tw`O!i@j&0~bN0oY%$tP5wUM-jAC%>ADUa^X_+^gwDeL@oV~QaE;@!j=6&i-^lRsHp6DK9 zAtQSV@=E2z(a>VQx~J==EOfXxTGuQ*_t4pG{ei4nsUpopGLkkCL=s738RO`=Qy42k z6U}w`(4An07=gdzQ{Oa9(Jkh9_qfyOq)&Id&cTF8l!skYnX4AF=~${mw^W9NehFct zkt!kbt+q24^Kx4IXL$VTHWE^frkN>CeYKwSHdFWc2Biw;&eW{eBk1(tzpQ0igh}gR zVTA!_fqa1`*ryD=0(_aX?RB+fIwW#s1H{_wX9u6O5w6J zq^zVumUAb(txVrFf-qSq&Oel5`dM|f`~GTQT?GI&ub+LLN*3C}?iwdG6W!fKO;D+m z*2;NbW|7a~%s>Osk-rFkL?v$>N*$sorxz00J7SEt)&e>*N`7Hi;<5#!Ta6cN+bvR}B z<8tY>u^G}-;pk9}f`@7RWq|=52krOamE+C1Cq2^w(i&ELr>YRfl@4dOzLL?i&RK}P35sij` z8K2Q%6ao>Gus)tU<9Q0nt3!zkHy10wds#;TVy-XW zMz>!8?%F=|`sjcu{0yv*Q<0jRU57F#*86SjsFxzp3BN(ROJY^#bGi&*@EVs?DB?Cnf3#(RK~oAFZ%7 znvFjYd@l>dd%6H=Ql)MB=E2XArW6uW$Pt~hq%racubpr|4lWNHgxdK?*}TTj_?^1f zWy*;F4fJ^9fS8&dej>XI>TdpBa2X*-z_SFjh%t zW#h8@bO6F>742Mb&81Edk>y}ikLkfr#9|258dVOPGzxY-odc;`o8CXVG;PgPu!@;@ zNoQ41*^MBNnBJHoHGS)0EOEZ1=#F`n0SXmS(#T9(B^INkZ(YCv1}DM`&=U_WSpEN< za`knz+7c`}Wm_Gg=47p7QK+Qn!n$6)dFVA)khpG)7_r5WJ_#M-Wdj6C2K#|AcW2xg z?58>l7ncN0u`aZ3LmdL3CSyxCBEFPO8Zi#xgqa~|mV!n;8^~9m47LHjo}ejCDqGv# z2luQ0NxK3@&9LcT`ppX*^1iHF*M(HP)YaoB!?f?9RAwDy6~-1 z2;6JS-{nnH8%bzMq~Yf>8~{LHHb&|{9OCCkpqWIBLaZRTv_XMI9KPE_RYB9gnUk15s_ z8F_ynJYh9FI=R&~C;^{nUSoQyof!V<{=crgPsF{fa+KfZMVQ@j>Q@I8#`@-waCIWuM)Mmh-fk7q2`O&%-6(q%!_Y zI?TjVy7dD$q8iItm2l(k24DHYtob-jFMjq!-1JiLEY-}Os^4%{tM9t7}BfVFz2y*1;xC)8vjqjEQ~F=85$qBkY~RJUhlxO_8#e7E9Bkb`3&i zy{mzW=fFFc`us}gufxBGH=CQDA&V~L)q$B{2Y!t5l=3%M_0D}ZEAL6))ZlN^0tQV_ zXHJ{s4lx?SuTQQ|ZS_hNn;)%UN9%0jLF_bF9r}$HCUL1>nQBl`e_ks@u9PJ>tgjNz<^9TTBI`Q^?NHlMHIL;uEYEAk4k*b)0}x zkj7)5J}5)?G#d(1u>w=r0Vz$IXKk!l@q>Q&F%iNg{McG6qvYC{SOfS{0>=7)ACr$+XcJIbj^9U z+u}*$lZREhAHr3MGfNbc2CIW}qhpf=Hob@MjrFXdhpwv*F8$|kn{!x2&3Bs@6=pqu z0=ud4MbEt1c)FoyA8b`#w6yHID;DF)^GlJnD{wX>0An$+P`p7Xe z9;_?e&CU?7S~>~{8gfbJY1}Bg(S(Xumr`q^VGJ0*oa+92D}e01(vW$;(0=;*o);|L zETd!Bg&X(V(la!Cs1za3eDDUUA+afgS~jeAd@m+8N_~C7Nq1=RQLN2yIhLKL`7Wks zxBgA4>8iMaodF}`>cN{-2e*a_RW@!By*8S}M1$-8>8C<0qfv3oe&?2LXv1Sukwfv+ zB=iBPZ;_?sYgR69V^7uFRtPwWHP>?D*+4ZZuqRWJi}YF2x3m%ABC{NW{h@7`D&xWH z7zO)fjr{N!Pz*PCP zrEpHHefs7(PW~+`$g6Q6(|el;y@{K|w+LeQ~#?RlGT4 zUj?ASa&P4L`7cVw0KyN0ZTY%RQ~>cikVyY`iOQ#>5ZJv2&N4fIdVetn{G4%R%}!^k zCfG%GrgL=sm;cfZAKWC!W4_$v5_s%C=6Th}d^vOY&O+`=_aFi6wK7hnr^Tn7^X$1I zc0oklBRv2T=GFL53uGS^Y5HZ*)qtKajpB(kj{3J4Sg_Ai#~f<^v{i;B>Ol|J9&w2i z7mXl+!~3##EPp@Xut-XB0jEw4f?${GGW+1eD|!SgbP!0%BO^P1{4$uLEqz7$G%E9>#P7`~ zBKacB<#D5%@pGb|RB1+x|4Q+$zswm3kp#e+pjdkm(Rc2 z_3m1kv5D%xymi|rpv=Do~a;G$OkHhWT(l>oGj?*Os>YIlmc>lCBQ zr~`fQ)SCdq^}KVU+`Z-#f^k%($FV9$wmgK<@ew0g_Crh_iLpq7vlBMaWU6jMkNj2BKP=EA2gv7>}ZD)c>Fm-N;EkS%)J_+;5%>2{YYnonO6cJMGhcdooWZzf=f=^uF`U3_=D&sP zMUF6RJw)u)B#sQ>^jyo$rC9@}3!v9ponxc@kj<`{{Sc29)zfClCZZHOM=BHRvtXcZ z+JNGS$9klVeqm0yeLU#=#2MO|KW%^O=T|_nb(BNl0W(};?!SfrBz+I{V9O9xt`KZ= za8}UQnTcTWTh_lmV!mUqjB9H%sKo56MRSSCTSeNkuPL0k+Eshg%;@Rgz4)pH*guw& zA8Yro0bv2NF_5(OPkA?!?hNGOpO$~e%w+%fcZ>ZuH<|sQ-#i2mDy&h1MKaL*16oRJmJ8edlwiPC8QU_x3dI2W0+z3ZVm^~ZzX7t5Lt za|k#^7C3z>0@qLA|C~T9_(&8m22@+Gk=I&uqfE+Z-=l4`_nnkJsNRk`uDLU^Sx?F6 zX}-BdUip2n6)xfs(XzkqF=73kF1B@WxJtoT*lkcnB}*$Hz&J_aWV_IR3WHe14STV+ zp<=xS@A~!k6B^5iP=lQSS5SY>f{#=Ip5APbMG#+fR}-XE!d^7g&w|EO?5|SNdb+*L z`OtH`!2;(kuEJs)Wn@_1+W@w4Aj-?;F+@a>1Sx}TmZYFE&C0?q`2 zUV^SVIK+XdZ{1!lasUggE*fo~`2&c#N;RPK@)HMR;zNU)S(x(Qk236K**Q2^+1Adr z8auY#f-EFqOagM%Q26E)2feg)>LRh=imFN!QO(+%4SN^?lbA z{1Gx=w2|UEwH~uV)3@2AR>U%zzTd>FDFK?Hd+WD#y97Wau*!f1pOZNI&}@gmc1KIr zGy~)?xL6MNUUC1-FaNu`XYUe|(59F+IK{7gC?L*yHy#4kJflyOg76|HRZ`gVV9utO z;`x4ZvScYacattmVELOUUj!!#d<^Qc8~ zIw1grQ2C>=nmF3Yvt84b3hdcTWrF7wv|Tt{iW!@&%~Y2E+GlTJ<&>!NDPd@bT7`)NVirt!&)&XY=0$x(VymUrNG9W` z^lQ6QX#B!0DZ97NtJc&kEB?OrdR^@6x7Gk#+|RoLUz6AOL0Zm8pdT9>!@Z|}jnuEr z{7M~IT5(PWMR$DF_UM?9ekFbx{e}>3cMPFG1#7djJ5-D~!$6U(xv#%~x{YgedmA^Z zBi=@Bjww90gta(Z_|NaJJCV9XQS+c$-Gb$?chI zu8iDcR4?jJ;mgNE?nSV`a-HMQ%#wbJpb0F&rgtE9p6XST6pjwDxAA1gQ$@q-qZ5Oo zzH6qti6^n+-9fE;qrRw>1k`3>zPM>^o|kj03P=VL6ay>3yoenvj1R{U!}GRExG0!5 zwOT6jOTM+_&S3R6DeLGvngZy>P^{F+mwE|VeL2v27NtCXv~Iv597Ndbe?cZIkltzIPgy7l~O?da%91g%bB5L37cb61j~ zoqE<_o`!_e%FKxG$XL_nCe~?TxLeG>sA~_2Tnlv%oc?7bC@{#$&Tdrew_kz%Qq+hz zb~DnhlerZs2lJZ!*km!qeA>Mx+LukUWuOelI>yX5MxQZ(+sv=(Ty?#YSlOuQvryh9 z`c}TskIVFmk8!JWu452L=(t8FZ%dzes*qI@s5mEQa$PDlnMa?tvsFDsV93o}7-_zB z1q>|~@iT$h$=fLr&SbeV$e2h+U9h7Cmr_UG#qUGD*cH(JaUQgMhFQO=oS}m)2{wSxqYV3)*dq z4`-g+wwrW6Obx&~<>syg^$HH-Cw`Ld*v0k$Z=rgf%N|jMwKti5k|FImDkAM79}X(c zYwTXfRsHS{&pmR1u?!c|UI#rS?a)BJ$N@bnAm~t4z}nq3Lj*DcAt_Cd>m7w-y^77? zX=zb2dls)@?mxrZekyWHi_^GP2YiDvh2bpZ)z4f-B{&gTssdY8ZJNYj$BC^PLnLOf{zX`HqCq!&|iz zu7DazuDG8zy3u_DC!@33H5j&wKpb^N+$*?E%e1w%EB>+vpEyrV71{2!<&3m*=1v-D zcs>2l_{1W$?atCQ!3huADK#}X;thfGrS{a3r1;?Y-~%PPj6{SVdGdAAC}5)XMvMAk zps+lZfGW42VpDyZb_{IeSI$DqN1dgb-Q1jX4!hG}`73}gu(G^hYJ7M5LS_FB4VTH% zz9b#p(z@98Z@L&1e*ylAa!GS5QbRi7^YlnSh4tEF$q$Z*7Uv_jhR~6g%FSsYtn&^9 zwXga(&0KUV#g5DjAsZ2D2(E5eepeYoD;sEMnUhacu9V4deBCgNVvQI@dj}bI$8X%t zG`yYN|M_9O6qcssl}-JePd!U}N`{g9=JSuFQ|IzgIFd^eynB4fn^JaYa3VW&&3_I{ z-Elt>HaJ|g^ow?el!n14W~3GF?VW4IvK84c2>|j-6k#}NBST!iQ@^bLWh=!4 zQ5L;$B_%)s0tjQjUOs*w-SG~Tm?ct>G+*#YI(co))yCSE^QV5w$iM_bV=`EUyL$P$ z!I>I^#2q8~vE&(rSVb6w-t9sj!@#B3D7sCIBy>mipO_bXWqv9IZcEXfBQ_PN46C%< zuFGC8_S?5iG&@>tb|5mxp6Hmx^z_N2;Ugc&;t__HZBk)>W%7*Gs#$GrCc@y{fWF@$ zjXHPjR0%b1wJ{O9JcIK-Y&^??2JQ_zK@JyZIy#w9-@ZNPGONPb)whKLdsRFJ7}vJf z7&yidd{$T`7+|dyg~_Q;^@OG@K&mexFbrO-MOy)J_NdKZ7OToD)nRHlgx`qQ5pdd( zh;FAZd{A#%WgK84mZ9$L>s#D}R8KV$h2_hs7!;8<<*b-`P|NN+i`~+V`THtKPCxP; zBBC}yW) zX(E@+6b>{RH3Qi8^9{kLoecCeWbK7~zwS*L!p|K9(~mMMgvU5SpYLNRDZuN)XG@3a zfMZM3=!i=y&9yvsJVDF*OdO(udU&T2;(V6*b#GBJ`ERkoB=jG>$Amd)MHo^q@gne) z-o`MIj=nHD5Nx=IB+1{h+!*M64fb zT2via!piQsjX!58EKr64o`>#-<7s!Fq3Tg*)RgLm-A58EY*De3P}v~^Zl%rF@a4?F zou(^-c0HMFN=x=`1Atk1YyxDL{9V?(cTKbXc=k3B_^3lLy229!z!q5(t*80#?H+K7 z8^FBgx7+_TIE?~c9Q+YtdudxFU>g{C{|=9|&Rp%4+H^^d6khg0n`_2Ogg_;2C!8+6w76ra^7poAXDxHmAETT+;g;)ZhK~n9knz323Rc3=>fMf-!ARr+!!Wg7VJ_ z8Bbg1rc5TxU`iqZrV?gcx;@`5>FDdT--yg9R68*4aSZM>8gYs9=kRW_ZHr0N({DA* z+wK*OB_uA7dDUR}4Xb~%hEHF=2KA-i7Jk&5&%@i&MatAaEFoD5ZdcN|+%K~r1+^*L zD1cO89gv=-#yWl_T=3T*U3Lq1SUwM3?DDI+v;KTe2-s&!n?$|dSV)PYO3hA{?z#P* z-;;JuyYFmwxfa39V!nMxg=E^De7MsTDC82yDsM-Z<>nV6=Uc`fffr4mi<3Sg^lr~&9XUTCHRBU{%*$qP z_PT+Q*_uWpwFQg7VK{%6-Ky*haC+_e2Q1@gU1vm|Q8RL6rP{^uNf~}Y#WYg}EPlUr z`2fCl0o4oqQU(dL6S7l&o-UN%Me8#$sXpgy6F@H_GMF&Z2Z8q4k3NPj`Q+ zQQ4B~R7%drtaj|IXhJ8{lyLi=b^u((z1=y*VK3Z5vsZKW?K_;A^T($=)G-rkL1Qud zqaJ8HW3`!eOoVNCN}`g|L82S@20wNym&_&34y&E|6X=$-~oW+lLl z`V;4-&LMbC#}EiU$JLj9C!VbxEWS07W^>px_D~3+l$q1Dkr0$)qx`%f=v}!sEa7(Q znzyS_%gyd+t^`nHkY_dAUn0Pv?`<{W9d*M%j-x!IW1R8i?rawGC^lH%w#@ICzu zaTSH{L8N(aYZ^6g0p6J~fj<_x4?X{*RuT7FNk_2MtLX++ybXF})~9}Ge6Yw$;rimY zoWmg0sq>Y2cAlk=fhy6FA&XEmkB*+Wm7{N02%<%cuIFP{wF^6Qo~6siQRt zj2%{=QR)NMjj1?~KjB>h@RpWa?UuEYnccQJ%F6IN0VHvf#{iZ?+PzD}E;gFzD9#YF zQi^|;*~uJxmYZ5Pp_J~Ix_Pld!w42bxCAf_Lg)PG*Dfnt}8WqH3@Symnu zyRqMI0lRh&agH|o7DCd}s3~dR{}A0ukaqp`;*ohzN;!nM;SU6CR{9I6oAI#x*+JcI z(;C%qrFO^%>smN`$@{3wA?r}}A)Et%w-Dnry{dpPq&cxmH$%`jg!QIcT&rdOk2y~7 zs$cp3>5{PgyD zqZn`WlAHfzJT1$6IB)w_*{HGcMbqEQEAr}^XS$!KLHk_L%-Ri7Q;V+rF$xN-ei`-i z_B3&HXDr$`_2g6hmP+$ZCfaNP)fj99woP>Gub`GfQJ~+@=9r$?PUxJkhnF|q!t#>q zqO)A>$%6qXoS_D}&ch3EAa2em6?v~A?T=qR=#};}7b?{|4`h|xzpt%h+r^&*b#ZV_ z0*RWcqxiz^zk^=etyN7Ikb@15j3A{CkDBTKK!TvP1gq8Yoi{DcLa6mqW%^TWSo8LV zw^3ZXSr%&dvVg)HmggCzYb6xQYQCIZw+h_f$iebscB+B^5Ska(F*u4_*)sXLQVUQO zim;va2?F&f5#!mp0L#zMx3;laAUS)Ycl?`q(ZE*zi_tTKm0npcUDh?d?{`N->-@8F z-UD&L>Z(f!_wV&r*_#P6=#der@B0m31%M-6aJjGVtG(^n7Q1Z~DbQo{gw;QzGkVj+ z;Li-c6}mGHf&JE2>?0*xc431G`s$gW69NYa>3@!`$-6|0iA(M#C8jN))spi%*NK2q z(qeyxD+P_Ewm!>J!6H8JGlNT~q<$|^^JZl~6dhZuV=S6`Qm`|o;OXsA&N>F|;7MT?`-uERBY8**kRk93w)bo7Fs zIiA=%5=%RU_pV-CNS*|i#}mcOBdJ(v7bZ(Nmv2Yy*i_4x^sSA=qK8I`2N;J!nz))r z$3~-OitdG`#c+q+To6T;)>FQ%SR)Vd=LRA|M)68>?DbWHC)NqJ-I=97Mz*ZcBLX(0 zheIayB|zwVMpy83LP9wnsPrh~%B#q$FH|m-4{B$*v^~l9gEsX~STig!~DaBrx=)jnlPAVjMh7)N%`-3&xj{w zo_cNGu7QkdOIlS>?0l_NUkK0k%vMkAzI3Cv#bC+i%~>e1V)Z_s#;9EF{x~|)3%%tMq3&+ zk}3}GIILo12Q;KOZvwsI4Dj_HZBeUuRzT^onSSb8T20CMT+;5UL}AGsm;M9-Kntw< zHo$7h_3EA~k#Ve}@(@EJJsmyQ{LDW?x&5rj1)#$WS*uuTb%B_)w6wsgQyB-moDD^{ z+4|5bUN-=#-7=GKhZ4nPQ`Q&UxRdHG1-?I03RUw32sTdK!9kNsf6zoMzy1Ts`(`jZ zik{u2or@*E>MMfR)w%q>-&4Xd$4VlA*nUZMUr9;ZXVNgS%P8Bv-V`9702I1Af{j6> zZ7)*wc376%uZ9-t`W=ecjPHx*9+ zV^!`1D%MvA7gugy?M|1}$Z9w)C_$NA@i&)+a$8jKBK)mi0q5TedhVDcu1@AG8%PF} z-nylx|8vFfFVZcnbLT4QH^}Ancu8k3Hlg0AU9ZPuivVD=TBY5xLY~2rub?>x?#8?z zIl8SsyF|S=D16A2xa1{z(*eH$=bux#EeOEq^75a6 zaTyK5i)5&~{QB-f6bZNh{SAU?L?2xP&K)a3>jxK4Anb6rzjBnaj(HNd#@UE&2Et1V zx2N9CUS_8EAB}PvH8mwIM55Sx=(v=Yo{2Y*RIfx1MH)FJGTd@9IZhs(kiSdEkrlL! zWKEYY#qCEXzDog;m_!)r0tqjh_O@k3>%;`bIPE^#=8l;jN^~spS}#?3^_sAJ3tA{&$r3Z5hXs ze7#zq(47`AxW+J^ne1bnpQ)UIN-ei)B>Byegcw~B4CSMLkX0Y<6-v`@{K_&rdIcgt z^!#``_@Wp0zK9EN=H=D$y-57K5t;Ajx7KA|Ny(z|)5FT9-h<2k2~OKNN|i0K4z??X zrrvJB^uXH0T{5L7k8}m>Rc0<{tkx_E>gd2=EtUdOVmh5vg%7~@+b{966n765o9hLa z(OnFt{1+EP@%Wa#vUYTy)^Xr8&*(dTg-EIhAhy-;c@ohS-(=l)STl=@De!1CsFt=4 z_*WXsrG|GG;ILUQapF#QBk9A@i(!`D;a_`~BR*V3J`Af@2!L}|mQQbFCl{X@CbDPi zm;ACvI;WTV$Aov6R?`9!|0@;X^S@C6kki@ziwZ!a=oDT_m5AS5;{W}_>lDGk-z|{6 zkpBOKB;s^l%N5K)o?28gvOvpF*5C8;Kh)WOmlV`DEFxD_eXC=o6GM0b0&_@`RYrRHuyA|)w!8wzAha%p49$t9y*#ZMOsrgM<7-5U+;LK#O z`9R^#rQ&N8931@GfO6OAdKW_q)eQ)3-Tq42y4Lv-tTB51d*u-^F}fyYra)r+ySe~> zuV1qxln4suQVhb>t>Iuld(;e3E7~%2I!)tQFYnk-vUjO!sOdW@w`7y*Af5vYnW_4v za-2y$iTRY|f?Hb^#BD21YD!9OrMl;}@~CFC5~liPSJQPSX)Yyy$HOb#nW9E)8d+>z z4HPxwxZ;Qs&E(U8Ju@eF%oa^aO?}UzQ|UEb_J}Cl*Yuj1(J|JOpck8Q7wN0%@nz=qs;xTY)bv)uZK8Tw?+vDY4KC0$|7wkd|Ck2g~KSC4`xcrs&5B0f;K8|{IHsP=C!;V9B7_+8%eV; zpc9X=ojXH4yYN7)10Ck%s}T!NgJ3+@DOVdl2c%}g%dkwQt`bzqorw7){ne3R6LZ%o z>F?gY|Es<4@M<#q+MOB4E;9ZU8*N4@14xl7UB?j&RX{*WV3gja_e4a+21tO=gMt(Z z5Geseiv=PBX~q}nk0r&?g!OT)ntH+btiFL01l zVe4+-jSsd+Ns&F7Q@C}0Was|_;2WRr@Y0Yby_;&riEj-MXU@FGMr@nl9Q|Y0Mh^3) z_mVtK%na~>?q)fqYiX{$`60}v=viHPJGAY&p4BTgTwQuv+Ml}I>C30JrMf)wc0R7Y zFIhd(B)xac*M>Su==FlZrE`d7U%ZZDJ)Hvan`5I|n^^d*iFjH0tUdXQjEpDO? zw9U-(%2K!g4qBd8oqj-6yywM7H#H;fMBj}T7K~@)N z_4;Q-AB?1=bIwFY=8-)i)<%CkM;-J*W8M;Og*~R z8lA(1YK&9NR-3e2V5yUOC|FE7B9)4b^s&SH;F)V5vh|8yQ`lAK!_tu^7G534FpT;o zt!e8gBmbLJHV>+3_)pHLT=4YtC4cG~+A|pL;1G>xuom?z+uQd6r}o-;xGrLwaC2|= zZjNT_3N~B#!#od8^h<@^oFWy~7k@nk^$kYG#k22c&`#00 z3U*4yf(lt@J5=PBhiyGV3$}74Wb_ps4jPpRzgy_&Pj~vw$(czv8O+Q*1Z{FGghnTq z)}W2OUUkgRF0OjB+b=&+3+TQMu{8E+JS?W^ww9HjQK4BQwKEw3pA2+y-6SI-jzx>k zSr>$}{YDB4RehpTSmIi9YGIHS2~*SsGepQrP@=m3q+hO_eAX>OSQu`+>_WIjLNXE! zM%ur>N;d1f9d6{5k*V3WKO-XWRfUB*eE$m#qNBmj9X-08o=KR>$o4E|rMhA5uUqQa zNz2KGei?|QHeBR|rAj@ueyVFPU$Ha_4Ko?E#TWzGU%4MyZ7*-%;#qfCL~ll@wep4y zNQF7W8Jpxu2WJPLgi0vh%Q1i){@o{!k38I)-SVD59AkMcbjRzBF-F5fhP&SQPefju zn!3qD;sic!=dA>uZw-u%WxnR7>Zr6;*Yrt7vWB-d7u&6bthHcY%C{%N$-*ysdyfh= z#LP61wzaex*PLP82HRgln(Ho6;4r|z-mAHQ#y@KH^BRiH!HuR@(iLo-hmu>^_kh%- zl1NO403cD>Zs-8RDYD)PJgpL2C+;jOL&%ypdJd&;1?s&<1$a{=@ipOqp_and>PjCQg&sI> zLKwyvIf4Fkv`1jtn@EJ!NC@ZH*GBqe1!9E7oXVWH>-B}{whGLq`oo6xliZKm*PR-@ zQ;xW|uvd^UzSY}Fp0gKu?F_aK%W>3G19qx5w6Mn2Zy91lzH#&?=BNxF_3qA`7V_LP zU;m`akQ*D`!ryY)vHK%OrtDQQ!*aFx=R@yGylO7A;&X;D>%#aKuj~YMm7Ec^b6v4c zDkbqN-_LQ~NpWcoKDs7!RMbx-TvO!7x!_d^l5f*8O00QnG(m6dy3?Cm_iUSMOnD=< zZUOjTDpubMO}y#-%Mm^uai65FR_~52l91k5;u}CO<1dyCfiQ&z<03pFdq3X0fMN2f z$&9%{4gGc8vH2w3gu#)SEVnFV_H_6bE6J>x-=U7DOL}p>jCD=gj%&lda`pwZJ9yfN%W1=rL!CQo`; zhEA1{Rx|?SRa!}1qD!F)CmG*2+yIjmRE=iWIM$VZq;op1P;0lRisCm@Q*}E%#Ji5C zujS;)bnNpXyo?zA^HbZXBqRefuyM#CYH2+BPwoWxaV8?n7i zU0QikV!Ad`jIJ4D3?o8tqetHZ+-91i1AANNOrH%iLM*a8@qT9c%}Sqx5w7Pb4z`qO zwf?UQouummIPz4~dIf3vb_8msAo5f8wP$F%{wETV?`K+!iAH@JdQ+a1uMA+~d9Zva zfUfpqy4+{2tgJ^d;ArbEe%P*N?N|>cYgt_Dm<^f@CokXsZ&TgS_+s4cKNflwpn%oQ zZf~q7@$von`JlBNH>AFl@e`VmU>QTs)`u(Ks0Ht?g>gNMP)aon<+RI#_H(GpeaoHIn398`-{Q^$ICb?=IrjpICixNqnn z$xjKH9Sas>6Kf7JOPh|&;68xA2-Cn%TpJwJkU6V+MN{(>h~Wz-Iu(GSf&gwX)^hjX zO0V)I&Yhtb(ae=)0gpENIt-VqkO3m-zV;hC=<()K5S|+bYjLBzZu9iVi55#r3+i8A z6n@o(KWEfck(JO~^ZRAVWB7@VRc7Z^bBmaAsQ%U@b##N{FRCAD17dEricd9C zevPmZcA)_vqm-M;Cm#PxNa|nWidAoy+Fie({#Ts4#nkW-0dVwc9xL2evH#`Vu0^4J z6r{XtZ@e-6XZd}NHo;cH8jRD|$ABX}>u3rG&wp(G6(w+?$TL@u2lflye_5ndViI%0 z<jOo(zo2(--4t*HSS=X|* zP%G8nMj}Nzz>&d8zH5$1l0U@KAnGw-7%7*W8$Fi~6_rQ{=O>HkR{-}5u`~;N@SmeG zB>%LRSD23zf8FpVCca41`w~=b=r!;=iKkXyhu$LWhFGrDJ_2+Bf&lSTWaZ*w5LSBM zA;E+FX9eZOdaE9I53cUuf}jfx>yy$B1H%Iaz)>6j4UDIzW}KE3*Y|6HD&v#2TJgLw zjxx|a5R-jvat^H4qyx+kbTj;rN>MZw`dw1nyLEfgmPNb|Cv?q_TZxSZ=Ri;1*5c#M z_`n4nX7n-8j85NvV%>4(1i)9a5;g{8ub}E+PFF#)x(>z}~GU1foM%NYSW@Pq>NM z1DkVlYLz26_QNBvWD?05VB!2&j8oNHx>)LEp+z9!c^{O=EkL=wIXXNlg^z`Co}6gj z-qPoDDRZCjJfyp+;%WnV@n2Es#YYmvDgbV<|M-Qy3!W@$d&YYEm+`OqSDJ^+Y z#e}l`_27(aq9t%qz{J+Y`BS@>M#Hab_>+wh2ioXfVSyIz4a*jinDEI#)xWV zL$7W^hmqN1TkzE*YXXKKIPGBmqJth_uhLObr~XojtZZUb;hD2)ew`7f=LlB75ok3w zfV6_$pd&_j?WD~U)j2YvDm(~FD_)5<&r&tBl1^mDz?U9W;e9cJpb?IEEMq^2rGWKW zfuxEh7~(VlUg7*e-Pf*3K;=+3*w2g2PGfZ43?(Bcu{g>8w7e_@h<%lBrFwuU?6vrg zcz`U^P{{JE{w`+E-o3el5%qdoAqf;W zPs8_g2i8tzN4*?c{N_d@SaG#b%eX2$Z3qxV>)giDdi{+8=R8F`>jmuVL|Yor|LK?!VrJ6;@sftO~=kM~8lgBNfVr~meDd?$FJN~K76v#DZ-!kd~|yz&$Jblu^?uD z20d7?1Mk=!bud3UMaSM3E;HFs9SCdocU|nw`!L`!5ifTlf{u>KLHcpwOHmd#o$z{{ zB*%SMGe_ix@laXNMoDWa|c3(~u^ErE9KN46mG~izfMF!$Uy- zE^Hk`&-I-2W@w_R{H8gd1NZJ7KLr5pjg|dXt$h`FP-sIC*2bZZVfzVZd(+ms~Hw*$8hgFxp`t?0mS%(F3g;j@xA4e;L0>*FiWRzE>~qZR{KXM;3^X zq6QoM<~kZwT~dzmzcTO@AYl+6#b{wy7^>lZcLvL{nam%83tHaKglYx9Wx}I4f{2$s z)-&&ZZ&NLx9!-exGYoe5LGHgu+MTxtLG`eGg3f<_`1w+JvK0cT|4Wd9!Y{2dtJPq+ z9vvfPPloPVe&3is8Tp$txPWSpC9K%eB}m73Vf$-i^1}5iMM?P=&>$%UvHatYa;am} zUVZmsMtp5FMJ7gT-OL}NzZZ$dfnGar2h;=Pt^RP#1&q4gy~ca~%qMo6@m%pFAfAQ#@xn|zfiP7-cH)4*KWmPW9Zplf=LGKg^FhW^?FM0d2G&Yv~ z;uqWR6?i`-UOXDl64d8fmm0s-7*3zJZ(bcWe4+4tU;5{)|6lhFDBX!W`v$iKbD&x( z1Cswl-eniUfA>}TKUyXFe@kU=#p`Q_yzB4HIU5jrjRi`qC#}VMTArLqU2lH*Xp^(f z^A2bKTpREi_BlvvaA`KJvBbeYycGTJ_KkB0$#afVM=YvGeP1a2b9~{>kt2wUH4_tO z6UK@t?(!D#HC6#?c|&7F`rus9;aB+I(Wd4fllxQmQ`20Z^mW(y+{?Nns8C{+#5#VL zz`Zvnk85n4nVqw_r<-)`pSE1Loew~s%Rs<$`U^69jjFHAaXV7i|5%j}1vg;A%SQ_R z>wT`p-g7A5G(W|(7Ri&%Ip-9+YZf!s3(1TW4{FrK`?-dglp6n&wE6Y(A9V?|-tL^T z@UT<)e$}NCTBeF_@>XwVy4~*c`AZW%&unMn=qt{YxCb<;p9IeQe(UE)rN7Ebd8?k6 zdK#YRDI%{jlC5l2b4t!CJ@$Nhr(>8$su9_-EJV3xKg9hD;!(Eee;`l8cPrkDxO{2% zmH3`t1wtRbc)Y`f{CUAf?b5$?jwuDdL%4g;-uO>R9m}%+sXlgf+5Lc-6iIC`5 z5$WFcz$r_miGpQJ4pOY1XKal9&Dw9jnXebhh6I^2%N(`0Hq7!xq0kIQqP9kUB=a4w za$sCoCAqS4A3Il+QxNx(48YJ^prxQ?CtBOllbfp zsv3UF#8*MTly~dIaK4W+^js6~b)`~Fuc-e(*YsNp=Ed_h@=IA1b4-q?YN@)42dU$u zOR}-w(r2?Hx7(8Z>?l3YB+cbJ=QV8ByS5Iu;>4Skq){RBzr}`|@HTRlmf|6Zckv6# z3u`q&dd2jfV~gb{R> z2!bX4v#%vOS_OnBtqJ4k((}xvY>j|n9Vt%lsjH}*pi0q~`KcJu_K1cgjBL#4mFJa1`Xk-}oJ ze8(Epx||}^pNPZDRoh5ggLEr9YwJ<8DrB3+*ly{+k*v3oqf;~8(ML)bO4npACcCZ% zN~fXV>`JH|-rr9QzV_~q%8N72xW#H?@Jv))oi1lJgMS`VVV^F6n=4kF&cHWmyDYTP z3hDV70pnZ5?YwW@25w(Fa6&cpn3nr;BWao}PqgE#u8N(iuP#u|*y5C^)NPk4(7pE@ zYOhKyna*@c?y^eO&n`KxTTKaka99-8@Zv+ziqMej@Yf^IR?WGzer4GEkCtmD2ziI> zhM$R(*EK?J0CQAYQTh)TGXsTJytaQ*aHD01rl3GF+z*=uuKQf4SiE&m%e z4Q;K>vz*l#4rl+mk_htWWEMN63OP_Q6 zU1$~S9v()-*D=rCBPyL^o%0Qd4Y4-L>gxWpDd)|#nIDR5Yg=%eiQ}65guHGI^_KLE z4E!@Rh9B^%va-XDo|~VMp-8MlF0-lS!PE7wCskNA?Kb%+AiPSVSLt zOqD&_5*uAYZEdZOn&z<9Q<6#YOZpAI;O<72c7vbE4d?#;DC_sB$T&1;CM9bT`_fCRdaZ7tNSErot9=VN9mPCkzx-7X(Cy zxm|Hf%8Q9XxN_@|I%_$*C!FeQLJeiy#mc8X7$TE|LCJ-vglJp{MfXq5rbT}r?a!Pl zmo`@Kx86HCxjHbv0yC2?^X>VngM1yecof@R_r0bNibWeHtve6x{v1 z>eW@d;(eu`_~fMLD@>5_{QaW(Mx4IkZ9EbZR8sZCq~e6jGFi$jZtFEl$he*2;W> zsdRiMQz6r5kap7(`k}#hxMxN1r}?%}XyjI$pop^;Y%`p+Hq!L>B=4{*&Esi1(}6SP zit^b8M1cBmfy57a1++02T8qn~u$lvFu`|&}th=?2tZ<&mDo)3_QTxPVA3RV)8@HWJ z7U?f^=~oG>U+UJ?=VD^m$Q^|2I3CZmM4Mv+&mwf%?MTZWb3c4eweTee`mJ`kH zi_sscDX9q22^vUghT#EF*a3hk{OB%zhoAmNeG_m~5~65z{lFC=pk|BfnmysmO-v6j zpRv@(k5^+jUCx~^A01Tz{%SmiIiyn8LRG89;~3j8)Hhmp`}L-drXv!AK?Paw)HZs4);yb(ZMCIfR6UB0XDse0E(S&KL_R`ca z0F8A4J`luHeeW+n+6tg9PzU-Zvjlu>8SI9FD7TS=Md?MUNxGHJHdpG=v9Z1$L z8w&=YB|S-4qnyDyJxTG$^SXCXA0b;)yChdfj*be3wQQzi*4ee+%ORO;KMQlsnV_h{c)a<#xtdl>!l?Mt4lznOi>6c z_q>$(`D}>}7r_bJ&1Ej}gW#6dQ7O?J@ZpY87q&hnQj>L_RS<~~#3>aI`o^n%D}Wb) zzU1UnIMlvyVPOr|Rq-T}9-nHr@s)QfbUJefxNNO@@Y6MH@hL~mbYwhYX2&Hugwak! z6=M{EOru>NI@Ipv0sH-^lo&wL!0nEZ`~LIy;{EWrf^>JsD^bTzuNH-xOU?~j1xIt2 z$CbA3NdUY1(g49Vd%4xSKpiz+SrKyaob(+Jf|%Y}VcXW+6qP-R5Wh%knIx9MK+F`b zq~<2CA?6E0Zih7OV48tB73I*)r~a6LfB=%5Vsj?<#FkFuSXj7LINRL6OK52FnMI+2 z$MC}x&PG0Ta*3VqwCakoTXjv=H+BZoM2Pe0?4Ut4jhF6k?>s%NrgZ`e3(Z(i4;al% zVDLjrNJza#329Pp9$3MrI$zq&C^@?H#c>Xm-#)5_t_k%C-XmDqb?;GI+E28xHmBP| zqPqOs-(G#~jgw$D(0>larMq2bmtoNvQLetiWQ(4&Z$wjnC{tbD9I>+wwMDuI9mvb! zg!}S7%%QU-C1>2S>b>md8o~bj)Jjb3VlLrygex#D<$$e7&IGG|RsXaYg;7SjjIF$B zO5-im?;zydsL?FVAVTJ$lS-u_FnV|1NK1tz+NK3T(ZeZ?)rI0^Zv$H)@ZaI-nH_EP zHNm{p7oi_4?FNs)cbLcgV1R4yS+)m2tzvm__;6Fzc}nBDa8_umo#xF^$PUPcR7Ve0 zs)EX#FISSM(=(8voXN?Pn~$Dg+8-Vt<6WTfrAbt@gfCwstGm7Qmi&$>= z?(JjN)`G7Q45jNf1;3tl*s!|hWRWs|>9VDhwWP1up3Y7!8+RMQ(+J>?w^84E#H~GcqFkI*QK=S|v1%*KMnc_)ghMg2ITRswl7P zn{}|{6Yy#C7I|VYCO&xImL;v;5!Ve+7(LJ=ub(lZoOyW&eqL%^zg9k7mtwsCt#0hc z!`jbpn5K1ypI>g zii(OGF;ueWXecwzhI?zz@4x@snkdN{8k?|4ND|DSA@8C-{9h9jXlOzq`QP>)%=ABP z&ErA2(!V|Zx%O<5n@9g&AAdd!bF@(WZ#StrzTE%Q4-?P!+sjR#>82)}|9x_IX$t;( z_Wx<7W84z975=|R$$G>b9*=H$+xMEM>_1Nw0$+?f{%=3-;{VT0z3BM=cZQm)wf`%E zhODmtcS8T!A=CfAB$QN)NBn0ScN5gjeSuBr+9qaC?Z1rnVrJto+w!_D5}-`$CMUn} z#EN%;opw)RSQa&vq&>f;mTLGbelL@M^;0wWm&8YYo&E{lpA$~(oWNcFx6T(KNP2F2 zV=6Bhu&D@@V`k~Y>g`OTxnvV$6;j1K=a*(owvKELpjfh$m8fGHDk3{tP;>wKkWCX4cmNx+%TjZ zjD7KDcqfT zCQAMEv8~iXud#50rZ)~Rcp2LGF5<+|F$ zd&(rlrD&lTkWlWg=K4!1^k)WV7Kvh&mtFAE4AX=9X(-<|jjR3ny>J-w@*0J8!#1VH z*p72)Y!BMD7L7R?wtv*I2ztW&bn%-+OQNd@2AIGBCQ`j|y+p1DUfJDVc;7D*--+s? zOK;u>&dg$1&~Hk82ytQ=K9XOYh1=hPV*2Om?x^$t{4qH~RBEYuY=1rHl4?=cewnm2 zPELJ$NGh7sKbB%OG*pb@GeS`?dA8}-&+#^8tSOo8mh>}ULhrfvpl0}ni}kS4U}|o_ zP)3-N8PExcwICrTvWZ*=aco*f7J=R+O%JNgdeuCLABZ#+ld6c`Bm2jbCLC>yM1WEH z+_)Z8{Bik(5rdkl`2$C)5Du_=5b~Lnq%cWRaW5GFV}oIHfSSRj`EIr`LVPyT#_lWN z3#ryqCWWk$QpVSp^#>fG!TFSe60?`+7=ITt;n{dpoN|Sd>0{?e_;)GP9$*+`TAwF< zHeQCTEN}dsv6G(C20*6cJljNkS-IZPaYAn~Wy;@gH;32I?TM!qkZ7xF0ju8JyeisN z#x*T<{zE59a_WSC1$?sfZgyHv_pL2F%Hs)Ybz^Ku=i%;6gTLqtN}|X1d*pH4hC}W^ zupZ~%>6C5G2ciAnIytn=y0%sHN$3Pa-}O*^4n@b+pz3{(%giBuiVi80kn@WUbchlh zV0T(NYv3y1Okw->^}|RE+7A=qtjWfT2JEWMlC^eP^acl0w4|@Ek8`0uwN1|tk4>;1XEqr@RK$aR9w6n(ft@G)f~pH_RRcTnq%`wF{be;+~Tj@XR$V^_!4-do{yGW zzX<+koTcPnbjq*N>fxWxyMwk46?`; zU-xT@yT#BvrIPvzYVPmzAlyE!mh*cuxSRcEKIq+s#(~o4=l{Zs)LofX z;b3vB^32?xrD^Yf{AtaG%*R2nY43ZTB7u%Qmhf8q$1+sx<4gsavDVINX1#sudWKgP z1FYMM;@Pr80WcFcc3@BJOP{ zc42aX0M6+(AIB4a{(SXOERXjNphsuX+^Bcq5C<3+%6-BXo8s=f?(x$2-4ZG~?`z|d zYNo2WRwpuQ0$ynwD&fPIKeB5Be1-RQqV_C4eQY@}xv?F4b^J4ZaTY;!ea`B6Fzfy! z@S04PF|r5875^OVoa-{nSxJ*d%AWPW940(7%)`uK|5&uoHqnFcy-h!%j!Pu7#9KyO z_Yhy29|H^L+?<5^S=#$b3lxY1t$a=>fbk?`RyWTNLOYE1-m@(H^U)s_xM>R{XUm;_4q8^1t-EHrbt|dxq zYi7|n2svt`v$^qPA3I*WQf5_36cUIkOd!~IVAot2X^KTM7ffx{wCcR{jM2D%rr>TC zSE2hEl|=sPiY_Iq`jr zWb}&E#G<1-QpV#V-wUqKdv12vvG@LMcUc*q0lVWWcG%Q3@*Y+SBvCHsoFxIKlV84c z7w9bBPm{Vm7DCn4dGWF@y`*h-R$J%AGoog%zc%cV;RVeB&x9Ddwv$daS99q6tMRHD z)T~QRF8gFJbY6TY9`f0&{0o)~ulJVkHI<)k_|P>N%?V}Ax}S7&sZ*J?-w4QZ7&FDp z#3XHS?n6?>BYzLvA2fxw$EF z^7b~GC@_VuSTuZNkmHxVJLETqtnWqr2fQh6I8A$YIof~O8E~0^8S~bM_mWbq#eP{m z%4pdYv=M1l_@J~vJrgYWU}MbNMQWe1A3m0 z980X(rAf;aRi%!HWVc;VE?%3PINGH79xg3{wlUUP2vDe)`#m6P<1d27$pZ4Ndj99o zQAo?*&=j0x9o4^oE_xh==jqM5WJpsi3yjJ&y=I5H@Hl00E>ekvK;-tGT{rOK!WSG%%PL{c_SP2(mg3E^1)uL-GCS zHXUnvJN8xvI&yTUkS=4z6~-*RPf4EGWG%fV$6Yy51^PYT4nb_njZUIo0++2T|Ggzj#Z{#81EM8g~8goc%SnrM< zq1DtohKDDadP3Gu#-QDvhc~7&CX>=x?RT<@i$NPa*uJ84*Hr*@%3qv*f3G1mZVS$c z#wLt}$+cF5xsNyQ-@TF3A}Zg+DA~F+01KS^kl|t+OGfO1BaSbN=A4g6L{`{tUu$?kh#8t1IBMIi@&aj-uasc zTv3eeJ30r+)Gzgg838Y?m#asRm4}Xtj4lUsfV*C=@cz0s9`I;eYJb%^Y+9{-TZ?x7 zK_GpZ2JGok8~ou=-`HxUimd=k!)E`@EstMMXNerPGw|*ov z3ITZh_5Q!(?5+m6IpXoYjP>OmuBmih8RD$NowBotL2QoiojszxqX2y7NU|bgCxo3O z2In!C0SPfkNyUpI>M193EHibADvs;p;V;=jA!XKQ@vG+$$cWkcjWPB<%2yQ9@=MHe zOrYB~S#AQgY^INSdyXQn9WCuK4t);+?>O7WF1D}rYm;q~u8|1ytxls~hxngN!85hI ztz!f6pz-eV(l@flXLu`F`^cVAS=w+AEqMM7q3u9v{4rwnHcfJypso(QjQgN@L&^O5 zEKMYy!16TOZbE^V&+=z(BWRfkbGB7?f2B$DvJ>iyGY-Q+>wo0*p`jx54_ixAJyv;_SGz5&ax#o!(TNH#$k`ovq*#w8Aw2{iol%aS$RXST}6QWVUiu*0U-{)l&ztREFQ9 zHg+nAyAJ7&(bAh!PGmk!KVPAnDGi8H8Y>%iwRn9LvvRd>U39SXc81GvY)#q-#c*9k z(0Pk|jFv8#MC)q#!qJ>-aC;0i9Rj3lVx!MevD)hnX{f-8;G7%$7ts%UWaQz^ia*Q$%EVZN!{z<>p zH?!WJ4R|J-h6sRLb%Kw~hx!@bwvA494U^$LJh;9t80}iErA3bJgIbd*A-A%R-&3P# zg)d)G1)>wo3V>lnz?_xnK71c^HHzEp3f1uw#5UU$!7qS7cse+u;#)8Ap;Z!KWjTCh zUVmVwe(U5wg**J$a%%`{w2akA_BcN@4ui`#@gfPB-ujBrwXohDAQOUNUF39a$L+7@ zYIz7l_-&RK_^xc)HCTOME8Uib4D4$;IW5|ZIjS`d66L*GO2PTPx?bp0+$zS;oZ&L^s@M?+7 z(i3@|2)^i|MY8mNB5SleZ)oaxIAC&RcjQWKDmk!-6p;n32%b+zB=y}<@?T%2B(aLR zRtId`N!=PQc)kMHUSeWD>C{gf>SH*6dE{kyG+FTGOj2sE#K3co2@q&QrgX*|8xnMp z*qjXm?rwQ9JB8IeXZkK3l2}|^e%7`X@g^c%#A_YEs1IF!#(F( zEI?^EXsOR_<#lE{@|v}9e$V2XmCrxmdeqza8^g>M16;KH4Zu`#_G;Pj<_y_7P&(;q zc@E^Zn@FiPYVJG}gjN}K{)d=)R{q;i1#QlJe8qz#Y;5)*q@N@&VP7;yl(Md{kfvFh zW`uj4D;x%7TMcbSnb;SwM$M7(tScI=B@YJhXiIbi1X;#UCwmK!N&??d_mrJBP2*ch3$Cl2ZnGfW-7#|0|1gWsfcFm8p?Bkp zNGpwKn}rS0?t})XUvpCa$q>l-ap|3%O_v@E! zRrO0&m6RXXKGto~FOKG%i$JpFHM_^Ln2!jH>B`mamP<|Haq{` zlc-9tedQ<{k&3fHnlfm`U**CEq}-TFd6)&S-S_(NL@hmh4TNira1$9$B{%(mUVxqs1weu)lQ&L8P4kXCYb=_<%wdj7sE)bCSf% z7zD#yl&DXR(TMi5SuW;!D`3%(W%j?DYsb-Yr1#jP`_etO{5jEqbtGQ#?pvoiL0MgK zZLe3Ngv`D^^Q(2?mi2S{+l)S+oKjlhcqxHFj}YUHi5xapWJl1DN~_vm&o3H^FAi1E zsV|1@(%RcIWv3X~N=sLo9^2H0?wjw-MO%2@W1WdGsmrC?GM>)wY}VM#e^5{(bF-;g z=syt+C-2@&aGSSi9xDsCJh8p5+ENG;C5WVdW{CFl=w>|bE6I!)MPqgbjh*uq*^DfP z{*!O-wz}hsc<(R~ZQJwyn$e+9zr#zY9{~=YWbSv$oN>R@nAg4~qRJgR**ydx-?R~0 zz$zI5bI^=EZ$r>oy(>qJ<6Gd8H&X_A?eW%4@HA#T>mPZY0`7e*dimf; zHi*sUhK7Q?dh^!DaL&5=3<7;@qmQu~?0xFBrO351P1t1>tSTDI^!3heA*3|`tego@ zU=v_l3)8Ii+jWj70UblQ31$C^i{Ku(?2M8 zX+AH%`_EQCi_hyX8TYV459%6*O7)eX=A5Y=yy6W?LL#!0R-5ZVqgNYO<}6znw$l8W zB=q!*K_WgQAHL;|H-yrw$=(xAr-L=(2P8pPlXwk&%Z>pza}1637Tr;?bYiB)$ZG7c zvG&*sk&NJ!?m{2I{gjGFrK?T&Rx^ug3(}M*Yj%Q&6LG1tUW0(sgKTxU#FCPPfTbJM zx47XE_+$qP*-k1dw?_mBOg>=Wt(q@v=75}G#kaMjWKm>KsIQWx!*8Tx_IiM-|2e1m zGrR}eeQ%geUql|rUarJ8Q!&gpGv;7alRh5(FG8irS96+C zd!TbFKXl&Zt((Z+3RDDqO|&m)9nvhR<>{ajvn^Z*81I?-Ryq3a&)dC zr9V_#rcPsPa&d7%0bywzGFry_25%!h7*gY-S^Vd-TLO?9B6UPoTQTz9^gAIFp;;|1x=MEc>p`_SL zw0DG-eP0BrM4yo6h69b?25aR8ep$Mn)oU|p&y`dr=nT6GUYbqiZC~yoDPJ`W>}P*) z=gT`T8bg>SlMCV&kB69=`p5*j-f%Ohw}cAgrBwTBQK00jQo3~tuTue>OCcQb+<4fRk&x~ z0V^PlTF1xihKX7n{#bdeWpEczmna=@K5XYJd^Vz+cDXBB(&j=u*|i6t_>k`LusvP;XSl8Sx|&Uh4Eo{NUz5 z5773db>*sOVX^+$8PN92$jyxRjNqsRN|16e)Ne0X_r&9_KDfvg6!m^dhJ4s|l>xeP z1PSPBLT4Qt$Bx+dIHcQx`UqHD+E=Hsxgg0P5~ZW}*%iJ~Y!|Kd=xx`vnMR8W!Qvl> za1Qm?n+y!wcYe+UR=jpeO(;NNBkpBlny04!v39yfrGES}Z*LOks7rcOAFVRASv&*n zi++`F_Ki0y5gWe=34OnF`2X<>LGq8jbIw#Bb%Z1l0h)hkAoJC8`BFL)a!_>XAl>t| zYIEjpRqq=Oqv5-Wj!Q~iU1N58@4Ip9r@*y;xQBhqTu*9Qcc~N9GrS?exmpKlHHlfR zG0l`t#Bo>oW72tRI%G!7bn6f7^AD@*D2DCs>Cv1a2T&#&5MiU(Z4F@mKK!D0nA<=t z)kt@=O1F&s<{G7FIjlY?X;AX;}3J zTdgUt&?TQXSIc(miOikbH11LLdtS;NB9HGnZTs8+Bzh^D6Tzc@DBFKLOrBM@lHvyb z54;NDcmJjpf5*9+w-2Ptiz`!8EM;}%73`_+6ZxL^Q{p=7_?M0TO#|E~?^?{&FKMGW zpiTFujlxvzzue%T&T*9!F#oLuVB)r)bt55hkF1LzmW`(^r{Br={GaXZd99hh?QOEg zhoQ7Ob4DO~!taRVPLfb9XBKSMJ4vL@JVch4lBEY)p939wd)xmr_dowV!n4DVuO5^T zEyk#TMY))m?DAn|P}pgJ?^Ve6G|}5wHe_1}lL6&_&y{wI_Bg*2`Ecb{db|~6|-N&2cKf|vH6g_GQN=k&Z z&Yg|^r@Y`^gabxu-QoX0`cv)Y{LYJBrP{{3*{{xa6*T`0Lz19V@F%5y9smbqY~XoOAD*fF z3H#5W4@ne}-ya!faF;M0ez;G_?;3fW(-&5KYdG*iS$ObF%cRpzwypC=l{%P$ooV9#iW+veLdmYJ&d*$0yGBcc0wG(&`#>|5 zSin(DYgcza`{2;-1dWnE7CJ?{WefYG_6mIOD$;~9+X@Wg70lO{m&yC7G0#NF`ev=l z1?>!-q9bNIEl=5=+&u@x&=1c()H;S$GMK&0|L}qRU(Wp;Uzr(8X90OVGt(r3;CFcD zzWcpI5uZ-3q96C*WmaFDf;W*PRoL|;??e=B?FBt#u#+z05d!^6P^b@^eQW3Z6|A}D zNN}7~JngO%p#4b!wk$McW~Lqg>l9EtHaEV!{-uoPnLnuw`^jxVMU#AKyCm>sRYkV0 zfM;|!{yb-7#`1;*y<*0g2-B_B^Sq|4k$?r zMb9cLu3h*p6L3=lfRH~7@9d^GvEr|5>6-NC+BK)!4i%+}k<(b9tzQ8Ut0m`3>QZ_f z7!pnw<;#d?2jIjK_2RJ)Yd$JAu?w+9`~3Mku$g|-u#NNX?M^s&m_|O}1Esd|TL+1y z{6c;F@UPku1VF-a#eK|@LYMQW{qk>TQra!~?Mon<*S3$k@(4CFrlY&`_N zi63g^FbfLUpQ=pj3jID?6E^WFv#BLeT;ciTTy4c?iF#^1*n&+@Vv8Q2F0Jz&7kwB`m0)j8EGO~KBNTd>8|@cd4L>cb15liT8$ zKOnWQD~0(`$eF5Nse8*!ZvrJWw$HY>4D|;mVbvxGdTcvX@3mwB^VqY6b?9jc4$env zsHL7*7cp4xJeB7?*Wp}yIF|5)iIiZ2b-UIO9Iu9?P-E09Y;6vI zxNr6{?-b>=pL8I~dfl|XuCT?5OV{X|jvZ(;;&l=~5xv}?4`(H%57hM{EXbP;g%wiv z*#m(}X)via>-g=52kD-kUgE;mM~3O-Er5H* zA=@9xsTIdk`sqUVvC^F`PVnBI<&J8T1*fO|Om};gKlzqBDE?$B#^_WO{C?)G35U2J z_TYCkpK^BV8?=+tgW-mgaX~3}rgGk(Ea7a1Vt;wgq3t;1kplEE z#@oO$v#aM|hCBrhI?f+fzLvr&)o+_tF6_ep5e{H1dG5_$|Blfib-DyKd8EF*k^i1TdA-b}qY|LnK}MLi$V)h`D| z*2k3Wd`IP>Tk3;pkAVrqFS9ZQZ2Z zJ!?(czZPX=O6MMkFGoO)RP7GbXLwqA*JI{l3jt@C7%BRH9m>Z3w&;hF%gNKh{D@G; zkWa?IRPMw;&CD!gK$XuDcHCoq*4J%W^rPhC1kAyI%m-Xn3>kgXw`3}d-_ja7F(L4z z*x{QrdcVt{rNFxVS+{kSj-I}{krHd2=0od_oz=+HX<8z5-Bik#`Y%*RsX^#s%l(rE zDwE!5Ks{X6*AI0U{KuMGnv( z=m@z%pGtVd6-ahl1vn&zRXnu+RMbs`^_mjD%S9a+X7w|AVy?>nj*y?kLz7P40$LWN(8u6F=xUeV!7RIquxu`+4 z@)bi5yFLpcvb2p@3*Dtlub_4S%VPXDV$P7;nB>Cbm%c*rV{z<<4{4vxq9E&_-oZp9 zzhp4_xK@KC7WjQfU?cT%?X)9^McqSyTShpW`cieS0Nb5ED_a#zSO>z%oAj&4Cr^z*P;&K~3aS8_1>u!d zdSydJzM!1Pi_a%!-FK#nu=y|hCPjHrs%d9AJ)UW37EJNmNd3Bs%|E3le?Lv|1D-es ztSKM?NZ~SkRQ$lEo!#Fl9YGu6=>x}M5|Bwm(IRuim8DRl z1%EBWzs)DqXC<#kI0&3{OOdvOF@M(Ll24(iotn|k$?QuwMf)+&-m^igVCuzZKH3%- z{X_DVJC+Jjk!bT)%0TBS(fOO1aNsdYxCpTMp{Ey6AUjvRD_FRY;g^+nzIU~RgX8xn zGGhtMM#*5Xdlh(ilXjdDXKfg)%TKD7D@}HsN=a4eVaQKg zUuXV!*7+rR_D9vP_Hjp(mKt0~Ul8gR)-88@RAeY;RA>8DSH7*-rLL_L7_9Iqdw-InC0=Xebg~M?yo#L!1s23F6eO2hpGc-2)CndF zGDh8nNujdO<;v4^WSC+R;C9nc_jHg{*g7r%uVYm$7lmKEyO1z{Z#+ZfP~(tX*=4xa&n*cx(~l zB9l%Ob;o?lOY`yXd=_6t~!5HJr?7cAiJ+q)XH~3?wMv#6!n3cgcecVKT*+@qM~ZYKG7a!? zZ$tUP3_ULOR`p?-ox#6W!hZ>VOvCV5JZDXUnDag=e|Ckybv&?S0474$4meg=-g`x(n*)~w+=x}5 z$mgdB6Yavqe6l1{eEVG>=g%K_f{%B9q+YrjMN5R5uZ^mGB}qdH$MdMICUW=)@(;}W zj!i$rHmW~T+G4mS!Cy}kUbQcaC$RVbFles0chn9$m>D<5FmB&?Z{osQ>4eD}cqdtP zEj6Z4&`09pa@A{U=Kj%pANkWi?exlXm-dzq5uZ7=XX+6L>MQ0%4vbNNS2FPG+;kLg zkC!46siarrU8sdV5RWr+UF=X$2)R&?e+X$`Em9bJ^uuUDsqhFC4-UG)#@1pY7NY73 z)+B7DJC(e9`|JHXs-e01BUFHvJ-=(y<|FeKm@TQg2%&3Zyv3orp=-lO&i)ZweMsAd zSey8vQX$|*6uEd|TV*)&KhV;bx~I5zs0 zF9u{~D9c*d%a3ll)*h_;M0Qbh$O@o?+yLr8kj^y(F_A{r;71h5*9aN!fsU9sT**2CckuDvD!M%zNRnJ zygAdC>Icl-S{}vA6ec6PV)2P@Z>j=uC19>YW_1(#5S#3C>vp zoG_d;e42{EJ&#O%b#N%qE$eksjGh`{rlGZ*?9-0E!ycvMv|n#PB~cIJOP~UY?scsS zz~Ig+_Kz7y;zR0*`kUY^?dl?iR2M5KXt$mE#+p|8!dM{AHdN)9yCD3QKpf#llUe^+ zcQ(OWyWHVf65GXZz53e521HmRR{8-qw^Y91M#I*+3Ttmxu3_eFm>g3{o1$iTAg6JT zh0yA+Ge{fOHHj!y+@V9|Xai&DZSbD8z)Y56g=6&#GxIPKQFRJtEQdO3w5&IRkIe{A8%bM@eN1S*&Fla^Q(=(7}oymN?wu$rE;o zoDg9tjIi(P_wG_dnNV0o&@Dc`i;8B}p%ubyVELeUKjjT4dzZOBYA}Zoj!lKEjDc3s z1)MdTutMvbbaU){)Dx6Nsr|OSlF}caOHY!Q3c61k{UuzEj=bgd^#SKJv{=>H;V80F zq-)2`n-4~zOWDaqNmZhFq8)T8ask1Tx|<39eCYj7iiVUB_xTyj^e~4$_?l>VWYW*OsfK6=kHX`Fe)C1Tc??BP#y(u&k(Q0lZ+C zm}8fzi|=mKkSAANPpOoBVoziZ<~y)P34?J00MU zqT$KQ#D!Me^@JPqWrRgW^SrV!CaINEvK6@YK;e3Key9+Pt-Hyvru}st+;cvLo!n>1 z6uK9BA2&=1>BZK5PA&wq7Rm;8l~Rp%_9$;vLk$NbEqHbK+yiNrwUi2r08I7#+59Uc z#9ELyvWu}YioFppva)ttg2H(D1Eu(A^M7!~hb{&@P~-ewR@Ue2>b^wT7F5ZiJaxA9 z90DvfT6yWXKeGKfEp&|r4P7HG0PW=KhZ)cj7V*yZ#~k3r8WeN0RN0=7WMx~=$9ed{ zKz*$#B#U!7f~htB{p9C-lhlKIIs;IpqvWfRqR>ZgN>|FBhJo97TR~AOk z%L+8P>#OHR#-5~&bf5&2p3~i(VmLT*HUI`Ux7&N1-S4P^_x7w|crQ6b`^mNr!z>1b zj?#q_`Trc{8BCxqnk#X;sULSt)RbQHPgC(Vo17dU3>OaacC6*PGw!~2iLBN(GgEgL zrqVF?r4Ec_fH?-)ecP~;<#AdnGY}(FZtG5yU!`*X^6E81;ZJg<7z@UnoWOLU&DU2> zp!EJa&>Yu5%q{{uhdTEiCas=cdZC@&i_M1$S-G;EzeM31ndr+Rw)y|uxeq4CY>E61FE$1ijBJ-?fTTCDj9ekHNK zm!#B$XZ(vd_+MPLsbn5aHn?tKUvPVsw1%X2ydz4ZOnBF8uIc_-T&%6=Ym0hX($8hm z8&Xh-Ea3dPhX*1_4^tn4+C!MtEf^HUrhbvG6-d0K?)-C0{2TBB88ZT+QN zI|{eb)Xnbxy_fXt!$p1uSG2=VbhluU6v>)>VSxmDAH_B3s#@3P3#VI09gCejBLynq zu9(c$#MAQgilg>RLIpDu>f`Fw7=Z2LEf~gC+47+LgjfctRu3^*r^07TC3w)ZxehuG zpIm7xg=pCOpD#ixILqfm0wb=iP@TT}IYDn4vNc2wSBo`JZW~TrD=}VpP{&WWTTn^))4 zA{&CJbiVrA?2+|u5Ho*0T`##CmLc4(e*^B02on5!aU!>Wx6NetT*H>|=;Q@eiTP*> z&_d?nJ(o~BJ)O*BuC}@SwSSC2Mn9me1?B#(xlW(g6JnWP=T8uTLJz1sO6YHr=!=@D zcH_e3Bw#sJvu|{X-sG)JuLW;+3OL!gpx$&pi6*9qyfIu0UK7;xe(r|%{x7oX=BdBt7#RwnF_W0W&b zf{)54iT6%MdjdB8xIMTD;9k3_t809GdfG7#dG2o%o!=cRe_^x_*x=$EDF{25XN4*x zEcdFqIrCbY4FB{&qLnpT1_j3VV*7U4yE!uhp~F&;Dg*9dS3Yl$Utz-9jra+f$I$@g zUZ^7wbwNaCI5){aNIK0XV?=m8cOzU36rPJ9M{HQkH5JtxFh%Nd1i(kjFI5zXG$(6s zAYaMuNOy}|#-~`zL!*+EFsovS(k-6^kiOE@_Vg(W z7iXv9F(<7bultrq&hOs=3!-xASOF-8B6>t->Hurv&g0Pmq~f`mOo{hMKh??f>VdtS z`h9gdnM?Q&>43&M7o+U-n*e{ads$v5Xr;7tgsy$P3Pj%$@Y(Zb@r&K4vmgHm8`U{* z=jzN*Oq7m}9nM|ljcv`jFK)SI@nnl-?(q>2C6tIKkOWUb-I!%_h0=+`Vh;k_w-Yo7 zTlZ-pw5lUC-lEa^x2@B)QIXF+OYO@_wI3MOiQHtmG`-8!1ZE9CkP>*VZE2Q=*2KQ>y}+YE$Ja7m|P zb~F}Hz;`+rpMi26Q`^?O7Jjz1mlKr@t1ev9!0SL$r!oR8{I6%Fj%Y~LMk*rw8Z7C@ z>Ft-U+gr!q=@ea1AGplZO8DaW%(5t4KWAk6w|~%yzb+Rg)Cz67y&VLh!(I z_QnCeLX+pDB`};yZrv@nk|uT~VP7C3oivJk+amI*5agc~^Ad&37WzCcV4B=iw5Hi6 zv)YlzV`~n!*XH3)*SA0ph*5beh4Mw#=?#St`fRis$KCi#2S=y-GzLG>^EU`8vn6x2 z8N5E5<4S8@?xLOO-qBFU;JxmC4oD3;O1%87*0)3R;UzK#3yTOO8g6V9)5L1~ad1*V z+Fqd_De0Ti{aB+6dE?A(;{^^at)f}N2ESE?DdlXvMmmWp;ZE-*x5Z!Htr`1a`!m@> zTD5mH9-h(rUEsU8c|I|A0c zj|B^2FXK1`2fk~4S>jq2lGFoY_Rf80VGx^;YH*nk?pnOM>{@E6@b|Hw*1!+H;=Nns zqsb1$d{e{%=bP(&=uANMt8$)Z2tFxR14VK6t|=cHD@D@wpz}JK+`c&=XIOwpG#oj+ z_9NFvog$)N4lQpd!pf^-iKzM9^mB1Zw4%4A(Gvf(A5Rncan%iW@21QPZdW88A3fr+ zr^CBZp(wdxLz?S>fm42N((w@@^}om_c*#L`vOoj?Vrzs1-Fzz4$f#2t-|lX5F;cAH(*>Ve&!^CNj1$Y~+$$>rhP4y^bRY&PNmAiJ+E|v>5 zohkZh+t|A6a>shDCZDb6d}49@1s598Lx!6G#s;jNz!=%Kc63V1nj%sQB!2q=Q5k9- zY+@n)M4s1jq<~%0a9#c9xm0@q9HB5Q3>1ZJWQra;g<;2hFEI*OlFMvz-Ik0u9pcSt z_j~pRYh|Y`O!i0uBW++r{F5c*b14aZ%So=<)6g|^Q0b7Foii2qjurY`Lbepz*`N*zh;Tp zGKq+JbCk>6TA$pX+wSnpjo|09ha?1aXZ5zuY5Njkjw|q*dg`z#b|E}@ziho@l>t7` zDU#`F_UhkSfDT2?8Jd^ZskdPkGVZvdrPq(@+ayc40-!cG?!y!ksE#wZSu{=&r)}fR zyaW%*Q2lea??jR7L>r~iV)oj*2WywxFP*SVP5dt2XNG^`E59EDxjIHK+?h1MAyc>N ziJNQjGF12{$yT2;5mEN~d~+taE-=0Mc_s>HG(}+c8lwrWpT;|ZPRC=zf70)-u!h8$ z2a(usJ;|=aQ(Ij)iays+@+DTiqEJ5nbJjZDESaOLcQu(;sE6^puiNMml|ps$*#^U&TbhsX77HO4uRS zwJ3*w>(3l(CYR^s+uoMAdPL}eq&8&JmT0j64IaOB$YI!CpcAI`+`d$JH@2jAfX6@7 zd_8BIu_%|7U9ui;x?EQ-@l5>W2~9D2|M$vIFh+QRL5k1yu)%x*js&p}P(sj#I{#F1#%Ui;-K{mm+sc7DX}f z+Xx%=LfI*cp=^YkM;3>XJ0x9wlWk2MFJN-noLmZfF6>hraP@G$I025^4)>$t+f*>Yv~6JM9oXwyEqxJDo5V zd753F@_3%cE-8cmboHGW$iTqIn-=@2%$%xTZPRrgd)}DUmk4V-+LaO zLdd{Qz1)Ru1B$Sj@@Zl8-$mmwBKOxon$%bhqlW9!p8r~)Zz+&BFyOTecQN=0SoQ+$ zU^2yGo%w&Nh{751KJ+A<5)$gYf@VW%cBkuq9n)|gj3a0(wx*m^Y$xE7 ztMdOL?=8dH>bAB~C=?15r??a^?rx>UwNQ#X6u00m#ogVD7m5?y-9mxlt^tC(hLiT$ z``!DT_x$~See2>%az$8kj&;wm#vF2wcwTxG9n-fjt_Al|@O67>8ae|*@ae_$PNyb+yGy)3{!x|33iQ7u#HF*QT6h_5>LtSOCAeo{mDkaLJ7F3n zLGiNDY5QqydJFLbIs&J0j3PCy2z+aQ)UfF*qMpox3Q~_t`hcq7gAxAkX0(PJ88zl( z-8mb*VArXcNjVcAGO~P7FbAi0qKv$JKRKDKL=eOFO~@;GJgh>5*rhkGE=qC=8pzxn z=UQMq(rS(J90_WInP1=r%?5z((z$9fGN z8wdHfE%^NjBfg|*Tp}Vjy7q1b_*3;ha+^y%KfF9H&v>WF?5v_23yhp31AcFNDh zKPiY~%m`gA)i<6Zs-V7p>(?{j1loDgAaDo8YJ#{NFS572zCo=$q{~b6`BGp%jg=q6 z@m_-|`~7!XyZOAA)!HC%{U(=II(yrQ4BoJQmj#ukN=otU&4;#mL914~mqIiH*$5Q~ zyYYAk>xDp%AkN>bPrn879OhZR|5;$Txf>J?lTCrC()SrV+R9o>wA=KB3F)t1lT=_G zWbkL4=?4xH|IH3K-?&gGs!EC8v{o|1r`M0;rg{C6Z$|mJxc+`m*^MWv&IcFosfK$B z!Qj4t;EluLs{lHQ_+~~l;FVysj1ox9uBt+Y!rHj0jdL)F+i0!%~!J3G<_@tn7ufoW5T@TaaA z-VQ`BjJP@q3N_owy0Pp_?Jr-+7)iJYmuUytE`PfNJP z8LL6`O5x^U*QGl^LNd=wq?Wi*QB>!jnG0I5i3NLd zrB=}EuW1r--n=7Q-FUth_{7CA{fnb@3;}t!or1exHJ$MKJ%nt&y9y#!fg&4DIu{3cvM|%J^~8n-0Dxf zUFro;a<(sBaoaK-g+$uBUe%Q(HS&lLoDS8+CRTn5D0^PucKx^!_XE!|tNJuHz{7VC z1VJZHxjCYbQjZzh{3a8X$rYnP5i6+Av@}rUG>e7Ft=866OzlfMM#+M8d>z#!CXIDY z80u>JC14T)I1)S%L?9zSmx)2zD`e?A#HSW;jXmmPmVbo@xbcWRPp=Kw#r8Z7ZlU{- zInU!>q4GCTgF>{yRxO&YB69c@j{E&-J&y{{)kmwr;el_ot_uDWE0JD>uNMqyI7h;Y z*rS6{zS!8q?-jQq;Mhu0eV2A;1-?I-&0o}6i6fB>`np{eFRL;=9a{%nc$t>p5tHht zD_DqouhPCMv$ZHu`=Y2oi^8EEmg)*XX2*m@{&{X@xSWdXhYU-b z@tzz)akUS`91U-vHNaxigvUg^>1kC0n@3xJ0_iPZIg)4zi9u|NTp91I=u#O3q=MkS zHe)I#Hx*HquP~2W7B4-P?!zg+c4^sNr%qBNyOh%$r3K%~5HO+H-zCp$0vy<9| zuyhfiQ=lrE)9Gmt^&HNR(vHB9qt5MtqXOnP$18mSDHAGjSn_~XaP{n?ZBlM_31F9* z;Gaqwp2mE|xGDvhU*7^JyGg+gSV}AI{}zA@um}+5RH(@Nk*eBCboj!*^pmi!=Ua z)n3d+?-L=evK(np2c-$>J+x$ZK4h&DDD@WQwUkul&$@`d(m1q1yNJqe2Nib_1ZMqu z&Sga`?DTkGdnX6%Rl0Yi(-4Rou3b$GN>_!Ed*WFgBn*O1+Ne?=jR_78T>Cl0W%CQd z>mZ)JBs!G~tK3A9?W3i*bCAzO3!~xWit%Rrn1s<7mn4{Hdwc%eUX)37SP7VS(@1D2*Qr;yOa%w_ zFCXTha`G0dkx~o5Rza4h7q+E3bq$dR4KR69xG6kw9$Fb<=85w;JR*u-pd+DDoozSC z)c6mOr`R*7CiOjAbu13;@@t5rW?!G5Plt1)R~MOMPpfi#fFozc-#k)(zTM10x=#KQ z+;Ky(ex@+tv3bG2XHoXOpeTYd@TJ$at|RUkAv1$1%^V;PaClVRzw~&)?6oAI+u|40 zoc`3dYEtk+!tWg!OqqU_d+X{jd@2euD(YPU1l(1HhAdNYKH<|9qpNv4bPTrCzI77g zgT~p5K!w4~kHi$YsmiqizZM3jB~5zi^cT;)ax54qdduzB%S2iQj{1yk>ezN7+WkoI z)sa%Uz;Yc9#vJ(IL65yMCXdCJ$U-^+5}VVpC28~@Q!$hoY3N^^&VCXoUR}hE@2_xP z{}k3w^b%S&iqx=|Z;>u0WZGW2kQ;`T$r#+QY@y7BI%8Kp(HxQ+SR@M}AhyJ}VTWio1>QEEid%@cdcqbfYLB;ii}$WiidOEdm%Q z;x2?_%m|KYziktZy4I|qXU1qITe>qh?7S7GQvH}LnU!&bJ_oyF3-b{au-tw^E?^0{ zW%K=(Hmx3_D;)#K;ca=5ZsYu6QN=tzx|-gIPxJy(H}e7)Y=ta^=<>FpQnShgg}gJftbK7*a*EU@oH&VNSQ|D}p^-JP?Unqj@^?gNbCr&OTGDr_70$8V@PFBCRGhG47 z-yMi4ZzhDMoDGMj0EX9;H_F*o*ay}Zt9+l^+ZH$BO&G0bmwN|ertFt;T#@;5*4gY= zU2fm#J73wFb0N3AUnUmK6cg*K13PU1=o4Nw{opk7Zp1I2b8uHo2R@ivcv5$@MI9 zG!ADx;C85|A+CDruQ?#Z+C1SxmP81TN}P6T(U6jDR{PQ3Je<9-yyzGT&hOCF>g=Cj z^^Mm_^-E4b@nvDIe`)v1nGf*@%V=El1GEs`^5<5wkB|fWZUtI1qrm)`)`;X_73F*a z%r>Uv`SJ<;a;U^qy?QQtLi+rCkRoTc4TOP=rP3o!5GvZ4!Xg^_g8COQSz~}3i@K?- z1*un(y2>0bniLNfDC{Jy1>bgdG#po$a-Ui5htTb&7GfuoDz6%sE+TzVo>T2~<}EW5 zLhERIHRp3uXZ?v_?spwQjprAIQz8^Mazj5Y)JRkXnp_uBbLW%Io#%QCX11Z7C??LZ zTp(-07aN0Ir9}Z(V-36ul?nY>F*RwOXGb(5Fdks4%(X&_q?vZcW=(W&pCr?w?QL*Y z6aQ4jpB1vtMrKD(MAvNU&ZlP^M@SIPB1X=8fAiJ(TktWypHK!=WjJ3lcq}3o+(d%E z;pKoSBX|@Mq_|z7z#M#+hIYZ8_T=WS`}K`;``K~a z70m4eNKQ6k$cnz|>tDava0fq8Li%!iICo$8v1NxHI(tGsVrr!CUAO6BL~*E7aej6{ z5><-^ra`;fAv=v66KBYCfZV%x*^t?-%F<)M4h9a4r9q{^B)nLTfe4ce4k5o_i45tq z+?LRgUDgCH6LyKBxYPwHEf@3C$#m>tQ}DJS*UqNZyMp>+Cq^BSE-gjL_H3Bd^m>wL zOv$>SqS7Ak(iGU4T3n1VWqe3zk|3)Hz@gapYippq4f_(fpycR@&j8f7k`IkWJ=wb0 zKzP1M0{E`6OGoSW0gRU~uV0w4r?U|5p`Png%PNGE%qTX)wy9Cp-p$z7AMp1rhcy>R z-=TYwirl`qgUC3kgsvLcc|HhIN@%~*H<}IOVM)g}FDK$cQ&H)%KspKKZgO_#B^scX z54jQ&nHW>uBHU1l+`YC@D8>KqT7S~ zBVam@bE~rR^mg_0ovR9CKa)M!bB^T^dO9GUi|SFK?JJaOs?)7A5kf{O)u4oJGV*fS z{ZYT;;@Bi`bxsu|d{&~HWCy=E|JZF%ipjh%sf)0%K(m`QfTEL2#Q9vub1YRUVwYu< z2VoP|cSYjEqpLB#qPRPUtZm1->;$S0nape&IPEMmSFEB5lsq!XkqioIoD!yW4n#Ah z8ux$f&1prTKFQtAX;fG7zTPjy^Ub!#>>Rh{f%5)7@kzV7u-nG-Ldg}lxpD5iG?{h5 zte+tE5tz%lvqWX4YqPX;r<-T9(%CZ7Ei_ir>Mp4`9a>Kuxc8_Of!@lJ`9MnD<22;u z_~|K=KZ81A=M~)mb5QUTSfS6u`+6JF{I*vzv^T=mT{@OQ0C@6g4!-Zb*#Wrv_{P9V z-Gn#>Do|)(q`U=YP->_)oOILta>c@X=?7LQD7-ae9eO1q+}_FT?hRi;yurg}sL*@x z6HT|^c{|<~T({R}tQujr4zARkW z^SMtR?73O}X0N4A5A89=&_y*3_8p!z%)!tBS!N>9)BCe>0w-A&f+G>^zJ9m5Bfqs0 z?rKoxjikwgHfuOaI5QL$T1Oa+e1~>chEJv7UlJNYe^YIa<9QgNP*P}bfbEz*vDM#f z%coami`vq5v7o`xzZ51TPv?2XSurZVXM5&m5H2Izg|*K{xxp;L|HGr0zP5e!z;oRbj<{`H1o>MPhY8H zpsn#zV*ssfGkOyqcu|5Q+i5&qLr%G)0*R zMfI7MuK=D8uWR}SC5<@W@3wtl4jnDCb-NA?m$GJTCgOdL=5wPzGRa76MJvIz!LOz< zi=TJ)H%ldWjbCAgi2*iEK0YokACym62%AiiRr)}X%z|(NZ^A8GcRn0OwtsCzAfiN( zhE8ZaJsf43-!h6uSff48Pg)>vOMQgWml4ph->3bSF?{*b72~(-Yg1_?wCkt^Q{`FHISgba8%_4axcCpBJrGza2*)PVL{|6* z`7_pLe#S!1k{S9bhQ%;Z4TiB?y=jU_c>MB#O73=V3eDZ) z;#YIIQ?2hrw6%JIG2*V-=l5(bt-b?SxQYQ}og2mGEzSGOOj)VMf7S>gT z#Y>8&&iDd=a0w!KVdoi<;Ul)Skr+w}4i}q6Z`|0vm0@$vDJ_qKZ04iN{O?6C8yNyB zl3s5r(4D&0cugx7Fe;0B$SqXU2jE6_4Cb2YNqKxmvon@a%$2MiMs&BBccSksCwhf5 zdfhg3{C$)mMyt0`?CM2wLj$xD7B<+WE5e%8Qmzw7?)$_>q)L_vTppN4;dAn}Vl~gX zQdZhuQtpe(%8<7*MO@Ewo>p8I7+4pq*)t<&YVio-alN<+W!(Y5r8rI=D1Wv=vLC%z zZoW!~HjqYlZnJsG-@;Tjlls~~u(EG}Uo+fE;_{s_xurE*!LN>la@Jdd)OxbQAAjbL zQMb9tLDCIb?xwDKbl9Za%`aK_)e$y*7_95PQJ$q{AfAcLP8*k)5&g3<2g#g~AyHlM z@y~sPbrW+PShxK2@p)d=rBYQZ+W_AK`O$4Kl@!ac|2%40C$j2<*!)#yXK3tQQ5QiUDF$9`(xQXNIS0Pss zDA3`Cbck1q^4TVPJp^v;Z?RF3^RY$03rsJ}BGtZ8-#k@xeP}JUKcr%SY1?kN+dZpF zG(EW`t?}+&_1&*a9Fh`=S$w%PRmiafu$o*tlQlH2z0#lLTkfXF=;JFiUnNY~7ls(M zWr_#Uq;QeUMT)#)MftAw+%3z?da*MDW(Z|>?5GgUVPUV+dO{0met!Gf;8h)I?QI0Y~d_bfrq+*-oeuVOpS1Tsr4iODl! z?EIP!tSl6>B)x-BtPfyP@Y+Lf(n%rCSb+X3^$IV91FUd(c#)I7=(rgy+QcO4O z6X4CC>_)5x`SF%kBr>U^OS{G|{}_0k?25J+s`u)bu2YM=tNDOw7xE9@+QgIbaIRBa zhxKargWg)7xxyOL;Bbf28GfIX_ab0rD@nEai5gnV;SXOGag&mKPKrcy+mi$erqoWM z8d4SQNgc~+_R9+ynAHh|a-mLu`<4}q?;lWKeuMl}Rsy{;8_d1i?}YYlem`;a7{;mn zZY(47jw;`em>#n-roF9ZhZQPlDsg3~LPr@A26Y84dvn4Go z9CN;lyS4Lcx9U{s*`Jb!HvVFWNI`U|3yb1!n0+u=UHQusV_&k(W0`z%Q+{NkT-3i9%thl;!ZG4 z2@Qv-I+fX6O&_vM188)oan2Us@}&eruE-sUH#1joQxMhWJqWidaiI5kGZtcRzEpT= z;2E;kndZNrG%CQ+ucUqt2w>Rmf-sw}lw%s}Jw3_3u7V##cs%E4>-GP4F2I7DfbXit z?PXgq4H9r=wL1IiWVySSWzrj(g*B1=%|xdY41N@V;#X#6#<1jv-J$q5Miw<+xC6bb z{ECWC93YU!i)dVBO12SB2Zc5z;!%oqU?WxYc^xH4V~*{11)}BcHqJQpy%u3EG_+DH z_ifoG=IulJ?;6Vsf;+pTD{q$_hHc3r4kqh7iRM-?oW1?yo136V8^X}CHl*IJxa_+3 z*?X|$rQ+dDNhbLDTTtN)DS2ZE0q4D+l0c)GoB?DIyo&DM==SX@mTqYThxPsg>PI2J zmeNNElKwMWMgz5-9Zt9hpigkgqGGRb_ZQ)dUzhx~j)#TC?xkY$;-kkH#ZS-&EPR|u zlkm|9>KxXC@|M^D-e@IfJ1UgALz*dZTPSZXHPkUnEBkyarKTSB81q5;B< z&brG$f(}8;rL3`umJ={5To)L9!dz=JODhpaYVKq?vd$-IhQy5U;?Ra_D&fpkXwTNF zsL{%p7GbciJ?u9PjM{K;*r$ot^wv%;su$0knv;#h?aoNpmP{J`fIhQ(uXEQT zKc88*{%zzjJUj5w~x}|!e^)NkAkNF4fuSN4~lJl>LtWUZ!pAnrCuk~ zJGH7WPDoCa(pBrj?yqQX*W;!Tl~HW<+KxtCi~lJA-6%G9y8I}w~ggb>^pB(Xz=e1=wYe0#!5q9UDaQFEPiv-Vj)l; z+Iv)>@a7@bgjrfa`S@bvp!9p&cX;z(CY%{hFD3fo<5T60o%^aClSGAM=om58apLQO zY?k65oVmgKzvvcZaucO%T~3=fdZ+b91AH1xDrv~m)g@Fi-keUVG-scuV1b=X>0b6* zO2DsPqq-&|v-ybK-lO|KVeV7HL?6<-aBP1}=_9-AnTO7;%mlDX)_yM4(6ncqUg(R0 zW5u%Vi3utg39I(IH7#;a3?rh{yFnI2!-of*p5+8gOzZQbWx(}5G=7FUV|!gtQ-_&8 zjx1eK+>DB4rd8l~UCs}V;CRbI2?BOL4_cI%=tDcUtvn~xQ3GTbGO_kcPE_PrUS51I zAy3i%G8MHMSg9l!n7=a_SS_8cknuBZXV#2&&OX1Q#2aTROexs?7%(t{Mg~J z1cm+25Ai+91TKHaf`y4h%6AZJ3&5%gaL87TwT)hGX>{ecq|aVwjhaT5X1!?UXOK99 zHTt`GDdyt08}4#cOdciBV62Dcla`Cl-PM>H(pceIspa-H0kQOC9sIz zDB3vVH3?drIIk1UWw%ksnz+R}IWG|(L5b^E3(2bt+1?mYGSXpK2a!nYkgRZlzY(+V zfb+4fbvY-Ur>15_ES99kYQpEK^qlK~Tg1*7gk!Fowr09yFT$d5wD>%~W(33UD35mBln>4q}AF#SZoGR&_2Tz-fxcNbkoPaqQi3S)rz zbC|)|S0US<&^V9Y?3>jO^|_xlwd^}Y11m#QS2=$ARitY^D9R4cN5Ls+lMKuP2Ec&L z1J^0;g;o$`U}lB$ZV9~y449hUAiW4%4?w@%bgiG>{WA+P)%#99m9E;wF8X@$;pG)g5mh|i8Om%=uj#>vyWvQu zf~8e{nW@0X9Qxw+L*S4f49`1RQ%|IjmRM3++h{2MbE6}JdY;GHG-~D7-+yU3hWx6g zP*+=8cf-y@VtS3NV#9`BX)|F=Yv*IW!%mm|E+c!HN`LM8dzw8Y{SU90)ac|B=CQ#u z<}ormexmWRVlQ5@F@Ah^isM;rm4oj{YIDUCme-HQy3Q4Nnm8UWBKbsBc9QNDD9(+Y z58ZNfG7-)9L4ksYcS=#1PnoVGt8*HdZyv8G<4kwt(C?3a$bI^Q(uF_s*LVUHBq{78h{9uC!%U$5cP6Oa+KqxWD z?FI=z#W3EPp?682XSB$VrG}!^q(9zl2{-aBAH`v!{X;L z`N{u-IoPKZRDXwWI`Xt0T=n;#;ku6IXK&d3i}EpSC^X|>WQ$K91Yd2OU52z04GQOCo_g$Gd2*yvu@k;A{D(~H?y}CLYb*w0Jq6h0SasI+kvcOg z5j$$a0eh0Lz+{kApF~4fISXYmN8O)=v+i9JIc980>MIjO;(ztc_zN;lrzk&=^%AXj zjr%7Dbi*(@Cs1k=KdoaHNpxZ1wtU4gW+g&&6!Ui5PHLRU@c=3z2TN;CQ)~{!aY)z@ zp}X*^1E0~rR0r;VM3b&HAadS9V^4G@o+_bIzc;rmyow%btT!;s;I~DAp4h(eOedwl z)FChY>;9yqcZCp}2tD`3JmA6u{&SNK<=;{L^H9Kj96zUmy*q3(_%4k@**nB;A4X#K zLdR6yb=`X+uL+A$&{G+S61fpcawx%8V#6}!2dE0#(Ykoj%J0%%}v{+Gz= z>`43zc;MVe$i*{;o5{Zw$KU7e&gEM)K5F@;xO$nrSE{f8w7g@Fr7 zou}JH&+J;A2i`_qzYUq-$Fj!6k>1$zy;YWXtvNPQ3T1a2c70e3;O8&{y`)fV2V1|i z=erp}(gOF@1Sa3!#yOhz(>jj_I)0n&P}<155wbPYFF5sWQ0vNe`=vdS&(7$b538~? zLE6VITNc)Z-VbK0-T*RtHP)>ZZwbUxMNgy(TsXMvzY$WGe2`MTymS^ zQefMg+Zb9z0~L{yWG~RyyI@QI%@Lb zhCE8n7k8K33m`+bh1=QPZSN!7e%hZWe1q&KUVJ`8l>Wlf1CJ#Q zE$#O0vaJ9T>CJFeEs&k}5|szG74@l7)baYS>%QGM$1n@1^z zu}2IU$nXtVlKb}e`fV9*zlS+<57N3wAB^XH48#@Ja&DvKU7FNb(k}9`Aw>jK0EzK_ zRO!k92x{ov2&flI8%8l~_hj1V-4yG%{{SpzGH~uFb*!U#L*3=~-nh2B`R}H7Lrn_C z?&vx9=JWF^eO8&+3Ks(HdHzRUqo=3j%68sxgMgALoqINBC*Qs^Sy{qFJEN~|Y#fsx z!DF+f5C;xpZCBCVlH4wV6*jWQlteiyc!wj+i6b5Si_B5536N#;_vZrlhXxZjn!1AB zH^+~i2)fQsH%-;=P`~e<*D#5V=ycxlp>Nn_4bjv|>iC<@J|Bb%*Ygdbl7*JE%KjHt z&nY>|Hh9#|7gueW^?*r)Z$%;0%wo4Xysh0^-l1ULP6X@{fR>V~VUPrB+w42bW&U0go5Qp~W$Iwj!0LM3QCri%fiVU)^3t7aW%uQ*$xJHuw8HSfedn z&qSTo8J~*UgMR_Z4l9WvyaS8s7FEjw$X~bkfrD8WLkdWxCMUUT+YRiEQvU@sQC&KL zHYDXyleR^*p237ML&o*`Z<1||5FcS5rpu0zz$%K(zF-YU^;!`uW6ZA;g3$@>Uh^Ca z(TN=VBo`<(O?-;dC};gy9o#d|CP(Eztxun-ywNcTD_ZH!8;>+&k#$gg5xd zKJH9tm3k5AB#{&R$Pl25_=jy~rQ2=r-Jw7*O*(pS%GH!=OAh_Xvk)7_*Hs(HVXVUp zf#}H8!bc_oZ_?A23KB0b+dWtXczAImWnu?6_I%3CYzP zTw_kX$Y#qPV}8hMcR^XVG`i_LCIMCpsqPI-cc8$1I2Ps_T1`)b zc0-CS=g^kD=1gpIYbaf5u%)^d6yqxYWwrf-QCu8mp`1Kd-qa4sHRnzaBCunE$2{Ze zQ=6U!!F|7C`t~AS=T}brc!|oEoTdx0?o)S{DHi?l9vV0bWIo}Kmg^f+=D_ud^3Ph( z_~g$k5wbA%@{3ICC$Y>({2I?&)cDb+djhfD#RkbIahs}wNRSdTE8BZSl;9G_J7vF~ zISsR5@9YXEyX{7?TRf)wK#0DlVCx>rB@RahE(3JC@oq-Bqw9P~)+h2K4J(vftm9bC z&*8{rdg}mkVEEQ^R#q4KWUWO;)PK%ow_9$07YIu#q(9Y%MY#m5JBH9Tn0tv2Us9z4 zu9Q0_cFf1GPS~nQq``SlUn9QGW{fu9c@c05Z9hcO?-W|!p1G7DeY2)u4bAMJGnC7_ zO zGSLnpIw}2wRh=21r=H-gmMYDgZ!jln8${T91Ub`-N_=wU#oEKvKBF>K-r;LB`eurq z5Z$BBzMOODEkS#tPV@RPf7*!bet9JFw9|MbV1ChD&br;FHL2;O1kSMMQRR@lu&1A3 zdtpzlbNqyG(@_)a+GS-hBDvNU;&f5KKEMX6Mx@KU;WiP5C^9zJ64EKJEv2UVH9c?NAwoK_9R%w(GO;eavJqn8niebJ32a`~&ABpQ+JHIAAfob>HDy4x}?j*c`o0}6e6F(Ch=0_N? z7NyN`vmJ3#{Qzj0Ckw)72<$6U)a>x}4U@i;Gt0im!`t)l=F}8z_jrDt&n_52&Efy0 z)j6FMyN9gd_=MyP@)_A*O((eWmSE;CwQQk_?wyjKDZrUO(XD3QYtJ|`hv|&U(n5_& zD@B&vZHFEQqlKUD?R4RGJ(z`f7+<54wvH$JZ~$n`M!U8czy{-zk}CeO19N_ZSDo%Q zu*y3JzS=7>H-~A(iR!hNgoy%oXa;!>L$ex=Ga5=%3$HE@w|R= zdoiJ@t!q~B-f61fYIZZLRi>te=XtV6L0FC~|6=3$ub-H;w4XEtT^4XSJuy#zPxz6% zf>p0sEI;wtwVPY#JvuW+PUs4oj{X@D!#OcbU{8?8Y2G`dYJKK+9pR$nWYlRD#_*YH3en)ztBF27W!ZB&4oA zFfFwp#SUI?T6n}fxV|PSVxiCuw$@-@diARtm>Qc!v3Rx!v4Oya6}pdWs}{Eh<6=u2 zyRJV#v)smn_S>uBmH2e zDcr%(=B(~)L)PEKgnSqeTj||Je(tp+FdX|joPO7>QNA)HW`NpJM+!06ed?0_(o^yM zEZ0N@|8a$VOrjqNVlmm9`Fu-;+1_eDFTBkq6O^i7f~@*yYKcW!^@dwE1Lsg9K`Eq-VUV!!tQ9skSkO`Kelj!P+ z#!p%Vx0CqNu0vNb#?xMhNAO{$-C#eEVyxN_x}n}FM~AzSrVhh@Eo!dczsEdQ2A>!wQgiz>c1;aw0(OEajGlJEA<=@) z(<@HwSocGIi2*8opW01G+O?e0a827+S-eU`nUWP$|J(qV9|ohR7eO`JInxBWEdT)o zF|)oq@Ktf}h=?>wHvHoCrv+#7X4yF2a>5rJM&Cs~J-2>mHnkAWUL^hy9fs7B)da`& zlbal)J!1}n@cJXg;hI65*G84QMZJ;5TW@l5S3b3uM?{lVKl0HdHl^;UD4PtnyC1+# zy*%==ytJR%uH}5IuTgbv8`O@W{;9b>8GMW-K(21*vY$WE&(}NM?M5~DpO)3mQ<(kz zj+x9-vyktYg-rq4eJtQzD2cYw?JCg;R8EeTz}-Gd`NF+@%cFr>&GwOHt(-rb zP2UNdek_Le1;TFA>)nbmL(oWFlk*zd<1YBwaE`+Zs-z&PgB%wj!bHUH^>vhA1 z%n?CM?tp~L*cPi*9|_L?z2C&>N^Bi^uBxNYD@lr2f)lPW(NHLo20b5irFT?S-r zw|UA%Om4$dX--`ioYW)(}_32>aNd}>9KlGgY=-J^@c zZp<0%>FS_wzxMicsniZG0WJ}RiSz;f+WqRJikElw+T}PyT%Z)T;ea|^Fg^C`_nk2* znGO%rlBQ-VBn`j6T)wzHp0IhmzxNs-t)^g_nw}1fZKKQPdAZ;pnh^mmY1M+k8P2qr zP^*rPgGiKXzeSp~IEHlw!@ZA3O*{VJPo87^NL6rc% z8knednf=o5p9S$eQ!Lts)WT$7qygPYlK3`>r&!OBu~*UH&EP^l(f%aF+ge=k#*vvp z_^T*%p;E{lJZG>4iZ2&LV7j~4GcXDs?>hWq&ES0xEdY^-9KkHG9rIMA5k0r+qhtc) zl$rWTcp9w1imh`aaKQS~9$H@f7w zpoAbCxl$C7_l2x_pG@H;tMiQYu;+l9zMGY(DK2y0Y-e81efebchUuLQws@i32|UBM zOT)L6g`lyM*mMQ61lg|%vL35!)agPuIbO$O%QRdQB5NPT3}wrN(v?!$QyNFZ>?Wun zzgb-%`djDjJa)M7t&HG)R7qLoh0)m2>+>znF0l|wx3!6%B2?^>*I&m<*%nk~*}C58 zGTC|Ve1$qn>Ros61xxGeMOp`~z}TCcD&^l6+8g(i=DNVV%T}cW@pSrWc%bSW@!RC{ z58~MI=lFZ}zsf(pZ5Kr3+?jR2uapI!HG%+w3%)#^=m<83gyh9)IDdgyW~A_@2G>bV z+4xE1a9J!Rzoz{cSe{3bt#a>cY^6YRcz-|A92`Wm?YRDFDP*OYs-x{*T?)#f`!KX} z>4*s0ZzbTEyJ`a28$JUb8lyd57g=+ROJW|p$AwD}XyRep({DIp*Mft$-FK0cn2ZjJ zT|f4cnqpxd`nrMQD|XV<`b9d{DQfA8se3~4WF2m;N~}-vGa1gYN8+9Q+D=iY=m4&tPgJTI+jeGI zU^r(+ArFSXzBZCrtHjt?sJ%N9;Fi?6SwlG4>w@?75v- z0pnKvW_3n&TJV`$UL=MWF8{K=y^BAHdRVEIUX~FL=D=Dlm5w!_g z8gzURTiv``@=7wvJ@}R9VssNcyCkvsSlPbT z#!s+&oYiDI=u9DvJttm-1UJpq|0~hLHMZHz9J zY_DE!#N|z`ikM?9{(veM9_FstiVxMag+)ZI^(|}>yuxgsHU9403+bjxgjKt#2zm0z z;Ni5qH0w(7iV`Q-497uC7LyCP{!Q*k_iSb=t{zv@dfB{loUG3aswEs`LVc6MEx-$j z+MKoiWpjO_@KE1utw)27<7>RF&2M3Z4q|N5tUFr^xplh|AtuqE1TkBqGb zolP%41IB(P|MWgxB{rtm|0wavdZ7K5(-z7Xis?JAkYJK)q!StVAzco0vgL5c3a5> z{~!zugTFa9ev)hx+alpD*%r~aeTW5vGVig-5H%-itdEdR+_t-96D$-Fv2}TmiBmcr zX+vu%n^erTb(cZM7jO&Qhx5_1SC4sX?QNQF*e6g37Z9u@cTCY6r(;*7@ez(B)b;0? zuNc$N@XQHdjbbe@?8OxM2IJ4qE{u`3o|h!1_)E<(2x{qzxw|Cf*}+UGOy`Vtv8H=_~v% zzuLN0QlpJ8ze@g$|9B3vcLz7HE$HoWkZnOy%~enKTZyK)!%nYzn{Ft2o9LOcBejsk zVYIUTDCC4r?T~aa3@)ju4hz3=Omx+2g2~l#|u;gTpIvka#;UEA*VK zs=YbMc@7EKG3v!+;%@jJu{e(qY2}6{usS|DC(xj}vz;_>=QWeB;6xXEFa}R0++f

cm-c48i9RFQ%wcL->7tN-KtZ0g0t(2y}a947ue7i9GciP`Uw#S z^~USCq~mfh0w|$0EKfp-VseO_n&-O;#=7_S^PQoI0LnztF}sPMS7X{8tmBd-$uq+u z73v-i*zv>+EGq*mY*{ALIn2dShAbly1fp54xO!(Mv^leC!!LsJv*rmVHAZy{&&OQV z0v`xzIjE?bD|peQ>||^S4b!r^8+>YZ|7krEpHX5grJwtdri{U7{z0K|3Bzeh{Y-Wf zgu4Hs0pR+EfFS#Pb!l$fcGap(!qZ@e?7?QP>`<$*^7m3nmFDnl&Cx!#)vxa-GRELe zgU#A4ee>b<4|1H+jrQB2l50&-d8{9<=~kbYsBMTnDBNNqihTV87~ZBW!Z$N*$7S8( z8nlb0o}(tX7CwS_)f;&ARd792@~j#~+C_~FppTsd-Mapl63 zKzGLY!pa(F!4MiLOw0U;Au=ecvD3hRe$o-i;9$LVF-S($wYab`J|J%aenbn^tRB9o$9-`+Ps7ue1jK9p5+Vl z7gPK$kJ9Qn0*1K=O*km16*~~tTd8S3)tgHAwE5BC5_{@I>>vf-guK%_(?@eeOKG2# z?t^z>VIj5_Yc(wBFDQ5R)Ljq7y3Q^)8=Y~N!_;jBr+!)zn&udtfL0zIIm2;ywkX6E zF0P#;qG{e;y!L9eF&bR>%}FXR`Kk!u{QBooLy@>4T?x+3>1Yk7uzu>>3SXwhhS(A< zO;qXGpC&%}v0tDa$A&jmor3bMsZvV7gk$*)@W}~;6%T8zhyV`4%X|Y+mXKhL9}hu) zg~^e2Cm|9-gXpPybW4PG(a|}S$~3*;!G3d-5r5;y7BwV#p;sWks4vk+V1+5u*VV=T z8m29bIE@@1Gj-&aKY9MsZ;(eJIArdN_zYUrAh!3#n^e&t(Q0_;I28vheyqlbTE!L( z3qQv@ZojJP4jDJw>V|yu*aWgajs+vLcwv0KfT^Z2ogC2QXZ*pbM{(d1AMJNo1o+4I z#iyHZ@dWxyf!1|gUFv^}tf{DYRQi+9QyqU}b@Gy-yz`a(YtWod*6K&G^kVn-{6%O)HhKN@j6yjeX*dXnn@o& zbNYRTFjLJot?*B#fodW{TjjY@Lfu;CMF_=!>Z2T$s`zUJn;)?%bi{>JRI1QJKqP#K zh`&}lOCl6E_TpransA<_bja4rpJkSVBy7%>yB!1=aTbAD4+ZC|Q3R6+P zqy!^LCd-Yzx|gnPFLaCh#{7rx;orEOjAG$w%Sfj5z4V3m3JNv@TL_Acy1~tND^B6q zdssZto`dwRR>X+owb!hp;KG2*XQhkzAP4ehhPHY2$1$XjINt~puq4cY(N%s5=H1Hs z%vz}d{Rd%HwlSI|QD0#v{^uyP`sA*MPSo&Vh}!mB{Q$xx9xvBr!y9k%#a$2ItnSaH zidfgCrE#;HC1rYidb+4sO7D&uq%NhfV^z@!fFjMIm-V}Rv;thW1qWMm-r9HwmN$M~ zWQu5w8Jb=D@$W70OiT}~-~0OF{%^Z|h<;d@8)4eGuO_oV$FWSZG4De@lY@i=V?=<_ ze6;|$9LUxHKk5f6d=?qJTQ8GgwbpPZI(s|_&20Ya{;Kgc<^~L&1{F<1=A&%27w<6$ z`EUNYPr*($6AC-ePznGZB5B`{67nTIJxrO14nZuD0zdMNjrw?i-m6}?*NG;54KL7P zGyBR$5;Gpca^n?>Yi^@^wa)PWF!$DNQFmScFiJ{@2-2aX(%oTDk^(AS(%lS0hm>@K zlt_sPL+8+4Lo>j@&F$wAH#6~-`IPvUZ1sAR+?7ITWCm9(P?*_ z`5qNnzt76+89)9|;6mZy+85V{nPnb@$bT25{(_uHje{hp4(AW^qe@H#NdKF!`oo9J zL3>dI=|k&vc6YZwC0`9@Jbo)*1}JdXs%1;SlqxvB&J#7TQkBl54?ckf8IwnI5r_0e z_Hi4hDy8D{3Ge;Q8yCIhfA-@~NXjE7PV8uwDV9fxJfy8%fa0VPDJ4x+E zKLbD2qyC*H#5I6d#xwV3r-OwZzv&L6vPJpSjpaXQAOE+)hn{||l?XM9Yage)vVwrt z`;`5>*(0RNwKxW;eP50*^md#B6V~P9A*x1c}b9##Q<^`%-OLZ{RN& z_S~59h_l7~c|7^}T7+emmt1Qbi3tmjQ&I>=EjR8L__@x>W&XOh*LAOHt@x0x@zWsn zMg9s-Nz`b%cFipq5AL*(~fW#2irK{H(us5KG6 zQZKuT9+%u6oOBq_DC^l>SX5fOCRd!kJoM8N=QGvovHU- zUCd5H5u&fiY~Fh$hS7(L%FN}nOhbfVb;g369Hu(#tAS&_H&X}F4bNorq8kFse?fEG z7te^ITqm(T=z7NU$>95N%MONw;G6_^5m@H!s1vt#Ke$DvIH4Z(6nmJy+Z}Dpuv0mR z=FV0pYEJJ&)N6dsK!Yi>rK!wE^=?C0_S&-+@8v_`2nWs6 zdkMj)XE=Hdu5{ZjB{01O!jepB$e27c|ADM%{tMos>t&;fjuXO#nWoCW4NA|J9ICpz zR*B9J90)_Ox%dEw9rv$ zYDaGL`J8eQChjN4KauBUmTna=_lS=yUf$7Cb>duMXC6E+n-Nc$hT6kv_Lfdhq7a#& zqA<~0d*sbnzj!`VA^?OKL}^IKAx6?vE76Z0$39s^tGd5P|h z0NCW-2cV9JhC(*m^ zYm&j%za!2ehP+_pqO`?}^|_aBHp?<+`}PXZI-e|<$I-ih$9tuMJK%S=noXm!R!W&p zRlUfR5~<6x{Jjj?=3b`Bylz7kzIN7v27u zQ3%if2kyA6YkzE%&aDJA>xAz1e_!Za`8EBXXU$VTNZfyV-Gt4wC3rTyySDg9HV<|B z7E9^78OQdjnbQ+?r^~XuhTMhRC#632xlV>@)GIfm%d`q1i0CbM8jcLA0?)+#>3an# zwhCKQ&!z>>jZxR)4vH9X+9kfaMQl#Rso9?+{4&c~XLj!g4|s)C-feI1!2IT;XlZQ3 z_PtQt4a{%hVAc_Q;0mv`baRFuJ5TdBJ#a@P&^5LI0@uhr@Oe-UY#K@{pPHYMbM3Q;h@jWt1j-lZ4vSI#KW5uyR^b=0R_s9p_Q3nxZU$SQx8tL%>%u9R0EM!DuFp( z(Xhi>uMHdI(`6I9w1{ac)IkTVU~Z7S)RKRezaK%KZ=gk|FQ=-if&;(#o zqeKzJO%KuJ&cU`)b(P zpC-KVIf{w9QI^LIn{N{=3|JcnyL=6w8-tdTJv!MU+0yH|^g!U9D?Ua`Nl~YBdAo{N zkehoyf+O5u%jcgY9`ql{8>i5#CORiVDF%wX2xnwtV98z`QiYH$D7|pAUy-~ogks$< z3zi>volI&Db{bpC1$c(GeOS3rk`d^$_j+F_14MFKaf)~lbqAM7^>&PbF*Bu&*KuEF z^BGpFnTu7(zh%=GxL13$c&QLdCzjdw_Rh9e4f&g&YanMgWO#biOCM*O!1`M}h?Q{! z%I*670W17t=)5-wiF2T}?a-FJE&?RfZx(47%+If`@8xphrN_)n+6_SBJ%lq0;Ucf0 zRJDh@KP3%z6NF?Y4h!XaW+AYJQU&t?cnusD(APd9(xcdvrdz+Q&iXUMRi#~(nIIVgSKib3Yt~?)8xP6FV)+{WOy5-U_KQ%4oR0$TUJqwm@-j1zK3sNsiSk8JY+82GId6EsQ@JN+__xG z1gt~}vIgdY-S)00YNI2UgRDv-79iD~wFBFNn|gx#K5qRpSuUj(E^yHoR-^`BGXZh0 za+oFue%7h)z=h5K(qU2Zzo^!qXi#9;{6Lu3hZ-rr=H?vOca%CXUv|NsQw&UJ7Z<;A z3^;-^TutWN%t`K_F!^2R^lq%8{-pr%c^52*z+f3BHSk0pWi8>8m*uzeaO(PHC9ySn z<`0YuWdX3_(LhSkZ8h~V2oO!mD6eR5{oc=^7xwub`iigU#FN`H&H*HI#yrOLLbJ~S zGq)$(r0d|cJE!N0R5msFqAhgr+ER%!fHn(iVd0_Uc%>R@V5h;qVnChaU$SMT2hiH4 z?C*xxXewuo_@e}HBS-pW*NX;t9ft#C{o+*VuD40tU7E&^7JSGGI$H~(q9Ri3SpXty z3Jon#Rsv#IHJOp;CU?bl8W_+5_6}27X=YQSIOwaDYryOQ4FPMXk2bn^wdbx#)q1jD zJwV4Zlrr>Blgh}>c(mufgHqFjRTOfWH+of~X}w;6#^AL}U~bfxgSItb+b-&4=bWK2 z*UnYpJ}BZt{bM*)WpMZ~&0=B63sloV)|yK##Cg_w2Fdylno;M z=7fqCuwWQ2=bO^AvF*)}nz{BfB38;Vv)0xf9#!|KV2)_l{ceIn4#lmsD6gZm!B6!t zr&4J42M&7s9A~N)%ILI{_1gl!`?M9A%SfwYu})UF0qB9;CsRR#j4hQO4Vz_34Ti=` zsG2QNCbDD>6u>SBQI_e_q0khJ%yT96ul1WZ`>)CUA$I#3y7tZL5q9%#`@9JyNuxFD zL~hSxY9cpk3-lU}+A2A4vt3|asJ|V6EX0!P=C2tBx!g|NZsV6m)dIRwzC+0Bd>dJ3 z>{c&O`jQN|L*#Z1G*_>r2P{Pi_GeBGj!`&a%3gb^Zyc^t^*y9ruW%m}*!>As2=T)0 zzlYLIRV|SJA)noUJis_sR-sl-mXCaVw^O(<=zN`*68a~TxuAJT{nx&mj&txrw|Fc#_9LHS4+1j~rC%)8chJqYO;DYC z(NNOu-L?DWedu3fCm6;*@N^S3dl$FOqgFT?D z8^h&16>I12N)+{Q4NKz7fj}~x0tt+{QnRimR?g2e!!?`-sQ~+xBQ39`f4AI|2Nj5$ z_MQ*#XMA3^NNt3o9r)w_cDsMZ@GS@&xsgdrD{$m3(BgMEdZ%$KnJa}n=rC(LC%JFbbwTwX5xq$Ak*n~Y$NaOfIEA002Nv~7;Cu6AFxSdnTfp^0<*-K6uf3L6}9){BV9$-R5R8JzOs-4Qc3z+5S;j1uw z6hwUgttDAlw)SRB*o8rKS9i$#=CA40?i4ol86R$9v<_~^f(ZyC?4A8T!N#wDHu(kM zbW8540gqn2WTtH9>E`#Ob5b3T^K{#5C5kF5++7nT{$Ca&jQvV0sJ^q6QLSh}SZ=!x z!CS!;pD~J`CWR#$=rklPXxO4`lHyp+iv<0TaY%z7%>rj)qJTPUI#bn=8)!&IK22w#B zXH9vH$(ivJ`kJ!_p4vv=FX%pQHx<#M}=zD`(}O#vL{m;0&>SHH3O^TO{!5rKjYLBt8CQW zKXK9QQI}Zq8dn(8h1&^~%_yCzFO@D;yG*$4*&Pv7ef+{fpKn~}W3$?59LoiUaM0NE ziUir7t3j{4KK|KmYuew8mGm`myP{0X`GD^-hwvJe6({uq9)Q(iu*_{k2-1x!LZ?0($T`#<#s0Y?^PfAWc6~Z^Bm2o7(e-7< z_RLKPwV=Q?%xNrg!7>W+5Q!>5RNO2GsRs?tn?Nyg9zSkhx{I710^(zL*WbN@d2{DPb=U$2VD+oPO)kxI8`WPB>fpM|K?N^jrh zMdhG>zk)!V#04rXw1)XQ#F((yE`(!$|5Lg|-A5%x`ZW%KX*KL|N-O1aN8P_S@#b%f*8y)8Szg zu2`4YT(gc8_pA)NoD^I5rSrf~@biy-WnYy2opz6kW;Iaqpt}1NFPZ$H(wQxsBy7RD zvEpkMvx40Y!QBjV%Cmk;RQ0C1keSO4>o;T);qvt_v@rFItN+;H^2Q_vn#8^w1>^S9 zW*GHRHIQcrTY3w^(v|a@aMQRbCO$kDBb;^7%px+eu-^5kgL4;KQ`~2H+lCus-vqo` zfN8D~T+z~Ch*XFqdV|K@xiUMKy?DjYa-OYruClp)v?%lTncC`z+`En5 zzkYC{jy;g8{O|LB|16r}KWb3eR?U@)W?~nTt73NAO2-y)-jOfTt;mP0w)XV&H7}`A zeojLpenmriaLtfXc4eSp zq*_M*deCi?*BCeEN}_`=BIfdYMDW#ZCUmjEpp)95C!;#4R=Mc4&cnqTvC@@(!5p+a z>YMO=c=j+^qsmpC$zMhN=UY7qm56B{JOn(}=K^FnVCiqkfU$Vxoqfq|Jk3zL{z8VfiL1N^tZkW|iH^5JdJVf`UrTb+W zK*c|q{TM4$_M#Fpt`3!*!4p+x!#x>a{Ia^;(C!zFFEI}y4TkWl243y-(pGWb%d0p= zcIDYh4FAb0Z>cukV+hydiQ!wTyHj-AfeleN6i}3KhebxCf2oT_!zo_)vd#e`B6}j= zz3F2+TaW6>@?;#^ju9$Q=%l3EAV3f_$hR|JpKhqa?6f(Li^_6}iFOGwMUq6@&i4e2 zx5U4n9o@Vo>g0Do4S10cRFAFzp3^?eQ05pdSOeG!^qnesnR2VGSF-yZG4I{*1H4aZ zlfeRMyA}ndddk0n)|0Y3xD=A!**pvyb3hUCYK0hyEWb&#!r4vc> zNbQy|LF4|u`~yAXbe(gqldmq_#Pz&SnH`Q>7TvX7n%^_>T#3Vr`{#@}obBd4{0R$e z8UMV4A@`8l0DJWNaMYZqouQ8GMPrggT^2Pb^=vE4-Pbn4xAlq)b+?--6fIMsdnHH%crPZyf+fkl3F|L5~iPQLOe_<=`P@h6FN9_?6E!` z7~H1nE1I@>(}JLT19Ms{3Gz6Mqw^k7{4e2A)c;-(tnlUg$0qRd0!7bM!seQU*2A5( zPkRI!Z(dV+0I^G#k)!pJ{!wp=$%N5oJ2BJC5R+<*dXvS}VvCqj+p~ymEMKY1;?O67 z@^z;oSy{rdQ$)9^DDXydcQBq+p2ZBBly&V!N9M3pUv-r8Kr{=FUw*E)XUCo%k)aaZ zHOR;a;KijbRAQ?3R#s3ha(T1}>XODVS8bl}vhxUC}5d{wu!z0BdWd@ zxw?JV6V>E`j+k2+D$~T_p8WpmJWl+m|9yAu^Y4S6^Upo!d6K+BMQ6*+6XMKV;Jcb! z(W4p#yhTBwg8kdm)<39-XFo9~MJ?Pkj);`BT)7g+1#}+ePr9?i5i8mvev-D1O;ON3TLJy%oNN;#@|mxPTa_o=H zTxXoGa~fw?E=`@#x$p@Y!UJ`lanx-c_T@>Q0Z22>N0N&Ke6ambz3B~G_!1n>gcW?S zYuEd!P_yjrjbfzJZ}=RavS;%S*qM6PQ|m?veEAqP)at+pVf|E1CscX2BmY$}I!Ell z1oKqok74uo>nC;;xHSGXkH`Saorf3-zQuS;A4)_0xKaz$^*nvwf_gRta#{zXojSUpL1<&%0PmLv}{ zMB19^p<>GYGOg4v9XoJ0Q~wxMf4|-{Py+QaQ`03CcNQ`3N6s<%UWg<#d-9W4egXf4 zf8=#_TuQ|99Nq9B$*&>qF<>6KIXOG+EJ~{N*UiO)}}^# zi~>Q9#7d2|le`&@EB8K%3rz#9gvO0LLitc^WQhknxD4E_hj#C{Prog?zdZ&b7MQFD zA^EPrsWUDQD<@+)yce+BjzX&C)Ml=7F$$*|CYgvTKh3~@5THRL5 zi_8dR1=#i_fuysH$#oAeTfT|}Zlh$nP8*EyE)#?o85r};i>il*cBaEQ=9z6NKIyLO zV9I=*fP{;jcD7;b*UYo`Lci?|vS~>EiRYH!$6vkAm(*xXhiVeE?omEmT(a1+aBU20 zmwTBaor0P>gf=!^UUBdk;ZE^OrzM*oO~YmO^rQ+k{6)wUXWM1>YDjxXvdVxsMXY~m z+PaE=j4$BZ)AlcV4kSb0(IC!xZGX+~zk87wFKeJlB!b+tAafWqekXp9mP@4fnMn`Z z&UH~N5fuBbeM+QugOJ8+nz#?SoabFt?kyhTwkyHaQ^uQ1NoN!tkH9a|?I zv7>tzmH5SN&FdQ5*L5r8;S`YK%8(Stn4Hf-_aW$}WgAGl$gPZ*mX>0kOs%s~oW%`^ z22xG-4{Q{DwHSSG?=5smc7EUp`Y|aU;1t8c4T*0{V?a*Vu4Av?l%+8e=H}pikcxbS zrsC*m!n1wfR=ks^VU*O5vStfMYAu`Vn!V?obh4GlR~2iE6x_4j^D&o(X_I>7+r1Le zdt$h{Ad$FJ{|Qr-k6H`=C2jH=P{^3z)t$y{{h4tqp&j19x%)ex0&TE$w?e5eZFyL9 zCFQpR{GKwFak?SJ-`1*_T)2&DWQcgp)|Za5LWo}9pBmQ_-!1P`eAM>i-fnNn&fLXO zXsSE#P&e3}uGR6*js551$l+qj`O)AfC{y{|Z97Q_zu=DrKlT+eTa)OX`kr(m?G|>g zUy7zKPlf8{8$L&|5R*@Ee^x;+ed=KX|FQnDgE+&i56boYQ(^_nj8`h(E|GgQI7Upa zOI@lJ&E-)XhbZyPcRn8n;f|0r&{20o`+#5L7Nvec5N4|_=RgbtUh;iS17VNLY3mvp z+uOAVrM8dW)Y^!)M(by3rjw{#OBVvW(e3$#e3ks@1rve zbnWRi&*GIcUaagv*mXLx;&@zf!g3J3T9TK~iI)F}+@z8PGNB${n$HZ^$Kt+hsXc_z(8X#}G(TIpJ-u(Dn_hl>#5BI}-t})d?k}0-Bb?4mi>`n5 z6qH#&h|N&d($nfvtE;6lK)gZdsP~B31p=) z$)RY^#=-A81NeYGYXW{U_?!b-f%baSbN959REs5C8A)>!y$ShY-o;PB6Fchj3Fpk! z@a)q^TLsKN4jpml!83iFV0H0mrj&|(liS-auCvRLHzpes4H#5*b3-}oXnwP2R5GS< zY}lh93o0+5=Qe0Z+pkE1v!0hmH>x&5lg=Z~tnlg2{WstiPtH5fGoCCDcTtxVzwU_~ zHAiFY$^uEbw*_MVpl<$H!hN9j_U(^L<=}aQj-a6%pIC@t&(Y_Hk%F2N@Z!RZiEKO! zXo$$q9fGgeqmC2VVXn-DX?eC^mA|Bf>SLoMs`v9h)^VZ-hTC!=0d+-TR3~A5yGyI? zC}bGX{n(s?())Yy;Ev$ijNT@3Bd|m1Shdf*KVsic%^(?0C`cIWeTV z%Cz+`XlkW2)|JXVM=PT8GYTg|@Ni|D5Ucq1`P54Eh3Z0HON()~*ozaFQYk?Jl{KcK+khEpEgciRi0#&O1+3g*U)*+zhqb*(Tffa5=u%K*IRqacUz|gu{lzK>&zppUop$Nx+Rw`h zI#N&OG$JGL?%QU-n(xJ+$HlN4t-)AIR zZIAJ7=!{3~p*#Z&;ksCa1NrO1rCOKaPGr5s@=YXN*2@?v$+o$m=Dm#nvQFNctx3U0 zEc;e3)+bIMC8VQ&ug}+|#)IyedDR2*Jo#i=UN*iu#7KR*)t`bhBNB?f4QHvG9{n|h zW6Kx!5&epI`7stu-IwtYR!hyG(e&dt8lN9ce!ePRCZEzSz3q!Kk^)*Uaqr&l2A_DK z%&{Wftmnc<$<)d;$T@(4|9Nt;{VnhaPY?sDWp>X-kD+lDQxM)J z>EOL;oQK@hHnYMlcAQ*8tUKQW7@G~MqS#g*;|L_3I=Kq-MnG@LhQ@_D)!FhM_^_zt zp6_nz4OXmgYhWQsz15CHP-(YAh}8Py+leSwd_ww$b1m9!iR6qEe%@dACU6e{1_CC^ zVx0gkWs9~;-jfBg9%kS}d*k4C>;G~w55FtogH|rAT^&S|UEOS$dwiujtTgmRr|{b7 zP;(K7$a1~Nn&vmFs|<>B;({aEK?V{jEPP?H(SVWq8{x5sB`fcjb<|bu7}z>^&MQQc z{XGvq*KEBBs)KySXl%i^?URbXxHNow>|F2Y57%_-F_;!llGvU~@JkQ}eb^px$lU{~Y&I72UZfF#^lC8rm3SSU%MKyl5&|3mM%QyQh z#q9E^+6GY)_dl+B1Z^^Cc^+tbS}$Gth_N?;S5Ov=f2l1ECr z{@y-U7YpFZJ*`bj6`esTS{2h?4gl{SA`md;bSTnV%B zna31b@J7~y8vkvoh0;`36ez6fk!rdgZvF$%xOTNUZEbcrnz?KhUDt`A+w;*X=o4}S zY|N>ju{Vj>8Ydc^1aw=1feo&|OlhuCB@`{lHzMG8A z_G3yjY?bj&F+lqTE1T<)DAM|!$T4jZ-~rpCqE%=uH|}|J=S*GW$EeOnlX1Q+;qN6x z9b{OuAYw#C*1l3+-B5kB{&HIn^Vt{fg$*H`Z?7Ghg@~#Tc9-<^Xl64+A;=pm>KT75 zCWXo_;_Y&aX$c#exS+l7ZzE(cl0M10=vvdWObsqxv}MX|{`IdGHH z%PYL@57=#SZrv8R))4WvMem8RJ8^7bcZQJyW%t7t>07dfF))1rnI~k4m07a8V<3v zh#r8W=eR8-OX0ocKgv`+iGo>4t9*-~S$;C-_+#GkCYYG0XriA3OiDL!8-7gXw|p&& zRMsegUx*YV%uVXch$0k%BHnw3+!MTcrq3L*v`za*+`NCv5ZgfT{f9EEg-RyFn|%gp zR;kQd`X{Q0%rN>zm9>9P(g!-s;MOLSle7K6Oh1Ss-T z#a{hhYaXkM_aiz=BQ#@a!IyNs5%1mqJ&-uooVoVx)>tf8f)}7E8EI>*${FeC4@+*^ zsY8GBoOxJ|$fxk~=YOuV{-5jK{BFU>Du9m4rA09HKxvB92hF8kx^>9>OfrWaTx$r8 zHCu(Xr!l9X{(#1m_Lb^_|{W0t#`lJMiZrqo`<5FsYob!>kljs-*=Jss7 zp0jeB4(H@ju~sWXfU@*Y_CGnD3}aqYhRC>FtId3pdODaJzm;1=R*$WY^f08+Fl)H( zEFZ>v849i2%U?5_hV6oz4k%}Z9q5eUAN-7&(TJ2%UHK#^k?8N(%+UZ+-l>?XJ_aE- z@AWUUV{R(toc8a;L9ojZO`z{p~hOgC2m$IGShcKe$SlNBv7KRiPuL?h&|*KSUJzU|o~o;(E~ zx5fkGCdTEatG%D?`&0zxuFV&j3mqLDuWYCu2Jp9UH}|pPj(%5Skr$4S?Ti1i(nb>u+q4`f7a zl2-@vtX#a5Y;Qm0E7J0wS_o{uu*ViUaek29@o7`!(K_h)%vmny{_0~rbQZzGAtp>H z{aVRZc5N`Pkm9?wm>D*mq*Qvg&kRd;Q8ywJd%aa>0yXDoL3d?C;Ea+~;+!4izy?}~YVz3W z+ul@PIIi-U!3I=xQs_ZPT-2odf2k|seDyKr;yce^p8vfIL_~248*<5a-eYU%pYhK? z+H0tx?EIEAij68jLk_CJYVJ@?5)HW^to+Xp zx<`hbcs_{)vwacC!}RmsV=6ccf9|_hLGFRs^nHGXNpW34#|q3 zS2vfW1KQP>r4*)s)-e5@k?fvEcc;A4NjPKC5Z1%ytIyY0q*LLSo zk@Xd{7A@(+p;C!u%*F(dCoOO_Zs(G4p!77!mA`z=bVLm7P>4s#1eXB5!e{JH6A~k4 z9&Pyo&bm-rfC>_^1>>z9Z(lwxS&8`2!n@e84!Kgl=cHf9>%mzWK{5ZxO<8kUuY+p< z^b6^#4|IFq>Gks(s7pc|RhrS8AO%{Pd9ASS-h8QgU0%|H5R>Uw6p+}*ZI%)udRI(( zuXG=K=ycQVJQH8{ST)%LcvoJMJ4e@_M*x;Q6d}!jGydbFsWl2%P>&%=0OBA!JIZ6I z!@9WawQjcb)21p4-9Bqyb6{} zYmi07VdSfmTmlm5B`t@WQ(vP1!vzzl@vj~5(V@*)DrxNQ(fupI!CNCgBHikxt5;4K zb?kk!^&zS%$tH3#;35>G%kV-A_nYo|$_Qu!E6f2-`_&xt5dAn@4T52@nEl}n?4yIq zb7!+{u#VpP4_ZB*$I0vmd$;LOH;})xJrs*ngi}(?^U5CpV5S#PsSklB|H2=;2^5dc ztI?BRO?v`t6Zm}Kv2R0yB1)9`Zlb1k=(;nORwo-^nl;^XMZh)#ghQKtE`ObeOoSrG zT2E1vA8=uJNaygN?H@lpbgH6qy$0S10}_>W-79W49M;ASQ5>PS>7spmEH8Tf>>S;Z zm?wpR=`84mk+ep+aTSL1E*p;SN&MEmc9tU@~9(`-=Y$tjT>}Af)?ZUQa5*-(> z+c<1t<>e&%`d>$QY8doA1(`D5NB_D_Bfx%0a#Z=#(cZ5xp+D{vHj`YJo||u5n5Rc) z!V4(_j6ZZw&RJMyKxiKH-vtvL-s&?7BT~)^wUNeU-(t(5Dc3r+mD+4~Wv2zo*dvty z-S2@4K+fRWLW@EO$ldxeWD=E`x>%y>@;ZS(=_zGJtMZe=^)lfvNL`fiS0={G|Bat0$KqargS8 z{Jypdq||=5Z&q!#Ke!MpHQnFYXds2S(gG77xR)mGFk_HY|FYd6tmf-Zt)i3)K?cc-F(wvoFcHq{m)NWni}X z`6DE~PYT@aV<>w(t)V$Sdg`-Juu^V%3xUKKBD#hpl*VoU#RAlLG{0oeJdB!BrGG3tYa-GQ@B@C; zyv=SxMi2bFz7xKUZz7_2h@mD;gwIbzq#3PO&#SCBUSoDsH5QU&CU~8^YbMg=MX7PXR3#1p8n|v3o%Ktjbj5we?|t=mMgVrD5gXOLi&t2u8Tk zi{tJR3UaLx!FKZLoB*|%L)g@d-_PovVmEogLh5DrdzX1jvOrnU%V^!ZmVM_73Q}d2%_^wAzeSdqmi+1 zpXqX$_U$qXtY_PmRsEL2u_*DC=cXyL^g#mPwmUvo=6M|$_T?Pi`}$M^AE%FMaGJ6o+Ji>K+g~qA|aV6chHTP z>8X>R+c+JBfe)n%uLHI-JawV;M!kGWUg!4$6&gfdVEaz5i*SwcjYqL0Ug&{Dt%Za6 zHh0@F((CpGYD;Aff{0U1w>(>s_X>QF_~=I%rIlKXk0)Ztr1ljvUlTtdL%^xRvfA>7 z0hIH8x&oVB8%yi6edI; z&xE*nC&ly01^h0Si~HH$cSj@}^Za7r8yYd&Bt_f6%28yOZJ@G0*Xcms)TCyvB*TM4 zZg7U`%3MDvjla^rwj1P<3$0uMmNhkQh8oM-9)MSj4QMlN>~FqiYuz}6w0Q%*0ton; ztSv2crUWt^v+VGaNg7b~yqBPv!Ts$RlMAi+{14byX*wr0v{i!Fc5kI1>)Aq7N{%Me z1BBz{_G*s_W*3EQ*@u(7Y=vXx4Cxf01feQ+FI;;516{ zWd+<5EP(Q8K|$dzZO7=@pRUW8F)>JvN!CV_N4W_52;83p$t^fV?tM%|-Y-8X;nS;q1~keEKubym&;M%Nt=9w6M4YJS)c|K5lxRm0cgo)yy1E zv&!1mB=o5Ah`3qDr)?2A_IRO@cFD=1)g5Pefi6sK!*fBsfb5FCQGW8BpjF3E#^&U$ zO7k>-wpzKi35~5-ZFICOkdCD8H*l*+!8-J84MHXUNHpW>Ny{Ez*3^Dm7XJWp3h)|L zIP74IDEG+lv3~}B^Rzm`dBt{2^5ams5#h);4MTeYk8eKq+w}CM7KdNVRC!Q6vC`71 z=qhbcZ4H-h)`DZ?$b>VzL>nmQ#4Q|w`-X#QJTZpnnVkd0EH_zo(5C`l35ND4A+24Y zBd;;z^-{@~!`=6^%s{(D@E~702f@8ltdni`2sO{T6TjNS#=Tq_>CVqVE)2pWE%yRM zR+dCDM~k@F^-RHYt)uVNQYNijKd3rrsba+@zWnCqXlBc8 z{viGw`Xp7QPFM3^rz>eHBAWi@b#An;RCDv=!>{)w%$eG9gA+Bs*F0{DVsiOZp37W& zviWi)BXXVbV87zSbpo+ji)Z4BNTvP0icQDEg3a&@EurkR7Kat-pLoh%F{bbDu<8To zVdis!oiW-AG>|Jj1P>O#eTev*0>fUbprC_fzsTGH9v;)+!h0@=UJzDQ`(zpA1C|+a z7tRR5OvbLR7+O_v`Qh&Ro-XDe5^uH!*Aglny*r%OGb_GGUx+E=fiq(D@fMXPA z=!gjsjCak!Ir`o_-lEyQOK1_z7ira@%VlTQL*MSGtPk3MQMiend|R-%1l{Ccr-=oR z6cjCy2vMGIyuP!)?Y3$_4I1CArK!(WbS(uL&5qw05%N>>CWp2=8+O)JU1GyCz1Wc& zlw`U05TB~LDq^#G>oZ|t7w5Rsbwm^O1kDhv^YI$xx@xMy{^mVP&%4a3wY&F*#}R#Bhr zevYC|N6U@C!(X@6t>xvYo;W0ooz8+H+jx==?js6ZR)X8^XAIozEEAu?{Vq^dPG2*T z>dCtjuC`VVWn%&lr3VFlt+qE@X?Umn%MdckH$27fZb&N|ZN*CQ@Drk~1b4=|Z-{v9JQ7 z`T{-H7i&eVwJ`5b+E<6{v;0(-7#11& zpsyal>+sS@NGO$JpiQ|_xb6W?W~*ID+x9AX&D}v#_~GZfrIo^c^JqC;QTR+|mU6=7 zZho!H{^Y0c(}xNi&9}cS?Dv6%-Jd^qw1?ey|Hk@*dAD@bU(>_nrLm&fqelCbxvN zIU|}yxpUp)s?ogXzQC)^xf&erV-v;hCM2r_73np-@7w*R%3sT;n%7aYIUf=v@%d-f zsng*Do;>n-4bK}F1@s7whNl}6u^~*Rs_z$nH`ia4%6Ur+j=VqiKpJw{|I{&a_edO` z2@9c!Sv^}%S}tpInD$_nks8Pg3#7$8%dO8|a=Q@tM4Um+zZ`cR@s;U*Js~^zYwfVF zQCt$ddVF4FMO$}y0r*H6q1-~7akfGCrKS3nwkEx{fa;1ps_RdiuOYyH$+)ES{8x=N zEhJX7@{$o5&{(vPTpe+geE-qFQtu_0Ok`ozo!(-1b^0Zjw+nM!-SP)kuXh-3vm>43 zj<3a?Hfy;(J2@^%t5uZ)w{uvquXO+c0>%9~@hCM~m0@LA^L-P8xC2Xnrf;wa4{!J} z#*^ufDiszTfSs9x%y3}&b+a?w`R8DDJ_~gYfDYO~z@rw=?zYmEZRNcEC^ICPRE6M4 z*Bsd^<$7>Tm&>{~UIoI%D4*?c%RODM=BB$n?fB`#D8%&!f$2At+kivh4%~JpO7I zNooalI&R3Sx}SU>8&PUxF+4|0w;rX-$L%Ppad!WLhY_4J+R>OAW~RXLoL+ruXa2`Z z{3)fDwI0943R|6|kj)Tp%{-J<=$px&%sW-7i#={3By4$d%a@jNDlVD8#@IrCF6V8( ze=T2kxOv8d4QPr#{jaU%863ioPdE-(KFED=sAcYy_UnY|JlLH&UGkPujKH4g zy_T*ML*B6jJ`JV9cmrg5t~0^K%Vq^JZ*e9~659;mYka6*pg2zz>179tzsG>(WPvSZ z4Xt=F<}tyv>`fITKAR1D-Q-kV%Z}XrP-Q*6cl1_tcn`R61R0FNtO{Pv-u|F+!s9E% z1MG-%5vQHnxU%pn%=mocK26!o-lKg6;(XdT1NRI2vi&)<&k3Z6fQ!kkW`MLwj#z`x zBRim*Jn5;%N0^v#KTEuulLvP!=YJALQ01>6tTk`^(0)Taf99O9!DgKKfZ0?)@|fx; ze!<6>9O;QFvagOi^G^7v($217JC-5=F{t)B(^tHXN5|BSce~dP-Jw%$9Q#$@d3Vy1 zt75x|ZXRrIW=XVVPKlU=V4X4iDu4Cu>5Xu@A3PE@d?adZXva82HPp8XxhEkgSRXVc zb8Yv4^6J$+i3HXFFjQ73m-XB;;V$*sq^i55sm~zb$=FAfvA;7R{_6bu*6Sv5eJ+r} zw6Uk!Q;8KUfMm^l+6l0&2&$NQj;@4URJpdrGknjQazTtOlExPcR95{8q>xq^S`OFI zbX;seQT{1WLb8>oY_r!o1}6>ck3@c6Tm=b3opU&J*X+1-{DjcbG_icIeZj`f?&+lZ zWs`=9d1#BxQpE30Gx7pXj3L6_E_C7|qDuxN6*cSczx%3vXpeg`vob29v@|Z&V!BM@ zRx0JqeQr5`KJ0Fx2^T7>&0-?Or^PZ@n~*B3Q_thbTFq!Hj4~`SbwGIG4EnOom%GWy zPIE4)-+h#|8dpD;CXXpc&23Tl|7+s4oi31WVU6%S+VI2+p>W4TZI}0#!wx0P(sB7{ zRb~P-zF#{#Wvqw9UKZ8@X!hn{2x=E!kO@0KPfq;)%WI9qNk~^F4!80Pw6NOztkeDf zQTNqPadk_(NPrOBg9mqa4?z*?;NpRVt*H}CBenrACVT8Q`y!Uc(jmD=P@Og>yk))LQ& zrXQfUL`?Ch8NV)acC<%H#Wu>wAadQ^>@82B79@q!z~0ld2*7*883za3TZ_-)Y&L{H zs-S|W62S3^R|Vl|N&4G^CNv0{`j70UJ7%Er<37T!it$qN37=_Pf4f&IvFvS$1R1}u&rX2Vohhk8N7(4T4wv3a)GI5t zx=;Zg?{fwT3nsqRyNEQH>W-@21)-Gh9EwKQ7p8nYWM_>~h&`1mt{D7raq{F6;C`CN zwq{;pJ83sCyQ`0S#CU3Zsi-vPHoorUx5n2NR@nsZbRRO*f&`J;HH?+JbuMi3hmnw$ zJMx>l&u5M5O1k|XP%#4j&KqyXsbA)x?2~H}0!^~j!=y{SvM2oa9}vNX*kv+Rqk)e7 zvIl4FfHMwm6V@0o?dR0TrB^tUOtv3Zk_pe*A%T5 zXY<)Va$_eT-B7-=>@w(3^J(h!(c|SguLLioGmTu>UqU6FRPr%&vePl3lTS>$@|Q3S z9wU7IQl%+tBK+{%bdj@~_rbmae*oTCn)*So$TIVS3kVfo;d`YgGk#Wko8f&6c%jo# zq=zMnJ>a6hDPP7UHu?KU`|Ugjg{Zl3N5W#SxUyoaK`iiV)P0oHj&Da(9_n~U-dwnX z9P4!N7$aeskWpF<5nD-?vWmmE!qD^78HFd`8R67W@|F`j9V2cB*!t9Ka~$A!U|$Go z`tMUeSJvO(8Qq+O?)^mv4+eSzZS9(->PFzNioKm9w?K=veN?M}smH|-3H+mG>R&Pe z4C;53nS3cVg_x&klvW}SG>zmOUoKo)TnVR%*@D|d+&hJ9K#wOl(BB@}J$3+Ipex!% z)N7+3)h8{>@Ewx5@pY?JymO#-uqDS1mA%*2yuZ-zNX41F?0<@e)#;;ApSzpIFm(3D zO-?dzHLgP$N|t%Pj*m8!(PsEmn;+p!S+$u^X3QFNHfWGHuB_m5!QvrY4i2HHExqR! zHZK(H$nedYqARF5SnlLmtMa#%y?ZkDsjr6o=oXif+&2w2CKA-3=I&}qIvBN6ZRU%I z5<0^Y@4Pk+%l50Cd6Z@|=@Es3P7V}uYOgBzLesO*cx#~uA&*z+H_bOG=Yn}4i{)(a z5=o}tQYpN_>%0E7x%+Q+>{D69cyTtC|D4v=w>bJVwLWy8cn(90Ze6bbN*hpDpt}td8|X z>bS)H`Bl9zXpSH49KASok?WE6ku5$|bmTk|7D3`Kj!D5J*-?*bKodLZzMrBKXuA6` zM2aV3{TPEP9JZDNa>)lFKY-D4?9a&0MWyQI`YYRNT@q2N_ZOm7rG;)|gq@OP^U$-a zUz0{aZU7>Po+y~x6;2)my4q2a4yf#*MkiUK*eUkA=k+x_DN?@QtStjE(COcuc>Gi% zSn#+qhZuh9UJEgtlZYaR%(yzJ6@3+iE=L`IZKkksEQ2IBQDd9kK}1?Yl>EUYYM&NO z%pFs=@f7ywg>PVJ07F#JJ#rwMR;B-@(-~H-%&Pl~`jvVID>(A=`6|^J787E7A~rfXwUVEDOk zY}MWF2nx7ibDTw8Oa$%@+nwMI?w!6P)&C$MR)0$!b9K|%_rqid+*(b(2Ds$i@f``m z?aGy`9C|I1?oOvtmf&wA;X+ssmi%Mh#Nk&krRnatw)X{iGu#r%;{kk^0?RP-3!{|1 zp)M@X)TWKiv@}XsqIqS9bkFVOp7T@d_6T#Q?6jY688cX!xc-HkiPgu#pGk4mp_`WX z>pm?*#aR9_20M#1a%HIBvk;3h+{$k31iD1Z2}CG6Hct*atBZ<_EC~zM-xXP(ZP+e4 zQIESXsQ}AZZ)21h6Ig_RhBu8x`ldrHWE7x# z$x9>yG#fScF`(_en8|a_1ky#&>j%{ zC?`AWm0(@W^}2wA-(fBbeawAKm5z95vgq_;YLucq)LF*1WG1(F2FXrm;bC)k7j4_RiymQXmTA>0cj;o( zZYz(6nl<6Q+o$M7`+c^oS`+bM6)GUjWh-AXIkdMdxk`-YS)ep-PIv>z?Q;h^y@0KB zlN*{A8X9db(4h=34GTe^X)3-)Ue?c%&mbA0yJ%%Ims4@BFTz&2{JwnBIOa^&F)ZPc+=W{Q29g06CUQo*vnzK~Ae-!8`m*`&(l)o$2>_8~0VuV=lX?K8UJ^3AK#3y+7!Fj%0O;va zID8*$#Q%^!QtRjC)2F}Leqbo#*+nD-J()T^_t}zDR}p7WRTCcggVSaK+kSvX*xbR! zE@sux!iH|3Y0?`ND!#BmLTtv=lX(yQN#_->Bhp{P67Amzr*L|wG&n0APGI5}Q0uFWNx%>+sF8K{ID+jj(9PYm{V=GwRd{jvvx^-HuI#&!Dc%yOu4RmXLk(0@N zZlVHi@x43pTuHM%5JQ^eqFB30$uXZiA4XCN)49Yaz-X3NqXWXYn)y!oi-i85;@({q z`(7$khi7+NcTSyrDQ zhY!@u)7`QD^XS#aOtGSUMI}7>kQypw=D)>2(8m&8-~X-o>XuNIcmdGnd9xxdqu^rs zW1Xi#e%itCykWh?Yf^9J30OA4ji{+|&+R`P-Mc|tL}pX(#m{~VxsdAbT>$?qhSS?- zv?JF_vU4)(z<<`#6U%hLC*Qa}quwt$ksw4q-)TEMN@CC)NK0;x5}38kTx%j<#B}YPvx_O^A;7?+9bOB zk;L%C@1N9FzivRC3aI<~Q_uSFu-p^|Iyc;d3ZE|TEvQ9{(G&pIYg-%;jpj7TIYXTXN|rro*YESZRa<8o%z(+ zKbNoA9UybC8RqPCtxoYXxIb6_j;cSUC)o40?4dP05w8XicTwohM5|7p#NesFt>E;J z%tPG8%;`7lOV!oB+D)x9J4gn1*ZRPy>{%od9K>zY!F#E@@EC0b`szr8k;LJvHxaRb zY&>XbzeEK61M+CqU2AW~3sn4kOAj|Q94vU_plz0>D4&(!k+q?2WH0!)ingYKa)UVw za6Vg-vE~HPzlQyjw;Y^xUMDEQ<+ZBbYM5{EcQ{U1ps%mZFRJdy&qOwLwA*UOs&G=% z$FaYut)gq^-b~`Sc$)xQZ=@7;UdI|iUmU^c`eUf4!L@^Q4Hqn-O|RgR71{;f1$YoVQYljyZ}E2A;5ui$B! zBF8jRv(K)SvRga9mm?CTYQ*3KB9)GR#;+xQJ_pEYN$00WY{Plt6fuAHy#G2Pe=kM1 zpFICkRe;Ae{&nSd!sq8-r2GH;B~tz8PVk5M&sF63cRK(3Qv9azZ*j{1+(?!+^WV1q z&wXgs*Z=)E|G5ud+^fR1|1K+n-}19C%Kr~PN$0aG%HKx?((_1G{4D;+uwVa$^WNvL zP4icU;{GTcYvw-`Er%<5Rk~Cc@3AJP20>=xt_Z3RU4`6AflC#VbjHYsvnp={TQUzA z{>Mar|4~OkDJy2?8^X2Y;DC;mzbufOYk!9fL9nq%^` z{QHdp?L}QJS0dJ=#Qekv@PAs;hV_Gjf*@ZKH4?&IZMBQLw^Qfq3jI>98Fv}Dn>geD z!v&!7i)8RgN%kcFzkUVnHV1E>OAMS#_wj=fJ zOnyb1l>WP#_&u@GH7Cc7ACE;~bTE0e7}iF^wf?-sp^W5X@x|4<+N#RoryPda+N8Q+ zo33GeKuRP3A%B)nc{XI=}C-}kkznlBe_Q3Z{w|G3I>Ew!|W>>br zQ+^mg&IQKxto8 zQ3ptVh7H2Nokh$)X|>KY)|h`q;q;9R$7yncdqf`SPO#g z7d}`kiC+^naec$5$R?^ERb1&C6_C+xyko%5&KxS}R-vZ{uPqG>*y*fhd^>zzdqq#^wHRSkr z9L!}F0WrO<^zQ}#Aj0)h?xB3b+KK`TlGiM1)ox#>{f5aN1(nLAhtQydu)RprhmfQ7G;w&qzesrK1#`?92 zWk&A|+%@!lo+*<}k9u>nnRI&k6Wz%!^MbIdgnI2RbaASEptC;nQuuldmaIlBmyT&d zV!8T3gK{^M{)UB~{7X4XY}+&cv0fl@8;|ecy96lqBY%8RT#J|U!&@Mas3oe5JiIdC zxiduyyzx8e-!eY`dXKi>S$7pT6OQ&hV7dW&x{&JY)0ZoF*CqxptFgY#(!8|#q)5r`;|M4&(d|Cf9-90~L0{)DE@u6*v?{oXwCKHFOM3fE zK0g9`X0x@B4bs^48T&iq-fh)~J+Bk%41)U6`Bk$?gyEy#%YV2wS2Ma>upAOCS{P5( z^HLwC?dJmzmDLl#<^@)0+#b2}KP*!pjM(gkY*!;nSaK18I?vHk1A$XQhVM#yW6zHA zXkTlyhM{B~ozMF(-7 z7M4{-qA*ns7Kl;Jb=+b%cc`4K~dM~Mk;x`FejbH+bx>d>g!ALLNT=V51RC6b~nnqm4HwNqc zRY+mRu=o+VKVFN{%ho2y--mN^3c0Uhmkj!A-I~t&HM(Awn#v^P#&TPA(fg|~zspT7 z^?dji$X`>2Nbh2E?BL7iBN7TGSxSvT4&`eG$Q&J!Pr|-ghJj8vi1h`(Xk(?jz6y<$4%>szbsO74Hs!pPD9Ii-xKI3Dp(sL{Y}rGW zN)K}{N3{g-E+!WXIC6h>yXj|jpoa{27OO9NbbhL%X(0T!@aDfEnewNzM%Lnq#IG7q z#e5D`O`V23f&?yO2MBS!yv?LL*qqov`JFS8QFN9cvSRb+9aAEbEIR4nUOrm>;y#z& z3ap1@A=7%O5!K;oH0gKOH4lS~%I_NT81ydu8yJlGAuO9+PA(2Z?PA1Leorh$d_#h( za(l;A+5$L*IZ)o6bj%CE0z+Dh()Xa{j%g=K1+& zG%D)Ef#e*`GY`DrCVOh{0QVD}z(W}+6^jer%@&4z!`YGaZm@*f#SUMoQ-$@1wostu zHjM4nZ4;x5fSGv@W=)0M!QHuuU>{p86He&a3Z=7-w z3xn-b6K-6F)6F=Hwegj_e>T(H^Iw67*64)ceV!&f;{uScmNV z(`khXXfz0-s5aIP?%4dw^sDM>?_%k)9~Dm8mx*53&Q@v#_K|pr2%mli=#kHKEejqJ zjwlNEJLC-0IHXouuYM#;Mt=_E?pit;lC*|qG z#>a<41^qI3J${A9l>uCt^0C_muFLeh?`V&c2xc|spKB@#h_?*6+-Y*uxYUhxFx68E z<)22Un*(i;wcJ4?V}M6eqJyww4rA9ky$&ReqR}znj%8lE8#o^eRN?dSjWOriWIMHo zyZNaM=@CFupuDoK??671Ubf19CI;zw=i7(nvC16f=p1a>F>{yCBqx{1Rrgrvh_fUf zV*eLxpohZ->n7m_Q`&0p1`Q|dq4vWc4AH*x4$Xjy0 zF#4$MDq8GkZ(?HDU|x|;^^*SNM24Tv6@_S6!R+TR4^>c&s*Eg`4eTC={8$Kc`*FQj(YpeW!fbKvIXiZQ#SGj&}xTrKN9P^ZIo$k?+9 zA#?k3e?;3$JWxjDR7O`FX<#3fz((8H(jlDG(RidUDyyO?K;UpQGpmIx$H4c@uZ$Kr zfw$Y(ZXRHk{8W?SFHIvXDoDrvLeO4Fd%A&ZeS`xsY`*#7SFfhz?V`uS{3VOGP-O>L z`em@;OJhfG-rYPLCuS3Ywvtg&)5b8pta7w9OodvKO7`~ayvz;Fbffo_t2^a1&z|eM zYDD8u;l(0oO2?|m>ZST>ov*q`)3K1h$al~vSAhNUN>rAk&`4I6mE;A_$ueJDjTmuh9B{d{U=xw zcP^*u?Z{(4R_fEGdwX7D8y<({)TxQgh(qGM^1P1FgF$(PmG`c*MtxvPG^a9vw5|8% ziEbuGNLJgaTQn|-yNg$I|+F}_sI?#=l!uae@?em`pVeVD&qwMRTQ!oQ+`)~$! zaOVdQIsEi}|DSh7{caxD8N%26@IY``sx{#ThqQ4&KaRl_>4sS-Ky_tv#2L$xwer-> zhYXGv(+A`)DkU841)~MwnR&Wo(2f6F-DNeaBLql<;BOaF(f+7YA*aKyj(Wq*`{En! zJ1uRUvL6ntMhycP!H!;!ed6cv4y6tb>%FF~jYDX~JL{J&2E9u|2r3Pw=9CEVw0rqk zi1h#lzS`DLmMHx##g-r3jbFdwPIsn=jwYw3H4)t3vMIZIhC?u3dn}BPYLN6FpxcFf zV{jyp$e5Z^iFP(nFQ{|q!EZ_EA^~=F5m6l8uZ`}|#wh&H;-1MiN4}5pkB~0aD}NJ% zq1wJ50ZxPi0z!E>ibi1~dm$BVixmLmKfPqn*WeplKG)DkNIwx*i?SZE{)nc~3){ART;>0GVCb!frj6X^nK61D!w!XKOR1q=7bDvgDyZeT`vE>yfJ9nO zJsLy=u7?Fe^Vk7+B;^^)KiY49xr#)r62+7Zcztj42wS|6r1asx_pc{J{$u1oDJOE{ zXs+qu{@1#vI4TKE-XDkB=|0ol?3)w{a4D~Qg5=u}$#=+y5i9621MJT`IM@Y9!jl(Z z8vcj%W83Al4n!RyIuCD%S!YF!zf97U)ntr zb1bV|*@2BxNG?XGC(IBmu0;8q-#+mq;&3huPGBP7h(?pjDF*8IN$fxOOJGu6k>#}A zF#i(ebkMD&v&A&;GXgf5BEWaNK;;;qUbjk&d$j$sV@Rx5C|8?jQqwE4Dlvwn60?;Z zLVLvnBKAc>w1A{%O7WGvHJ*a3AnKiy@sfVv!}Sb1R}YEuki{x6ndz|)hkpFkn}j?c zxarFQmoy1=o65@A)YSZeFCM~ZdsJ$b_vVU+ zmj=ban*MvoVU%DsY(`2fAZk*X7Uu$WBc|EP{n=dqYhHnRM>)mMR6^Eyh6?8J@!r z5vQ~<+p|RjZ+fxqLWth_5;kEImM&#UJ@xknJm+OKVX2(>eXAqqw3xk#3>#*dn+!dB zy5T*F`6Y}@Pi;0ZjK!erWgrQ&7{(;mGW3OZ?;alrbhW*g(G96?Z_>PmK)#i-Gxx44 z!Uj{N+^ZOQ)i_oEw?d)2uYRp%!#qnw? zS!xwVo3Ss+r$cLYxr^05eE?#t+nyP4Xp2bGqw8SakW%xueM^Jbi%b0yDIQ}M2RA6&2(jiJlgpQvI2{x0wpq87 zwmQ0*21668&~*wm1Ih(LG1z@I`4yQxwIVH#0G(P^yh!z)hageSlC9Y71E|W$f14^@ zY;kSg9e1pTQuZ%MA=R9l2Npg7{fGOuxv&$PbUW2X8g@@9>nKkLR2}R<|KWS>)bL}b9e5-#R zer}mtSnko64z@B}B|y`FJYFGLE!*MVz_*Y4EoTehbC_bw+mDTzr>0BCluqyU`g|e{ zXSs!FolTbyG^P+0TiOef?kpiMFADbA0)-b4VeS?7zOG)7kMudCD!e>soOV?f?^sa5 zRntZgVmN&}ySFKe@BDHQVOYtFoc2ptf&fA9w54J|f%M0|KaO>wEwNS~U6kt?O$qveso%zn8uVqR63YQKOz48f@Gu=&QhllNQpw`Wb3K@*tb<^-YDFx7WB+p zM%fw~=TVavm%(7MBPcAq#Tn<$kj_!n#&bYpH~AOqkiXj%Mc}bBtZbOOlB_x6=%uFY z{*Bh;tfVhCTw>?M-T#pE&o_QS?{+kVv>cCkpM*}{=%4z8bsV=iaid`Xe88tbdD>m~ zr=A|LbMZ10^V>73nC-x3!`{(utH0-qMh?$)d4{`@cjRe>S5$Vj#Ysqlcld2~d-zkP#4me^uJsHn;Jvx#0!SL?jWF^He>tgv(1mS?GskR&1uxhPshZLS|-)echp-V_5NSUwYOB1$bOGg!+tPEsu zlW9qn+{cVnX)Hmg4NGK2DJw9cxD9$Hzmvlwi81d;4ApV$GLIJ_;|YF`$LHvLRUn;b zaqFX{5EPVZB-vKS7xKAqLdWb01Kt8zRU)SVf zs&@`*yE*16SN)cR-dz(l$!8%KcL zo*+v6y8asCaeWBtLb&c#!F#2r<&8`_?~g#^=Ih9V z%sZ(FKe^?~m11?MsrE!ez?_2L@%o;!4A11I@e`~&^6&*Kw&{&#)4|fFq?2Vs+V(c=E;1u=(VOjgxOEehh?M9Y+w1AYG(&Qp#F1m z-i=4YLWgaUJ6JDlBM0NtgT@3A&v(~t;ZJdW z;Sub|@tY!kHf)7z_8iASktIjhD)5}(5GFk3b9FGo#vRZ?V?x(NcO~=rZYEb+f?6-2 z`fJNWg%c_8I43ttKbP%8+>5C;8O=3OI)8FL%~(@6=XKk-is&|XEX&2By40m2iR?gA zPr>sS39%=fP%?NTw)T*vYs{%*P2YulRaAHuX%asiW>3B={_gzL4)Cdlut@tlZ5q5M z8ut0?ubTS2BGT_2fp-(Afrk`n>=|wm?j6yj+N(jD$4AD?Uw)wG`OI{8Vb;Iyd%i#g zBdRi-4F(MjgXTy>QB^T7Tl!;|5zxGA`(IJYl?taZIc9D5|8i-@v+C>9FG1h?9LWhC ztNJtTVIccdO!zn0hhK)ETA;gAW9w9)n+=C9{UiP4^`pkD0e%!!x`S!+4Z8R zpSU>UL7QrLN$PW+X;k&|cj}ORi&+*$dRq_eat0vjAtx1mxPiFAaQrLtSwiZ?U;J)? zpv@R3Nt$@JZzU$SMDHY;En71-8|%SGM1y* z4>x+YWBL3kf7_;!C2LsI$a!fIcf&+hqBQX%r?fHZ~7Sq1MgpVgjoq zdf{Uyo$&`Qs#Cr|cXyKcdJ{}BiPa71=cDuND)an4XGch1Gj$CkhDK83SXxv>Jiw8e0aSw%=FYmzXm?IbWCrZRhm&w&v z@i+~HKTKC_KR7$1Xq9+REf(`!L!Qi4F7Z_<{lcl2+RPKxG`vx<%sQ@Dl{BR?n7m4F zmTz^#-Hpx0V2P%`yh(1M?{iEUdh%mpF5Ek@lNdhEd#I?w&9GJs=&o zmm~C>4Ziw6Cz+J-*^#t6KastxOdM%ZVYuevT#f14-1x&Q_{Uhw)vm zgN^}-+X^fjY+|%Tthwx~ilRpH>}$Fq8MsA9quFYkM|b3HS-O1#OWo7T?oSz=qvWM~ zwqC(tr+xYrEA0S~dKij$d9LxBA8=+uB7QWt)=WY3(0z29^Suo(!{Od{`43B?w6m&P zw^)5jf5{mvxHv=ii^M)=v1+3IQk^CdtwVGo}>6EwRXju}(CUB@{>v zRWMg7fdhd}X~oF>=Gj&{tdbGTS&{Dj#HhnV@sop3?ZlM(GuO5TwyV*-F@oCP<-Hp) zL7Ks$($u`7?c^E5Lz$9wvB(uX^p*i>4df%bE&ZN3;=9o!R*cuL<-~*(*m*aqW<^?J z_ljA}QX9rgX6S#txM4N&i6))glnk<;YVh61MH|i9aP~$`Z7_3SOZ^ToL}9mA_zxGr zG_{V8^nGENs9)IBdloaJK&6%@uf{GbaVW7hU%J-4YCcFpsHDGiEO1U+-6>x>p)YNk z<=NXlV>P6Xv|C|pT_KqML$(3+#Xvy#5~Kv{2}mWZ?X#v|hLzRDbm3Iyv3EqKTBaGi zM@^{ehhU=JX3L^Owcfn0wwTnwPyF~KdlujS-fx0;94p3*;Ao6E2iSo0mAyjYZ$TT^< z=2YaWsvM};bnO7Oa9p{-Tx>+Kww^!ClI*>!<{vIO#9gw%Kdtq9^W302+Xu*hISg+v zKHuV2UfWN<=}VFFBr;S0+E9Ft!gnKj+w4VtwfGur9P(IIhj(d4N0Djsy2K^>D_a@_ za*oZl_bH8t)4`o?@4Zx}4M05@lUF?wK!S{tk4aK=xx`n2+W))bt`bw5Vdf1F(HjD> z8{VZD#V-L__ZWbBUTEggfU_TWNjna0@t zuUa-*XSxF~eXM-_r?4;q>MyPWf72WhrN09YhliB~fe}V7kTUq z9^k2}Tm2@Uxz5a?LXhcBt(P5(d-{3CcF^f_mB;G(rzC6YzP7aYjA@r&FOksE-@lxc zwx<30)1(8{WLf{}%ct4epJ07gq8`rV8nFGB*^mhBk8xoB{r7KPyn82_f0Nb>QpQ(j zO#1rb!4GU(*5ftmGAd!YV;0{q<|h@X>Fgmj6inVGz7#*l9nQwI+^6Hu*^S*0QsHxI zqH;VQmO3CSLS9bHvDVNN8Q#&P>NwghHw@qJ~G39w| z--l7ZT_PqtA&^}p!?|HAmb8wzB0aK#oc*MBUZ&Bvw#k!xIQqMz*csV@qvg@@s&*4) zSaMUa*YlRgeQ(?M9t!1W<94DP@Ps(4KY4!dOCbA9OD^wn@*anqZYg6t5aKu!=-}B> z`XyBv;f#mG7Eb9Ay_O<;?e#v7S^NJXL#e+RcwD$1~wPx(63?=@2ELn zf6=|tS?bls$2D@DK5KZGm{92^3H5lI`;p{<5cf#6Haa15{^}V+XxHA(Kx8#*7m%;Q z_@IW~{qi%r;lQj{sBkk`A)mimj=XF&@{YFJ?a1{BzbduLQPGL8cEo^}8y2jU!B;!-Wvdzxkejg0W5A$6{^G zR;VK6bBt}Tx*-E1-!oq@w0C_w*BE)x@>$-ZY93opU?Q)TEvRG9QC1D!3ybE3L&w#eZyu!p@<)}E>6v(3Azx>3ougK{MnL(3HbItgg~%7 zbKXi>zInz;CYq7(6a-O9km3Abx21_?PwPQTQ+m&-BjY@v<=f^)?D1Hh$exEWf{|LK zlNI;s^~`ay`Ccn*-n=y)T`U={K^pZ;qnvBK3-7h>D{k8= zwO=fHf!XR5RZ(a7!|F668g7SKH{Yrq#MYsjppICcbC7M7uJ_S*Xt-O@V2N7Vv(ILC z4abU)mjDgHnfcN84Bge7eL+sLwb0xeTX(n&U`lHDPU-Vb0$}QeYa8@7xka02++%!Icx2_g>D)K6dNiuYU4QhV1uLNkfoMzemXe(FHeCO7rbP^f z>;CDDJUgL(WkgFfJ_La{V&_p_9(9~4emu>+m6MP3_q{n0;Pk!q_xclMcC4BuUcLM} zQ4dX#!&T;8YNmJQ*>QCSE@ldKR1<+rhAt+4*q&HrW*y|_zEZ`%j;*omybs;M&G+sG zGmmA?ndlL&yGcyg6Mu0K~y~-ulzy5Rb#;i`ffa z_JGwnM}ww?v?rAvLvMX4AZgKpBHljLhkvi&PaBO*1&-y@$)u4nJ|R3TszYYbfDV)RwdRWlC%zK$3#4l1iw0u5%$8!XKY&O}l=oiTfNhTnfCM4^;E2 zu?`{&_#7W`R7S0zoUKR}P~5hxIm?jNR`FBE7rkWcj~{pj-EMBx7iGS(gb*MQP7`2s zYSGm$U3;WE*9r6HGd!wfFjWbp6P`a2bUR?(W>frNFz)+!p&QNu`i}VeA=J?uV-ew2 zA?nQ}LgG_z3Wq_}e94?ICDg;;{kG*JsMKK>R;r}C1oEB~vipOOiOM5da_4!Ij!US2@b37oF#fg#w$cLafJ|mYED(t)rVgL z`>NfO%$zltDW+;)LOt`COt~Pf{SOyqNhx{s&~j<#bSCeD0OrV@&K)sdLPvmhLybSnardm)5H$QgWED^%1x|Z_I`Hfs_V` z9e5-)sc=1L{8%-m&0dc3s{LTiS4#f2#+^XyWF)YA2xcBB1Vl#gE^qJfcxDfWJ}<9y zXQq#>@=n~AMNS0}j{IFknqlpwT*37w3%CSfiTm|o3~{uBz1>p<&bh8Dh8i-OGU{)& z&fP8}H9%hL;NZ`$3@@~W(dCZP2RkA8jP6T%>>e}$sWFB-LPSaM%2z}Y1zf|d%4U)~ zBM4jE$$PSefcQH>HCb0+14Bc`K2rJIBC;c>S5+q zM_Cb~lcI^Ye(-kCV|4hbJ+K5QmfX+Ne$@TEjN3cHB)a+XGd1hhaUq{4Pr-4w+jFj8 z>az#PL?5yEo5av${qYFz_1tn}dLi|^N@o=AN$P=gKqSHXgz8u1k1{J@Jp(Vs*o)$y z!dT2)RddVmFqtK@*FRi%g)DrC!bC2U*DcKTNpy!-^#a;%hRyH?#Qf<|ZMQN$+V_5F z(^q5hUUW1M*i%WS`*_fyu3CY@%w^kZQCV==4=LmD%&{cq>YbZ}D+_tg_&Ng~cBBIF zeboB58L5O_P%B2WtQ5aw+ZH37;QQGobZM59GUD6*E@AzJ&s^pw8G}7yN_}EpoN{t$ z`zc3T{NfgS$l|e;lCWF38;x1faN-?`2SQ#*>+sQByXs?wce$hWBDtHq()&44P1|FE z&F~a*4yLk}Ab5VMec|9HawbuW5Sbydu2TPZ=<#f@ybxD)*ShWU!U-q3JX)betlQ!p zv32aKdj&L`w$p*~!`nnYRJd|rug|)GWJr3j^^w;t4)#gy;}0h+_qvfH>w;HgKN{2j z(Eg}Tw~+cdSgiYGcl4G$loCj4aO)#~=oEhWE~C}a>}L9dNpNXY2vFGo5dQK7cliz< z19)4Fb2?gUXIc}099m1YcCw41v%JIQik;~t_u6Hw_6tBmb96)K#_1-#R?^Sr*1}kH zmEHA?WGCM9g5fwuRq@GW(peSv7 zx*Vj8jU<_W4vjCqb6`t4KaMkSeTn49ou=FRbX?Rn8x6jdX#%?`MYn!WJlWhke#J3O zB?fD#7A~{!U@QWS(a#K#Lc?ipb7oT{&kcm{L+}K~&_gpobX*u8_#zPb@);}K+?@}F ztlZRnOpCNudBsDUPXR4_iuoR_dDp)p$%4?30ZseDPXe`O{9IrpoaHHn{C%K|&B6FnLbpJ`gk$wRDWq1QFWT{WR!bT9 z2Q1-|M^1iGWvBnEC6uQqDRbxS%=4(#b_uqIt_{_&1$^?5l*~Yo$7+f>r$Q}}8}hO| zG$`@pbzVYNw!V-gC!&f(`s~CsLM4krZ5H`3bMj& zO?*Vwgu@1q0jlaD z@-4l5h2s4>Cw^j=;@(7K0Sn#shz;&yoN(!{a?Q#lebzwgDfMzBL}UworM+3c%%PGg z5?;&p&kqN+B8k$RMhARrju#jIhpn#+i>hneMnDkhZbn+VyA)JXLb@A7I)@&R&JmC< zm69&$?q=w221Yt%Xuk3G_I;lBJ-+p0W*>9RUTf_Y`-*j**EI&W8?HlsnZdj6+&gzA zJwN&2d{1ECR^)5v$?ot%@8XmmjLRJ+(T+XdYBFLua)fYUk6K@H&OTL^NtHajenULc zQC4FsoNTdRZ+!repb%sG1bEzvMb4cQk}j)kwcY+QC19{5rsTc56sB&v(Gy`lr#1KP z+8?Pyb~M6!Z_BW=$973CEN|-K%^n-5Y<&FwmBWs>{d1+F=UoZx%J$2_8{*TM1RWeQ zGZDYJ296aXLJC*TuFSxqgOa^Q$t${FgBQtjtU~lC$F<2C9@vZ~!FSLaT1lj~>V4k} zVrX1-&jn$(Kqus4ZbAcx7%BgSbXnzt7si_BmVCzX{tMp?F^_bmFtbNfyautjXfCna zW(SN1dqi|D1{5$zw9X>e+<@Y{26sarDUs+UU?tZhv@g%INwe8aWVCxMJj@UIaWg8b z%zM5H`lFNJ?~pP6!?1#Wf3LDZp}MhUo$>l8J1K>6TT)Y1T3#9|)$nvnAFO6XoIULI?RHSPY z11n>=`%_Nh(gE7lfQ1&yD{iy)pG*TytL>5R#b_X4b24SSI8tz(qMX z4AKV46cG>8CUdi$9{afV(dyrYtIQRS#2;GC&JR-%&GUh}^-Aks8}wy-XF4M8dOu1n z7N*{UjaXL)vA_ib8Sjy#a=8-ZAUM%I&yGVVzfYF7%S~Z2-X3`u3ra7Q!}_5o+GMCi zZ=yeT+14QJ%2%6HDZ}3dr+7Kl&YqkE`G4mq&wJ8@mO5SPY-8nj?9-XS8DEzl_AhvmHttqT6zbki$B-b_FdzwGG_O+>qv=9KlBokLY^IsNuD0lcM2hq%81D8 z+H|9a3Z!{F|0U46BL3Pa2&(j-(lJ8}C_9?KHZAepLsz zT_V_&edxeF-e{*3{*>DzWw{x8 zd^niBy~QEpX{Lk9)8)9n5p8=_LKP3ZQ!*P)>~4%*&$r2T_16;2L&`_GzPUCnQey6+ zP;e4!d;%;yeOtmp(R~?r<|QH-bQkvY`v*^IHRbEkIc5d6x~Nmd=7D0!l_hW_|v0Ra0?pQAM|C-x*5>2c4J{b)X8}A zQZ|-*bhtN&4x@_e@XbkzKD!{Ww7g0NOMU(1WU!0zz->QNf!UALk&pvfb^ zJ)^KiW1Te|c&W(dbt%sFh8>Gr*mZ{)2TyaP3sg==M0R9pGSJLaS9mo$=K!q=Xdwo^ zzQ@Xlc8{{HcbV3AHkjU>>A8iS@@Jv7Kk8dhEP~AW+fgoFJG*EfSWXOWA-&25bX#^U zInj^|bVsp6Eww*sA+>glqWVxeqq67qG(XsJN&z}t3Gpjs6aP_wCfE=PP~+Ql$IV1) z79#x)6SuBat}Nj;Bm?2@QEV`uR89A23Bu3kg`(oPpq%ws=@7p=q??eGEHW9NHLC8c zM+IK_y?H&uZsx(69=FtBv^DYr6*bCFN&*!FIV@T$>k4R<>ttKK>lRy$e2w{R{s{P3 z`Q6hVE!m|Ob2}IlLnvOs(~Bd|ELkA+h*8RmE4JagYc&$;{yYNf=3TQ>%=RADx6X$y zD_0j*MiAR(95=HG-uR*pDu3G93lRf+!xX+`kiQ=ar0hOa^9K0I$pl?LzIFXBPsnMn zs$kyKFBvYx_%0MPt}>b1zMrf!b8xQh&W2{mq2R+y z&i=-!?~xKEP$&+~E@C;Gq^i0eIoiMGsKs;R_LlpzJ#;eB zR_&#IrgJ-5bu5oqEiDojx$xx)o(lUFi-Hc;vs_chy_n`5pPwk!? z(sai_w{E?-fo*JDS6CV__R7}KyDr`u#CXyaq@f)YG!WbX!dtmp=20E|`cP&v>+OR% zp#4bv`S2 zu&uAWp(+)yIO^YM6`SzXYkM9kC**XD89sG1fL$-VsBa;U04v*KQHr7k)U-V`94h`g z*j&AM!||MB*H>gPI<@vDj@19wzW_c?9BW0zgR+Svw~#v4o5bNN2vm{Z91$A*;9Mfa zT*fxIVC*-oq1{X~LS`1h9X2^D^*J)*fFZe*xz3PU_J&}CM4=w?zIkZ2vgvsyG;&IC z8+8pv@wx(rM<-_`yY7$knWdcAw`?bj0OnPFSkrVIAWdbr{|j&8($!>f4+r&Ic;ZLi;20 zGH(=Tf6yl3(NT zFT&D#Ch{wWt>cV(d@W_5^BSm_y1!^qB{yV;2gmoUC9uUEe5EVms7K7FQn_L8^z3SH zLBT%GT&~X7=mJ%Rz5q3aOt`bZBWBA^vD_-mUyW#|#y~ z91Plyv?2|D=>^OZUDh3EsWfCmJ=U!;i(K&I)lLtFuYpyAj#sUjeLHr(nQA(fp`DQe z46wSE12xT-5a=z3A&Iu`mUlecY+Z|#Egj_~!Q$Navst^ltHU+%I8JrF*Oq3)i4oL> z(=*bVW-OW!EcT9ikVwXc&sER~&Q|%H1Dz#i)OFM;2AXFo5w;?|mK-i-C&Fy7uo*nQ zuOH`eIDPLv*neyo4lHjI5=>917=JOzZ=@9&_xLSm`uHSUgLCsiQv9x+?27h=UM`GC z@3N*M+879Tdq#I^{T2F8bOS2lo5_hZiCQs{RBAEc`3ru!zVzRRG=SL6ZC(zBv_kb2 z%i}{8PwPdH+=o)Sg-Wih=|VStO$Iu;Ow%v>o5XhaMEzXaLrx+%!rX8N>zPa&(^FM8 zG(T^aTH?F(6orOkncDE9*o*wn8) zhXusR{2o6JX_`-JO!#q2z5kr`kt-JcEm~diSo2>j03JDkN=7+Xs=mY4O74gRbxU}E zc0lPyQ)&J-T^|X0lJ8M}Jg3no?_aaZB{SK$h?YSLf1LW^;Z#EJ=BsQ;Kq?|ZHp~Wt z2vg(Q6W6R6{;Ww~TRYdaeF&~JRvx`#;#QEU`NiU?jzjG>clKs09|Bk@^3}A7=IjgeJ$jC<-0q0 zuU>h}2{z;@>b3%HRM1`Qs+g+katng~3FUzZ1b-&{bikJRFx!=YG-MGV@xzL*z)xf9 z&h$^O{(j1pyA#FFT6Lmi9=lab?UEnj{At9{alP*d?)Kz2jOkCAP!4sF`j~)DD_I(i zUhk|{hmJ@w_TQyN7tUOcUXMSvP@j(3u}t$%xW>QjAjZMUFroQyvq!)=)+1p|EzaTG z#=dMIgxiNwSj1)fJ(u!P{67&$e|xw7lw6^`j{@ay#l0t;IHR0Ql+}1BlbFv&f#_EQ z`$N^UJuV*6ij-#(DUy!J^jeI^b72isPtLa*F~6noc2jeiV>d}_RlBKe#fAN^-~)7Y zEi?Gcg;ugTF9|HJV3`w_RY+rJPhc6EH|1{xl@SP1NP?^+g6Fqq}Nav89c)FajZ`zZf> zLxnwF4ear8Mq6dbYKKhl9*sMT<1OCx{jKiLcU;!^71TZ3=}@?<#VgOvwuB^7vFJH_ zrOD1%hk>yD8{r%=e%b$3@2gniOrx{wH1a#Lv6ZR1yo{KrT0VG~bgkw*B0lmt^r4Kh z+cL<&=|dl9G(P^Y$QBZx|AEfJ|L)u??>1#^qqe(kCdmcEX^+S5mORE1ZHQwlT;{Sz zyiYMxZ}#~e!1A9GxA_jX7^KcG zJY|`9KTwf%aZZ*I%pvu@?Yfa6S(`==LY=PZ{Ezqge^#K2xL7B&=Iv?6)4>C5s^=!J zeLN~k12lZVV$-T|K!&*Av0MLB`YXRE#?LP27p28##r}ul`p>vF8YVN8=lEtiR|?^6 z^b8!#cVHNu*NB;P?|Y*L{-0`i)}JKIzA3A>W5_ln3kH8CBgv zTZiP3E);JaMgeA5`p;nfzS@}<&2IK^*&GMOZgosbI6FFXy+O-zMFzhS{=t3N9z7K5 zqU$y^V3U*141>@N2~93NIdns$oB8iDkuKulu^}*v4Xb)zP%Fgm<2>JD9&Y#}vq6fe zs&w$esiJ`S0l55(lM*VO?!zOD54?BE60V4EE8DZ{{$0@o4Y4J$1oi&}RSCbva2NHu zyXf>&0^pAXTueDo8j?AW%e6MQOFO3$v!N|5MZ4va*IOP*8fk6(8Xoz)a)J}P5)HmcV8EVrk6_#WPWNYL@9cU zqW+zfIH?f&qGq&yoy6{BA6umFtgKcC8zW0jdoIc#CpM{EEmIqaGW(XDabs$+HHY=C zO#0PozS&cDB!T^Fo`~e)Sbl}SRsH$i8Hp`9r3g@<@w6mlxo2dT|1N1jYnV3l7F@!x zo3ZW-iUYEpop~MAz8&T$y@UJ+x^?Y%dA|eg@9A2SGc5S^?0*LKpNm+a;iqP_)2E(d zkb6}Z1q?6G$%4FwFa^2iHD{ih0@le4 z5VN1|4mxf8l5wjg3eqO}T%EW0SA6{YC~+$#whN(kMbSToSh>)IPFAGaJAU~?R8+-q^aQg3Z@7CC6U;lq@ql}f_`c=uuVrs1thKNkoS7|EK zcmCfJhpr`__5Vgo>SOuiZTZi0NGK2d?-vpNj`LqZ{kKIqu3m;sr@odeA^%w7reU`GehO0L9|puykP5ZVBja$Lp(Tr8Dm5M3509)^(%cT@en zBT4>Ma8h`miAFve=P5C23cbC(&BFQf*7r{R$pUw|**ZDr(PiN%>>e*Ip#M!Eym+_h z^t(4AR#?=$!7K$Tw7hg5cSsGD0@^?-VF+dG_ukvm?OF!vTwZHp8XL{JH%Z)xVzL?4 z9G_4NDE->M^qoa=#G2Q?x|k31`~}}A!&Le`Vwry?0h+??){n;&O=H28vK6xyU+g&Y@Cs!iJd`Cw>vds1z7Vg99uHX zRMKzf2nD@LeLndYUmG#gSl|&u9v@X0Z#PIB1qBTccA$1+f=`ZKTgB)nkgoWP!i}=; z>#L@E8Fz}NA^0yhe!7W0R05YfC*)iRua0t5{Kw0 z_%P_;BcU0ZSe6K>Vn{WcLlcb~9afFGxZ`VELvI`^2<*#D7q*Uj^$qJlapszz+ESyG zT^V_YQOdv3Au>S1ni3i9*zIid1M$t5MGzU$!|&0mEi6400!QBDN1vEz zL{rL$7tL2S1^+5mxTG!E?$7=lE=Tw;aHPDBk0`+MYsf)%*Fo+wy0{eRSfIh<|ueC&y-VW3144JUpQy z6HOY(DKBUgkFj4|T}$jfvN^lq+DY-RJDZbt{&Ypl2l6j0$ia_W*^YMdT@D;HI0cE{ zR>-(Lx!aDWdp;2?vmBJuY5xGSWkHuRlArJidG7v9!qkPGEO2QxW@$PkVox-EM)dd; z&(nc7_*ZFQmv&%(Hn;#2zDzSP{8Cw%+W%8T`?R+HT(vgrthO*Twj@0!8c0m}Z!`4KcTN@azLgle(Yf}E zZ;ihIC}d-BhBva&483B}ru2aI#QHPc%T0q;*6A2jIy%{)*-MiQq@fv&T}fo>-agmP z49_LQM~VVlKGiI8gI&9TaO-G*Lsr?Pk(a2<&FwG%vIRFeKee8ogiQwJ`{* z@;9J?11Ltj0?V6@ROwo@Q%C{gQ(!eCBmp9t=d`9O__|C&Xm1(_=lkRyFz&oYtffFc zP&|D~C2Dsy)bf$z?qwv+*OqpR8IT#fClSB4yLI@o{F)n1OzHD)-g&Z??gUb&_#5)W zm3hp21wrsp=^0`XUhgl=ps@^lMzkn8#&ssAis~846RLwUh7Na7# zPw=O?5IpPl&abNzwtzFH+up$1Zg(4|0bm)E4{#aXnr*#G)jH;c^wsWk4df< z_ac_p+@3!3cHcovm+l;1~*qVXCOAjyXyhZhTbN{ZveX5UieqLAW+-Rv1^&1piE9v@U-$Ojd zB083Md!kb*c(s^Z52Et+3juEn9xhE*8t1duDqc7=w1yLNeXcEk+z>8Di6ucD@LL$j zssBb5($dlzc;53Pk#JolwcOx<#F|`wu?jlQyG)sXj(uXWi?Mmahs4O{nPar-R26(EeuX&haT#-OGMp+RrKTxgfz6SIWb$?LLbYE=)7Ie z;MtMq(z$-hV-06U{`zXO(bgFWO}%8m9^&Bzv);=DBkB#2L_` z3L>3w^{A-xbgiz*kudBfTqlfj^rDl0T`a7+JPKPQ>3IfssRb;^)Mnn%c;Hkkr^}ZN zNIOjMEj8Vr;glJ-fT#BW3}a^^oY;|@os}T#X$aT2o|Uhv)q0KlDR&p_!*Tk?e*4hEYw-<#BG{TdU_G~@Qk}rbbj?s?&1{QzAF)~HS+S}bC3c?s)4^N zjq~`MXxk#ax$lv`Zde-_mV&FJDzBV$-$oIS>#Gm3bQ0qxR62(RVccg>VCg7c-o|v2 zz^pmtVQ2Cy2KYOj-L6Z|zUH<-lwRe&{wtEk-yxQ!oZOSiQ8DmqW6;P3<0?&0zxPZy z{;G?123HsXjpa;l&xKIrH7+2V2t5_Rdj?CUz(VDHe$C@RBS5zL#xI#&gXCasZwr3b z_A!5;_61#+1FV;jc?{B1>E}v84Wf-R6>=UqRu4aSqP?o)5&zr_M(Mc`9$O%Ehj&!R zxQ;WedNq5`F!(AYolI@4lDjXAC>0qVHH^TJfp5+%&crh4M$o8@;&uwemtu_aU}@#sg#^@EcIG zE=L1{ooCWj6UZUy95bpZK0zWz2NSe?z!YJta%7uA&KLW=-T$06`A%2{(LQ_0g1fl6k4ai`GAdqBTrk90=p~SwK;866+rX(9jBO(^|c{6bvs% z0F<&%PX}T14j~o(T&_oRaWQ4!B%`B7TOJ@RXju8l`yW~LF(DJp#J)c^MEv*1yw@}9 zxAmsMUn}9RcNL!3WR##lUBlL}nzpufeVev&y@S(&a<2IHE4djz?ayX}NLbFvyV^Jw( z^l_ccEq^rGAQOIN3lbN{K1iSZd0Ch;8pG`UhA8W$GSMwe-Q&Klx^k*=mUpSQu`PJw zjzbBh9XkPNyGbW2E1$etIn%C;e)_$moD!FIV$pJ2BQACF-NpjbTn=9$4SGJVYaL@L zpMvh933Rv8$n#N>A-Y%2blxNO<`aE8Q^-V2;4p?TJ?$q6KRkW|Nnlgn_w_$BE9u(RD06b|M- zC;@RdfH9}@Z1$B`dt1M`6!9!%b&-SlO6A>wI#c??nZgnNoUt0oi`#RfiH~K4d|*Y7 z&KPJ?eVP0+i~2|Bdq*?a2TM(y4*P;5TvNBiGIkQ~JIMVqY#}yJ=QXEIoN^qO*bm8_ zCEqr=rr&MzJlyIk9mCsA1}u%Q1wHZ|&4K>-S~-9dX34=@t20j1>vlOTqAJraOuG`0 zudsTb-w>O6xwXqV#`)QC`!aoe;JEc^av|WfQ(oIedKI(Y={zrEvaZcO@|XF_Y6Ci3 z78bbaFnp73$SVgBvSy+3sT0bxDJ;;u%=c)Vcjnu#vzLAdN!2~gttk)^4zK4`j z1V?GeI2I0w?mtS@vMYy^bJQsbr7@rNi&UqM^`%bSb}ytn{r-c(`G7CNwt#bOfuuYx zKlVJ$_Jc5~vVSrtmP!dguc2i%Z?cSwLVill{J1q5z74^llZY?)coyKX1Fs>VECKM$;hl;7P%E(-Ncc8}D(ay{}S zG%-EnYG5x1xY0=tCt<0`e`wfkRNfv$1kYU>?v@1#d*jDhY5XySCCXYN_R`WQv`TeH zM!SP^@TN~po~eIBH$}r?lo+7iYx|&TBa(s1EY;@*LjQQ96c{9hRBHi$>wHgEB2uD% zMOMyVG`incuZEdIy$K0EsjK!Lm%xtCskzPPo*b9+Uyxq8x#OFut)8y1Zuc#VIC;!& zv45L#6uTc0WQ$cfL#4%)ITAG=X3p)i+}CBDB`Y=gY?Rs`Bg+5ghX+)AGy>c+Z9*%w zF28MO=TwHp?7Wj(P|w|;oglk1U@axN+#FJ?{X8&)&GV#5q@>Ii<tAKJh*QiG$%AJ>oTjA?T%I z3YkDuF>5-U3!<#oRc3k@ft}i}8!B}5jWblaC%LCFro564YNUKZHJZ0swmzHasQ%_z zj_gvuuuugF=jN|fsWK^eD?ZFMzKLFg>3CqH?ew*7m$~>*LIJpo`CPi}iRZMkWj$Ai z`O!T?5Iyvwi`=U3u?@eEq?L{mzyq+PrttIH^>Ud_G8$sW?okqsv%Q+cj z@FnjK+biusj5eb^5a{G{=qTPQRV;JXi3ZuuUs_Gm90kG<2-wkA?YSmYfv1*3mzyWz zA9njPPC$q3-_QbVGe}D~knAwF0~3~=D~J+)ow~ehWwHNF7HYBPejhK^Q62WFdKWiM zK!O@i<;Ota;0UNn(yjNfzULoifMz*~@7KIdid*Ps>H)d2IRbwJfH*vo3KoZ3JC!s5WQQEh|bOUasX zbAm}R_3<&F!RNbGnUK1VC8%0Yp(gtDhio*)v2II zkZzVL+Ge#oaWHnll%L|RsejdZUapK<-bnd`e|{)Thf~7(amsLllRPhJJPy#Yao?n z9j!Qr4Y6(hqG1iIE6dNF?ZtW%Za>*P5|23W@jsh;WIIZ*GPiu}m+@L*L)(rO<+yt& zqie7xjIa>Fe}bH;#kauaa&oF2G!c9u`$Jpt`^kVW+;2z2V4`y5-*PU{)R#AmkAnuDq#xS$dV zipD3`)!AE*Lmhn7s5s;&OG)&`OeffowV*=)X#9}q^m(TCQH>YKMq{)6e_QxgwpZ|kbh+-mnLvr$!q zE24anAb8&>Vl3kH>pKq@CaG?NmWh%4Q5W=$f0!}vrD=YX_RvGFm1UEY^Qyk`sw^`* zqD7+jUs3-6$QVfBR$0t2ge-#5<>sp6u-fssqZ?DzB=2AF*fiMg)=}c~paR;{&ak1%w`yzdo7*O0Jc-|FKAE(0YI4tjp5Emx`B+v!j zvwH8xV*6!)%$_2YLL^V0i)zZQ`#a8mulMv)r1KFH*4d@I6B3`~e8f2C z`?)-f9FYd^yUNj7k*v)+A(d@!Gt26?DW3e4ikCxCtqO(cFBy{z3Ed@nEt1Zxx~WQ) zuW3sv+w7#@u_rm+M)(DESfduy3$1=z9Icb%%lizd%8O_jr3q1SODL~XD2++zw?6Nh z#r!_ZaMlt@a-pkq(Tm*vs9ep|BNQITTW;ghNLa}qS)9Ys6;nSV8WIP_=^YvgOpC{g zKQef$e3OkD;xByC8hyN1`<4sdG7io^nIU)wY#uh(mn;}t>CJEL4$cZt zQ555I$k!bJ3uG@PCHb%o=OI-j2MIQfuHDwlW8p+T>))R;=|;So+etxy_cMz%-%y*1 zV@Lqs@SfxccUnojf8_D*oqoHu+jog9+9v>OB-st+>o_45yLGR%V9Ws86er`gHKLCO zk5~)ee@fqh+3SDzdARQxS$?Lo&g5t=J#p zY@>=77$5*++qTzR>h!d{EG$f3>E}&nSCwk^rsVS z`hn^c8Yy$pM4|Or4Wphs+T-Z5Y*_IFf?Gt=Mm5(rZOW4}e2@Af3f7`n)_`{1;PXf| z{+Dd}LC?X+5M*KO`j>t~%pD`?1cW2pY0-}W+ievgYs=z?;kBC}2u3~n8$7szRLRw2 zB8Q=8t~LZ$#l;ki(bOLe?TM{=Uwo4k1K)ET%#0U$_!uwA*)NHT7vtRk*r=oOzFsG- zi%kem&8T0TGC?aN&SM1DUtmwOL@+GX#LzVf(L}gqGdfb}o-#$(PYhDRW}JGr1fq>$ z?L`ja+xtVMuj)JhP|h{=|4`0b;*nVx9!Wnl`PuU1<6}I$yeD+6+AUi9COx6gzZt#m z@t?+Y;V@9ce^f~~kqeYY!ayaECLoyDgWj3Pe+rgoe0%Gc)z@b_I)76#$vaR|eR1!a z7biygk`WA!xRnr2tG_G5%ZEF+Xkqy~muX=YqP$(QZ5yWSq{eJIbs!Gl?L#Q24e{~U|tjwL+iR79*0)N;78HEt0!vG?WS8aV!O-?${IfrgI5&mS`j@KnH!)`R4 zv4Oid5|t$YkSW^SDP!2>#EXQ;yj$ggc9dQA&5r$-)bNdm*A}RmNare)K`d@=a0W8e zsn?-wvWT0yT%5pIwlEl3uu}F8oTT$+k*(8U3#fVpg>IveLx~>EneuBHSQ9-eOVSp( za;IcFbMp^j?Gf$Mp23*`M41{4;iUA#=1u@5+D??cPO$#4hN)6cP-7NjVPL#ysuo)Z zWPp>kH7G+IBli^Q-m>IsiQ1@3BiTPx{cgn|$m8`k#jwqj0Q~f`!-P<=6*?{ZNVB78 z{*QoN<)K;}GI8-^vY&x{?Xg6R0N8PYzPzYiLv_Y&RM^w!tVPWT0@JhXTeoM+3Y{X% zV1=VkdfhIg4YXYl2T@&113|-u$rEzL8UbiRN>TU< zzr|@|IGz*|rQkgRMs$^q>9*b?E6p)I^J1`UbJ$ZL@t1q17@ZiHbVdAin-KC7+v$%i z$xO#*j))1(N2XcZvPajD1PdY^D0z}2J(Y_tG-pR-@cNg47NZcc*XUX%ybmNl$S`0t zOv_;<5L}kt zUVD}@E`cTcOw3XMaC_-?<@K$UM;2dQm)PBpXJqZrDAS3TDBkUskHpc?$aM5jO$l(r zfRafmj1w@W&VZ8DeL8tMz&=`R)5T{2d$eU{&@ph%+(EvSas7z0ROoSZBEtcssdksj zm^>El1gyhJL8_qtvDl>~A(`4k-0Dd=X4}ZxV|Kw^AXcp zDEsL|#RKfc-#iRZUq$i_3)@&8KxrZ=#qjCDNf(<*@O)ae!HdK!>=8f>e50Ke+=?U+ zlc%xsX&r;X-?#^xm`Xa#n%)`MdCF&bPhmF8-%W#X!3yT#s$R-U-%0dn2XYCMKE%HJ zGO)aLG&~;h7+kad4$zJ`Ie^4+o9p&86z#3Kk@UTz9Ue*|@fUo7ui76==%w_O2Y+fM zQ&G-Lh1k$w0+RSFfG>6beYh0eYpA0vy~{u8adQxwi^J1McH?*HN)8$q#I0@BKG>oQ zJ%^Xtx)mPcb^ccbAPeMtWh{&%^cNmhk(S{aklJ&*@HV1mqqT7(YW9dd^@ptiO#y^| zo1kwduE+KMzWbv)CM!ePqi8Za3Kp_6mUk|XZZT{$-Q#~W$7BpVcIquvLcY-{vTQ!o zDlPwZ%766y8Z|@8Lin?Reh5QuNqzgJf}6Q?+evWxvzsZ{EgZtn9n9;}uTH!{DFfC@ zYN&xbcm=>W*$_?ioehB~LkeH}G-@|afwNlgk)W2$TB)DPj(i*(KOpRQf5YPNBjklt zQ9>w|Q{-H?C>qPVH)>zE@&!f3ROi7u=v-mDVxs9XGrRQN!?zKo2_Sk}a;FckizAW% zp|4MLlhP`mIVuv=(`phbM!3p^_Ql6*>RQwM$eKjKWq!6t6n1o@8)0js^>i5NH5p}< zIBUg|I<$QwXn99J3OIy!37s2uGFhyqR0{4EKoTS?xuv-txvpkF4))|J9khN;-QX9n z)g|B{%ey+Is6=-P{P$Rz|0!eHo&#{#M$s|~h$>ThhvrzH*imX&QtR%TIV}932r*VY zCT{B?VHWW7)?0~s$ZVMpuxI8xvdDW|+3o@0eWQ+Z1rr z(v4e~>okb6o*GrIl7y8X;c?ph43;f~%)8NHS1{9UTnrM9#=_5rzdtzX@4d`3-ldV3 zN8QIbCD&|RxR6N?7eYDgN?keAV>3oVpKOCspV#SWN@mfN8U$=oNqViHJaVhIAlcMg zkTD`!b;y7qg4|XzQetIk^R_I0=e0#M8PK(iPjj&UG!|<>xKLYFD#Q*u#42TXKJpez zzF99xp>ec>mSEXQOX^vje|$*9i0pR<$8j z#8@n~>tnDt4UdIk$mCDVEA&KZ_oFvUUQ04zXLZQj6BE1(9s0RrT{xqxAfj`-oqP*~ zNmlVp6iup&ukH*!jZl`7MlptsXJx*hcM(q3dRJ(>jMu5J)9NH2bC+5(V%NXEEYIAJ za(vj68!02bXf)K)a--T5n8G!DO>In=Xf6L!QhXnyQA4;bR$1s|tOCQ$>8SnF@qHf5 z20kE@i;`99ovp}P(AHNl9+AScv3yUv4fc*&lx8N}abc8^&fXeV1Msx8utnI|AZ>-l z;_N$7w@`It)W-k@eMvQEFOR(gcQTQ=KgmqhdiiEzr%1sL-hw{G;vXH0r5qZ%+yV)F zNZO;64_KL&@1EGhpJ-oBadv1J4_jG#W2f{5Kb?)tnWPq%yj9R6Z_lXBO6)62Ppv+L zXXH%2%6A9FjUQT?_4|Z8P%CvuOB{HQZk>FR+>*8BK3_kTJmRUT;Zr{RT2Dk(GvOeJ z`&jF}EcYEf=`mQ);RVGaA_`ZRfS3lIroMm1XYqEZ%1^$RbBTuA(BPx9xrEo-1t=BY!4Ux&Q?Y#uNvYc z8{upl(>qpgv^32!(QUBt3;K=Qrwt7%Z?}>1D0HPIW?(FHC)T6=xC+_4-`_%y_nF=HXI+;WJCOh6}Ve55|-ReF)vN`h6SQn9rvB4+VMDAcuh&7UF-#0 zH-+h}33a&KAuBtWqBblfq`G`mg1n$GXFaVNrFqDlyqBqW7$yiU=)p@)MZ_E*h}wd^ zEw64t^P4`%qU_;FmU^EWBr(^WS`M)AJBdFK%h~`rlylRz2ld~VpS>(cRRmcc`M3yI z!VD$lM3W7qW=F$}f{bB7w}T5DYX_IR@uzeGpNWSeRz=sn8Zh(A{C=Jo3b~ji^!F0O zO|+wHuW}C+J8}}N8>~W%9q9AhgzUwd*5K{amr4>cAAC7eGMsESV+SlybPI$Vpa#0{ z*GVZw@Vp;qa=CW+Ejf7`Co1=Tbvv!>X{{kurm3A%ebupIPj&mOuD3}wS?7bGg|Lab zcuJ$TKIhffv^b`C+-jdw-~(PYIA3h9CGNB;hw>gOIR-RmTp$f~s)&$K_hFKTi4eXsCvit=ESzZVf7nzoXLJ zw8v^c?1VVJS2XfpO=ecM#80qcV3@-PZ=eq=mrD(|WKS^_a?-sM_}6h+{iWM|y7nk# z^kWMs-V`lpoZL8j)b0GFE0Ax0RXm*(tb5bwjc)wl!FN`BK-++)RQA;k>!(s*QeZtL zEtemzBFMM<-JKq5AjhKPRs@0?oTMI5nhEH5l(|EO7u%K~LBv!ETC_WSDD}d=@mtqA z9)%oLaPnj#2eI9Ah$Yjo72KNNo({>BjFhz|Uw_U#f6mv&5i!u=GKwNPIod@{*uapj z)7flUry&e#J9(=?jA2=vkypk;U6$oMe z=1(hj;nymeh>|aewJQ*TZy)5`FVzc{TJ8zkA*IL$v^1`Eybz*?9&Dz^9BGhU^99!Q zbcJn-hc8|$_h2iU!4pS_%T@zMQJW~_W3F(y>_n6ju#{8I#8k?4+8aM38%T6Q4(h&s zDuD|4*1L!Tn5OwV^pkxKv39(Yyc|caL_W9i53RsMVArZGG)%3umj7@>lkiNpho%CmqE5SM0GF;@p=%+Sw)m z@pbM(Jlds-IzTJU&=qa3Zk=wk665+CcO7Od< z<|(943Fu^?)S5Q_Ne7}V5bWc-iXcmpg(Wz0udN?R&psj5^P#BZOP3Fq92ruf+R9V7 zuV1`A!(fsGew0!sey1}bIUHZlIXt*g0Fvc7`Ne*3x3o+U7nKoH=lI=Ug|n-pb)2b+ z5I?T%YndUttD?igtst*G#mUm;h3 zRF)Ikl{vB1yFB64K&{3S5d^!Rch{&(0|46;55)-FCx-DMeC#c;OZBf&6Zjw2Z?-d)@Xduh$VlY^i!j9ZRtIh;ng>i9augQd{ z6qV9NGTz-aRs{9zNiy3_VF%YWXU%tIT+WuC&1vUYxFE|908U=J$nT|;L26fyV*Vq0}NEn8t2reP*&yDRV< zKkn>bym1WOMfX)rb{Lq-^da!>EnZCjYtEauMg}&}IDEpNYeKQiz3$dsNsrk@?|l+A zp$@ejxy0W)wO-|#lJ#F7aoHIozh;@I;5FcU3K{0E@_L2e)kI=Sst>x$il{M#a|$<4 zhQ79BtwQ*2p&NfKwn)b|{go-&@Y_-g>k(M0C3?!#gX9}@G(`A@p>r`Zth>dNX|r7Zt*%_?K2YWu_eUcyd7*W`z|~8S zO$hT}(#5xb(awl*;BbG0>931~*zEPdoG758xIxzw=MhH9LtzZ^oB84oKS8=#YhDpzGGMW1}>@K=$=O zFsOX>zAK*xUS{-zTYA4}Uc8RA(*Nea6KFQP_>CpEagmJnKV~XBBz#$LA^6JA7!qL{ zAX7Z|XAlZcTcS4t^D(!b>ieQLxikK>UwC*I(gu6MQELpZU5{?Ocj+`J z(&a!LP-~ZzzXZL+qVi(wx^eGVUH*Tpy>(Pn-`h6~qM*{Cgp{<>A)QLMh|=BN3|-RQ zT`CAl=P-1alz=ew&;txGz)-^w&-jb`{yy*X?|c53v(~INbI#fOI(uLH+MhU8U)`es zRwFY%!3a{`>osWWxGntv2+zK8tU&2mo7huxKWwHQ|E+YpNB7a4=u}CvG0aP)(?;%{ zT6y@WqY#S1;jS&eAfs9=1mM6H?iH8z1w$60C0k)bHYs;;UHJYtb z@RA}9QSIa=v%e(63EN{wbS}6gn)mARkXD*rL$6b|Yq-|yCB3JXIv7c<)wlC-$aR7^ z|F?_LUBky*^L@_;4;pF%H#HQ}h<{GzwZE7*>e7*7Ar(Avqa$VIp)C+7V)U!S18#0u zB2*e%;Fa(NzN@r+3dNT6HN%YiR-qmapcF`aQh;W3$%6TOjV^&bc=cHCFJq`_Qxg*+Kz-Wrx z`DNvlKRPrc@VS$b)wS_z^BOG2lLNs-y&^7CKSecv z!8QH^mZPq24~eUus7dB(Tt4BJU?~*fh;_%akXg_`qZNXD=)r9%mICH&Y!`X9Y+fuJ@-vV?qx70bm10kf9&q&CNb-%Rk~s zu>*}*eG?iw=65IG>PLaWucuj&bHCN=E<=lID(by$a5i;~#!95uafRfkIRZud-Iy*X z+R{RUGA*3|W1?i^Ki?Z2P89`<`w-q!Y{X5?WsTAX=aNR1>hQnuAYE(=$Mo*dfmsKE zB_;yF4>umacg;<3=^Dv1aek#0LDm2KJ|G-b>e=77s}2^Uv)2CeaVNd1edX#+F-{iT zd#m#Pr2n~bH@zfP01obcy~Z4R)ahvf6CXV^W%0V?GcNkn*}8}x7@UKSxa2)u2Y07a zVz{LSib$<>Qr0;8cE{I-igqqUi(u>&yk9byHS_(mx$k_%T>A437QHrLV+E^}Ld8N@ z&YdYo4klLqG(h*mtJTJb!z+`y8f8p01>Yf=OvvfjyN>vMyjCB- zJHQW*2NgO%R>yTRE*j%q!0O*1woX24g7klfO!T>g_{XXK3!@=BEtNFa z1^+I~9jBUnAsv@@XJz7mA%jY_+K;$-y{-In%5D{qegg{d)W>BoiM6W#^$nU@B6NJB zb$NP9sFZ21SC(k#0iC~ItzrQ@y3~kiWU9tZ(?yMSjJ?VNVMlLA5tbtQhoXkDzdTCO zA#k{PABW%R&xREjb)|l@F5p}kbXU9ftuor>)qOdBaC+R3ptL3f!? z9!fex3mMh#*RPeg5J|>A{EINE7;KFKRud16jJC`3w7Z5%*|gnUYb%fdp`#twYiYl> z7mp8kD0KA^!2eFPf6w@`e;*Z_giQa2&yPLMyj(Bvl0*`i3j&@!U!8l8=+qtL4$iM@ zZzL>{>3Z?#Cd<|Lk|-Zj(dzP2r9$x`7E}FAUa6`fR!8gaiIr16E0{}w=1T4CNzus= zrpj~4w_ndH0a$zOyq8o2)|eEJbKYn9{sh-@xBBFL)j7TSOlb(=tPFxiA5A}1`Dha@ z^&W|ZGaDNaUeTr}|MDeoX5cJAT4!c4D@RSf!Ij56Sh#;>Ol?!B4+pIEoPT9c^P9f|$FuH)xEjDEc-RFpSof=SX zfCawJB}E@U!ezT&a3VA6?b8qQcX09?#NOOulC>!pQy0)lcI#VK#+0EH)Bjj^Zkd;E zHNC06(p4{$iDvf!?EW&<{s7giZXi)q!ZGX-d6VDs-pM3Q^oqPonI$OLNNBnHlz+Z9 zScJ-+7;;3aq?-z^+Vg25ZSh&9G_IJCD)XRh9y=`NQGOwes&?HCN7w1Offt1|AqZ*!a+% zvLPZzuK~reIN>R|8eRd?~dA)<%Y1ovu67>OXOgvgkRb#RIDOr6R(X?=}4LU4_fH zQ(1=kN21XsOVJM5ergX3ff&{#!B^QxfdcYt@t6Q!XkaT>KuAx}tW+4PI zv!E;d)nmP31C=hQDcKd$Xds={#X{OmU5tB&$V&y2ZmUfyk+0S0)gYiF=h>6VkNTmK z8D_W2I{*!Hn2?xT?5<2OyMuNAZO@T1^wH&d=35#b%>0$f$fEscplHLb1DeA;(Qs>K zA+hG4GXIhOK#PAEyg${??f*q?ZR+9^gHwGxU<*@%o_PQEZO?d)%fE0r;#g?-5t%*h zU{cgGI;aDJ=Sov2Ogtpa=^vv{tE{wRVYh$eVbeY|k^6A(#o)0WS{|Rdnz6O~;aNl@ z{%%jWokS(~Ql5#@>5J(5WL9_+v<11jyJg<}Q;p6!dnJmhvQnR-IT3v1le_KpbFoS& zh9kg-3|J%CrzWvd(Mj-X?N2VDuk*w&+=^$D`Xd%K7h8GcTmwV8I1gG(s`;EXD6 zi93l+BIqd`D%fK!He>%Bl75N^**iBe^*D z67hNDpXzzGu(@F7561d$TT^THDVqP8)(6hiu20LFBmE{Uo%4|bOG!5Gb=};|Xq8Yw zI~_|d>%b(Sb{d7MC9*=uZFG!#-se?9J3^E{&092=&LlAYXY)8Ti$!f-urhqNxy9+m zqPx5NWa&%Y7+yD+=mo&8P`@*3uh`{cwS7v>v6D#y4l&&lU{<52dNf7 zx7uo@9rwUbLgA+aoFFf{2ZpitDa1pOn{{e0G@8V@zIFwVNce<;-v&Ai&*#hY!PBBB zcCi)=q;?{4$c4rXw{8pBszoO^e+Sd9-%FMU$YR+E8?~K1GM(8m$rVl=+@9@STs{#< z%UCrGBDxW1gwJD!>|$wp9m(`XW_i>1MS_Qr=+LxtK0~scf{RhwB`15Gq$#CqTl$yc z(EqJEz9H0$ny>Goyf`QKKDeTzcG!Pu&*()+l?w~Q#-}uxQ#KClpd=66OWk^!V6Wo})%Ux&_4 zPHvFLDlq=I|Gz2+hUjTbPBu3}mVnm2n_lD%L+C#O=Z!~XDZxLNE`Kxj|F80Zo%{cz zJn;Wx$!Y1|H&F6bwf%0el;CSVb5Za#x<2?n#~Xw5%yu9?pnIyN)34!G^eDYpQxNLe zKNBtDl$|o#R4|}1@F#oLc~i|j?=Y?h5>Zfa17hmx^haAhrF5l~R{JwfqK+aECtid?&c_Xb^r2=Ko&0FqRsmTc+XS)E>f$*8G25&TDJ2NME%3yAo3-R|IERti@z9@+z z$)2+f@Jj2f$-lG{j{gJxu&%N2iE@vDktmzqe`*?p_`kwh4m-INNC^EnJ-#zswO%ZYz?%T}VKd^dgZAQX-(zfutD@LMaC{M6EE;}z!D!`Fm%$w2eks3`x z^cyM3#@2I^07G}Bfb&;2Y#ag)eb)v5&_G{u$H&+Vi|5MjUwb}n$o(szz%aNq1MYZy z>Uib$RRVr%t>qFJe3>Z03M4%LQDy-JWxw>da0Lg*rrv61`aaY~Y7I zq`p<}CnG2}UG88f)7&{>xUd+y_8x6Bw&QB)f-Q9*jGtT&XZr26_UDvTeKhB}@8Z;>?x*L}_OnbTq;J(KWNyA|`3gCw%MsNUXQmS}Z* z#xJwfrI)md$$>eP@t-kR5W$pUNc(ZzfGn@ppS^90O)Pv{g4GGTGF0UL6&?y+k6(;^ zT9z{&G@FA5Bx!5{ci(>Y6KsTwvs}GB%j_AGT>LW?t=PaXPDDulk~`;5(XV#MV%A&| zU`VLHzopR#14GW+#@+e^J25CHVfyj(vq&I!?_(yHI%u7rs-eMrEt>SQx@XwUE))0o zF(1~T-)iKrNpzk>(hAjZ$>TOYBpEq2rdAo*DRfY{FpxdXNjvufG?rCX<})?;b1cs& z#9^&->kV1wi%BX4_IoBf%JqRZLge%WadcuCg5L&aS0*c4S#jC!ewu`H6{LA0bsgc} z*N$Ph?~nHAMyrD~|7PY(6{Pys z+*dtcB|G4ule^vQ)zq`q6PoITgI8Mqy4$C6u_XR_m1*eju!8DP&pWJ;jvyf+AC26Zq*l z;~Oc7`j-mbmibr{I;_xb%97kX)VAgr^7)MV;z-@Xg`v?NE?;v&0BUmG1nOa{Y80$x zq&*jM?3*RU^0AD^Eu1S1c}{Hik}dYHWnPN)&jV`k=3smkUuZ|rCN^_*o`i{NixLx* zJo))OCb!F7{4`uXF{F6L)7n@h!#`gflAY8mbkHouU5s?jk|5x4 z!L84+#ak|8!-37fdZy}e-%4NDs~Mrpk4iIAX(T_#!s*(J?#?p|6|w!NPI`9bX` zK_%H2F@;&^c0xB)nIoE|1A!E|Sqwg?HJ?>BPo!Zt0y_8k0S;GJc6pVZ3U+LlIcN=n zB$6`J49Q0)^t;7S<`_IkFPrzpL*8y~j=WJhfvs!K!|S^fHXwMJUItV3sESHp0aQn# z7yLwog1U{zcbD34zeb)oCGwM~rO$&ANTGk*?(yqH$T`;15mz3FD>FlFV-#lu{kLlZ z?I*p@?MNo%t^~aB7}V&O<22W?yH)=P4UIBYt30c_?qb#RdeEIoicpGiON0Z{-J>><{Ge3EmRV;0z!QMI3VZWn=lAEc zF*c+lOb=}gaHzQ**{vD}AuSSz;vI@g$h512DyEzYJ98=}0~FCBQkW=9w@+|@T1~{BsCKk%oLw(%)ysdwVBuA*t8vAMApUsb5_zH z_d9z8S?1jxcBjsSX$Z{JIhML-uArja*0crqS)8$Ma(?`TgB@i=h`zvyx4lfb3IR&X zTybn!O+P{ZdgJh!QaBp;9fJ}!-wqJX_1l2Y#Qn zm`FQbzdfo~XK%$QKiAmmbsHJA=$}F&k>$^(!VnqMys(SUA&g~9Qx5$|%F2@Fg-t7nnoX^#?GB5y`-|n8RbGV}RwLU531x2$g zpd_NsvWx>&kkS~+EjYFT&i7b4TDT27a)CY)G4O%6MO}3mM*bK(y^*-_My^z{A)P18 z_`ENQl<8c+r@`I1TEexP0>%>cr2+1%9t1ANk`$AbO=I`l6f#ljrEv{T%!jQ!-{6ic z8HGXbxb(3Ljtu|xzfT(*{@tZ1}xrT(YheTTnl|gh-GL-ZqJ1PT>*2~%HYfI;5R1o zU1^;BY?2_0?l*j&fiv%1-Pry4$;{MM*RHyNsUXx1?kEdiIFQhLaHitsH;J5YPDxNp z4rAQR>naEK=3CNi`AAYx`iDAFV$)=SDreA4Vd}CACP#CXgV7c7PeW#Afy2kSwR;c} zA@Yzn)6L-WpNbv7+G|;x%gL->KCzt&$s@8mQfDS}Wvi?2Z<13HVpoFMFSr_!+l+?M zpNQOOT94E?d_Xo4NT9`8qIP&O4E6b_;1br~Qz>%bSwAPgx)?;x#(yp<{vs zqN#x%R!c#`v)%Br9#vy`JWV%LOl;g={25mPh4(<)vUauoU{;|KWP2er>BBiz2%&CQ4h?!pwe&lR{_y9x}X zCN~3HHP8zG-<-gNM$sJKrDecQP3U=lzh z*ZAKa!nbllo7XM890VKpPQ<~@fT8@rR7SU{ek-W?AeqK}jQH<+!3X;7-Nm=9o5r4* zpzvF2B?*;6O2+~*Ugvp4yw{I;8=A>5yQeyh04xu@F6Y3a>DRCDbr4DGxW0g4FTBV0 zNnL5Uw6upYj=?nE35LT57cwBG0C5Zdc<6L$!I*EvHm{xOjc5Y}~4IysAB0IefBnfr>f@YR_Ki zYLC|qQ12wRS6yXqC+jamPR^*G;$1WzcO_C5uS(Q(#U7Hx!7)|DY;N>5wx%>)_`XdG zzu5JO`}ivaF-9+|?h+Q4hriSR?89X~gO>(Fj-4DufIi9T4Uzt3&GBrO$;-pS*#4PO zX-#96J%9C-R_L?6m*8aQi zN8`Vx>|uyLT9`;qPOcIH3dO=HenDRz_ZElCg*22g+5PG{?dqLT&eK`0_>MEHYD8qF zaUcCQYj^5FXGez+wg<_Q;Mn#Gs6L~uYHuk}(z^*^E#2k6aJIq$__%Btx2{?%;4bL= zI<7fjoGt^;WuH`{%;OuOz`6ep@+(e@*B>pijtC-mnjl0f};_m~_ zMih%sJ?AGEyF9>EX-Dl4a)K+o%odI?GjAsbcmll13n$x z*K_2Q$bu%i40!1M8Y$97;voIDNjb(vjb1E;zvbqcn+!c3hT7V>Z(SAI_#AcTdO)iV z5#pIE=xJDh12b!Y>HxbABpHOGV zyoP+rzVsm<4J!I|s8VBfkx~>3Y0Df*Ar?*@O`(}Q)i)eyNlj|7Lpj`JVhiJ2dj81R zcQ6o}{${eh?p33c3&K7=N%&F~#mdDT<8Z1Jb00Cw>L4QJVfFOl_)`m-JjxZcQXe1q z2u%&XxPxZq$FzhQbou5(b)+=8(AJ`vS5KvwvoVEw!>WO;A|BI(0lLo7M>EtCjh_od zFq}bRh1R#3zT1&<6X=Bmc@#&(WXrYZcIq^M*35A=l7RF zoS}79@Kc2y`9w=+%gLW$-_0@ws2^FY07&z3D{(o+f?>1(lump3=T zQREo0A<`gaVS<@`Q*9cs@arzU%*WRo&zgF7*+H;atrKtG7bmcwJHIn=pl#HoY{@$b zI^j}iIZgB=`;BUTBE`Z1g*#kHbp6qIaXC)cGontWnewb>zn zn4o$gE(XIgzB!=+Fjrdb?F?l0d*uLj&IHH$jwmt2#UbbnGvVeB$zJ9)*Ih z%}SCRx#vi=&~5x)@j5P;h>o!FG4tBBhe@!A&vQb$WLKaeS^#4WF@BKU_<4mtsqkLU zk}vrl=650P*QknK;}L7QeFdniDn|&rEBWpF1C0>;QDk~lIxS=}k$NJA4BztU{0W-@PrtNXerc0SVg*hm`Pjrw+Bdb(pg{iYji zslyz2H<3Fp+%4S};xJ*7-$tzer z|LW*Q`C}&o8!z~j&x_SzdeX(4hj;D+{_cT_;z*vCBq8JDGaif+YVH+$lj~-JzK114 z9M*5YHQ_u3oZJq6&n&s~%{;bY3n2^|h?z;@?eavfm4$Fn4#SZ8NM~L z8(jB>9_N68g8zWCG#nHv662M}#`1%+9udU2xF0ZCG4H?lL1k}yvG3RE=0QT8`whvZ zTcwZ5riD%xi|Zt^V3(iy7FY-Lpq6YM{)NOA9*5%ydc5f7{CuZfJzmdsrkg30(uwID zlCv9#sG?QDaNj|kx-{r&=f2{$%Nh;sz@4B|``Wm|UMX7mMEE!F6$?B2n?EOHb>=<} z;wz!;4@tkX~xm_=^UDZv83u8=2-4-b~L6*aO+O&m4^AVNC6#z z0ts^a8bJglHcRgniCMh)`IxTy{)+{0(igZ9yw!ice&`s+DY#{|li>l|Lv>Ln)7swuTTj*nBdG=4eI! zZ)X2iXHY`>-%xzJE9yWcCY3AS3*U{XE|y%Xiz;D!zjVfui;$D$mlM z$1C&^{Cd;}I?dN;DY@doA%L6Cu4-Iyvev1mE^O^Yu!qox=FD`iw-2@o=r@dF*SKQ8 zU9r@;Gt>X@Csn64xBbHxR{?{W)wM9r*%?M~-UNk12H>5kg~WDp2fqDISk+P2FuhE(M{Au9z=D#p> z!s>P=Hh?Bk##bU(=^u3YBQA*EE#phmw-E%GHBiA`xA$EfubnNarLxfios}T2c(|?%KuU zC(tjCHcVvc7I&Pp`TEN*2$wOO!Zer(q_Gu7G5m+Q^&Jq&kF36juwxfj)r{Fu58EguX zc)Z|j>cg+Z2hUPEc*72YU54B)T-95JF=|xgiQCV~30xeiNmDj2SHva)E(!2jLFwQ! zUEx6ON5w+(4ds1_x+D2|+p?|mDK}N59#XZ89es(+(^%Qmpq*A8XX>MHiT7?yNzFwP zV=5!#lZv&M??wDEFVY*fz~ZpcQOyL_sw)%~HtrFz}Dsgt+lEfm1D;H%@O-aIzQT)9xi=Y zIBWIUiDh`o7Q#pMDTR4-KA*n;B+bgh+VJ{&%2N+070BiEQNLJ|*>r6x#|HyQ`J>Yj zI|h3EopKm}V;zzWpd7U?e0zoAi0J!xxuW$`X5p;=LetH*f`CqwO{ z0M^Hk?+Xc^eRMt84ovTBzEeF(kcoZ)4eKc8uRb9L4Jr`1dl4_dYnXiB-r5a^rk)Po zv(&7NC$^pLohM;F>=!mWKJE92XDzhY_%Wtr1rG~OZYaB>I+#yi_k|G%1=0%Yy+WBX z{_JBVC5F9S!wV*GnfZ1y?JF2)H(B`FsvpOI0-Gkg9Y{p^*wpkKs%$uFV)%o-W<~Rp z6F&8VU$mIXn8hapun`*<^rsF#<@vjpbv>(w!jf@TT}>t+1_r0uqY(!P|F!GR@A7+B z!1jE6FoCS$0!~s~CAyUI!Qrg{p^1FQmg@PX1K9YGCgbncnkTukVRJ#n$XsiuHZRvv zf-^hUbqI1)(zG)$Sp7mQqOOjSlIU4%9?X<0|Aq&kQf=c#c`!DK9qU*OXsjqRT`SXB({)H2BURuGpzh`9n#NWU)?z*D*KJbp=T zsYZt0>iHj3W|pcoaeoVFWAEu3?G;t&ViST}H80Xz97K}z7oh>1)%9zyBA{^V;=5w! z&HV0iJLd%6e6eeQHm5&u_2crBu@_Eih6bniYlw4~Q;#_^`U zI-T4fKLA4ukKZc>@xy)thjizJbL9!v5=g5PrBz7ho$PFYZ`$4DwuI;XTcjDAhSY;5 z@C(^R4KcD`T9F$-Sp))$lQ`uDwj>)qt4&h4Q5?iw+NE6KKk1(BdjzRa@3FmPY?E?W zp^?h)pH^&no$yS9Rkcs%Sc;Px(pfl<=5!!RumD2U%x!?VD(hdzs`XtCdj*W=8Ja#{ z9-6BO`?Q%WSW~60F*toxorP7Uu3^u(H8S2S8&({d@iz;+Wp!uZ$+-ec`SY&Q)qXri zv7%Z$+{7wB73huK8AhM;ZjhSdTr&};IDc6Iw*z91naxdS?@96}HE#R>7Ru01@sb}n}mopw`~j7vVFohxZ}N#0p(#DZryIKdMa{78pKS^Cs9fz+l~AsCGO%58FhZA)1=#F{RQ-ljZb3ZTJU=3iNF4r%C5c zBPTps0Pn?Fl;_V;s2k%4*j*l=?+{Qcic-C-rU+AU6Z~ALq1G6kh1%8@BOXn$e>tI2 za@F{fMcS?Dj+=Y52O6pu9F^pY!|08{cVg(=v=y3=!V9TiE+H7z95#s?a8whcGRn6- zSUK35ag~7nY9#rE*&A?TYaJO@n)4cx{dSNaHXpS90Z{!4``{$^nOvSuiX@uCM>tZl ze9oT7Wu#;+xJIJ*d#p8-HjnS-Wy|>T?sQ2ta_t%BkKDTAR05-O`bv@{f&=3c8=ljo z;ERnn!QCGQHSU!+PA||K?xskhs{vnhwX)~St)deHSW-)rxRxrn)^7}Wgl%OWT#(-b0G7zG6d7;xm&y&ICqVpO* zU+qr&?UFRgVaFjWt=vzF(8;Gv(?;q7h`fd$m_tvNL)rd@z{)!n5^x9!7+6wi zrSQl!m`_W=NKeSlnqn~CjeKfSeq%~3Kyp$oXLO7gkxefCx8+4}?jDwq6$&9=~enD<#7 zZqMSp_D|sk*qHU?q{(;w8mB)e-B>?^Bk;fj5u_AB*rfIys@P}^hu6l~uOJiOW^3Gt zUa1Gi5?*eH_9WFY(n(~BkE=0MJ$RYg(?LaRv9-2<=ae0||B&ohBuWe$99$L7e_BGG zy)a7oirx)c#v};-lsCkef0vTPS2o!w8ce9|q9ZRr0|m94ggD*0|*xH@mMH?8Rjo3{%1KRrtx>`NB2>Tp_dFtxK(Wdp>a>{qj1&^ zZ7a+Kf0~q73=(9GY({rYG^`RDVpEsleVeS5R((?UFrj>Zfi-@(2cN zwkl(Q+e5`khXAV(zj!FV%~}IvOsm_&6q`Af#x~IA?9z2q`PTcRI;erL6$pV(N^x`W z-VY)WdVF&JYeQV(iJ$wk(9RH%q_Y}yA+S!7^`zDnk?(#)r71?KJ)$@B%h$6s;%!qQ z&6{tZZFWAoYHKmiSpo2^O^J~e+0&5k`=t{M+JRHKAKod@`U@uNaN%xtvOdWE1eYL_ z=*|MyTn-ZQ&`nsq9pW_RW|(F>QX)t`ZjeJ%DbEf+{ zeRRb>uh3?5bBf!h=~NR%TeJs(qKrpK`MF-AhJ)%)7^hh=Y-FCaO>4#A;#JHXDE@*4 z(A+Wczq_H}J2GiEO72~4XW;Q8L3`zvO<`=u+~i+bsO60XULqpFuw`nf!r92>$%i7C zaC(Xy@r93%0+FSAZ%D*9nWEGE>N(YvGxnmp&d-=-s!ZL1;vV-GSXn!VP*-9fp9s>m z4^3O|eHn`GFMJS6U4W*{8gD0?v*S*mq2=DVP^jL}6W5by`mynt-sP}oei73?fhH(> znAh+!0#{5u_M6GEC6{M#l=ms7V1p~NBRlGz4jSdZNh4gyk2U0B?Zv1f3e%SSMN-t} z`@`h18Ltq}QaeuB+6)Ex2Ih7i(tVTMYh$SqNiTWn7nu_pibsdS!-^yHSR2;-<<=wg z5--@_|I6q2ez0$c{h@mryx4Gci4cpK$=NSuKwxylx;CH>g@>OzN_2T*D0xf`bh^nk zU)^jgu{%q+WVHUR)lSru^@joWZI!ljDqNUSI6qImR_A?`aa?4oZu3yyx?A(eu?u`@;oIusn@r71H&m?;UOaPu{%~MhdE%!Fm%>}l_#yQi#gNOrvD+n3 z`K8_?uA`}NkO9Odb7MRJc#&b@5D#{SdJEp)EbUP{m8>XK?ANGqxl_jyxL-B{;|Lnw}cY=YdV&6Ps+D8XQ zNDq$R1kT$s!C?fc&ZXkakkrUzTdr4ST9rSvlv&g?IXMCW~nvd%@l}3%Qcm;wu z^Fuv<7GicW3fWRJ;w&n=(~0u!xgrANSE6+YsFjf1lkmi~xfxMz-<2Jhsc)3arFyZ6 z;p0v0N%V$61xb45c|eEti>_N=Owwsr@jar~Cdh0Q*x7GL7Lyl6b;Jt3IVr8LOlCB3Hii2uz{bdQPfqj&;fV~_JDonr zwvC{AhZRBGxs)?EJNAh$>6KzZUv^LF`_&2iM<7((_qnunmZd4D%h>fF%8MM3>FdvE z=)I0Kp4|k#TrWdyZf(buW!Y49HYlQO8F9Lt)Y=&i2NJOsq_bNUXc!5uX$T3GkjI#6?b_q)2K)dpFDrxlI~9YXp6`Uuc;T_q zESG?8_WnmT$>j-|%6zHrSMV-=Uj=VgwB4>bl$_}M^p1Xh!D1BvZHZM98j2S$hY&9WDyGfe2ns(TegXf+Xkmg1irH^#+PK)mf+{Y2r%n#&o)X24vQgTk8>hjF+HBM<{s-w(bG4$@S9Ev9sP5m_2fTEuXFDso6nSe?WR z_lvEk6GaEAi^`#tUyGSmw~dBl;rRcD9xJ|Szz12Az`m;WK#dn>wyIQ8+N$RS!&Eb5VW7tB0{_B;hPk7kJx z@2MLuFBL+^MvndnEWeml|F>~CgVRg_DR?E7IVCV6=D=akJYV30@W<@luf4NXwrOv* zHL>;NDi#(O`vl6&ah0AMC@R~-6O+JoZuXZR&JE~Z8!c<^te4Wr=cDZc8TgK^7C;39 z{`CGV)SAz@z;4Th)T!sqb)mb=Ja8Ni8@6ba%Y!5(*zM_BCubmNNG3!j#*}e(?{P9UhSC8PCCg4l-MVs7+s;@cmcFah^(Ym1EW1KI1 zCqxTXtqKjuPB~G7>vuSr@jxDd##B(<_pv4q>yw-EhaPn_ab5g^whbP|q1SfpXO@gL zfBfwT^YjMKEh?M8e6*ZLn4l5vi6(_PCWu(1mxc}w+T!BPe{@l`s1?bxG;><^lz1l{=b?Cib?Nd z792yBaWk$X`dGxox+g-WY%x3)fQsIYyD)2qhjJw}+g5i)Uih0+SvstNuBi{EOz)dVuFF}PgqjTLCJ&K@m#P)To! zD5v^z{8gJwXX-g_OxZ#TVc@I+R zZ^(mZy3p6)GW-vZ2%W2=YdvZsFw)OrZhfVEPS=Xp5B=BXWhDaT+{jSc0Ygzm!IRY+ znP(CiC`jI0>RMResP9$VoB~wp9N=6;922U1?GKp8_yb!HzifFW?Wq3Q9Yvz#`eKfS0k1i&2A*wOr{?Mv6bPo6i|?lWJ`S zG&qc|a2=@fUM%+{^^_U*$9v$AtgovTp&6YEp^(#!G`fb4_Du%0>$6YBoVoo=A`z32PC=R)ARgopL)z4qE`-_Kh2ZOUAoxN4=ZaaI?B4C45DMTtxGe0h z`5D};NU;JQt$t&tBPDDhTpxrcBA?s;B=5&r{aPVqvH+729={#x#n+)?;LW!UvIP#x zS3#Rv{~o34;Mf@<`R(;0J_O}0!`GRf&vD1WfSzpogAfIO@tnb#xB6K4h-$USMq$3rd`^taCR*0V+mWPqTuGz{WU z#(}v}8$GtwI+PpH*90TNDM)V&_qOg+pP(f*L!!DU3}thH{w70I-d!FvJa~SL<^pv~ zp4eWV<}Hq_NJCPyCmZw4&8{!pF33K%M&YnVK8-9t4be)54HzXcnm?b>_U7@=S=epX z&qq$|bgX54_|9tyP?Lb_T?+F&9zP9%JtWN#(Vva7vF_{!|EY-k`&viMT6e<17qP&n z=SMO2xV|l+*!`kCFVCc<6~lgtX=0_xBAh?df|kQY*GrbxdK9JNn8;{0noVcY+4!>{n9hPwmUyf&7u-uAkO>vE^7 zcHtI!dAzdrm%zF0A88PBe~ULLBW($$Xx@Wiirzz)r_KW9!Lyh1a`$U>rP%NPF%|Ju zK|)sd>JSAP6qs8W(GS%V^ugTl{icS+$j2?MecSxLBv!akE|ZA<}*^CTSV!urMUG-$_G1j&|bdXTudDm zQe>e#yTEWl%Z4I%!2BvAj0n4;2XtRBtOhudj8F2z;^-06_$is?q1yXZIQeP}MU}Zw(r77cX<00co=s;G zhhXU(%!lt>S}`X+7_pwpud=0588mw6^&>#T>8c-iOlBig8Dcdf)VVOelzgkOv0EW> zvK|_{CRqFLB@^t(BYxH-?V=xw(}A-r&6%cbE+k^d+2x7M1kvOH-tivRRo=vtaCQ@ae^5e4JK#zKqw zL&-YpU%v9!=ZQ52gl#XAGzSZX9>gt#(gw!w3xhrwzL<8u>=>@8uv)pkdlIj#I(x}C z-$(JfaAdr0yV;z}u=E@J-^&`2F&Gwns0r#HVnJ%=;N!b-*#7lTEr5YvVL?|FU-W16 zm{MG>=z0%1ngrp)GD`+k%*=c8>o^?uQK zXMcXOqXWT@oxY4vo&NV;ee*(T!wIKiN5A$$%$5&fdzUJm<8y-6T2-1r;CUW&%$q2)N~+`q?#YNF-W zX=DCuYUfu24Ck=bTvYYes@)rrR{fh+O8JoLF0X5t+Y_nBiz8#2q#1LI-O+uYrG7I? z{fh5d9V{=hNp=iB-S`jt;W@HY#Z6)cfKU!lw4?x3G_XMp>-~Fk_ z^0!~>+naiGWIQoqt@`Y*il9IOr%RP|d^5DfcZqD*Sw$n|86vJ%B`V!8VN#JTbra!B zK0L6`P!kN1+?eAiAAd8^cE*dlbw~Qt?8Qi7$*|KHE&1q|A#C$T(Z%WC3fcDWKb;KHMn+=3Ky43jA(XuU2Sq~ZEA#v+IHwW_Avi;-`>F1&cVt%zb!i3ud@{Ue?;ro z*~Ab_hsI$C$1>FsOMIb=eo)a`q;w7wGMbL6aSO>w_rX00fgz+9Tv5zN55 zU(q*rFgrM{lsq#1lj68{)sXQ2^R~0uo2L>g&Q7?CAyvv(884RL=N_*26Rz@KVlVav z7ap9+@JFz{G0FLTU*TlFt5UFU(&BnbFnLGw?CSLUguL@(14zhBW07@*bs~dlU@#3P zLu!1qJT^u7j@`Ch8fm&%Yq}@Kkre?E@YD?hW9K7d(ywnb7AU?SXw_9W;HV%ptpyWi z5D)-j*J~v6Y7IFTbccmH3b!0dUyG}uy(v-Y46Flhjx_qe0`Mu0kR>r0?Q+Vgvq`-d?CPXHlAvqa%rG8UnoIxr2QcWzXtgn?L)b6V~EPR zM1TG)%GplYcl1g8uZhx%*@%QDsm=m9YVnfW+iOIBli!e!kriE0$|HSoA6ado+2X*G zm6B^i(Oa)FUJ^l>c#i%d$M<sxi7W$E^=sQb&Daq_X|m4A(=P{94|i z)m6>^rZc(u|7q)%D)0LC?g`>R_22(Ngm3Y0VxRsyV1K^b`M)jMN&klhurYo5Pl_Ew zFpa>T4|j2QuaEuf8vk{oim{ga8-e&AyC*jOQsAR+E-iIE{9oDJS~ zF%2AUjzc?a4KT~n0sJXIul|vT^ zck!H|#n5mYK-O2tT?82(KG?PW&p70!g@7D!&R7q_%5nm-J304tngpm2qhQAPk?cP^ zrcm$q$A=WhTbgVt>J+yn%qRB`P5<;bvqs4tHct($-k7xBdfYjAOv8rXf^9a}w3t&? z$8RrLk#%2j)}9WZ;jsJYh}}K?12+Ty24*IxF}Gphik!aR_jNfr)RQBifzF<={{Er; z&i+4!MS{;#I9#9ky3HV0swOx&@lg$Pshkc>67{-kz_|t+9vW+1p1Igazp`FAi90}V z>1g)})mri%M1vbCOs#eJL)rc`RPVU{U8-3(Lob}Au-cf4KTD4*{v?LAbyiuydR(CL ztqx!;WO$t~9og3~`0D6mZd1+$B=qei06LV{RWz%FsGUF&^mXHlqHHG*l~uL>m0g68 zJwK$5j|@@ykuzKP@eKuxP2MO0xc% zYex?tz6(A8@X<&@!ry8NW4{jOL0mPr@N^t<^1|r;IH{fziqikJr%u_GHowSF08f$~ zf%a@&kx7O(#SL@k-b%=?zui}|bbRY>^~n)|sm_|2_^O?vmZ7`q>bZ49 z?WD!u3uti~;lLr0;j4p^FElF8$wq`NLWfan{ryoQBNbi}6FZ5;+c(R%kgpGH^Sm`- zU@gO@s5fc@sj`H5r<~`MeWKdI7*mAkLE)K8|jO3IZ8Es~e zeV?gwxc<;46B6tgE$Vp(L^g>m7MdMueTI-~4F$__HHA1nF;rnRvHpNYo{J=le1$Fe zL;A|ZXsPDwGy<9kH)cCp4NRDllQeqbobG1!PBDEiRI5$jIwg8=s!dhx^Zd$}PqH6m zXeH-k8!l3y33Dl^k~hb@{$J0z8XO=h8O`wH@j@nZ0v8?KgnHJItp~KL6W5Q%&UDM| zQ!d@Md+btviWnPNv>vXRs;gQO>#lRDj0%6^O|IOOf;P&JA3xZ=cHbc-zI_Pvx{IP+ z`qS0E$)Y77^uY|rE1Bnz^A`Bt4ythOA$7-fBLvaOdA4H4K`FSP$K6t7H_c!W$S3-lv|$*|Pt0#u|NfI& z--Zl@aA)(4yCa@a_-T#m&aAS>oJk)e2gANvk2to)aXaw97p z6eYaAz#ccwmff4oDippRip+51vS|fvHRi1nH6;x-^jF%iyz)?}s19WQ+KMJhek*FL z6)EV?l(s7fB^P!(g-PPB5(R?qklqjSRyDmz5TYG^*aZZG<=#?el$cH0f8}sFt@~uk zFb~O|YU8qXf8TVm_z9KL8l&6oF4}=6L|k&OzYyM}=yiz_>=c<-*T#j$r8S!u3bEsB z@e0D%Y)t{UdCaOM>bju)3A$d}YgkQHF1F?0OkYeVT5nv~rgwn|=vPeV zJvFWA(>b|q#M)FZ%+OpO z7-g)bH~7cuBRLT^Y3mJ-Oz}RgTx@D=j1fMG>yz0=F4fU1dP6c&&@zGH)4kLS0Nw6mp_f2oxzd7*HuHWC#Bzv+$e8<3xEkptqNT@OyIIXL?u7j^t7$Iqo2yt6OlG#)- zv)*&%8FprL{27HcowJ7p4twdvv%2*vpBazl<`e%wLRg@33jd|*2-Zm#;tk1rCFhnd zIV@=U@PgSD$24~kAxuO95eKz#ca--ARiE+~yl{2u3A3ycRqrlZ;6mun5e8^!T!)od zAX_z(qjGv5JL132x?ZMl)}*%sNPk(TO$PwKe}m)78wW|t%n#WB;e7+yj;sD#9Aj9V z6S~V=_ma)0$`tM&(-b5YXtmF`@P(O*DD+TKR^d?=XqP=R>UVvW&!2Ou9j}BosjGVK z&vpg2c3Ig8e`-#gA$s(O?b5unuwt9oHI>%WAHD;e{Zl>M~)}zA9V0g=XuKAms&N+Fq2uyWWX=PZ41xdmvqOv zC9mhtL{~IChC#ls@jrw#QIWdfhz~-4^Lsy!+&ZVd^m`@f_nPna@QJhM?6i7ejpKkV z{k;vz_oNqJEa!(ZaO6%%r@IfSK);T!4`tJXJGI~|sHH1WbG0F5jU z1B_tz^!XrgcvQ!qO%{m#2#NHE7^QWLKNy*$U(h*tn%AKl%`Wr0S>8)fr5~8r$gF>o zG5(m=;O!gndfcDU5Vlrv61Q`37%oJZO!g9lWpMk8q+5+%HIB!rzX7HGgJ91?PSCPA z21$xfB{fSzjtSSRg%IiFE*<}o()o7w1b$_5lMl%hk@2yh8~Q(gKV!j@3A6ME{m@1X zh6DPybytqAjMY_X#kZ0L`~1oMS=mZ&XV(avDeI!r#FJrM3qTWe-2^HA_)B^Z`zR$7 zWRID+6uVw!d7JWU7qYUTwV&yPJIIMf-kQAN)SnDk$_?(PL4wZEr{NL7^xZuGn=;pD zG}`SSl||Moekkw2Oo=9gh7AlZWQat1veyOKCAc`hzHhmH#_{m`s@|g?a!tz2*#EKk zg0!k@*oSH+1!_)(8b6{?>YySbe!nE+k~qrS#4Oizw##g zGz{P&Cmb|UJY($R%}C^r;}s;*$#qd?%-yu4Ex7UgS?bX1;Xk)N&N@22Yv3}+?Ftm` zHIC4!3*p5xDbn*t!Sjc$FRjq8sigEg7M_hTl$Bo!t$SyX+_}tKS(zWG^9-+F(TvKM zkXPYHez~XKEoF+{xPKKePVlx8% zybAC@`mx*U+h?%!@21fx&g$jyHQb4snuv0?uAZ*o{VgQPpt-Bx!c%oJGcSn`T=3iBKdjn?m#wvNpBNtp9-d=^^{dM_dk9sN>@Tgr~tQ=wDWc;Scew=?O#UyL5l-3yu1;?Ny^ z|zc;1ZyY=^dWA(gOqWY@%c?t>$9@)}m1VAzS!0j22kWro52$ zx!{d$V=bKO4ZagH9kau|V>YdFPuzDH5%qGtd&V3@y0YtoaYYcmlzp6*l93j33i zWL@=$%_@(?L`}!d%`TKtfqGDrv<)ap*^h#Z0q*6p&J;g7J}1aGXUBqdYYl5oji~yP zUpH*!;okB;>1pshY3sGIN%c~p;kpG9Y<}&Y8xBShmE^Y&ky#xHC{Y*g>I#@CJ?*1F z6m719e)hRxQ&C;~d8LfF8oyW&%xJDPa%Z2|R|pUARsLFX?@PNrP14YQfbcK0-Q5*# zjcmpGKCpit$iTWf(>8zLj=icf@2a}De`yQotA0f`HFJ5ne&Crp@9nW4>7iAT^@bjjw|N5UBSZd0UsfJak#uYH6E6zzr)G% z8BVO#i~8)lBFYGigCRl-?imi<4OvGlq|jLHWVEKNJWrq2YD zo`Y|-Mbau28QiUp!XRkuZYwG97e|&_s#lE%Zb4I0$b!KbAfp_;awFD41Y!8>Xd#P( zo2d=?viy743p3}^;58CCvR=$e1ro&-dtJoBex~eCOx!ZE2J?ncn6(|x?Ox4ll!0h% zNZ8P?dSb>BPSZ%u*>#QP%Z`Z-wnR9G&xE6bcKUuDJ*ApnHSbep*wYp2RtaPXOb zMc>ePl(&fusGIwH%6*@j?J@2$nfP@Nk2kBsyHB}(_S=JG(mnIVd!5K9c5r>B3)rRJY`xYZAA=yvyXf}d?QR9;j`LP>}Y-kby4rv6(Lk0W9D zDrS;)E7qS3cwJ_Sx>!g-B~{EC8RA7hOHv3BXB@-tFv*2VUGvOW5NA}oW;*_3Xm zxZS{Avu*qI?MMXK{Lx490WDT^Mk8oL(ci5shV^9f`@ zMT78&8565MV4{;we?L1;yZkD66#7~YDHOZ`F?KmI{+Qj|sKYp4_gJ)2{G9tB!vNCy zq&=nev)bHjR!*;0ZY`B;r21rchACDLuy$!wOER%hW}S=b_yl!eLfWIPI!5?K|E%lF z@-By85sc$5vmx&CVE9Tfws^2Fhp1^!fKe( z!=lUd>^a#TH!bKq`$@a1Du*9(OX+I$HXqf)y=_5D!R~?`j+N_SG9zn^&P3ejFX((? zJ9w6?FEljeNtVsorx(61T<+mTf-y3yO(LXU$^L4>W6(Dpc#^h=r0*7IrQx$hL$;Q# z!>voMf`Y%YY38-;#^f^mYUW$gGmpI)1(74y0LXrVm-`5ikyk^bspVU1g0RtN4jfj%Ur3}B68 z@VWO)Q2aWZY3TanJDd|sut2yD{R+`5nNABlb^EB;tF5mS-V2h4g{J~Cx=s4TdoWDH zHymJaSVY@P)k|!ZySrss*~Nmc$um+nvO3m8=$~HMi~&3?VEXSQ;jJ43DaM_$Qri4q zgX(M?}}KTX$Oa^FQ_qvQ4Qm|PM!M)1_@^sa&(N|YmElWBviLiP8NqTX;RYL(yQ zBZBTOn3IO#uYCRDF*7{)BBD;A7ef*f=G$ahf8Mz`3ec7UKaUtLTzzCxi%J=m_HlWw z(-|CrMa|>Pne_5;Bws{uD7%npO_wVTa$x!ckeZVmZ)aU< z4B<%Hfn9caav?fslM#Av z=5of9dutj@p$xx}($H8RV?^vn=!N?+h9H&;FzJAX9Xj%KdrAxi_~?>XpPI%JoWchb zC+3VUgHE##sP%gxQLI|xF>_N=0@ZxbD02EeE>O;-qP6#H`g2K%idK#4uO?06RsH^G z0H(e=1~a99cpQvE=8Y)+d-T^&%C^>G(CD{X5APn+@7AMFgu#2Evp1b`XBxF<9^B%1 z7HR0YS)re}f8*SfO)||?D%>gjZuZ=5bIT&(IU>%kgs|1SQ~AxqKYy*$u`we94;x-O z1vs`{iV9prQqHyt9pKm~-gQ+K=vKu`wq?BU$WCS3tRI5%GO4KXE;eXuh)Lpo`YpPQ zOZ5uvpIQKIRfU|gG0-pLFc#%No9p7N$X(RR(qTH`C+`Onm1C#k!YQn|sD5t3f`>|t z?rqO_6?j@};tghcrmcAn5|F|a3iEun%&|>e0%xYq`;pMuZ)p834z?O;j<4A~rX96V z_DtSxG{VYEmE>l8*;uv?gVgM2#Wl_k(g$t~)lQazv~YIbF+_;yfFa-czBAdw?gE*~ z*$OZ^Xw7&zniFYcCdiF#7wu2x74CEt!S&rA>JkzK2dR&Q2dQJaUZr}!lR5|V91pS5 zbVn`U6CBd9ui)!42Q>sd6-84&qvLJ6n-3Jf76x2KjcL)E#MeqUH5ywW7KG+joLi(SFC2ji;&cw(Vl8ke!f>wWkO`C+H#MoSrkd6Puf0*Ar)ENzdo zE-f&J(CNoDly^g=_FZP&<Afkb*I30?C?}QSaa7@=lTl==85U)Y`3MpKNaF1~zC~vf zPkS!xcm65NChQJ9N0g_SrTiz)utO-iV;*qUYBb^)S#+g1aKRI4F=C{;%#A;JSPiUo zl{wTnbt)TU`{|ymveC3~mmQ_C;OD!OJbO5^S0qMmOMO#&_B0-8! zAcp;#ExOqWM($SXy=T+SwC#`LV|aL33OFU187iDP#S@G~Y;Ntc!q>;ob*=P=kAsD- zs((+0Sd);HSHzH)cUv~rpv<=4J~J=1Nh&k;%IYa*^%b^T+@9w~u}_`LsU^4r#OPKr z7~I@SHn9|qJ!Ul)Zi>_fU%#roakw$z02nxXW?~t~H-p3v=lR#^@+bEc4I$D8@>@rJ zaqv$ZQ_Qlzkg^-|VqVwjUn#V;_-pQ3rf_LK#$}m136rT# zd#$}SH1v0fmMbaaL`5x{D=89kETA*vCD%14qpIJ`%kbm{peLNcV56{=+v#EAH?zy5 z6BYL>d8L@4Pi4bgZxd~_VVV=aC_EenR9qiFPrsoac1Zzhnch*)tWZAEA&MKF=8 z(Ztrpe~-r0cFY&YPHbpPkay!qp0SLKD^V^|Fikk-Q{yRNhW0t1MJU?om|57 z;87Qgg&w_2F-XZ<=msmW-PF!?MrhFq3s(%LE0QZWQVUu|BJs4DRp&(F88T6dn+!YJ zty!2x%`2^s{oE3_Epjb@eY@%2YRT{*+nj)=z!x9!0=BGIMgG-YlItq$ftLPK8fhT; zYEo?rmr39;R$@cRx zMP6s@h;lSH{iqSy5&K|o+Nhn{4hob|q=z=VR?MWxCgT z0H*aD+x@XM8FIm!t#pTOC+#%1_GvPIDGtt@Jgp}E#d|1FZ}Ujc>mwtcBe^593zmR& znnDt$yR%y~nG|-ma{dt~5A$o^mBVwwK^`PW{ZC-7TAzI{Z%D-si@HNY4(>0h z#XBDoNNL1ykxLTl_>o{Niur)^2xtSE3lcjCfrK&g9q!vt7Tivc_^J%?ik@3MNlX5< zKfJ}i+HSZ*@*~?uWHYBRE*>^2cXoz>*EKdCgt`~E+I=q$fyd?M-af{`1gYi~tfn|4z0?Of3Z#kB!#37r zH|HCnfbh~Xz#5!ASjuPCU+d^#$Zfv4*B$GqKMu|o;h1UOL;83FNwk6ia1~M8Z!elJ zvV2VAs!iwISY$kE%nJ*(Wo%7VR8;Uu!n?683l479CuN?^U||ULkiAee)^`>N(P7uMUJIJ52^5aN*|Vp77LdSQvN%IcVS2N3xq zd3y=e_|df%wg?bfaW9jpspCSJv&jgMia&G`06AGA*-uqqPuWcO0~W z8IVKeE2}!}^+U=c|7+AoveBN0Nerdl=7Os;=w?lV+Q~SvqQj@HB7TM)X;$ImmnMoS zqKt}X)18wf=^zC#UfbHr68~G~QY6GvAAB^C|4z84I>!I=%-V~!HmS?>g%Y1*JC-2y zEE~G@^Kq@zplf2wbvLbHSU@wZ)c6Q^y+MhB&KX!-*s$=f>{5Fp>SP|Lk@K-hDkjGM zwHnBYhL~`(vbo-`K3CX?wig%Uhiv}Y>bi*K&g-%^y<5nF<8+1PH>0*KVY6Rr+E5wV z!RyN|vE0{jqUXoruTH=y3|gw9j3G2GiZoP}eiwRWIS-j7TEHUR4B5k9@7!?|-mIm@ zNw?Xu?5SD$ZS&!~(-Hsx-(wTj9~`<8y&gGI8ib;Zk3VD3fFE_RA9eA_h>1Rn(Ht~7 zy(#sgK`tyv7fQHMv^KvK|0cr%%;3~ECkq`ke>_+KB-dWlT9jhhefH7+Lb$J;nF4zpujCoo$z`F@1Tr|x6OygmqHL2 zPw|ewF*v^sj&=2f&b<%sntm(|D|I z69hRuILO3t!-Mk;Z}lrDxq`p4IJCa%yQb~I+UEwTi8Lp}6hJ+xOu-8KGS1Wbl|Uy- z{wD)rCMN?;ZR=Adc~M$DNt3J_iBZD(G8(iopGh1?N#&hYeK^;kVk*cEd68?oI223t z{zX%;g`o#MONW-qXOlu4eiscsD~D{vpIg_us#UX~PT6kY8;TcjW5AAW1!uLHYm{)Hv+*YyXjzU#x&kS0*2? z2m4wZ-1L#6BfV}RCp|+uo$Wa8hT(w-oUYN$q55I-jxTDg>G&kh|eHUQC8iKMoP;;WFnFa?pp4QW}S_oA3h4p4H zM%0OnH(o-AGtG={-C+oaL|~{!${m$Ui!;AXeC>$0k{luIidCnT`PhrFg9NRWEKt#zC z=@Vpz!;<}rUE&Q-Om|j_<11*)^<~Vb)|eW$=Dy#0>y=zWRzN*Dhdj(AXyDHpu6dUo zxnU)ei{i37;R;64#UHm%_nxHrL^5fsrG*o!Dy!a|Nowp|mIXUhQj-2+LO(XyOJF_V zRrRj$JF|uuulhY_@)Lua(y@E$KUq|w3Vt4-UZc-_)sRt>+amv_#8A;kp_D#PN4s7w zI(N8`i8-CAIp7I$aBw*Eq+Q7Jx?CLj8o^T3r47lLqU3Jrxg#pIxViP((sRW?8Wp+P zBBIFQ-iHW0!zOv&p02@yRq+K2Z3c?f}4h@&T5uva))X%MLIgTHpPGv;s{p-xEgDt-Mc^kUwaFSL(aVp8ASF-5LM^ZtIo$OzsJXGB z)UtBYuzwINe%QOIU6%LmO4B4d(VZ%Xx@{Ar0_J_Z|A3vND9?7A*B6}x?mFFkY#X0= zs2-hXfx%X@gAa+M7LFwfTQ%h%6ZnOxQwgudet&;uPzl6qFrlS|#aEd9c{ptRabTje z*F>`fHw^!HJ+xZ)YiK)j#IKkpc{-EXT*7N4p259J}KU8r@)OznJmKC ze+EZC))YJFRp-0tH(%X+>bjD~a%U7(yqWBb{K$c^>s>jptuf4xqTiW@Y`=FX=dV19 zZub~7RgKe`J!1~6`N?Bc=h?PEC=>HKWjxZCno6CkCVmd4dVKMCG6<^HlaV!pt$NLr zLTq|uHAl?4XwBG65a@v}u;5@8F_$e$-^d%twqly>`o!yMe{7H?m3yw`f@Vz#pVAgF zFr;)pUSV1_=z5GA!XR7J=TuSNg6Vgy9yDes*7}}b@UOfcwYh-42ochroFUjrd&%Y8 z&7Vmryn&7`g0{Ye5Vf(AO)gk8g!*wSoLMQGH@JM~Vc>)LHA#_GL}0g+eud`PVuww>$nL8yvY26ug;v(8sq zikGUV9i6tsR5BmA{=!l!_U8|%t0ejPhf;v_m{ZbsK@)yt4L1*n?DThx(Rpj^38o=le zaY2u-!GO?BuGIkANc&cU1N;PkJ61T_d#8(J>?d!^l(O4-4frfZSwc>Uxp3!tX*_pR zN$adP4SDHX=AgTpygN&OEucRK0|IL>J5ts>eH+#MKvZU`J-|;LX=Hnc*?7etd5DFDZDlaLdm&Nl z|6t_nfcRON*y<$qKVui0`_ReMs^LVu2CIKT6*Qjzfc_zuCN7;bc;xfb^-|rQU8lHf z`vc;avv!L=Fa(9alG<4sIn~R>Abyp`jN;G182Z$o?`)S~hoUX!hJbt{L1U#<%6#^Q zSQq~gA7PXd!dsqlsei#ed=Jg0eG99nS&)?ej|GaH2n%Xv`^mg}%2*+EiQM-tkt;QS zZv5xNyg>)MjGz%KtB<5EHku!kiSiT4ciGxo^e^1DFrKwtA98dt)Tu9OiRFSv{6wse z2c?OOGUirjI$a;PObN&i1#;;G;S1m{9lyWtSdik(*lZ2<;zMEeaF;^|Kp&}bpNkS| zd7&0Q!HT3s^)*LVIA#JWQn8ty@K z>-wEL%utq})$bD32`vA9$k^&Igi(iHkJqW90;m>k?*1Pwk`V9&FTSd>3NTOC6_A;V z6g_wH&LDfj49uQ>2pTnogl@U~)aItDJ;S(P-=gQrc6i<4eg%I1g@|?IjQDX#Pk7jh zFE|n~Fef4m&Ixj%qs(4B}T9^nVwa z+C%Z?9AzU7#?Od34i6eTLSDOHPHEeEQYh_${gvN*=}6_bIoXoZHOZr_t?mnNzIn#_ z>g8ad%+-nJ-QG<{rmfmPa~BJ3Bnp~2sKTLV%A)?#c?uWmnczLL8g4{VZ(O&FS)oxth(k?3EVhbaU(~x$~L&%;m-Z5I^hfcfQV_^*St&a2j(0F9p@D~-T=GuGK1Ol<%qA=i$;|_tGh4TniyZKH4jfrO z0zu?0!iaGEmm|jJdWjAK%Zla}Saj;QCsmn$wVn=KSiaR2HD9$Q4dq72L<9F`q05co zPvOl$ce=2NuYma*25--cr>_?n1HHE%ldFUqKuKX1ydMA~+;w0XxND|4z(MbUIjW62 z!mkn0N6lcWcVVbNo-6@P4r_3qtD6r(zznA#vQcUl5?R$D!`md~1XE~FvsAEx-fk!7dK@R8a|6Oy;uAwNg^&-i76A$4S-8R< z?e3ju7jO^%ekcS4E&Mep535XM>grIb>e1=KTBz@lIU)l@U}3%a7}ci>b2mSpAUrx7 z^TN>fR^nwr$u?{3L=s%t(pEqf_?(bEW;OGd%C3yogPSdP6_K`Wxfj4h^ zo8fN|vL7U%_nPJyXYd=XL!TDk0?3`o1PA)3p>yIrv>7DHAx}3!pRjw5MTaG$&ZIC+ zcS;)W$#Dd#S9L294PT-TzuOwHO``s18ZIe2061n6+}su#YBicHScO_}=*Zq8Wr*{5 z4X>fW&e&MAABNy%euzACF|mRapf85n{QXh(s2)_fe(7!0%;O_T5i))d`)zcfRLR}7 z-JvA|LU-Iu>Lt>6H%<3D_RR1oJuFcgMFha zua6Zp(#ehV`TVuBD+$s?6WW?qnshYymTyQK!upx1HV72p4vu(XC9c3hjF zbCH#^&XMk!-pvb}i?&n(_a59CFB(%AUu;#;K)+t&_ov{;sH8_V8^E4GflN0F?r1Pr zXwYF;P|Z_Gyk&7uW9qjhjPU5R&h(l6gE3kxQOx^GNRsUygjl)tEA1eH7q|s3zno(% zIb1BNBnP@&PIw)MCw3DXP<(iY(4#jVtQ9^$&W4aWpzz`pH`w%SU7Zg3bbT)PCpefF zX_D)ziDxo>BGBcfLROAZV?<3r6o9Z@7C} ztbTg+EQ97I%&)`qAW+5a7Y$TF=MSPhU*mOUR7qZD5I8p(sMiy9`OVdaNXFrMR=nz|4+)hmW zkfxMo0=f6KXIBD_;`x&g8M%3R*SENZ5~&hLJ(IRfT3?7NwY{i+gdzYx0&)1{$XYpE zc*y8Gcfd=O6QeP!SL{DGqRdPah(^|O;D7!-`7FeDOE0pP?LUd07quC#tZRJx!%s*p zyqZEo@WPOYxAI`Q2&s^95T1-9JnO*y&)U!Rk{dK#E8T0hHW=QkKFoiQuF87PTx73D z^@;EehaDe>-C`}N8W*>#lRxssCU@CEb08aWB@HTW=4i~;m`@O}oBi|$$~LAb-dVo< zV!ow2?Zt;2ejsV|-Jy-D{kmRhN1ufXLe|9Z+@iUebXlN`Ctwvsw_2}WmMqU>M zH`C*ivT23ppVf%S&3@>-C@V4-DXfbE0k4|A2kXE7@diFWqfvKjI3TAcj^60lWZ86r z{LR+NEQ?G8PIh(PI_iDy?Ne;--RJy{WM;^^^=OxL z(vo4O^|VQ*0L|f2rETq!0*eOk&6oD|t;ddgt4LMSsid!HM!3Y2Vak1rJsUahmR{-J zrgn=Ya}p>oH;$*8S?1~BH86vft*yD~CKOLwrX$HP!!DjKHA++_ous` z=6|6A8UZ=O=s2fB~H8S{CNwBIUSs}TEVm+Fm~bU`f;ZWN)dT8>{~3t5(u#Y0U% zPnyX39@P0hn_h%6F%TW5(p`%G8SrZonx5+S1DRhDe^4$aWvi{!9f|TZF9{49GEL30|ik z-e?c<8t*~jzttOd*;%96Jxyca$x)`H^Hdj&nVd1GN67#sAl5 zp=5TiZH3zYczUO8bTKEFKQ`V0DkS7*NW@V)Z{G0|IGl-p8g3fpHCA?uQSUi zFTb}J|F}m}e1vNK6>M&>ToJBT5d9|(ck-);&I1=q3B}x?A@^JBidIu{4z+l6Xun_8 zl$1R-s1*!IN$h*ow&Cvlm1}$z_kxvj+KQTzKD*a0nEUUyTJS46QcUp?$J25R=oRkv zZmMvv{)I_*kSgg9O1+8%LkUHI-*=&XnM+CGbU zORa_I@tjkNQC^mmUH8{@gH}bQ76;JuZxq<+1Xb|}dAbhW(t)k^Lhn&`Z<$=lD_=3M zfXIJh0g(5y5om}X7<~$wFRfY z34A6~+Ri6rbwdBt?{8+H?bNsxe=a)Ptu6AOe#&Z%yULWIw#Bz~q0n}?o?^#2+QKSkYnXN>%w(pwg=Maeo3EqOu6iqQCyU4v zcSa3dSIU-MP^Dv4YN~mbsQxyqASNo>QFq;%FVmW%U^Rj^x3e}kwiXQIxO=3CBWE?l zo}K&nHcf=nl5uq2`mkW=f^qc(LEJbH@DI~KY{N>#JjcWNoS8i3mI$)j0Ml&D?G7-- z?3U+J$u~zCLErBh>StLgGa%l$`k`HGcaz_blZikV}zryS4kA0@3)f zea1Unghvt%HHeg^G}~;}S}w{zh5TpBkJ4h578+ev>n+YSt78)_Tz4EPrUDxi$u!hs z2^Z5wHh*e9{*Ikid+DU_7k-}skpIsJ^SF!w4>hYl>ekB1IQ3r*R<|Rlh_2RgXgwic3NFG+m$dk$z23_@;28J1a%RlcPlW&+72u1S+j-*)Qiq1#<1pV&ZEv9LyHQEA zwQ~i{cI}({SFe#t>`p$s zB8Ra}^FO|e#bac=<_-gN7z3W{b4c6%pF6fWtE_wbM?9_^Ak13dyx3B)(eg08deK@5 zGgIH_dp3lkNn|5;$|$7cz&Vw;(&#!8IN96Ab)~hv+4@ z&*Rrya(Q1M5iV`HkwaIHXxuld2|~b^e@N5}SSynOXq{TG$0|lnsB&4>Tw@mh=Sv9v zrXAVsTpY7sEW&?kx-lN2&!E?O{`S(*-O5Eeikg%DWGGh9Y7q z=?;-A|1kg{59ymiaF3^l5&8d)_4v;}l;-{hi2nJyd+g+oZm^yHi0zwxVo8v2&; zzg_;HFKo;jv!2bAjffKjGJm3!y!*(EKLlG|RV~Pk0BL&^#Tfx&*3X^j2L-mi{Aa5! zKR_Hl|7?bI?EmiE|I+9G7Z@KG?-;rcH+Wa_DpGQigCg!z=%-e5d?dBUC`Z*bX4xl# zoqXs%aTCVPvZW|Q;qwV_6TDuYL^W}_ycz`GFh8{JFP^-n`G?dg%{tfW)^4k>%lLUs zrL4XZmFOvhC5DD%ijZG)p`H_;5y%hiV;-|V%e*7_!?qQLUeo14-ue4r==W5*XDfBW zHBDvMKEcU`Z`^`l0)s4 ztTSvRnfD@$8Zg#dF8o!0JS`CjxJ?Q4J6Jk{gG=n}zg5npa8|bRSq4g;qa3ao{P84r zI+us=kPW{0hg=wXI?beUZVno@ z({CXomibeG{d7w=hbiYUI0D`n8!M>Jg3n92(m!@^-y;tXa2#4CZ$u}RQi9z4z+}e| z)05{w?S81Sbkcv@ygyNI_y|H>K#_Z&JE7-u(JwbjbXbS1=d;7PMr}Yb0s7 zT0pX9tiIC`QxQuXnA<`u7!k}Ac$5vFOggc@U;yLJ-)A|0BWh~=HcE{`$Zz7IEoP&q z%_S3_VPWNDhp{VjZW+)$d66qRj$Poaz^hwsMEvGWqD-N)dsW1Im^6$nrm$LpxMtW{Y7{{y&n-C`?`(-f z&u%WS`6hw`GW3>mO0&l}i-0!IhT^fi6&;yRkAAqIM^qB&Gclo6f!s*y{~{y$?|yF< z#HTxSzjOU4s75{fyP5p+2&DJ4S-cz%1C#rLY7c5>4_BP4nJW?2Vlgu|JRWB=PKL2c z?s0-&d6r|dEia%=Ms=mE^$+COI?Ctrj?edm16~j(Cal`)g zt1$b*>zeb@`H@l0cWc(ApPpv5(2A!6^lw0_kP$Lj-<13`_%59H5EnUo@tse*)mOm_ zHzDgW?2XppK+JuE-OY1GJsB6GMUaD+?N-RSLfC>izOQ{zfl;ptwZJvyqlO|&5Ajz# zwAHtv@i+YnM7{Onkqi6rNSU3%wl+4pA7-nNuGi2yYL~(Cu=GetXJ91nZAkRq`Sl|Fk>UlceZ#|B`yv_F4!BO7#<+)UDbsoOsHLDt}9=%<3I7&%TjKEL){k zTXsS`ZD(p)=?lDT8*Ma%*X|Q+%#?7liq_KjJkl4@8=t5S^J1MZYIA9^a%Z}3md75M zf~6&^)ywv98-!7k?O;f^^*t3MMtb>;=ls#qW7x)k`6exfwuQwpI)aL_&gXYuKz-OX z}`w&ECDTN*?c#B;L-4b)0gdnFP)agTb!;QjvQ5p3`i`~@UvAq{BZMvC1D&z(VnqUVYraYc;2wcv-MWi=B5M1|QZq~!r zV0$sy_dp_i=RhAdYLPMgEcxnTA#NTYAFM36yBRKkSz+dC(8;iN$$lu$x{^;+p8 zYtoEyf+i~Z;Xt&$yMDjpG$}JL2x|Ss`{t2r-FKt+1VUTFl^#PmGhr^COUoC27Cz)S zZT2i^?Tz?8dQqah#v(@r5c>^eH!wJ?Z>3>1ZeJ8$Uw<{@$yoU~5jVbFxN}K{^J>d` zNEEO#D#LM5sh};Y71pJ(?rlT;v2NA{CvCs*3YzJpW&`{ zb=q})`|-;Il5Mj~q;0dIgQe9UJqvm@*0CuoVG8GCjwqD*BLJm7jR7(Fa%@A^z3`M` zB#S2@zn@TnTWOb%6lME$T~X`<4TZrP5JQ%4r_#m;%oKZ{*i&iI&}F%R6I}}!$_fj(AM;Lx)Yo*A z-CJ*TS+`N1FCOAzGy=D5>?J~n5Vb%tAyiJi`PFDRI=VIGYAUJhiaTQT87mDinl*MO z(dgCNSXx5H33X&3wXpa3iLLS)hEG~X&B>c0g?tPpR)-r2VDcPy8r*9K3Xf=x*tY%wNgjsl<#v3{lw%Q$RLFs`DC28pH*Q#1-1X}798U5Z_k7#kYI}q@r zXr*XP>*3boO-2jD3=@?%%DK#P0@SnVG#P2hpIdin9s%**s1guwZ55N$2-RKa{5lGn zpo4men&W;u$3$@H_q!#(k8mmKlg}CN-A16h%ki+r;!A)g!|L>8|1}eVIa=D1J8Qe9 z3-;3q@|P#yT6Db@AFblxEw&!~M&H-7nDLXJ6y9AwnidM%P~ZU*VP)qF2_3lOTce>8 zfmCSO7FGbq)0;b-%u=86or<#N6j!Kz)VZ#cHC($H4ao@>C-{vgfktW7d(u)K%;yh0 zx8Q54n9}nh!jNnY_9Sb9`y{V#do+4kd~Wkq7MWsPDBgOMSL*}4cIsR@Xqyrz9wzVW zTz(Q8dr6G1B1O|(H_-0nFK>t_x4oSQ#h*R&pR_~-4+_MWy&|m(pp$zEaKul0-*yC9 zE8~$dZEgG7sqb1IYh;u&tAu|8md9OVfDmT7j)rIBAhN<;Wd;R77EimZuk4O_aZy>HL$(A$KZK_oXSQ`NFPB)RHm~_ zwCTM|M3DYVxCDlVYZpNN`agpMJt>hbM zLUY1!p(ZGGDbd zn&PFSRtK59Z+zO+ynj3ipvexV=-Fyh$EL8kw4S;!BxeMa5BnETI~PL%6PO*>n{Wld zqFcV3FOm4Jben?j%jd?;I@eh=I#3f3sFkL z{>$Rv_@Gg1L|AFdPv! zYE!wIS%px#A!l)C{}@3GIkIx@KH?68s65`28E`a`+d} zmHjWE3-;eY*Y3ZtwRg{S4Iu@@mXld6#HumSLgLQ#$Wnq@n-msmLgF`|21=S z&rxB}O|S|k?O;BwJAZz!#^%vLUd{H0!G_E7C!dydti$=2ppzEASZ&Ze@1wVowR^(Z zSwm;;AN|fv2Cg|$<)>vCZjC(VW>aGMOzc)uUJAx-uKWy^k)^Is#?(g{W6I&N=iU-u zoNqOxYR+m?P+Ti$U{HOYDYgn^e5SRxaWZ=oG?CE~{Ry$cSN)7>k9@vWT|HS21bc>k zQ)G1etRQnL^q5Szbg@D*T&Tv6s&x@%u--f#sPEX0wp@QvAUB*%arCt!vJh}v zOvi?>`eRzTo6&tH`FGIR9nb z+dHb+QGBos{1WH*q~=mecm0A88E*sQqPQxSBrwB~pcHUyc6R-*^V`ZGO`rlZa434Z4&GY}+HD@ZGPE;O5@uQ}5X5z=a3u9t1t#SsZ zL4c)`-RL=o7KI0@<*{LM@1yq(<>}JzF8Mxi?9{dv_`2<^S>v(A77-Ul^XWmG`NOL? zTibZHxEg0kywNRC@LA?c5b7N&}Lcm2@iSqMzE9uf6XFNFe%*y$V2}(D<%PQxy3hhjH#e% zQ5!?C;{yTEsl{Ohq)z%GJVZ z%B?EMk7alLee|RBT19?&%X&3^*;GCJOMq%TcE#`e3yx2zjZrlVwrlsiboaIC%lQPq zICUkyjL>QEI^cTiJTQZgbZ_1nU`n3OA5?BG#b}41Ej}*1^%3E1=2vIi85BNUTFCuw z@J!t0bc|fg;Nt=`T`}tiy1dJy4=xlT4&vK{PL`i#<_oR{=?G-)#_J^dxi$3A=7B;# zLeX?{%kcw${!B|Af!7>h6>^_!b|^=3lbP#Si@I|>YPDowng_}rl>8ueI!fu6Oo4Tf z#}g||Wuag!V9AgXGH}(O_bqMA{Sv5kM{x`ugH4|n^c@hj@+8KTa4^94ALGlihYP3% z=gt_xF4TXNHh-<%at@`pc&Xs0C4Czj5@B(=G#MMKR`!p0k5o`(`^A*0siid?noy@z z+la!Vd;eN!i8ZCp-kQ`?&xZWxPkcyLMYp)_W^TTJ2#Focau6yNFV(kTiJimBlAP#C zPl5rB8Vey`~3@OaU*6gNXXa~wahG#veHDwpfK)@ z>lj!z%>~oUc8wCPHJL8P`p(hGa_lU8f4#CCta{%d#G65QRE2I7!qM&?1Os#2nbG1p_gbKjzwlZq#C(NJ+&;d?@mxq+0>}Q4j)cE1Vll?x&2)Ms6+pPq-+@@mP zt9@_`On73c@(E$wRkpp4va5_cC)&tdmQfJ8oyvEZP z@kii*bUDy~Mq{#{AW*Rd?ZZ|3!u6THf5<*-z;(E79?BbWyMEMwKxoZX!J3*VSC~DV z$GzHgZQ$Eddp_?S@`m#xdAC<0gv?;6?;w08skV;LOtHKXdHze zug901g}*u9B{RT@V{z;%b=aQ1Klb=_{p@b!nCZaL2G5*u>DmM_RUA>{Q>GvdzReHlOD zOC3~Cmj-+A4oebqMQXAwMm>*;;*T7o8E;(#N`ew(3lZMk7ZNPzs?`IzV6 zoB24gv$>kDY{O2*%1eEX&p5U`_7NobkCaj%GWe^{%h(O~m!;twB4l8AV4de1%>lX> z=G_OuC&_9Rd#vPRJMsE6x4rOO9i!*4qaH9@KsL`y*K`jJzV8S$wtd%MRx*@Z`=qRI zww&=+5kB2R0|Zz%CJtmH(l7M@U&xF}^~D*6=V$QdUylt65=t28%wy?)VO}=uV&2)jQ2? z;%zHaEfA}71^{nh=cn%SNUjVj$GfLff-f+D*ef`aPc=bhMo^lZx1t&8oT^?&CquWb zRCUO_rrKW$4YtVOzAb6cybDvqrqX}_3L_7VXexEalirx#`Fb z^{&ne#?gS105=V@cl<#B8ni~ImUdpF~{Kw;B zUyAdq*IwtsGNv}hl)Gm)T~lq#;SKR>lfMzrM=Z9_M{teBr<1eN!_mqw-)86$Hkl3Yg)8)XLlerYR;n%O2tYzd?U8bVVQd(383ga5 zRthKTk6m#zFSi@5U4vp4$U3$a@xC=PX&dvV@N%N%<`4iqtbM0C9A4*Q`G{}hpdDq!d7&AiFnW6(BkPr`l;}6mB1UJ} z9qa;;riq

#2!=xpoYbWRPtnAxgLuKkKAsvtwEfBuqM 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 literal 0 HcmV?d00001 diff --git a/docs/compare-exchange/assets/create-new-cmpxchg-2.png b/docs/compare-exchange/assets/create-new-cmpxchg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b29f4abdcdf5409e43055e566d52ce0d2362c0e7 GIT binary patch literal 72253 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�goRGZrQGn@n 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

s4G~o4(5A2ow;z2ogog>p8 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�&|9`>&!^i}&H?;z1o1&txG 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 literal 0 HcmV?d00001 diff --git a/docs/compare-exchange/atomic-guards.mdx b/docs/compare-exchange/atomic-guards.mdx new file mode 100644 index 0000000000..1f49046005 --- /dev/null +++ b/docs/compare-exchange/atomic-guards.mdx @@ -0,0 +1,47 @@ +--- +title: "Atomic Guards" +hide_table_of_contents: true +sidebar_label: Atomic Guards +sidebar_position: 11 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import AtomicGuardsCsharp from './content/_atomic-guards-csharp.mdx'; +import AtomicGuardsPython from './content/_atomic-guards-python.mdx'; +import AtomicGuardsPhp from './content/_atomic-guards-php.mdx'; +import AtomicGuardsNodejs from './content/_atomic-guards-nodejs.mdx'; + +export const supportedLanguages = ["csharp", "python", "php", "nodejs"]; + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/cmpxchg-expiration.mdx b/docs/compare-exchange/cmpxchg-expiration.mdx new file mode 100644 index 0000000000..e7858d3dab --- /dev/null +++ b/docs/compare-exchange/cmpxchg-expiration.mdx @@ -0,0 +1,34 @@ +--- +title: "Compare-Exchange Expiration" +hide_table_of_contents: true +sidebar_label: "Compare-Exchange Expiration" +sidebar_position: 10 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import CmpXchgItemExpirationCsharp from './content/_cmpxchg-item-expiration-csharp.mdx'; +import CmpXchgItemExpirationNodejs from './content/_cmpxchg-item-expiration-nodejs.mdx'; + +export const supportedLanguages = ["csharp", "nodejs"]; + + + + + + + + + + + + diff --git a/docs/compare-exchange/cmpxchg-in-dynamic-queries.mdx b/docs/compare-exchange/cmpxchg-in-dynamic-queries.mdx new file mode 100644 index 0000000000..9446d6e720 --- /dev/null +++ b/docs/compare-exchange/cmpxchg-in-dynamic-queries.mdx @@ -0,0 +1,37 @@ +--- +title: "Compare-Exchange in Dynamic Queries" +hide_table_of_contents: true +sidebar_label: "Compare-Exchange in Dynamic Queries" +sidebar_position: 9 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import CmpXchgInDynamicQueriesCsharp from './content/_cmpxchg-in-dynamic-queries-csharp.mdx'; +import CmpXchgInDynamicQueriesNodejs from './content/_cmpxchg-in-dynamic-queries-nodejs.mdx'; + +export const supportedLanguages = ["csharp", "nodejs"]; + + + + + + + + + + + + diff --git a/docs/compare-exchange/configuration.mdx b/docs/compare-exchange/configuration.mdx new file mode 100644 index 0000000000..2b9393e08a --- /dev/null +++ b/docs/compare-exchange/configuration.mdx @@ -0,0 +1,98 @@ +--- +title: "Compare-Exchange Configuration" +hide_table_of_contents: true +sidebar_label: "Configuration" +sidebar_position: 12 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + + + +* For an overview of what configuration options are and how they can be applied, + see the [Configuration Overview](../server/configuration/configuration-options) article. + +* The following configuration options are available for compare-exchange: + * [Cluster.CompareExchangeExpiredDeleteFrequencyInSec](../compare-exchange/configuration#clustercompareexchangeexpireddeletefrequencyinsec) + * [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin) + * [Cluster.MaxClusterTransactionCompareExchangeTombstoneCheckIntervalInMin](../compare-exchange/configuration#clustermaxclustertransactioncompareexchangetombstonecheckintervalinmin) + * [Cluster.DisableAtomicDocumentWrites](../todo..) + + + +--- + + + +## Cluster.CompareExchangeExpiredDeleteFrequencyInSec + +Time (in seconds) between cleanup of **expired** compare-exchange items. + +- **Type**: `int` +- **Default**: `60` +- **Scope**: Server-wide only + + + + + +## Cluster.CompareExchangeTombstonesCleanupIntervalInMin + +* Compare-exchange tombstones are created when compare-exchange items are [deleted](..//compare-exchange/delete-cmpxchg-items). + These tombstones are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + +* This configuration option sets the interval, in minutes, between each cleanup run. + +* At each interval, the cleaner will only remove tombstones that are ready for removal - meaning their deletion has already been processed by all relevant subscribers. + Subscribers are internal RavenDB processes that need to observe or react to compare-exchange deletions, + such as indexes, ETL tasks, subscriptions, etc. + Tombstones become eligible for removal only after all such processes have handled the deletion. + +--- + +- **Type**: `int` +- **Default**: `10` +- **Scope**: Server-wide only + + + + + +## Cluster.MaxClusterTransactionCompareExchangeTombstoneCheckIntervalInMin + +EXPERT ONLY: + +* This configuration sets the interval (in minutes) between checks for compare-exchange tombstones that can be marked for deletion by the cluster-wide transaction mechanism on the node. + This is separate from checks performed by other subscribers (such as indexes, subscriptions, or ETL tasks). + +* Normally, whenever a cluster-wide transaction command is processed, the cluster-wide transaction mechanism checks for compare-exchange tombstones that can be marked as eligible for deletion. + If no cluster-wide transaction command occurs within the specified interval, the mechanism will automatically perform this check after the configured time has elapsed. + +* Any tombstones that have been fully handled by the cluster-wide transaction mechanism will be marked for deletion, making them eligible for cleanup by the tombstone cleaner task. + +--- + +- **Type**: `int` +- **Default**: `5` +- **Scope**: Server-wide only + + + + + +## Cluster.DisableAtomicDocumentWrites + +EXPERT ONLY: +Disable automatic atomic writes with cluster write transactions. +If set to _true_, will only consider explicitly added compare exchange values to validate cluster wide transactions. + +- **Type**: `bool` +- **Default**: `false` +- **Scope**: Server-wide or per database + + diff --git a/docs/compare-exchange/content/_atomic-guards-csharp.mdx b/docs/compare-exchange/content/_atomic-guards-csharp.mdx new file mode 100644 index 0000000000..66ac08484d --- /dev/null +++ b/docs/compare-exchange/content/_atomic-guards-csharp.mdx @@ -0,0 +1,357 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* **Atomic Guards** are [compare-exchange key/value items](../compare-exchange/overview) + that RavenDB creates and manages **automatically** to guarantee [ACID](../server/clustering/cluster-transactions#cluster-transactions-properties) behavior in cluster-wide sessions. + +* When a document is created in a cluster-wide session, RavenDB associates it with a unique atomic guard item. + Atomic guards coordinate concurrent writes by different sessions to the same document. + +* In this article: + * [Atomic guard creation and update](../compare-exchange/atomic-guards#atomic-guard-creation-and-update) + * [Atomic guard usage example](../compare-exchange/atomic-guards#atomic-guard-creation-and-update) + * [Atomic guard database scope](../compare-exchange/atomic-guards#atomic-guard-database-scope) + * [Disabling atomic guards](../compare-exchange/atomic-guards#disabling-atomic-guards) + * [When are atomic guards removed](../compare-exchange/atomic-guards#when-are-atomic-guards-removed) + * [Best practice when storing a document in a cluster-wide transaction](../compare-exchange/atomic-guards#best-practice-when-storing-a-document-in-a-cluster-wide-transaction) + + + +--- + +## Atomic guard creation and update + + +Atomic guards are created and managed **only when the session's transaction mode is set to [ClusterWide](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction)**. + + +* **When creating a new document**: + A new atomic guard is created when a new document is successfully saved. + +* **When modifying an existing document that already has an atomic guard**: + * The atomic guard’s Raft index is incremented when the document is successfully saved after being modified. + This allows RavenDB to detect that the document has changed. + * If another session had loaded the document before the document's version changed, it will not be able to save its changes + unless it first reloads the updated version. Otherwise, a `ConcurrencyException` is thrown. + +* **When modifying an existing document that doesn't have an atomic guard**: + * A new atomic guard is created when modifying an existing document that does not yet have one. + * The absence of the atomic guard may be because the document was created in a single-node session, + or because its atomic guard was manually removed (which is not recommended). + +* **When saving a document fails**: + * If a session's `SaveChanges()` fails, the entire session is rolled back and the atomic guard is Not created. + * Ensure your business logic is designed to re-execute the session in case saving changes fails for any reason. + +--- + +## Atomic guard usage example + +In the code sample below, an atomic guard is automatically created when a new document is saved. +It is then used to detect and prevent conflicting writes: when two sessions load and modify the same document, +only the first save succeeds, and the second fails with a _ConcurrencyException_. + + + +```csharp +using (var session = store.OpenSession(new SessionOptions +{ + // Open a cluster-wide session: + TransactionMode = TransactionMode.ClusterWide +})) +{ + session.Store(new User(), "users/johndoe"); + session.SaveChanges(); + // An atomic guard is now automatically created for the new document "users/johndoe". +} + +// Open two concurrent cluster-wide sessions: +using (var session1 = store.OpenSession( + new SessionOptions + {TransactionMode = TransactionMode.ClusterWide})) +using (var session2 = store.OpenSession( + new SessionOptions + {TransactionMode = TransactionMode.ClusterWide})) +{ + // Both sessions load the same document: + var loadedUser1 = session1.Load("users/johndoe"); + loadedUser1.Name = "jindoe"; + + var loadedUser2 = session2.Load("users/johndoe"); + loadedUser2.Name = "jandoe"; + + // session1 saves its changes first — + // this increments the Raft index of the associated atomic guard. + session1.SaveChanges(); + + // session2 tries to save using an outdated atomic guard version + // and fails with a ConcurrencyException. + session2.SaveChanges(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + // Open a cluster-wide session: + TransactionMode = TransactionMode.ClusterWide +})) +{ + await asyncSession.StoreAsync(new User(), "users/johndoe"); + await asyncSession.SaveChangesAsync(); + // An atomic guard is now automatically created for the new document "users/johndoe". +} + +// Open two concurrent cluster-wide sessions: +using (var asyncSession1 = store.OpenAsyncSession( + new SessionOptions + {TransactionMode = TransactionMode.ClusterWide})) +using (var asyncSession2 = store.OpenAsyncSession( + new SessionOptions + {TransactionMode = TransactionMode.ClusterWide})) +{ + // Both sessions load the same document: + var loadedUser1 = await asyncSession1.LoadAsync("users/johndoe"); + loadedUser1.Name = "jindoe"; + + var loadedUser2 = await asyncSession2.LoadAsync("users/johndoe"); + loadedUser2.Name = "jandoe"; + + // asyncSession1 saves its changes first — + // this increments the Raft index of the associated atomic guard. + await asyncSession1.SaveChangesAsync(); + + // asyncSession2 tries to save using an outdated atomic guard version + // and fails with a ConcurrencyException. + await asyncSession2.SaveChangesAsync(); +} +``` + + + +After running the above example, you can view the automatically created atomic guard in the **Compare-Exchange view** +in the Studio: + +![Atomic Guard](../assets/atomic-guard.png) + +1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), + for any purpose you needed. They are NOT the automatically created atomic guards. + +2. This is the **atomic guard** that was generated by running the example above. + The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: + * The prefix `rvn-atomic/`. + * The ID of the associated document (`users/johndoe`). + + + * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. + + +--- + +## Atomic guard database scope + +* Atomic guards are local to the database on which they were defined. + +* Since atomic guards are implemented as compare-exchange items, + they are Not externally replicated to other databases by any ongoing replication task. + Learn more in [why compare-exchange items are not replicated](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases). + +--- + +## Disabling atomic guards + +* Before atomic guards were introduced (in RavenDB 5.2), client code had to explicitly manage compare-exchange entries + to ensure concurrency control and maintain ACID guarantees in cluster-wide transactions. + +* You can still take this manual approach by disabling the automatic use of atomic guards in a cluster-wide session, + and managing the required [compare-exchange key/value pairs](../compare-exchange/overview) yourself, + as shown in this [example](../compare-exchange/overview#example-i---email-address-reservation). + +* To disable the automatic creation and use of atomic guards in a cluster-wide session, + set the session's `DisableAtomicDocumentWritesInClusterWideTransaction` configuration option to `true`. + + + +```csharp +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide, + // Disable atomic-guards + DisableAtomicDocumentWritesInClusterWideTransaction = true +})) +{ + session.Store(new User(), "users/johndoe"); + + // No atomic-guard will be created upon saveChanges + session.SaveChanges(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide, + // Disable atomic-guards + DisableAtomicDocumentWritesInClusterWideTransaction = true +})) +{ + await asyncSession.StoreAsync(new User(), "users/johndoe"); + + // No atomic-guard will be created upon saveChanges + await asyncSession.SaveChangesAsync(); +} +``` + + + +--- + +## When are atomic guards removed + +Atomic guards are removed **automatically** in the following scenarios: +(you don't need to clean them up manually) + +* **Document deleted via a cluster-wide session**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Delete the document using a cluster-wide session - its atomic guard will be removed automatically. + +* **Document expires via the expiration feature**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Add the `@expires` metadata property the document, as described in [Document expiration](../studio/database/settings/document-expiration). + * When the expiration time is reached, the document and its atomic guard will both be removed automatically. + * Since different cleanup tasks handle the removal of **expired** documents and the removal of their associated atomic guards, + it may happen that atomic guards of removed documents would linger in the compare-exchange entries list a short while longer before they are removed. + You do Not need to remove such atomic guards yourself, they will be removed by the cleanup task. + + + +* **Do not delete or modify atomic guards manually while they are in use by an active session**. + If a session attempts to save a document whose atomic guard has been removed or changed, + it will fail with an error. + +* If you accidentally remove an atomic guard that is associated with an existing document, + you can restore it by re-saving the document in a cluster-wide session, + this will re-create the atomic guard automatically. + + + +--- + +## Best practice when storing a document in a cluster-wide transaction + +* When working with a cluster-wide session, + we recommend that you always **`Load` the document into the session before storing it** - + even if the document is expected to be new. + +* This is especially important if a document (originally created in a cluster-wide transaction) was deleted **outside** of a cluster-wide session - + as when using a [single-node session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) + or the [DeleteByQueryOperation](../client-api/operations/common/delete-by-query). + In these cases, the document is deleted, but the atomic guard remains (it is not automatically removed). + If you attempt to re-create such a document without loading it first, + RavenDB will fail to save it because the session is unaware of the existing atomic guard’s latest Raft index. + +* In this example, the document is loaded into the session BEFORE creating or modifying it: + + + +```csharp +using (var session = store.OpenSession(new SessionOptions +{ + // Open a cluster-wide session + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Load the user document BEFORE creating a new one or modifying if already exists + var user = session.Load("users/johndoe"); + + if (user == null) + { + // Document doesn't exist => create a new document: + var newUser = new User + { + Name = "John Doe", + // ... initialize other properties + }; + + // Store the new user document in the session + session.Store(newUser, "users/johndoe"); + } + else + { + // Document exists => apply your modifications: + user.Name = "New name"; + // ... make any other updates + + // No need to call Store() again + // RavenDB tracks changes on loaded entities + } + + // Commit your changes + session.SaveChanges(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + // Open a cluster-wide session + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Load the user document BEFORE creating or updating + var user = await asyncSession.LoadAsync("users/johndoe"); + + if (user == null) + { + // Document doesn't exist => create a new document: + var newUser = new User + { + Name = "John Doe", + // ... initialize other properties + }; + + // Store the new user document in the session + await asyncSession.StoreAsync(newUser, "users/johndoe"); + } + else + { + // Document exists => apply your modifications: + user.Name = "New name"; + // ... make any other updates + + // No need to call Store() again + // RavenDB tracks changes on loaded entities + } + + // Commit your changes + await asyncSession.SaveChangesAsync(); +} +``` + + + + + +When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: + +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, + the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. + Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. + +* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): + * **If an atomic guard exists**, + the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. + * **If no atomic guard exists**, + the document is treated as a brand new document and will be saved as usual. + + diff --git a/docs/compare-exchange/content/_atomic-guards-nodejs.mdx b/docs/compare-exchange/content/_atomic-guards-nodejs.mdx new file mode 100644 index 0000000000..684926d700 --- /dev/null +++ b/docs/compare-exchange/content/_atomic-guards-nodejs.mdx @@ -0,0 +1,259 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* **Atomic Guards** are [compare-exchange key/value items](../compare-exchange/overview) + that RavenDB creates and manages **automatically** to guarantee [ACID](../server/clustering/cluster-transactions#cluster-transactions-properties) behavior in cluster-wide sessions. + +* When a document is created in a cluster-wide session, RavenDB associates it with a unique atomic guard item. + Atomic guards coordinate concurrent writes by different sessions to the same document. + +* In this article: + * [Atomic guard creation and update](../compare-exchange/atomic-guards#atomic-guard-creation-and-update) + * [Atomic guard usage example](../compare-exchange/atomic-guards#atomic-guard-usage-example) + * [Atomic guard database scope](../compare-exchange/atomic-guards#atomic-guard-database-scope) + * [Disabling atomic guards](../compare-exchange/atomic-guards#disabling-atomic-guards) + * [When are atomic guards removed](../compare-exchange/atomic-guards#when-are-atomic-guards-removed) + * [Best practice when storing a document in a cluster-wide transaction](../compare-exchange/atomic-guards#best-practice-when-storing-a-document-in-a-cluster-wide-transaction) + + + +--- + +## Atomic guard creation and update + + +Atomic guards are created and managed **only when the session's transaction mode is set to [ClusterWide](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction)**. + + +* **When creating a new document**: + A new atomic guard is created when a new document is successfully saved. + +* **When modifying an existing document that already has an atomic guard**: + * The atomic guard’s Raft index is incremented when the document is successfully saved after being modified. + This allows RavenDB to detect that the document has changed. + * If another session had loaded the document before the document's version changed, it will not be able to save its changes + unless it first reloads the updated version. Otherwise, a `ConcurrencyException` is thrown. + +* **When modifying an existing document that doesn't have an atomic guard**: + * A new atomic guard is created when modifying an existing document that does not yet have one. + * The absence of the atomic guard may be because the document was created in a single-node session, + or because its atomic guard was manually removed (which is not recommended). + +* **When saving a document fails**: + * If a session's `saveChanges()` fails, the entire session is rolled back and the atomic guard is Not created. + * Ensure your business logic is designed to re-execute the session in case saving changes fails for any reason. + +--- + +## Atomic guard usage example + +In the code sample below, an atomic guard is automatically created when a new document is saved. +It is then used to detect and prevent conflicting writes: when two sessions load and modify the same document, +only the first save succeeds, and the second fails with a _ConcurrencyException_. + + + +{`const user = \{ + firstName: "John", + lastName: "Doe" +\}; + +// Open a cluster-wide session: +const session = documentStore.openSession(\{ + transactionMode: "ClusterWide" +\}); + +await session.store(user, "users/johndoe"); +await session.saveChanges(); +// An atomic-guard is now automatically created for the new document "users/johndoe". + +// Open two concurrent cluster-wide sessions: +const session1 = documentStore.openSession(\{ + transactionMode: "ClusterWide" +\}); +const session2 = documentStore.openSession(\{ + transactionMode: "ClusterWide" +\}); + +// Both sessions load the same document: +const loadedUser1 = await session1.load("users/johndoe"); +loadedUser1.name = "jindoe"; + +const loadedUser2 = await session2.load("users/johndoe"); +loadedUser2.name = "jandoe"; + +// session1 saves its changes first — +// this increments the Raft index of the associated atomic guard. +await session1.saveChanges(); + +// session2 tries to save using an outdated atomic guard version +// and fails with a ConcurrencyException. +await session2.saveChanges(); +`} + + + +After running the above example, you can view the automatically created atomic guard in the **Compare-Exchange view** +in the Studio: + +![Atomic Guard](../assets/atomic-guard.png) + +1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), + for any purpose you needed. They are NOT the automatically created atomic guards. + +2. This is the **atomic guard** that was generated by running the example above. + The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: + * The prefix `rvn-atomic/`. + * The ID of the associated document (`users/johndoe`). + + + * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. + + +--- + +## Atomic guard database scope + +* Atomic guards are local to the database on which they were defined. + +* Since atomic guards are implemented as compare-exchange items, + they are Not externally replicated to other databases by any ongoing replication task. + Learn more in [why compare-exchange items are not replicated](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases). + +--- + +## Disabling atomic guards + +* Before atomic guards were introduced (in RavenDB 5.2), client code had to explicitly manage compare-exchange entries + to ensure concurrency control and maintain ACID guarantees in cluster-wide transactions. + +* You can still take this manual approach by disabling the automatic use of atomic guards in a cluster-wide session, + and managing the required [compare-exchange key/value pairs](../compare-exchange/overview) yourself, + as shown in this [example](../compare-exchange/overview#example-i---email-address-reservation). + +* To disable the automatic creation and use of atomic guards in a cluster-wide session, + set the session's `DisableAtomicDocumentWritesInClusterWideTransaction` configuration option to `true`. + + + +{`// Open a cluster-wide session +const session = documentStore.openSession(\{ + transactionMode: "ClusterWide", + // Disable atomic-guards + disableAtomicDocumentWritesInClusterWideTransaction: true +\}); + +await session.store(user, "users/johndoe"); + +// No atomic-guard will be created upon saveChanges +await session.saveChanges(); +`} + + + +--- + +## When are atomic guards removed + +Atomic guards are removed **automatically** in the following scenarios: +(you don't need to clean them up manually) + +* **Document deleted via a cluster-wide session**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Delete the document using a cluster-wide session - its atomic guard will be removed automatically. + +* **Document expires via the expiration feature**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Add the `@expires` metadata property the document, as described in [Document expiration](../studio/database/settings/document-expiration.mdx). + * When the expiration time is reached, the document and its atomic guard will both be removed automatically. + * Since different cleanup tasks handle the removal of **expired** documents and the removal of their associated atomic guards, + it may happen that atomic guards of removed documents would linger in the compare-exchange entries list a short while longer before they are removed. + You do Not need to remove such atomic guards yourself, they will be removed by the cleanup task. + + + +* **Do not delete or modify atomic guards manually while they are in use by an active session**. + If a session attempts to save a document whose atomic guard has been removed or changed, + it will fail with an error. + +* If you accidentally remove an atomic guard that is associated with an existing document, + you can restore it by re-saving the document in a cluster-wide session, + this will re-create the atomic guard automatically. + + + +--- + +## Best practice when storing a document in a cluster-wide transaction + +* When working with a cluster-wide session, + we recommend that you always **`load` the document into the session before storing it** - + even if the document is expected to be a new document. + +* **Document expires via the expiration feature**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Add the `@expires` metadata property the document, as described in [Document expiration](../studio/database/settings/document-expiration). + * When the expiration time is reached, the document and its atomic guard will both be removed automatically. + * Since different cleanup tasks handle the removal of **expired** documents and the removal of their associated atomic guards, + it may happen that atomic guards of removed documents would linger in the compare-exchange entries list a short while longer before they are removed. + You do Not need to remove such atomic guards yourself, they will be removed by the cleanup task. + +* In this example, the document is loaded into the session BEFORE creating or modifying it: + + + +{`const session = documentStore.openSession(\{ + // Open a cluster-wide session + transactionMode: "ClusterWide" +\}); + +// Load the user document BEFORE creating or updating +const user = await session.load("users/johndoe"); + +if (!user) \{ + // Document doesn't exist => create a new document + const newUser = \{ + name: "John Doe", + // ... initialize other properties + \}; + + // Store the new user document in the session + await session.store(newUser, "users/johndoe"); + +\} else \{ + // Document exists => apply your modifications + user.name = "New name"; + // ... make any other updates + + // No need to call store() again + // RavenDB tracks changes on loaded entities +\} + +// Commit your changes +await session.saveChanges(); +`} + + + + + +When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: + +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, + the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. + Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. + +* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): + * **If an atomic guard exists**, + the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. + * **If no atomic guard exists**, + the document is treated as a brand new document and will be saved as usual. + + diff --git a/docs/compare-exchange/content/_atomic-guards-php.mdx b/docs/compare-exchange/content/_atomic-guards-php.mdx new file mode 100644 index 0000000000..c880abf738 --- /dev/null +++ b/docs/compare-exchange/content/_atomic-guards-php.mdx @@ -0,0 +1,273 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* **Atomic Guards** are [compare-exchange key/value items](../compare-exchange/overview) + that RavenDB creates and manages **automatically** to guarantee [ACID](../server/clustering/cluster-transactions#cluster-transactions-properties) behavior in cluster-wide sessions. + +* When a document is created in a cluster-wide session, RavenDB associates it with a unique atomic guard item. + Atomic guards coordinate concurrent writes by different sessions to the same document. + +* In this article: + * [Atomic guard creation and update](../compare-exchange/atomic-guards#atomic-guard-creation-and-update) + * [Atomic guard usage example](../compare-exchange/atomic-guards#atomic-guard-usage-example) + * [Atomic guard database scope](../compare-exchange/atomic-guards#atomic-guard-database-scope) + * [Disabling atomic guards](../compare-exchange/atomic-guards#disabling-atomic-guards) + * [When are atomic guards removed](../compare-exchange/atomic-guards#when-are-atomic-guards-removed) + * [Best practice when storing a document in a cluster-wide transaction](../compare-exchange/atomic-guards#best-practice-when-storing-a-document-in-a-cluster-wide-transaction) + + + +--- + +## Atomic guard creation and update + + +Atomic guards are created and managed **only when the session's transaction mode is set to [ClusterWide](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction)**. + + +* **When creating a new document**: + A new atomic guard is created when a new document is successfully saved. + +* **When modifying an existing document that already has an atomic guard**: + * The atomic guard’s Raft index is incremented when the document is successfully saved after being modified. + This allows RavenDB to detect that the document has changed. + * If another session had loaded the document before the document's version changed, it will not be able to save its changes + unless it first reloads the updated version. Otherwise, a `ConcurrencyException` is thrown. + +* **When modifying an existing document that doesn't have an atomic guard**: + * A new atomic guard is created when modifying an existing document that does not yet have one. + * The absence of the atomic guard may be because the document was created in a single-node session, + or because its atomic guard was manually removed (which is not recommended). + +* **When saving a document fails**: + * If a session's `saveChanges()` fails, the entire session is rolled back and the atomic guard is Not created. + * Ensure your business logic is designed to re-execute the session in case saving changes fails for any reason. + +--- + +## Atomic guard usage example + +In the code sample below, an atomic guard is automatically created when a new document is saved. +It is then used to detect and prevent conflicting writes: when two sessions load and modify the same document, +only the first save succeeds, and the second fails with a _ConcurrencyException_. + + + +{`// Open a cluster-wide session: +$sessionOptions = new SessionOptions(); +$sessionOptions->setTransactionMode(TransactionMode::clusterWide()); + +$session = $store->openSession($sessionOptions); + +try \{ + $session->store(new User(), "users/johndoe"); + // An atomic-guard is now automatically created for the new document "users/johndoe". + $session->saveChanges(); +\} finally \{ + $session->close(); +\} + +// Open two concurrent cluster-wide sessions: + +$sessionOptions1 = new SessionOptions(); +$sessionOptions1->setTransactionMode(TransactionMode::clusterWide()); + +$session1 = $store->openSession($sessionOptions1); +try \{ + $sessionOptions2 = new SessionOptions(); + $sessionOptions2->setTransactionMode(TransactionMode::clusterWide()); + $session2 = $store->openSession($sessionOptions2); + + try \{ + // Both sessions load the same document: + var $loadedUser1 = $session1->load(User::class, "users/johndoe"); + $loadedUser1->setName("jindoe"); + + $loadedUser2 = $session2->load(User::class, "users/johndoe"); + $loadedUser2->setName("jandoe"); + + // session1 saves its changes first — + // this increments the Raft index of the associated atomic guard. + $session1->saveChanges(); + + // session2 tries to save using an outdated atomic guard version + // and fails with a ConcurrencyException. + $session2->saveChanges(); + \} finally \{ + $session2->close(); + \} + +\} finally \{ + $session1->close(); +\} +`} + + + +After running the above example, you can view the automatically created atomic guard in the **Compare-Exchange view** +in the Studio: + +![Atomic Guard](../assets/atomic-guard.png) + +1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), + for any purpose you needed. They are NOT the automatically created atomic guards. + +2. This is the **atomic guard** that was generated by running the example above. + The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: + * The prefix `rvn-atomic/`. + * The ID of the associated document (`users/johndoe`). + + + * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. + + +--- + +## Atomic guard database scope + +* Atomic guards are local to the database on which they were defined. + +* Since atomic guards are implemented as compare-exchange items, + they are Not externally replicated to other databases by any ongoing replication task. + Learn more in [why compare-exchange items are not replicated](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases). + +--- + +## Disabling atomic guards + +* Before atomic guards were introduced (in RavenDB 5.2), client code had to explicitly manage compare-exchange entries + to ensure concurrency control and maintain ACID guarantees in cluster-wide transactions. + +* You can still take this manual approach by disabling the automatic use of atomic guards in a cluster-wide session, + and managing the required [compare-exchange key/value pairs](../compare-exchange/overview) yourself, + as shown in this [example](../compare-exchange/overview#example-i---email-address-reservation). + +* To disable the automatic creation and use of atomic guards in a cluster-wide session, + set the session's `DisableAtomicDocumentWritesInClusterWideTransaction` configuration option to `true`. + + + +{`$sessionOptions = new SessionOptions(); +$sessionOptions->setTransactionMode(TransactionMode::clusterWide()); +$sessionOptions->setDisableAtomicDocumentWritesInClusterWideTransaction(true); + +$session = $store->openSession($sessionOptions); + +try \{ + $session->store(new User(), "users/johndoe"); + // No atomic-guard will be created upon saveChanges + $session->saveChanges(); +\} finally \{ + $session->close(); +\} +`} + + + +--- + +## When are atomic guards removed + +Atomic guards are removed **automatically** in the following scenarios: +(you don't need to clean them up manually) + +* **Document deleted via a cluster-wide session**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Delete the document using a cluster-wide session - its atomic guard will be removed automatically. + +* **Document expires via the expiration feature**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Add the `@expires` metadata property the document, as described in [Document expiration](../studio/database/settings/document-expiration). + * When the expiration time is reached, the document and its atomic guard will both be removed automatically. + * Since different cleanup tasks handle the removal of **expired** documents and the removal of their associated atomic guards, + it may happen that atomic guards of removed documents would linger in the compare-exchange entries list a short while longer before they are removed. + You do Not need to remove such atomic guards yourself, they will be removed by the cleanup task. + + + +* **Do not delete or modify atomic guards manually while they are in use by an active session**. + If a session attempts to save a document whose atomic guard has been removed or changed, + it will fail with an error. + +* If you accidentally remove an atomic guard that is associated with an existing document, + you can restore it by re-saving the document in a cluster-wide session, + this will re-create the atomic guard automatically. + + + +--- + +## Best practice when storing a document in a cluster-wide transaction + +* When working with a cluster-wide session, + we recommend that you always **`load` the document into the session before storing it** - + even if the document is expected to be a new document. + +* This is especially important if a document (originally created in a cluster-wide transaction) was deleted **outside** of a cluster-wide session - + as when using a [single-node session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) + or the [DeleteByQueryOperation](../client-api/operations/common/delete-by-query). + In these cases, the document is deleted, but the atomic guard remains (it is not automatically removed). + If you attempt to re-create such a document without loading it first, + RavenDB will fail to save it because the session is unaware of the existing atomic guard’s latest Raft index. + +* In this example, the document is loaded into the session BEFORE creating or modifying it: + + + +{`// Open a cluster-wide session +$sessionOptions = new SessionOptions(); +$sessionOptions->setTransactionMode(TransactionMode::clusterWide()); + +$session = $store->openSession($sessionOptions); +try \{ + // Load the user document BEFORE creating or updating + $user = $session->load(User::class, "users/johndoe"); + + if ($user === null) \{ + // Document doesn't exist => create a new document: + $newUser = new User(); + $newUser->setName("John Doe"); + // ... initialize other properties + + // Store the new user document in the session + $session->store($newUser, "users/johndoe"); + \} else \{ + // Document exists => apply your modifications: + $user->setName("New name"); + // ... make any other updates + + // No need to call Store() again + // RavenDB tracks changes on loaded entities + \} + + // Commit your changes + $session->saveChanges(); +\} finally \{ + $session->close(); +\} +`} + + + + + +When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: + +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, + the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. + Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. + +* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): + * **If an atomic guard exists**, + the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. + * **If no atomic guard exists**, + the document is treated as a brand new document and will be saved as usual. + + diff --git a/docs/compare-exchange/content/_atomic-guards-python.mdx b/docs/compare-exchange/content/_atomic-guards-python.mdx new file mode 100644 index 0000000000..0d7962fd4b --- /dev/null +++ b/docs/compare-exchange/content/_atomic-guards-python.mdx @@ -0,0 +1,248 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* **Atomic Guards** are [compare-exchange key/value items](../compare-exchange/overview) + that RavenDB creates and manages **automatically** to guarantee [ACID](../server/clustering/cluster-transactions#cluster-transactions-properties) behavior in cluster-wide sessions. + +* When a document is created in a cluster-wide session, RavenDB associates it with a unique atomic guard item. + Atomic guards coordinate concurrent writes by different sessions to the same document. + +* In this article: + * [Atomic guard creation and update](../compare-exchange/atomic-guards#atomic-guard-creation-and-update) + * [Atomic guard usage example](../compare-exchange/atomic-guards#atomic-guard-usage-example) + * [Atomic guard database scope](../compare-exchange/atomic-guards#atomic-guard-database-scope) + * [Disabling atomic guards](../compare-exchange/atomic-guards#disabling-atomic-guards) + * [When are atomic guards removed](../compare-exchange/atomic-guards#when-are-atomic-guards-removed) + * [Best practice when storing a document in a cluster-wide transaction](../compare-exchange/atomic-guards#best-practice-when-storing-a-document-in-a-cluster-wide-transaction) + + + +--- + +## Atomic guard creation and update + + +Atomic guards are created and managed **only when the session's transaction mode is set to [CLUSTER_WIDE](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction)**. + + +* **When creating a new document**: + A new atomic guard is created when a new document is successfully saved. + +* **When modifying an existing document that already has an atomic guard**: + * The atomic guard’s Raft index is incremented when the document is successfully saved after being modified. + This allows RavenDB to detect that the document has changed. + * If another session had loaded the document before the document's version changed, it will not be able to save its changes + unless it first reloads the updated version. Otherwise, a `ConcurrencyException` is thrown. + +* **When modifying an existing document that doesn't have an atomic guard**: + * A new atomic guard is created when modifying an existing document that does not yet have one. + * The absence of the atomic guard may be because the document was created in a single-node session, + or because its atomic guard was manually removed (which is not recommended). + +* **When saving a document fails**: + * If a session's `save_changes()` fails, the entire session is rolled back and the atomic guard is Not created. + * Ensure your business logic is designed to re-execute the session in case saving changes fails for any reason. + +--- + +## Atomic guard usage example + +In the code sample below, an atomic guard is automatically created when a new document is saved. +It is then used to detect and prevent conflicting writes: when two sessions load and modify the same document, +only the first save succeeds, and the second fails with a _ConcurrencyException_. + + + +{`with store.open_session( + # Open a cluster-wide session: + session_options=SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) +) as session: + session.store(User(), "users/johndoe") + session.save_changes() + # An atomic-guard is now automatically created for the new document "users/johndoe" + +# Open two concurrent cluster-wide sessions: +with store.open_session( + session_options=SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) +) as session1: + with store.open_session( + session_options=SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) + ) as session2: + # Both sessions load the same document: + loaded_user_1 = session1.load("users/johndoe", User) + loaded_user_1.name = "jindoe" + loaded_user_2 = session2.load("users/johndoe", User) + loaded_user_2.name = "jandoe" + + # session1 saves its changes first — + # this increments the Raft index of the associated atomic guard. + session1.save_changes() + + # session2 tries to save using an outdated atomic guard version + # and fails with a ConcurrencyException. + session2.save_changes() +`} + + + +After running the above example, you can view the automatically created atomic guard in the **Compare-Exchange view** +in the Studio: + +![Atomic Guard](../assets/atomic-guard.png) + +1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), + for any purpose you needed. They are NOT the automatically created atomic guards. + +2. This is the **atomic guard** that was generated by running the example above. + The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: + * The prefix `rvn-atomic/`. + * The ID of the associated document (`users/johndoe`). + + + * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. + + +--- + +## Atomic guard database scope + +* Atomic guards are local to the database on which they were defined. + +* Since atomic guards are implemented as compare-exchange items, + they are Not externally replicated to other databases by any ongoing replication task. + Learn more in [why compare-exchange items are not replicated](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases). + +--- + +## Disabling atomic guards + +* Before atomic guards were introduced (in RavenDB 5.2), client code had to explicitly manage compare-exchange entries + to ensure concurrency control and maintain ACID guarantees in cluster-wide transactions. + +* You can still take this manual approach by disabling the automatic use of atomic guards in a cluster-wide session, + and managing the required [compare-exchange key/value pairs](../compare-exchange/overview) yourself, + as shown in this [example](../compare-exchange/overview#example-i---email-address-reservation). + +* To disable the automatic creation and use of atomic guards in a cluster-wide session, + set the session's `DisableAtomicDocumentWritesInClusterWideTransaction` configuration option to `true`. + + + +{`with store.open_session( + # Open a cluster-wide session + session_options=SessionOptions( + transaction_mode=TransactionMode.CLUSTER_WIDE, + disable_atomic_document_writes_in_cluster_wide_transaction=True, + ) +) as session: + session.store(User(), "users/johndoe") + + # No atomic-guard will be created upon save_changes + session.save_changes() +`} + + + +--- + +## When are atomic guards removed + +Atomic guards are removed **automatically** in the following scenarios: +(you don't need to clean them up manually) + +* **Document deleted via a cluster-wide session**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Delete the document using a cluster-wide session - its atomic guard will be removed automatically. + +* **Document expires via the expiration feature**: + * Create a document using a cluster-wide session (an associated atomic guard is created). + * Add the `@expires` metadata property the document, as described in [Document expiration](../studio/database/settings/document-expiration). + * When the expiration time is reached, the document and its atomic guard will both be removed automatically. + * Since different cleanup tasks handle the removal of **expired** documents and the removal of their associated atomic guards, + it may happen that atomic guards of removed documents would linger in the compare-exchange entries list a short while longer before they are removed. + You do Not need to remove such atomic guards yourself, they will be removed by the cleanup task. + + + +* **Do not delete or modify atomic guards manually while they are in use by an active session**. + If a session attempts to save a document whose atomic guard has been removed or changed, + it will fail with an error. + +* If you accidentally remove an atomic guard that is associated with an existing document, + you can restore it by re-saving the document in a cluster-wide session, + this will re-create the atomic guard automatically. + + + +--- + +## Best practice when storing a document in a cluster-wide transaction + +* When working with a cluster-wide session, + we recommend that you always **`load` the document into the session before storing it** - + even if the document is expected to be a new document. + +* This is especially important if a document (originally created in a cluster-wide transaction) was deleted **outside** of a cluster-wide session - + as when using a [single-node session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) + or the [DeleteByQueryOperation](../client-api/operations/common/delete-by-query). + In these cases, the document is deleted, but the atomic guard remains (it is not automatically removed). + If you attempt to re-create such a document without loading it first, + RavenDB will fail to save it because the session is unaware of the existing atomic guard’s latest Raft index. + +* In this example, the document is loaded into the session BEFORE creating or modifying it: + + + +{`with store.open_session( + session_options=SessionOptions( + # Open a cluster-wide session + transaction_mode=TransactionMode.CLUSTER_WIDE + ) +) as session: + # Load the user document BEFORE creating or updating + user = session.load("users/johndoe", User) + + if user is None: + # Document doesn't exist => create a new document + new_user = User() + new_user.name = "John Doe" + # ... initialize other properties + + # Store the new user document in the session + session.store(new_user, "users/johndoe") + else: + # Document exists => apply your modifications + user.name = "New name" + # ... make any other updates + + # No need to call store() again + # RavenDB tracks changes on loaded entities + + # Commit your changes + session.save_changes() +`} + + + + + +When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: + +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, + the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. + Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. + +* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): + * **If an atomic guard exists**, + the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. + * **If no atomic guard exists**, + the document is treated as a brand new document and will be saved as usual. + + diff --git a/docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-csharp.mdx b/docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-csharp.mdx new file mode 100644 index 0000000000..c0f29f37e9 --- /dev/null +++ b/docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-csharp.mdx @@ -0,0 +1,494 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can use compare-exchange values in **dynamic queries** in two ways: + * **Project** compare-exchange values into the query results. + * **Filter** documents based on compare-exchange values. + +* Dynamic queries are queries that do not rely on a predefined static index. + When you run a dynamic query with a filtering condition, RavenDB automatically creates an auto-index to serve it. + Learn more about dynamic queries in the [Query overview](../client-api/session/querying/how-to-query). + +* In this article: + * [Projecting compare-exchange values in query results](../compare-exchange/cmpxchg-in-dynamic-queries#projecting-compare-exchange-values-in-query-results) + * [Filtering by compare-exchange value](../compare-exchange/cmpxchg-in-dynamic-queries#filtering-by-compare-exchange-value) + * [Example 1 - Filtering when the compare-exchange value is a string](../compare-exchange/cmpxchg-in-dynamic-queries#example-1---filtering-when-the-compare-exchange-value-is-a-string) + * [Example 2 - Filtering when the compare-exchange value is an object](../compare-exchange/cmpxchg-in-dynamic-queries#example-2---filtering-when-the-compare-exchange-value-is-an-object) + * [Syntax](../compare-exchange/cmpxchg-in-dynamic-queries#syntax) + + + +--- + +## Projecting compare-exchange values in query results + +* You can project values from compare-exchange items alongside fields from the queried documents. + +* The following example is based on the sample data described in: [Create sample compare-exchange items](../compare-exchange/indexing-cmpxchg-values#create-sample-compare-exchange-items). + In this example, we want to retrieve the current number of guests in each room. + We query all _HotelRoom_ documents and project: + * the number of guests (from the compare-exchange item's value), and + * the room number (from the document field). + +* No auto-index is created in this case, since the query doesn’t apply any filters. + + + +```csharp +// The session does not need to be opened in cluster-wide mode +using (var session = store.OpenSession()) +{ + List numberOfGuestsPerRoom = session + .Query() + .Select(x => new ProjectedNumberOfGuests + { + // Project content from the compare-exchange item: + // Call 'RavenQuery.CmpXchg' to load the compare-exchange value by its key. + CurrentNumberOfGuests = + RavenQuery.CmpXchg(x.RoomNumber).CurrentNumberOfGuests, + + // Project content from the document: + RoomNumber = x.RoomNumber + }) + .ToList(); +} +``` + + +```csharp +// The session does not need to be opened in cluster-wide mode +using (var asyncSession = store.OpenAsyncSession()) +{ + List numberOfGuestsPerRoom = await asyncSession + .Query() + .Select(x => new ProjectedNumberOfGuests + { + // Project content from the compare-exchange item: + // Call 'RavenQuery.CmpXchg' to load the compare-exchange value by its key. + CurrentNumberOfGuests = + RavenQuery.CmpXchg(x.RoomNumber).CurrentNumberOfGuests, + + // Project content from the document: + RoomNumber = x.RoomNumber + }) + .ToListAsync(); +} +``` + + +```csharp +// The session does not need to be opened in cluster-wide mode +using (var session = store.OpenSession()) +{ + List numberOfGuestsPerRoom = session.Advanced + .DocumentQuery() + .SelectFields(QueryData.CustomFunction( + alias: "room", + func: @" + { + // Project content from the compare-exchange item: + // Call 'cmpxchg' to load the compare-exchange value by its key. + CurrentNumberOfGuests : cmpxchg(room.RoomNumber).CurrentNumberOfGuests, + + // Project content from the document: + RoomNumber : room.RoomNumber + }")) + .ToList(); +} +``` + + +```csharp +// The session does not need to be opened in cluster-wide mode +using (var asyncSession = store.OpenAsyncSession()) +{ + var numberOfGuestsPerRoom = await asyncSession.Advanced + .AsyncDocumentQuery() + .SelectFields(QueryData.CustomFunction( + alias: "room", + func: @" + { + // Project content from the compare-exchange item: + // Call 'cmpxchg' to load the compare-exchange value by its key. + CurrentNumberOfGuests : cmpxchg(room.RoomNumber).CurrentNumberOfGuests, + + // Project content from the document: + RoomNumber : room.RoomNumber + }")) + .ToListAsync(); +} +``` + + +```csharp +using (var session = store.OpenSession()) +{ + var numberOfGuestsPerRoom = session.Advanced + .RawQuery(@" + from 'HotelRooms' as x + select { + CurrentNumberOfGuests : cmpxchg(x.RoomNumber).CurrentNumberOfGuests, + RoomNumber : x.RoomNumber + }") + .ToList(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession()) +{ + var numberOfGuestsPerRoom = await asyncSession.Advanced + .AsyncRawQuery(@" + from 'HotelRooms' as x + select { + CurrentNumberOfGuests : cmpxchg(x.RoomNumber).CurrentNumberOfGuests, + RoomNumber : x.RoomNumber + }") + .ToListAsync(); +} +``` + + +```sql +from "HotelRooms" as x +select { + CurrentNumberOfGuests : cmpxchg(x.RoomNumber).CurrentNumberOfGuests, + RoomNumber : x.RoomNumber +} +``` + + + +--- + +## Filtering by compare-exchange value + +#### Example 1 - Filtering when the compare-exchange value is a string + +* You can filter documents based on a compare-exchange value. + For example, to find a user with a blocked email address, + you can filter by the compare-exchange value that stores the blocked email. + +* **Limitation**: + When filtering with `RavenQuery.CmpXchg` inside the `Where` predicate (as shown in this example), + the compare-exchange value must be a _string_. + If your compare-exchange value is of another type, you can still filter the results - + see the [next example](../compare-exchange/cmpxchg-in-dynamic-queries#example-2---filtering-when-the-compare-exchange-value-is-an-object). + +* Since this query uses filtering, RavenDB will automatically create an auto-index to serve it. + In this case, the auto-index `Auto/Users/ByEmail` will be created. + + + +```csharp +// First, let's create a compare-exchange item with a blocked email address for this example: +var putResult = store.Operations.Send(new PutCompareExchangeValueOperation( + "blocked-address", "someUser@Company.com", 0)); + +// Query the 'Users' collection +// Find a user with an email address that matches the blocked address: +// (The session does not need to be opened in cluster-wide mode) +using (var session = store.OpenSession()) +{ + var blockedUser = session.Query() + // Call 'RavenQuery.CmpXchg' to load the compare-exchange value by its key + // Filter the users collection by the value: + .Where(x => x.Email == RavenQuery.CmpXchg("blocked-address")) + .FirstOrDefault(); +} + +// The results will include the user document whose email address is "someUser@company.com" +// (assuming such a user exists in your data). +``` + + +```csharp +// First, let's create a compare-exchange item with a blocked email address for this example: +var putResult = await store.Operations.SendAsync(new PutCompareExchangeValueOperation( + "blocked-address", "someUser@Company.com", 0)); + +// Query the 'Users' collection +// Find a user with an email address that matches the blocked address: +// (The session does not need to be opened in cluster-wide mode) +using (var asyncSession = store.OpenAsyncSession()) +{ + var blockedUser = await asyncSession.Query() + // Call 'RavenQuery.CmpXchg' to load the compare-exchange value by its key + // Filter the users collection by the value: + .Where(x => x.Email == RavenQuery.CmpXchg("blocked-address")) + .FirstOrDefaultAsync(); +} + +// The results will include the user document whose email address is "someUser@company.com" +// (assuming such a user exists in your data). +``` + + +```csharp +var putResult = store.Operations.Send(new PutCompareExchangeValueOperation( + "blocked-address", "someUser@Company.com", 0)); + +using (var session = store.OpenSession()) +{ + var blockedUser = session.Advanced + .RawQuery(@" + from 'Users' + where Email == cmpxchg('blocked-address') + ") + .FirstOrDefault(); +} +``` + + +```csharp +var putResult = await store.Operations.SendAsync(new PutCompareExchangeValueOperation( + "blocked-address", "someUser@Company.com", 0)); + +using (var asyncSession = store.OpenAsyncSession()) +{ + var blockedUser = await asyncSession.Advanced + .AsyncRawQuery(@" + from 'Users' + where Email == cmpxchg('blocked-address') + ") + .FirstOrDefaultAsync(); +} +``` + + +```sql +from "Users" +where Email == cmpxchg("blocked-address") +limit 0, 1 +``` + + +```csharp +public class User +{ + public string Id { get; set; } + public string Name { get; set; } + public string Email { get; set; } +} +``` + + + +#### Example 2 - Filtering when the compare-exchange value is an object + +* The following example shows how to filter documents based on a compare-exchange value that is an _object_. + We query for users whose email ends with one of the domains stored in the object held by the compare-exchange item. + +* Retrieve the compare-exchange value outside the query, then use its content to build the filter logic. + +* Since this query uses filtering, RavenDB will automatically create an auto-index to serve it. + In this case, the auto-index `Auto/Users/ByEmail` will be created. + + + +```csharp +// First, let's create a compare-exchange item with a value that is an object. +// The object contains multiple blocked email domains for this example. +var putResult = store.Operations.Send(new PutCompareExchangeValueOperation( + "blocked-domains", + new BlockedDomains() { Domains = ["suspicious-company-1.com", "suspicious-company-2.org"]}, + 0)); + +// Retrieve the compare-exchange value before running the query +BlockedDomains blockedDomains = store.Operations.Send( + new GetCompareExchangeValueOperation("blocked-domains")).Value; + +// Query the 'Users' collection +// Find users whose email address ends with one of the blocked domains. +// (The session does not need to be opened in cluster-wide mode) +using (var session = store.OpenSession()) +{ + var blockedUsers = session.Query() + .Where(user => + user.Email.EndsWith(blockedDomains.Domains[0]) || + user.Email.EndsWith(blockedDomains.Domains[1])) + .ToList(); +} + +// The results will include users whose email address domain ends with +// one of the values stored in the compare-exchange item, +// assuming such users exist in your data. +``` + + +```csharp +// First, let's create a compare-exchange item with a value that is an object. +// The object contains multiple blocked email domains for this example. +var putResult = await store.Operations.SendAsync(new PutCompareExchangeValueOperation( + "blocked-domains", + new BlockedDomains() { Domains = ["suspicious-company-1.com", "suspicious-company-2.org"]}, + 0)); + +// Retrieve the compare-exchange value before running the query +BlockedDomains blockedDomains = await store.Operations.SendAsync( + new GetCompareExchangeValueOperation("blocked-domains")).Value; + +// Query the 'Users' collection +// Find users whose email address ends with one of the blocked domains. +// (The session does not need to be opened in cluster-wide mode) +using (var asyncSession = store.OpenAsyncSession()) +{ + var blockedUsers = await asyncSession.Query() + .Where(user => + user.Email.EndsWith(blockedDomains.Domains[0]) || + user.Email.EndsWith(blockedDomains.Domains[1])) + .ToListAsync(); +} + +// The results will include users whose email address domain ends with +// one of the values stored in the compare-exchange item, +// assuming such users exist in your data. +``` + + +```csharp +// First, let's create a compare-exchange item with a value that is an object. +// The object contains multiple blocked email domains for this example. +var putResult = store.Operations.Send(new PutCompareExchangeValueOperation( + "blocked-domains", + new BlockedDomains() { Domains = ["suspicious-company-1.com", "suspicious-company-2.org"]}, + 0)); + +// Retrieve the compare-exchange value before running the query +BlockedDomains blockedDomains = store.Operations.Send( + new GetCompareExchangeValueOperation("blocked-domains")).Value; + +// Query the 'Users' collection +// Find users whose email address ends with one of the blocked domains. +// (The session does not need to be opened in cluster-wide mode) +using (var session = store.OpenSession()) +{ + var blockedUsers = session.Advanced + .DocumentQuery() + .WhereEndsWith(x => x.Email, blockedDomains.Domains[0]) + .OrElse() + .WhereEndsWith(x=> x.Email, blockedDomains.Domains[1]) + .ToList(); +} + +// The results will include users whose email address domain ends with +// one of the values stored in the compare-exchange item, +// assuming such users exist in your data. +``` + + +```csharp +// First, let's create a compare-exchange item with a value that is an object. +// The object contains multiple blocked email domains for this example. +var putResult = await store.Operations.SendAsync(new PutCompareExchangeValueOperation( + "blocked-domains", + new BlockedDomains() { Domains = ["suspicious-company-1.com", "suspicious-company-2.org"]}, + 0)); + +// Retrieve the compare-exchange value before running the query +BlockedDomains blockedDomains = await store.Operations.SendAsync( + new GetCompareExchangeValueOperation("blocked-domains")).Value; + +// Query the 'Users' collection +// Find users whose email address ends with one of the blocked domains. +// (The session does not need to be opened in cluster-wide mode) +using (var asyncSession = store.OpenAsyncSession()) +{ + var blockedUsers = await asyncSession.Advanced + .AsyncDocumentQuery() + .WhereEndsWith(x => x.Email, blockedDomains.Domains[0]) + .OrElse() + .WhereEndsWith(x=> x.Email, blockedDomains.Domains[1]) + .ToListAsync(); +} + +// The results will include users whose email address domain ends with +// one of the values stored in the compare-exchange item, +// assuming such users exist in your data. +``` + + +```csharp +var putResult = store.Operations.Send(new PutCompareExchangeValueOperation( + "blocked-domains", + new BlockedDomains() { Domains = ["suspicious-company-1.com", "suspicious-company-2.org"]}, + 0)); + +BlockedDomains blockedDomains = store.Operations.Send( + new GetCompareExchangeValueOperation("blocked-domains")).Value; + +using (var session = store.OpenSession()) +{ + var blockedUsers = session.Advanced + .RawQuery(@" + from 'Users' + where endsWith(Email, 'suspicious-company-1.com') + or + endsWith(Email, 'suspicious-company-2.org') + ") + .ToList(); +} +``` + + +```csharp +var putResult = await store.Operations.SendAsync(new PutCompareExchangeValueOperation( + "blocked-domains", + new BlockedDomains() { Domains = ["suspicious-company-1.com", "suspicious-company-2.org"]}, + 0)); + +BlockedDomains blockedDomains = await store.Operations.SendAsync( + new GetCompareExchangeValueOperation("blocked-domains")).Value; + +using (var asyncSession = store.OpenAsyncSession()) +{ + var blockedUsers = await asyncSession.Advanced + .AsyncRawQuery(@" + from 'Users' + where endsWith(Email, 'suspicious-company-1.com') + or + endsWith(Email, 'suspicious-company-2.org') + ") + .ToListAsync(); +} +``` + + +```sql +from "Users" +where endsWith(Email, "suspicious-company-1.com") +or +endsWith(Email, "suspicious-company-2.org") +``` + + +```csharp +public class User +{ + public string Id { get; set; } + public string Name { get; set; } + public string Email { get; set; } +} +``` + + + +--- + +## Syntax + +### `RavenQuery.CmpXchg()` +This method can be used to filter a LINQ query +or to project fields from a compare-exchange value into the query results. + + +```csharp +// Get a compare-exchange value by key. +public static T CmpXchg(string key) +``` + diff --git a/docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-nodejs.mdx b/docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-nodejs.mdx new file mode 100644 index 0000000000..2209ef9e56 --- /dev/null +++ b/docs/compare-exchange/content/_cmpxchg-in-dynamic-queries-nodejs.mdx @@ -0,0 +1,256 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can use compare-exchange values in **dynamic queries** in two ways: + * **Project** compare-exchange values into the query results. + * **Filter** documents based on compare-exchange values. + +* Dynamic queries are queries that do not rely on a predefined static index. + When you run a dynamic query with a filtering condition, RavenDB automatically creates an auto-index to serve it. + Learn more about dynamic queries in the [Query overview](../client-api/session/querying/how-to-query). + +* In this article: + * [Projecting compare-exchange values in query results](../compare-exchange/cmpxchg-in-dynamic-queries#projecting-compare-exchange-values-in-query-results) + * [Filtering by compare-exchange value](../compare-exchange/cmpxchg-in-dynamic-queries#filtering-by-compare-exchange-value) + * [Example 1 - Filtering when the compare-exchange value is a string](../compare-exchange/cmpxchg-in-dynamic-queries#example-1---filtering-when-the-compare-exchange-value-is-a-string) + * [Example 2 - Filtering when the compare-exchange value is an object](../compare-exchange/cmpxchg-in-dynamic-queries#example-2---filtering-when-the-compare-exchange-value-is-an-object) + * [Syntax](../compare-exchange/cmpxchg-in-dynamic-queries#syntax) + + + +--- + +## Projecting compare-exchange values in query results + +* You can project values from compare-exchange items alongside fields from the queried documents. + +* The following example is based on the sample data described in: [Create sample compare-exchange items](../compare-exchange/indexing-cmpxchg-values#create-sample-compare-exchange-items). + In this example, we want to retrieve the current number of guests in each room. + We query all _HotelRoom_ documents and project: + * the number of guests (from the compare-exchange item's value), and + * the room number (from the document field). + +* No auto-index is created in this case, since the query doesn’t apply any filters. + + + +```js +// The session does not need to be opened in cluster-wide mode +const session = documentStore.openSession(); + +// Define the projection using QueryData: +const queryData = QueryData.customFunction("room", `{ + // Project from compare-exchange: call cmpxchg with RoomNumber + CurrentNumberOfGuests: cmpxchg(room.RoomNumber).CurrentNumberOfGuests, + + // Project from document field + RoomNumber: room.RoomNumber +}`); + +const numberOfGuestsPerRoom = await session + .query({ collection: "HotelRooms" }) + // Project content: + .selectFields(queryData) + .all(); +``` + + +```js +const session = documentStore.openSession(); + +const numberOfGuestsPerRoom = await session.advanced + .rawQuery(` + from 'HotelRooms' as x + select { + CurrentNumberOfGuests : cmpxchg(x.RoomNumber).CurrentNumberOfGuests, + RoomNumber : x.RoomNumber + } + `) + .all(); +``` + + +```sql +from "HotelRooms" as x +select { + CurrentNumberOfGuests : cmpxchg(x.RoomNumber).CurrentNumberOfGuests, + RoomNumber : x.RoomNumber +} +``` + + + +--- + +## Filtering by compare-exchange value + +#### Example 1 - Filtering when the compare-exchange value is a string + +* You can filter documents based on a compare-exchange value. + For example, to find a user with a blocked email address, + you can filter by the compare-exchange value that stores the blocked email. + +* **Limitation**: + When filtering with `cmpxchg` inside the `where` predicate (as shown in this example), + the compare-exchange value must be a _string_. + If your compare-exchange value is of another type, you can still filter the results - + see the [next example](../compare-exchange/cmpxchg-in-dynamic-queries#example-2---filtering-when-the-compare-exchange-value-is-an-object). + +* Since this query uses filtering, RavenDB will automatically create an auto-index to serve it. + In this case, the auto-index `Auto/Users/ByEmail` will be created. + + + +```js +// First, let's create a compare-exchange item with a blocked email address for this example: +const putResult = await documentStore.operations.send( + new PutCompareExchangeValueOperation("blocked-address", "someUser@Company.com", 0) +); + +// Query the 'Users' collection +// Find a user with an email address that matches the blocked address: +// (The session does not need to be opened in cluster-wide mode) +const session = documentStore.openSession(); + +const blockedUser = await session.advanced + .rawQuery(` + from 'Users' + where Email == cmpxchg('blocked-address') + `) + .firstOrNull(); + +// The results will include the user document whose email address is "someUser@company.com" +// (assuming such a user exists in your data). +``` + + +```sql +from "Users" +where Email == cmpxchg("blocked-address") +limit 0, 1 +``` + + +```js +class User { + constructor(id, name, email) { + this.Id = id; + this.Name = name; + this.Email = email; + } +} +``` + + + +#### Example 2 - Filtering when the compare-exchange value is an object + +* The following example shows how to filter documents based on a compare-exchange value that is an _object_. + We query for users whose email ends with one of the domains stored in the object held by the compare-exchange item. + +* Retrieve the compare-exchange value outside the query, then use its content to build the filter logic. + +* Since this query uses filtering, RavenDB will automatically create an auto-index to serve it. + In this case, the auto-index `Auto/Users/ByEmail` will be created. + + + +```js +// First, let's create a compare-exchange item with a value that is an object. +// The object contains multiple blocked email domains for this example. +const blockedDomainsValue = { + Domains: ["suspicious-company-1.com", "suspicious-company-2.org"] +}; +const putResult = await documentStore.operations.send( + new PutCompareExchangeValueOperation("blocked-domains", blockedDomainsValue, 0) +); + +// Retrieve the compare-exchange value before running the query +const blockedDomainsResult = await documentStore.operations.send( + new GetCompareExchangeValueOperation("blocked-domains") +); +const blockedDomains = blockedDomainsResult.value; + +// Query the 'Users' collection +// Find users whose email address ends with one of the blocked domains. +// (The session does not need to be opened in cluster-wide mode) +const session = documentStore.openSession(); + +const blockedUsers = await session + .query({ collection: "Users" }) + .whereEndsWith("Email", blockedDomains.Domains[0]) + .orElse() + .whereEndsWith("Email", blockedDomains.Domains[1]) + .all(); + +// The results will include users whose email address domain ends with +// one of the values stored in the compare-exchange item, +// assuming such users exist in your data. +``` + + +```js +const blockedDomainsValue = { + Domains: ["suspicious-company-1.com", "suspicious-company-2.org"] +}; + +const putResult = await documentStore.operations.send( + new PutCompareExchangeValueOperation("blocked-domains", blockedDomainsValue, 0) +); + +const blockedDomainsResult = await documentStore.operations.send( + new GetCompareExchangeValueOperation("blocked-domains") +); +const blockedDomains = blockedDomainsResult.value; + +const session = documentStore.openSession(); + +const blockedUsers = await session.advanced + .rawQuery(` + from 'Users' + where endsWith(Email, 'suspicious-company-1.com') + or endsWith(Email, 'suspicious-company-2.org') + `) + .all(); +``` + + +```sql +from "Users" +where endsWith(Email, "suspicious-company-1.com") +or +endsWith(Email, "suspicious-company-2.org") +``` + + +```js +class User { + constructor(id, name, email) { + this.Id = id; + this.Name = name; + this.Email = email; + } +} +``` + + + +--- + +## Syntax + +### `cmpxchg()` +This function can be used to filter a query +or to project fields from a compare-exchange value into the query results. + + +```js +// Get a compare-exchange value by key. +// Used inside 'where', 'selectFields', or rawQuery. +cmpxchg(key) +``` + diff --git a/docs/compare-exchange/content/_cmpxchg-item-expiration-csharp.mdx b/docs/compare-exchange/content/_cmpxchg-item-expiration-csharp.mdx new file mode 100644 index 0000000000..8236c3b6ab --- /dev/null +++ b/docs/compare-exchange/content/_cmpxchg-item-expiration-csharp.mdx @@ -0,0 +1,140 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items can be set to be deleted automatically in a future time. + +* **To schedule expiration for a compare-exchange item**, set the `@expires` field in the item's **metadata**. + This can be done when creating a new item or updating an existing one. + +* RavenDB scans the database periodically to remove expired items. + Any compare-exchange item whose `@expires` timestamp has passed at the time of the scan will be automatically removed. + +* The **scan frequency** is configurable - + see the [Cluster.CompareExchangeExpiredDeleteFrequencyInSec](../compare-exchange/configuration#clustercompareexchangeexpireddeletefrequencyinsec) configuration key. + The default is 60 seconds. + +* To manually remove a compare-exchange item, see [Delete compare-exchange items](../compare-exchange/delete-cmpxchg-items). + +* Note: The compare-exchange expiration feature is not related to [document expiration](../server/extensions/expiration). + You do NOT need to enable document expiration in order to use compare-exchange expiration. + +--- + +* In this article: + * [Add expiration date using the **Client API**](../compare-exchange/cmpxchg-expiration#add-expiration-date-using-the-client-api) + * [Add expiration date using the **Studio**](../compare-exchange/cmpxchg-expiration#add-expiration-date-using-the-studio) + * [Syntax](../compare-exchange/cmpxchg-expiration#syntax) + + + +--- + +## Add expiration date using the Client API + + + +```csharp +// The session must be opened in cluster-wide mode +using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) +{ + // Call 'CreateCompareExchangeValue', specify the item's KEY and VALUE + CompareExchangeValue item = + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Add METADATA fields to the item + // Set a future UTC DateTime in the `@expires` field to schedule expiration + // "Constants.Documents.Metadata.Expires" = "@expires" + item.Metadata[Constants.Documents.Metadata.Expires] = DateTime.UtcNow.AddDays(7); + + // The item will be created on the server once 'SaveChanges' is called + session.SaveChanges(); +} +``` + + +```csharp +// The session must be opened in cluster-wide mode +using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) +{ + // Call 'CreateCompareExchangeValue', specify the item's KEY and VALUE + CompareExchangeValue item = + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Add METADATA fields to the item + // Set a future UTC DateTime in the `@expires` field to schedule expiration + // "Constants.Documents.Metadata.Expires" = "@expires" + item.Metadata[Constants.Documents.Metadata.Expires] = DateTime.UtcNow.AddDays(7); + + // The item will be created on the server once 'SaveChangesAsync' is called + await asyncSession.SaveChangesAsync(); +} +``` + + +```csharp +// Define the metadata with the future expiration date +var metadata = new MetadataAsDictionary +{ + // Constants.Documents.Metadata.Expires = "@expires" + // Specify the expiration time (UTC) in ISO 8601 format + { Constants.Documents.Metadata.Expires, DateTime.UtcNow.AddDays(7).ToString("o") } +}; + +// Pass the metadata when creating the item +var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0, metadata); + +// Execute the operation +CompareExchangeResult putResult = store.Operations.Send(putCmpXchgOp); +``` + + +```csharp +// Define the metadata with the future expiration date +var metadata = new MetadataAsDictionary +{ + // Constants.Documents.Metadata.Expires = "@expires" + // Specify the expiration time (UTC) in ISO 8601 format + { Constants.Documents.Metadata.Expires, DateTime.UtcNow.AddDays(7).ToString("o") } +}; + +// Pass the metadata when creating the item +var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0, metadata); + +// Execute the operation +CompareExchangeResult putResult = await store.Operations.SendAsync(putCmpXchgOp); +``` + + + +--- + +## Add expiration date using the Studio + +* You can set or update the expiration date of a compare-exchange item directly from the Studio. + +* Go to **Documents > Compare Exchange**. + Edit an existing item or create a new one. + In the item's metadata, set the `@expires` field to a future UTC date/time (ISO 8601 format). + +![The compare-exchange view](../assets/set-expiration.png) + +--- + +## Syntax + +* The syntax for **creating** a compare-exchange item is available in [Create compare-exchange item - Syntax](../compare-exchange/create-cmpxchg-item#syntax) +* The syntax for **updating** a compare-exchange item is available in [Update compare-exchange item - Syntax](../compare-exchange/update-cmpxchg-item#syntax) diff --git a/docs/compare-exchange/content/_cmpxchg-item-expiration-nodejs.mdx b/docs/compare-exchange/content/_cmpxchg-item-expiration-nodejs.mdx new file mode 100644 index 0000000000..1265d951ae --- /dev/null +++ b/docs/compare-exchange/content/_cmpxchg-item-expiration-nodejs.mdx @@ -0,0 +1,98 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items can be set to be deleted automatically in a future time. + +* **To schedule expiration for a compare-exchange item**, set the `@expires` field in the item's **metadata**. + This can be done when creating a new item or updating an existing one. + +* RavenDB scans the database periodically to remove expired items. + Any compare-exchange item whose `@expires` timestamp has passed at the time of the scan will be automatically removed. + +* The **scan frequency** is configurable - + see the [Cluster.CompareExchangeExpiredDeleteFrequencyInSec](../compare-exchange/configuration#clustercompareexchangeexpireddeletefrequencyinsec) configuration key. + The default is 60 seconds. + +* To manually remove a compare-exchange item, see [Delete compare-exchange items](../compare-exchange/delete-cmpxchg-items). + +* Note: The compare-exchange expiration feature is not related to [document expiration](../server/extensions/expiration). + You do NOT need to enable document expiration in order to use compare-exchange expiration. + +--- + +* In this article: + * [Add expiration date using the **Client API**](../compare-exchange/cmpxchg-expiration#add-expiration-date-using-the-client-api) + * [Add expiration date using the **Studio**](../compare-exchange/cmpxchg-expiration#add-expiration-date-using-the-studio) + * [Syntax](../compare-exchange/cmpxchg-expiration#syntax) + + + +--- + +## Add expiration date using the Client API + + + +```js +// The session must be opened in cluster-wide mode +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Call 'createCompareExchangeValue', specify the item's KEY and VALUE +const item = session.advanced.clusterTransaction.createCompareExchangeValue( + "user1-name@example.com", "users/1" // key, value +); + +// Add METADATA fields to the item +// Set a future UTC DateTime in the `@expires` field to schedule expiration +// "CONSTANTS.Documents.Metadata.EXPIRES" = "@expires" +const expireAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(); // expire in 7 days +item.metadata[CONSTANTS.Documents.Metadata.EXPIRES] = expireAt; + +// The item will be created on the server once 'SaveChanges' is called +await session.saveChanges(); +``` + + +```js +// Define the metadata with the future expiration date +const expireAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(); // expire in 7 days + +const metadata = { + // CONSTANTS.Documents.Metadata.EXPIRES = "@expires" + [CONSTANTS.Documents.Metadata.EXPIRES]: expireAt +}; + +// Pass the metadata when creating the item +const putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0, metadata); + +// Execute the operation +const result = await documentStore.operations.send(putCmpXchgOp); +``` + + + +--- + +## Add expiration date using the Studio + +* You can set or update the expiration date of a compare-exchange item directly from the Studio. + +* Go to **Documents > Compare Exchange**. + Edit an existing item or create a new one. + In the item's metadata, set the `@expires` field to a future UTC date/time (ISO 8601 format). + +![The compare-exchange view](../assets/set-expiration.png) + +--- + +## Syntax + +* The syntax for **creating** a compare-exchange item is available in [Create compare-exchange item - Syntax](../compare-exchange/create-cmpxchg-item#syntax) +* The syntax for **updating** a compare-exchange item is available in [Update compare-exchange item - Syntax](../compare-exchange/update-cmpxchg-item#syntax) diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx new file mode 100644 index 0000000000..33e411c478 --- /dev/null +++ b/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx @@ -0,0 +1,564 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* A new compare-exchange item can be created in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* To create a new compare-exchange item, you must provide: + * **A unique key** (string, up to 512 bytes) + * **An associated value** (number, string, array, or any valid JSON object) + * You can optionally add **metadata** (a valid JSON object) to store extra information with the item. + A common use case is to set an expiration time for the compare-exchange item in its metadata. + Learn more in [Set expiration for compare-exchange items](../compare-exchange/cmpxchg-expiration). + +* To modify an existing compare-exchange item, see: [Update compare-exchange item](../compare-exchange/update-cmpxchg-item). + +* In this article: + * [Create item using a **cluster-wide session**](../compare-exchange/create-cmpxchg-items#create-item-using-a-cluster-wide-session) + * [Ex.1 - Create compare-exchange item - with string value](../compare-exchange/create-cmpxchg-items#ex1---create-compare-exchange-item---with-string-value) + * [Ex.2 - Create compare-exchange item - with custom object value](../compare-exchange/create-cmpxchg-items#ex2---create-compare-exchange-item---with-custom-object-value) + * [Ex.3 - Create compare-exchange item - with metadata](../compare-exchange/create-cmpxchg-items#ex3---create-compare-exchange-item---with-metadata) + * [Ex.4 - Create multiple items](../compare-exchange/create-cmpxchg-items#ex4---create-multiple-items) + * [Create item using a **store operation**](../compare-exchange/create-cmpxchg-items#create-item-using-a-store-operation) + * [Ex.5 - Create compare-exchange item - with string value](../compare-exchange/create-cmpxchg-items#ex5---create-compare-exchange-item---with-string-value) + * [Ex.6 - Create compare-exchange item - with custom object value](../compare-exchange/create-cmpxchg-items#ex6---create-compare-exchange-item---with-custom-object-value) + * [Ex.7 - Create compare-exchange item - with metadata](../compare-exchange/create-cmpxchg-items#ex7---create-compare-exchange-item---with-metadata) + * [Create item using the **Studio**](../compare-exchange/create-cmpxchg-items#create-item-using-the-studio) + * [Syntax](../compare-exchange/create-cmpxchg-items#syntax) + + + + +--- + +## Create item using a cluster-wide session + +* Create compare-exchange items using a cluster-wide session when you want the creation to be part of a transaction committed via `SaveChanges()`. + This is suitable if you want to include compare-exchange item creation and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `CreateCompareExchangeValue()` to register the creation of a new compare-exchange item in the session. + The item will be created as part of the cluster-wide transaction when _SaveChanges()_ is called. + +* Exceptions: + An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + If the key already exists, _SaveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + +* Examples: + + #### Ex.1 - Create compare-exchange item - with string value + + + + ```csharp + // The session must be opened in cluster-wide mode + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'CreateCompareExchangeValue' to register the creation of a new compare-exchange item + // as part of the cluster-wide transaction. Specify the item's KEY and VALUE. + // The item will be created only when 'SaveChanges' is called. + CompareExchangeValue item = + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + session.SaveChanges(); + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'CreateCompareExchangeValue' to register the creation of a new compare-exchange item + // as part of the cluster-wide transaction. Specify the item's KEY and VALUE. + // The item will be created only when 'SaveChanges' is called. + CompareExchangeValue item = + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + await asyncSession.SaveChangesAsync(); + } + ``` + + + + #### Ex.2 - Create compare-exchange item - with custom object value + + + + ```csharp + // Define the object to be stored as the value + var user1Info = new UserInfo() + { + UserDocumentId = "users/1", + AdditionalInfo = "someInfo.." + }; + + // The session must be opened in cluster-wide mode + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'CreateCompareExchangeValue' to register the creation of a new compare-exchange item + // as part of the cluster-wide transaction. Specify the item's KEY and VALUE. + // The item will be created only when 'SaveChanges' is called. + CompareExchangeValue item = + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: user1Info // Pass the object instance + ); + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + session.SaveChanges(); + } + ``` + + + ```csharp + // Define the object to be stored as the value + var user1Info = new UserInfo() + { + UserDocumentId = "users/1", + AdditionalInfo = "someInfo.." + }; + + // The session must be opened in cluster-wide mode + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'CreateCompareExchangeValue' to register the creation of a new compare-exchange item + // as part of the cluster-wide transaction. Specify the item's KEY and VALUE. + // The item will be created only when 'SaveChanges' is called. + CompareExchangeValue item = + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: user1Info // Pass the object instance + ); + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + await asyncSession.SaveChangesAsync(); + } + ``` + + + + #### Ex.3 - Create compare-exchange item - with metadata + + + + ```csharp + // The session must be opened in cluster-wide mode + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'CreateCompareExchangeValue', specify the item's KEY and VALUE: + CompareExchangeValue item = + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Add METADATA fields to the item: + item.Metadata["field-name"] = "some value"; + item.Metadata["email-type"] = "work email"; // e.g. describe the email type + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + session.SaveChanges(); + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'CreateCompareExchangeValue', specify the item's KEY and VALUE: + CompareExchangeValue item = + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Add METADATA fields to the item: + item.Metadata["field-name"] = "some value"; + item.Metadata["email-type"] = "work email"; // e.g. describe the email type + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + await asyncSession.SaveChangesAsync(); + } + ``` + + + + #### Ex.4 - Create multiple items + + You can create multiple compare-exchange items in the same cluster-wide transaction. + + + + ```csharp + // The session must be opened in cluster-wide mode + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // You can create multiple compare-exchange items before calling 'SaveChanges'. + // Call 'CreateCompareExchangeValue' for each item you want to create in the transaction. + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user7-name@example.com", value: "users/7" + ); + + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user8-name@example.com", value: "users/8" + ); + + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user9-name@example.com", value: "users/9" + ); + + // All three items will be created atomically as part of the same transaction. + // If any creation fails (e.g., due to an existing key), the entire transaction is rolled back + // and none of the new items will be created. + session.SaveChanges(); + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // You can create multiple compare-exchange items before calling 'SaveChanges'. + // Call 'CreateCompareExchangeValue' for each item you want to create in the transaction. + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user7-name@example.com", value: "users/7" + ); + + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user8-name@example.com", value: "users/8" + ); + + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user9-name@example.com", value: "users/9" + ); + + // All three items will be created atomically as part of the same transaction. + // If any creation fails (e.g., due to an existing key), the entire transaction is rolled back + // and none of the new items will be created. + await asyncSession.SaveChangesAsync(); + } + ``` + + + +--- + +## Create item using a store operation + +* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, without opening a session. + This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* Creating a new compare-exchange item will succeed only if: + * The passed index is 0, and + * The specified key does not already exist in the database. + +* The operation will return a failed result (no exception is thrown) in the following cases: + * A new key is provided, but the index is not 0. + * The key already exists, even if the passed index is 0. + +* Examples: + + #### Ex.5 - Create compare-exchange item - with string value + + + + ```csharp + // Create a new compare-exchange item: + // =================================== + + // Define the put compare-exchange operation. Pass: + // * KEY: a new unique string identifier (e.g. a user's email) + // * VALUE: an associated value (e.g. the user's document ID) + // * INDEX: pass '0' to indicate that this is a new compare-exchange item + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0); + + // Execute the operation by passing it to Operations.Send + CompareExchangeResult putResult = store.Operations.Send(putCmpXchgOp); + + // Check results + bool successful = putResult.Successful; // Has operation succeeded + long indexForItem = putResult.Index; // The version number assigned to the new item + + // If 'successful' is true, then a new compare-exchange item has been created + // with the unique email key and the associated value. + ``` + + + ```csharp + // Create a new compare-exchange item: + // =================================== + + // Define the put compare-exchange operation. Pass: + // * KEY: a new unique string identifier (e.g. a user's email) + // * VALUE: an associated value (e.g. the user's document ID) + // * INDEX: pass '0' to indicate that this is a new compare-exchange item + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0); + + // Execute the operation by passing it to Operations.SendAsync + CompareExchangeResult putResult = await store.Operations.SendAsync(putCmpXchgOp); + + // Check results + bool successful = putResult.Successful; // Has operation succeeded + long indexForItem = putResult.Index; // The version number assigned to the new item + + // If 'successful' is true, then a new compare-exchange item has been created + // with the unique email key and the associated value. + ``` + + + + #### Ex.6 - Create compare-exchange item - with custom object value + + + + ```csharp + // Create a new compare-exchange item: + // =================================== + + // Define the object to be stored as the value + var user1Info = new UserInfo() + { + UserDocumentId = "users/1", + AdditionalInfo = "someInfo.." + }; + + // Define the put compare-exchange operation. + // Pass the key, the object instance, and '0' to indicate that this is a new item. + // Specify the object type in the generic parameter. + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", user1Info, 0); + + // Execute the operation by passing it to Operations.Send + CompareExchangeResult putResult = store.Operations.Send(putCmpXchgOp); + + // Check results + bool successful = putResult.Successful; // Has operation succeeded + long indexForItem = putResult.Index; // The version number assigned to the new item + + // If 'successful' is true, then a new compare-exchange item has been created + // with the unique email key and the associated value. + ``` + + + ```csharp + // Create a new compare-exchange item: + // =================================== + + // Define the object to be stored as the value + var user1Info = new UserInfo() + { + UserDocumentId = "users/1", + AdditionalInfo = "someInfo.." + }; + + // Define the put compare-exchange operation. + // Pass the key, the object instance, and '0' to indicate that this is a new item. + // Specify the object type in the generic parameter. + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", user1Info, 0); + + // Execute the operation by passing it to Operations.SendAsync + CompareExchangeResult putResult = await store.Operations.SendAsync(putCmpXchgOp); + + // Check results + bool successful = putResult.Successful; // Has operation succeeded + long indexForItem = putResult.Index; // The version number assigned to the new item + + // If 'successful' is true, then a new compare-exchange item has been created + // with the unique email key and the associated value. + ``` + + + + #### Ex.7 - Create compare-exchange item - with metadata + + + + ```csharp + // Create a new compare-exchange item with metadata: + // ================================================= + + // Define the metadata - must be a valid JSON object + var metadata = new MetadataAsDictionary + { + { "email-type", "work email" } + }; + + // Define the put compare-exchange operation. + // Pass a 4'th parameter with the metadata object. + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0, metadata); + + // Execute the operation by passing it to Operations.Send + CompareExchangeResult putResult = store.Operations.Send(putCmpXchgOp); + + // Check results + bool successful = putResult.Successful; // Has operation succeeded + long indexForItem = putResult.Index; // The version number assigned to the new item + + // If successful is true then a new compare-exchange item has been created + // with the unique key, value, and metadata. + ``` + + + ```csharp + // Create a new compare-exchange item with metadata: + // ================================================= + + // Define the metadata - must be a valid JSON object + var metadata = new MetadataAsDictionary + { + { "email-type", "work email" } + }; + + // Define the put compare-exchange operation. + // Pass a 4'th parameter with the metadata object. + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "user1-name@example.com", "users/1", 0, metadata); + + // Execute the operation by passing it to Operations.SendAsync + CompareExchangeResult putResult = await store.Operations.SendAsync(putCmpXchgOp); + + // Check results + bool successful = putResult.Successful; // Has operation succeeded + long indexForItem = putResult.Index; // The version number assigned to the new item + + // If successful is true then a new compare-exchange item has been created + // with the unique key, value, and metadata. + ``` + + + +--- + +## Create item using the Studio + +To create compare-exchange items using the Studio, go to **Documents > Compare Exchange**. + +![The compare-exchange view](../assets/create-new-cmpxchg-1.png) + +![The compare-exchange view](../assets/create-new-cmpxchg-2.png) + +1. **Key** + Enter a unique identifier for the compare-exchange item (up to 512 bytes). + This key must be unique across the entire database. +2. **Value** + Enter the value to associate with the key. + Can be a number, string, array, or any valid JSON object. +3. **Metadata** (optional) + Add any additional data you want to store with the item. + Must be a valid JSON object. + Can be used to [set expiration time](../todo..) for the compare-exchange item. +4. **Save** + Click to create the compare-exchange item. + If the key already exists, an error message will be shown. + +--- + +## Syntax + +--- + +### `PutCompareExchangeValueOperation` +Create compare-exchange item using a store operation: + + +```csharp +public PutCompareExchangeValueOperation( + string key, T value, long index, IMetadataDictionary metadata = null) +``` + + +| Parameter | Type | Description | +|--------------|-----------------------|-------------| +| **key** | `string` |

| +| **value** | `T` |
  • A value to be saved for the specified _key_.
  • Can be any object (number, string, array, or any valid JSON object).
| +| **index** | `long` |
  • Pass `0` to create a new key.
  • When updating an existing key, pass the current number for concurrency control.
| +| **metadata** | `IMetadataDictionary` |
  • Optional metadata to be saved for the specified _key_.
  • Must be a valid JSON object.
| + + +**Returned object**: + + +```csharp +public class CompareExchangeResult +{ + public bool Successful; + public T Value; + public long Index; +} +``` + + +| Return Value | Type | Description | +|---------------|--------|-------------| +| **Successful**| `bool` |
  • `true` if the put operation has completed successfully.
  • `false` if the put operation has failed.
| +| **Value** | `T` |
  • Upon success - the value of the compare-exchange item that was saved.
  • Upon failure - the existing value on the server.
| +| **Index** | `long` |
  • The compare-exchange item's version.
  • This number increases with each successful modification of the `value` or `metadata`.
  • Upon success - the updated version of the compare-exchange item that was saved.
  • Upon failure - the existing version number on the server.
| + +--- + +### `CreateCompareExchangeValue` +Create compare-exchange item using cluster-wide session: + + +```csharp +session.Advanced.ClusterTransaction.CreateCompareExchangeValue(key, value); +``` + + +| Parameter | Type | Description | +|------------|----------|--------------------------------------------------------------------| +| **key** | `string` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `T` | The associated value to store for the key.
Can be a number, string, array, or any valid JSON object. | + +| `CreateCompareExchangeValue` returns: | Description | +|---------------------------|---------------------------------------------------------------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item that is added to the transaction.
It will be created when `SaveChanges()` is called. | + +The returned `CompareExchangeValue` contains: + +| Property | Type | Description | +|------------|----------|--------------------------------------------------------------------| +| **key** | `string` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `T` | The value associated with the key. | +| **index** | `long` | The index used for concurrency control.
Will be `0` when calling `CreateCompareExchangeValue`. | diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx new file mode 100644 index 0000000000..bab1aa9a15 --- /dev/null +++ b/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx @@ -0,0 +1,146 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* A new compare-exchange item can be created in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* To create a new compare-exchange item, you must provide: + * **A unique key** (string, up to 512 bytes) + * **An associated value** (number, string, array, or any valid JSON object) + * You can optionally add **metadata** (a valid JSON object) to store extra information with the item. + A common use case is to set an expiration time for the compare-exchange item in its metadata. + Learn more in [Set expiration for compare-exchange items](../compare-exchange/cmpxchg-expiration). + +* To modify an existing compare-exchange item, see: [Update compare-exchange item](../compare-exchange/update-cmpxchg-item). + +* In this article: + * [Create item using a **store operation**](../compare-exchange/create-cmpxchg-items#create-item-using-a-store-operation) + * [Create item using the **Studio**](../compare-exchange/create-cmpxchg-items#create-item-using-the-studio) + * [Syntax](../compare-exchange/create-cmpxchg-items#syntax) + + + +--- + +## Create item using a store operation + +* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, without opening a session. + This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* Creating a new compare-exchange item will succeed only if: + * The passed index is 0, and + * The specified key does not already exist in the database. + +* The operation will return a failed result (no exception is thrown) in the following cases: + * A new key is provided, but the index is not 0. + * The key already exists, even if the passed index is 0. + +--- + +#### Example + + + +{`CompareExchangeResult compareExchangeResult = store.operations().send( + new PutCompareExchangeValueOperation<>("user1-name@example.com", "users/1", 0)); + +boolean successful = compareExchangeResult.isSuccessful(); +// If successful is true: then Key 'user1-name@example.com' now has the value of "users/1" +`} + + + +--- + +## Create item using the Studio + +To create compare-exchange items using the Studio, go to **Documents > Compare Exchange**. + +![The compare-exchange view](../assets/create-new-cmpxchg-1.png) + +![The compare-exchange view](../assets/create-new-cmpxchg-2.png) + +1. **Key** + Enter a unique identifier for the compare-exchange item (up to 512 bytes). + This key must be unique across the entire database. +2. **Value** + Enter the value to associate with the key. + Can be a number, string, array, or any valid JSON object. +3. **Metadata** (optional) + Add any additional data you want to store with the item. + Must be a valid JSON object. + Can be used to [set expiration time](../todo..) for the compare-exchange item. +4. **Save** + Click to create the compare-exchange item. + If the key already exists, an error message will be shown. + +--- + +## Syntax + +--- + +### `PutCompareExchangeValueOperation` +Create compare-exchange item using a store operation: + + + +{`public PutCompareExchangeValueOperation(String key, T value, long index) +`} + + + +| Parameter | Type | Description | +|-----------|--------|-------------| +| **key** | String | Object identifier under which _value_ is saved, unique in the database scope across the cluster. This string can be up to 512 bytes. | +| **value** | `T` | The value to be saved for the specified _key_. | +| **index** | long | * `0` if creating a new key
* The current version of _value_ when updating a value for an existing key. | + +**Returned object**: + + + +{`public class CompareExchangeResult \{ + private T value; + private long index; + private boolean successful; + + public T getValue() \{ + return value; + \} + + public void setValue(T value) \{ + this.value = value; + \} + + public long getIndex() \{ + return index; + \} + + public void setIndex(long index) \{ + this.index = index; + \} + + public boolean isSuccessful() \{ + return successful; + \} + + public void setSuccessful(boolean successful) \{ + this.successful = successful; + \} +\} +`} + + + +| Return Value | Type | Description | +|----------------|---------|-----------------------------------------------------------------------------| +| **Successful** | boolean | * `true` if the save operation has completed successfully
* `false` if the save operation failed | +| **Value** | `T` | * The value that was saved if the operation was successful
* The currently existing value in the server upon failure | +| **Index** | long | * The version number of the value that was saved upon success
* The currently existing version number in the server upon failure | diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx new file mode 100644 index 0000000000..83322cbe25 --- /dev/null +++ b/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx @@ -0,0 +1,308 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* A new compare-exchange item can be created in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* To create a new compare-exchange item, you must provide: + * **A unique key** (string, up to 512 bytes) + * **An associated value** (number, string, array, or any valid JSON object) + * You can optionally add **metadata** (a valid JSON object) to store extra information with the item. + A common use case is to set an expiration time for the compare-exchange item in its metadata. + Learn more in [Set expiration for compare-exchange items](../compare-exchange/cmpxchg-expiration). + +* To modify an existing compare-exchange item, see: [Update compare-exchange items](../compare-exchange/update-cmpxchg-item). + +* In this article: + * [Create item using a **cluster-wide session**](../compare-exchange/create-cmpxchg-items#create-item-using-a-cluster-wide-session) + * [Ex.1 - Create new compare-exchange item](../compare-exchange/create-cmpxchg-items#ex1---create-new-compare-exchange-item) + * [Ex.2 - Create new compare-exchange item with metadata](../compare-exchange/create-cmpxchg-items#ex2---create-new-compare-exchange-item-with-metadata) + * [Ex.3 - Create multiple items](../compare-exchange/create-cmpxchg-items#ex3---create-multiple-items) + * [Create item using a **store operation**](../compare-exchange/create-cmpxchg-items#create-item-using-a-store-operation) + * [Ex.4 - Create new compare-exchange item](../compare-exchange/create-cmpxchg-items#ex4---create-new-compare-exchange-item) + * [Ex.5 - Create new compare-exchange item with metadata](../compare-exchange/create-cmpxchg-items#ex5---create-new-compare-exchange-item-with-metadata) + * [Create item using the **Studio**](../compare-exchange/create-cmpxchg-items#create-item-using-the-studio) + * [Syntax](../compare-exchange/create-cmpxchg-items#syntax) + + + +--- + +## Create item using a cluster-wide session + +* Create compare-exchange items using a cluster-wide session when you want the creation to be part of a transaction committed via `saveChanges()`. + This is suitable if you want to include compare-exchange item creation and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `createCompareExchangeValue()` to register the creation of a new compare-exchange item in the session. + The item will be created as part of the cluster-wide transaction when _saveChanges()_ is called. + +* Exceptions: + An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + If the key already exists, _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + +* Examples: + + #### Ex.1 - Create new compare-exchange item + + + + ```js + // The session must be opened in cluster-wide mode + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Call 'createCompareExchangeValue' to register the creation of a new compare-exchange item + // as part of the cluster-wide transaction. Specify the item's KEY and VALUE. + // The item will be created only when 'saveChanges' is called. + const item = session.advanced.clusterTransaction.createCompareExchangeValue( + "user1-name@example.com", "users/1" // key, value + ); + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + await session.saveChanges(); + ``` + + + + #### Ex.2 - Create new compare-exchange item with metadata + + + + ```js + // The session must be opened in cluster-wide mode + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Call 'createCompareExchangeValue' to register the creation of a new compare-exchange item + // as part of the cluster-wide transaction. Specify the item's KEY and VALUE. + // The item will be created only when 'saveChanges' is called. + const item = session.advanced.clusterTransaction.createCompareExchangeValue( + "user1-name@example.com", "users/1" // key, value + ); + + // Add METADATA fields to the item: + item.metadata["field-name"] = "some value"; + item.metadata["email-type"] = "work email"; // e.g. describe the email type + + // Commit the cluster-wide transaction. + // This will create the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the key already exists. + await session.saveChanges(); + ``` + + + + #### Ex.3 - Create multiple items + + You can create multiple compare-exchange items in the same cluster-wide transaction. + + + + ```js + // The session must be opened in cluster-wide mode + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // You can create multiple compare-exchange items before calling 'saveChanges'. + // Call 'createCompareExchangeValue' for each item you want to create in the transaction. + session.advanced.clusterTransaction.createCompareExchangeValue( + "user7-name@example.com", "users/7" + ); + + session.advanced.clusterTransaction.createCompareExchangeValue( + "user8-name@example.com", "users/8" + ); + + session.advanced.clusterTransaction.createCompareExchangeValue( + "user9-name@example.com", "users/9" + ); + + // All three items will be created atomically as part of the same transaction. + // If any creation fails (e.g., due to an existing key), the entire transaction is rolled back + // and none of the new items will be created. + await session.saveChanges(); + ``` + + + +--- + +## Create item using a store operation + +* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, without opening a session. + This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* Creating a new compare-exchange item will succeed only if: + * The passed index is 0, and + * The specified key does not already exist in the database. + +* The operation will return a failed result (no exception is thrown) in the following cases: + * A new key is provided, but the index is not 0. + * The key already exists, even if the passed index is 0. + +* Examples: + + #### Ex.4 - Create new compare-exchange item + + + + ```js + // Create a new compare-exchange item: + // =================================== + + // Define the put compare-exchange operation. Pass: + // * KEY: a new unique identifier (e.g. a user's email) + // * VALUE: an associated value (e.g. the user's document ID) + // * INDEX: pass '0' to indicate that this is a new key + const putCmpXchgOp = new PutCompareExchangeValueOperation("user1-name@example.com", "users/1", 0); + + // Execute the operation by passing it to operations.send + const result = await documentStore.operations.send(putCmpXchgOp); + + // Check results + const successful = result.successful; // Has operation succeeded + const indexForItem = result.index; // The version number assigned to the new item + + // If successful is true then a new compare-exchange item has been created + // with the unique email key and the associated value. + ``` + + + + #### Ex.5 - Create new compare-exchange item with metadata + + + + ```js + // Create a new compare-exchange item with metadata: + // ================================================= + + // Define the put compare-exchange operation. + // Pass a 4'th parameter with the metadata object. + const putCmpXchgOp = new PutCompareExchangeValueOperation("user1-name@example.com", "users/1", 0, + { + "email-type": "work email" + }); + + // Execute the operation by passing it to operations.send + const result = await documentStore.operations.send(putCmpXchgOp); + + // Check results + const successful = result.successful; // Has operation succeeded + const indexForItem = result.index; // The version number assigned to the new item + + // If successful is true then a new compare-exchange item has been created + // with the unique phone number key, value, and metadata. + ``` + + + +--- + +## Create item using the Studio + +To create compare-exchange items using the Studio, go to **Documents > Compare Exchange**. + +![The compare-exchange view](../assets/create-new-cmpxchg-1.png) + +![The compare-exchange view](../assets/create-new-cmpxchg-2.png) + +1. **Key** + Enter a unique identifier for the compare-exchange item (up to 512 bytes). + This key must be unique across the entire database. +2. **Value** + Enter the value to associate with the key. + Can be a number, string, array, or any valid JSON object. +3. **Metadata** (optional) + Add any additional data you want to store with the item. + Must be a valid JSON object. + Can be used to [set expiration time](../todo..) for the compare-exchange item. +4. **Save** + Click to create the compare-exchange item. + If the key already exists, an error message will be shown. + +--- + +## Syntax + +--- + +### `PutCompareExchangeValueOperation` +Create compare-exchange item using a store operation: + + +```js +// Available overloads: +// ==================== +const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index); +const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index, metadata); +``` + + +| Parameter | Type | Description | +|--------------|----------|-------------| +| **key** | `string` |
  • A unique identifier in the database scope.
  • Can be up to 512 bytes.
| +| **value** | `object` |
  • A value to be saved for the specified _key_.
  • Can be any object (number, string, array, or any valid JSON object).
| +| **index** | `number` |
  • Pass `0` to create a new key.
  • When updating an existing key, pass the current number for concurrency control.
| +| **metadata** | `object` |
  • Optional metadata to be saved for the specified _key_.
  • Must be a valid JSON object.
| + + +**Returned object**: + + +```js +// Return value of store.operations.send(putCmpXchgOp) +// =================================================== +class CompareExchangeResult { + successful; + value; + index; +} +``` + + +| Return Value | Type | Description | +|----------------|-----------|-------------| +| **successful** | `boolean` |
  • `true` if the put operation has completed successfully.
  • `false` if the put operation has failed.
| +| **value** | `object` |
  • Upon success - the value of the compare-exchange item that was saved.
  • Upon failure - the existing value on the server.
| +| **index** | `number` |
  • The compare-exchange item's version.
  • This number increases with each successful modification of the `value` or `metadata`.
  • Upon success - the updated version of the compare-exchange item that was saved.
  • Upon failure - the existing version number on the server.
| + +--- + +### `createCompareExchangeValue` +Create compare-exchange item using cluster-wide session: + + +```js +session.advanced.clusterTransaction.createCompareExchangeValue(key, item); +``` + + +| Parameter | Type | Description | +|------------|----------|--------------------------------------------------------------------| +| **key** | `string` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `object` | The associated value to store for the key.
Can be a number, string, array, or any valid JSON object. | + +| `createCompareExchangeValue` returns: | Description | +|---------------------------|----------------------------------------------------------------------------------------------------| +| `object` | The compare-exchange item that is added to the transaction.
It will be created when `saveChanges()` is called. | + +The returned object contains: + +| Property | Type | Description | +|------------|----------|--------------------------------------------------------------------| +| **key** | `string` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `object` | The value associated with the key. | +| **index** | `number` | The index used for concurrency control.
Will be `0` when calling `createCompareExchangeValue`. | diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-php.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-php.mdx new file mode 100644 index 0000000000..d32ece6a51 --- /dev/null +++ b/docs/compare-exchange/content/_create-cmpxchg-items-php.mdx @@ -0,0 +1,112 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* A new compare-exchange item can be created in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* To create a new compare-exchange item, you must provide: + * **A unique key** (string, up to 512 bytes) + * **An associated value** (number, string, array, or any valid JSON object) + * You can optionally add **metadata** (a valid JSON object) to store extra information with the item. + A common use case is to set an expiration time for the compare-exchange item in its metadata. + Learn more in [Set expiration for compare-exchange items](../compare-exchange/cmpxchg-expiration). + +* To modify an existing compare-exchange item, see: [Update compare-exchange item](../compare-exchange/update-cmpxchg-item). + +* In this article: + * [Create item using a **cluster-wide session**](../compare-exchange/create-cmpxchg-items#create-item-using-a-cluster-wide-session) + * [Create item using the **Studio**](../compare-exchange/create-cmpxchg-items#create-item-using-the-studio) + * [Syntax](../compare-exchange/create-cmpxchg-items#syntax) + + + +--- + +## Create item using a cluster-wide session + +* Create compare-exchange items using a cluster-wide session when you want the creation to be part of a transaction committed via `saveChanges()`. + This is suitable if you want to include compare-exchange item creation and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `createCompareExchangeValue()` to register the creation of a new compare-exchange item in the session. + The item will be created as part of the cluster-wide transaction when _saveChanges()_ is called. + +* Exceptions: + An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + If the key already exists, _saveChanges()_ will throw a `ConcurrencyException`. + +#### Example + + +```php +// The session must be first opened with cluster-wide mode +$session->advanced()->clusterTransaction()->createCompareExchangeValue( + key: "Best NoSQL Transactional Database", + value: "RavenDB" +); + +$session->saveChanges(); +``` + + +--- + +## Create item using the Studio + +To create compare-exchange items using the Studio, go to **Documents > Compare Exchange**. + +![The compare-exchange view](../assets/create-new-cmpxchg-1.png) + +![The compare-exchange view](../assets/create-new-cmpxchg-2.png) + +1. **Key** + Enter a unique identifier for the compare-exchange item (up to 512 bytes). + This key must be unique across the entire database. +2. **Value** + Enter the value to associate with the key. + Can be a number, string, array, or any valid JSON object. +3. **Metadata** (optional) + Add any additional data you want to store with the item. + Must be a valid JSON object. + Can be used to [set expiration time](../todo..) for the compare-exchange item. +4. **Save** + Click to create the compare-exchange item. + If the key already exists, an error message will be shown. + +--- + +## Syntax + +--- + +### `createCompareExchangeValue` +Create compare-exchange item using cluster-wide session: + + +```php +$session->advanced()->clusterTransaction()->createCompareExchangeValue($key, $value); +``` + + +| Parameter | Type | Description | +|------------|----------|--------------------------------------------------------------------| +| **key** | `string` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `T` | The associated value to store for the key.
Can be a number, string, array, or any valid JSON object. | + +| `create_compare_exchange_value` returns: | Description | +|---------------------------|----------------------------------------------------------------------------------------------------------------------| +| `CompareExchangeValue[T]` | The compare-exchange item that is added to the transaction.
It will be created when `save_changes()` is called. | + +The `CompareExchangeValue`: + +| Property | Type | Description | +|------------|----------|--------------------------------------------------------------------| +| **key** | `string` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `T` | The value associated with the key. | +| **index** | `int` | The index used for concurrency control.
Will be `0` when calling `createCompareExchangeValue`. | diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-python.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-python.mdx new file mode 100644 index 0000000000..6bbf563583 --- /dev/null +++ b/docs/compare-exchange/content/_create-cmpxchg-items-python.mdx @@ -0,0 +1,113 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* A new compare-exchange item can be created in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* To create a new compare-exchange item, you must provide: + * **A unique key** (string, up to 512 bytes) + * **An associated value** (number, string, array, or any valid JSON object) + * You can optionally add **metadata** (a valid JSON object) to store extra information with the item. + A common use case is to set an expiration time for the compare-exchange item in its metadata. + Learn more in [Set expiration for compare-exchange items](../compare-exchange/cmpxchg-expiration). + +* To modify an existing compare-exchange item, see: [Update compare-exchange item](../compare-exchange/update-cmpxchg-item). + +* In this article: + * [Create item using a **cluster-wide session**](../compare-exchange/create-cmpxchg-items#create-item-using-a-cluster-wide-session) + * [Create item using the **Studio**](../compare-exchange/create-cmpxchg-items#create-item-using-the-studio) + * [Syntax](../compare-exchange/create-cmpxchg-items#syntax) + + + +--- + +## Create item using a cluster-wide session + +* Create compare-exchange items using a cluster-wide session when you want the creation to be part of a transaction committed via `save_changes()`. + This is suitable if you want to include compare-exchange item creation and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `create_compare_exchange_value()` to register the creation of a new compare-exchange item in the session. + The item will be created as part of the cluster-wide transaction when _save_changes()_ is called. + +* Exceptions: + A `RuntimeError` is thrown when the session is Not opened in cluster-wide mode. + If the key already exists, save_changes()_ will throw a `ConcurrencyException`. + +#### Example + + +```python +# The session must be first opened with cluster-wide mode + +session.advanced.cluster_transaction.create_compare_exchange_value( + key="Best NoSQL Transactional Database", + item="RavenDB", +) + +session.save_changes(); +``` + + +--- + +## Create item using the Studio + +To create compare-exchange items using the Studio, go to **Documents > Compare Exchange**. + +![The compare-exchange view](../assets/create-new-cmpxchg-1.png) + +![The compare-exchange view](../assets/create-new-cmpxchg-2.png) + +1. **Key** + Enter a unique identifier for the compare-exchange item (up to 512 bytes). + This key must be unique across the entire database. +2. **Value** + Enter the value to associate with the key. + Can be a number, string, array, or any valid JSON object. +3. **Metadata** (optional) + Add any additional data you want to store with the item. + Must be a valid JSON object. + Can be used to [set expiration time](../todo..) for the compare-exchange item. +4. **Save** + Click to create the compare-exchange item. + If the key already exists, an error message will be shown. + +--- + +## Syntax + +--- + +### `create_compare_exchange_value` +Create compare-exchange item using cluster-wide session: + + +```python +session.advanced.cluster_transaction.create_compare_exchange_value(key, value) +``` + + +| Parameter | Type | Description | +|------------|-------|--------------------------------------------------------------------| +| **key** | `str` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `T` | The associated value to store for the key.
Can be a number, string, array, or any valid JSON object. | + +| `create_compare_exchange_value` returns: | Description | +|---------------------------|----------------------------------------------------------------------------------------------------------------------| +| `CompareExchangeValue[T]` | The compare-exchange item that is added to the transaction.
It will be created when `save_changes()` is called. | + +The `CompareExchangeValue`: + +| Property | Type | Description | +|------------|--------|--------------------------------------------------------------------| +| **key** | `str` | The compare-exchange item key. This string can be up to 512 bytes. | +| **value** | `T` | The value associated with the key. | +| **index** | `int` | The index used for concurrency control.
Will be `0` when calling `create_compare_exchange_value`. | diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx new file mode 100644 index 0000000000..6c2cd24392 --- /dev/null +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx @@ -0,0 +1,355 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Existing compare-exchange items can be deleted. + +* An item is deleted only if the index you provide in the request matches the current index stored on the server + for the specified key. + +* Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. + Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. + E.g., indexes referencing the deleted item will update themselves to remove those references. + The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). + +* In this article: + * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) + * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) + * [Delete by key and index](../compare-exchange/delete-cmpxchg-items#delete-by-key-and-index) + * [Delete multiple items](../compare-exchange/delete-cmpxchg-items#delete-multiple-items) + * [Delete compare-exchange item using a **store operation**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) + * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) + * [Syntax](../compare-exchange/delete-cmpxchg-items#syntax) + + + + +--- + +## Delete compare-exchange item using a cluster-wide session + +* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `SaveChanges()`. + This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `DeleteCompareExchangeValue()` to register the deletion of an existing compare-exchange item in the session. + The item will be deleted as part of the cluster-wide transaction when _SaveChanges()_ is called. + +* If the item's index (its version) on the server is different from the index you provide, + _SaveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session. + +* Examples: + + #### Delete by item + + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Get the latest version of the existing compare-exchange item to be deleted. + CompareExchangeValue itemToDelete = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + + if (itemToDelete != null) + { + // Call 'DeleteCompareExchangeValue' to register the deletion as part of the cluster-wide + // transaction. Pass the item to delete. + session.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete); + + // Commit the cluster-wide transaction. This will delete the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the item's index (its version) + // on the server is different than the one provided in the delete request. + session.SaveChanges(); + } + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Get the latest version of the existing compare-exchange item to be deleted. + CompareExchangeValue itemToDelete = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + + if (itemToDelete != null) + { + // Call 'DeleteCompareExchangeValue' to register the deletion as part of the cluster-wide + // transaction. Pass the item to delete. + asyncSession.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete); + + // Commit the cluster-wide transaction. This will delete the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the item's index (its version) + // on the server is different than the one provided in the delete request. + await asyncSession.SaveChangesAsync(); + } + } + ``` + + + + #### Delete by key and index + + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Get the latest version of the existing compare-exchange item to be deleted. + CompareExchangeValue itemToDelete = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + + if (itemToDelete != null) + { + // Call 'DeleteCompareExchangeValue' to register the deletion as part of the cluster-wide + // transaction. Specify the item's KEY and current INDEX (its version). + session.Advanced.ClusterTransaction.DeleteCompareExchangeValue( + itemToDelete.Key, itemToDelete.Index); + + // Commit the cluster-wide transaction. This will delete the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the item's index (its version) + // on the server is different than the one provided in the delete request. + session.SaveChanges(); + } + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Get the latest version of the existing compare-exchange item to be deleted. + CompareExchangeValue itemToDelete = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + + if (itemToDelete != null) + { + // Call 'DeleteCompareExchangeValue' to register the deletion as part of the cluster-wide + // transaction. Specify the item's KEY and current INDEX (its version). + asyncSession.Advanced.ClusterTransaction.DeleteCompareExchangeValue( + itemToDelete.Key, itemToDelete.Index); + + // Commit the cluster-wide transaction. This will delete the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the item's index (its version) + // on the server is different than the one provided in the delete request. + await asyncSession.SaveChangesAsync(); + } + } + ``` + + + + #### Delete multiple items + + + + ```csharp + // The session must be opened in cluster-wide mode + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Get the latest version of the items to be deleted. + CompareExchangeValue itemToDelete1 = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + CompareExchangeValue itemToDelete2 = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user2-name@example.com"); + CompareExchangeValue itemToDelete3 = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user3-name@example.com"); + + // You can delete multiple compare-exchange items before calling 'SaveChanges'. + // Call 'DeleteCompareExchangeValue' for each item you want to delete in the transaction. + session.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete1); + session.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete2); + session.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete3); + + // All items will be deleted atomically as part of the same transaction. + // If any deletion fails, the entire transaction is rolled back + // and none of the items will be deleted. + session.SaveChanges(); + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Get the latest version of the items to be deleted. + CompareExchangeValue itemToDelete1 = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + CompareExchangeValue itemToDelete2 = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValue("user2-name@example.com"); + CompareExchangeValue itemToDelete3 = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValue("user3-name@example.com"); + + // You can delete multiple compare-exchange items before calling 'SaveChanges'. + // Call 'DeleteCompareExchangeValue' for each item you want to delete in the transaction. + asyncSession.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete1); + asyncSession.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete2); + asyncSession.Advanced.ClusterTransaction.DeleteCompareExchangeValue(itemToDelete3); + + // All items will be deleted atomically as part of the same transaction. + // If any deletion fails, the entire transaction is rolled back + // and none of the items will be deleted. + await asyncSession.SaveChangesAsync(); + } + ``` + + + +--- + +## Delete compare-exchange item using a store operation + +* Use the `DeleteCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to delete a compare-exchange item by its key and index, without opening a session. + This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* The delete operation will only succeed if the item's current index on the server is the same as the one you provide. + If the indexes do not match, the item is not deleted and no exception is thrown. + +* Examples: + + + + ```csharp + // Get the latest version of the existing compare-exchange item to be deleted + var getCmpXchgOp = new GetCompareExchangeValueOperation("user1-name@example.com"); + CompareExchangeValue itemToDelete = store.Operations.Send(getCmpXchgOp); + + if (itemToDelete != null) + { + // Define the delete compare-exchange operation + // Pass the item's KEY and INDEX (its version) + var deleteCmpXchgOp = new DeleteCompareExchangeValueOperation( + itemToDelete.Key, itemToDelete.Index); + + // Execute the delete operation by passing it to Operations.Send + CompareExchangeResult resultOfDelete = store.Operations.Send(deleteCmpXchgOp); + + // Check results + bool successful = resultOfDelete.Successful; // Has operation succeeded + long indexOfItem = resultOfDelete.Index; // The version of the deleted item + + // If 'successful' is true - the compare-exchange item was deleted. + // If 'successful' is false - the item was not deleted (index mismatch). + } + ``` + + + ```csharp + // Get the latest version of the existing compare-exchange item to be deleted + var getCmpXchgOp = new GetCompareExchangeValueOperation("user1-name@example.com"); + CompareExchangeValue itemToDelete = await store.Operations.SendAsync(getCmpXchgOp); + + if (itemToDelete != null) + { + // Define the delete compare-exchange operation + // Pass the item's KEY and its INDEX (its version) + var deleteCmpXchgOp = new DeleteCompareExchangeValueOperation( + itemToDelete.Key, itemToDelete.Index); + + // Execute the delete operation by passing it to Operations.SendAsync + CompareExchangeResult resultOfDelete = await store.Operations.SendAsync(deleteCmpXchgOp); + + // Check results + bool successful = resultOfDelete.Successful; // Has operation succeeded + long indexOfItem = resultOfDelete.Index; // The version of the deleted item + + // If 'successful' is true - the compare-exchange item was deleted. + // If 'successful' is false - the item was not deleted (index mismatch). + } + ``` + + + +--- + +## Delete compare-exchange items using the Studio + +You can delete one or multiple compare-exchange items from the Studio. + +![The compare-exchange view](../assets/delete-cmpxchg.png) + +1. Go to **Documents > Compare Exchange**. +2. Select the compare-exchange items you want to delete. +3. Click **Delete**. + +--- + +## Syntax + +--- + +### `DeleteCompareExchangeValueOperation` +Delete compare-exchange item using a store operation: + + +```csharp +public DeleteCompareExchangeValueOperation(string key, long index) +``` + + +| Parameter | Type | Description | +|-----------|----------|-------------| +| **key** | `string` | The unique key of the compare-exchange item. | +| **index** | `long` | The current version of the item.
Deletion will only succeed if this matches the version stored on the server. | + +**Returned object**: + + +```csharp +public class CompareExchangeResult +{ + public bool Successful; + public T Value; + public long Index; +} +``` + + +| Return Value | Type | Description | +|---------------|--------|-------------| +| **Successful**| `bool` |
  • `true` if the delete operation completed successfully.
  • `true` if _key_ doesn't exist
  • `false` if the delete operation has failed, e.g. when the index version doesn't match.
| +| **Value** | `T` |
  • The value that was deleted upon a successful delete.
  • `null` if _key_ doesn't exist
  • The currently existing value on the server if the delete operation has failed.
| +| **Index** | `long` |
  • The next available version number upon success.
  • The next available version number if _key_ doesn't exist.
  • The currently existing index on the server if the delete operation has failed.
| + +--- + +### `DeleteCompareExchangeValue` +Delete compare-exchange item using cluster-wide session: + + +```csharp +// Available overloads: +void DeleteCompareExchangeValue(CompareExchangeValue item); +void DeleteCompareExchangeValue(string key, long index); +``` + + +| Parameter | Type | Description | +|-----------|---------------------------|-------------| +| **item** | `CompareExchangeValue` | The compare-exchange item to delete. | +| **key** | `string` | The unique key of the compare-exchange item. | +| **index** | `long` | The current version of the item.
Deletion will only succeed if this matches the version stored on the server. | diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx new file mode 100644 index 0000000000..417823296f --- /dev/null +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx @@ -0,0 +1,130 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Existing compare-exchange items can be deleted. + +* An item is deleted only if the index you provide in the request matches the current index stored on the server + for the specified key. + +* Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. + Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. + E.g., indexes referencing the deleted item will update themselves to remove those references. + The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). + +* In this article: + * [Delete compare-exchange item using a **store operation**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) + * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) + * [Syntax](../compare-exchange/delete-cmpxchg-items#syntax) + + + +--- + +## Delete compare-exchange item using a store operation + +* Use the `DeleteCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to delete a compare-exchange item by its key and index, without opening a session. + This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* The delete operation will only succeed if the item's current index on the server is the same as the one you provide. + If the indexes do not match, the item is not deleted and no exception is thrown. + +* Example: + + + + ```java + // Get the latest version of the existing compare-exchange item to be deleted + CompareExchangeValue itemToDelete = store.operations().send( + new GetCompareExchangeValueOperation<>(User.class, "AdminUser")); + + // Execute the delete operation + CompareExchangeResult deleteResult = store.operations().send( + new DeleteCompareExchangeValueOperation<>(User.class, "AdminUser", itemToDelete.getIndex())); + + // Check results + boolean deleteResultSuccessful = deleteResult.isSuccessful(); + ``` + + + +--- + +## Delete compare-exchange items using the Studio + +You can delete one or multiple compare-exchange items from the Studio. + +![The compare-exchange view](../assets/delete-cmpxchg.png) + +1. Go to **Documents > Compare Exchange**. +2. Select the compare-exchange items you want to delete. +3. Click **Delete**. + +--- + +## Syntax + +--- + +### `DeleteCompareExchangeValueOperation` +Delete compare-exchange item using a store operation: + + +```java +public DeleteCompareExchangeValueOperation(Class clazz, String key, long index) +``` + + +| Parameter | Type | Description | +|-----------|----------|-------------| +| **key** | `string` | The unique key of the compare-exchange item. | +| **index** | `long` | The current version of the item.
Deletion will only succeed if this matches the version stored on the server. | + +**Returned object**: + + +```java +public class CompareExchangeResult { + private T value; + private long index; + private boolean successful; + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + + public long getIndex() { + return index; + } + + public void setIndex(long index) { + this.index = index; + } + + public boolean isSuccessful() { + return successful; + } + + public void setSuccessful(boolean successful) { + this.successful = successful; + } +} +``` + + +| Return Value | Type | Description | +|---------------|-----------|-------------| +| **Successful**| `boolean` |
  • `true` if the delete operation completed successfully.
  • `true` if _key_ doesn't exist
  • `false` if the delete operation has failed, e.g. when the index version doesn't match.
| +| **Value** | `T` |
  • The value that was deleted upon a successful delete.
  • `null` if _key_ doesn't exist
  • The currently existing value on the server if the delete operation has failed.
| +| **Index** | `long` |
  • The next available version number upon success.
  • The next available version number if _key_ doesn't exist.
  • The currently existing index on the server if the delete operation has failed.
| diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx new file mode 100644 index 0000000000..b329c4cdd3 --- /dev/null +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx @@ -0,0 +1,251 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Existing compare-exchange items can be deleted. + +* An item is deleted only if the index you provide in the request matches the current index stored on the server + for the specified key. + +* Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. + Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. + E.g., indexes referencing the deleted item will update themselves to remove those references. + The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). + +* In this article: + * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) + * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) + * [Delete by key and index](../compare-exchange/delete-cmpxchg-items#delete-by-key-and-index) + * [Delete multiple items](../compare-exchange/delete-cmpxchg-items#delete-multiple-items) + * [Delete compare-exchange item using a **store operation**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) + * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) + * [Syntax](../compare-exchange/delete-cmpxchg-items#syntax) + + + +--- + +## Delete compare-exchange item using a cluster-wide session + +* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `saveChanges()`. + This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `deleteCompareExchangeValue()` to register the deletion of an existing compare-exchange item in the session. + The item will be deleted as part of the cluster-wide transaction when _saveChanges()_ is called. + +* If the item's index (its version) on the server is different from the index you provide, + _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session. + +* Examples: + + #### Delete by item + + + + ```js + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Get the latest version of the existing compare-exchange item to be deleted. + const itemToDelete = await session.advanced.clusterTransaction + .getCompareExchangeValue("user1-name@example.com"); + + if (itemToDelete) { + // Call 'deleteCompareExchangeValue' to register the deletion as part of the cluster-wide + // transaction. Pass the item to delete. + session.advanced.clusterTransaction.deleteCompareExchangeValue(itemToDelete); + + // Commit the cluster-wide transaction. This will delete the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the item's index (its version) + // on the server is different than the one provided in the delete request. + await session.saveChanges(); + } + ``` + + + + #### Delete by key and index + + + + ```js + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Get the latest version of the existing compare-exchange item to be deleted. + const itemToDelete = await session.advanced.clusterTransaction + .getCompareExchangeValue("user1-name@example.com"); + + if (itemToDelete) { + // Call 'deleteCompareExchangeValue' to register the deletion as part of the cluster-wide + // transaction. Specify the item's KEY and current INDEX (its version). + session.advanced.clusterTransaction.deleteCompareExchangeValue(itemToDelete.key, itemToDelete.index); + + // Commit the cluster-wide transaction. This will delete the compare-exchange item, + // or throw a 'ClusterTransactionConcurrencyException' if the item's index (its version) + // on the server is different than the one provided in the delete request. + await session.saveChanges(); + } + ``` + + + + #### Delete multiple items + + + + ```js + // The session must be opened in cluster-wide mode + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Get the latest version of the items to be deleted. + const itemToDelete1 = await session.advanced.clusterTransaction + .getCompareExchangeValue("user1-name@example.com"); + const itemToDelete2 = await session.advanced.clusterTransaction + .getCompareExchangeValue("user2-name@example.com"); + const itemToDelete3 = await session.advanced.clusterTransaction + .getCompareExchangeValue("user3-name@example.com"); + + // You can delete multiple compare-exchange items before calling 'saveChanges'. + // Call 'deleteCompareExchangeValue' for each item you want to delete in the transaction. + session.advanced.clusterTransaction.deleteCompareExchangeValue(itemToDelete1); + session.advanced.clusterTransaction.deleteCompareExchangeValue(itemToDelete2); + session.advanced.clusterTransaction.deleteCompareExchangeValue(itemToDelete3); + + // All items will be deleted atomically as part of the same transaction. + // If any deletion fails, the entire transaction is rolled back + // and none of the items will be deleted. + await session.saveChanges(); + ``` + + + +--- + +## Delete compare-exchange item using a store operation + +* Use the `DeleteCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to delete a compare-exchange item by its key and index, without opening a session. + This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* The delete operation will only succeed if the item's current index on the server is the same as the one you provide. + If the indexes do not match, the item is not deleted and no exception is thrown. + +* Examples: + + + + ```js + // Get the latest version of the existing compare-exchange item to be deleted + const getCmpXchgOp = new GetCompareExchangeValueOperation("user1-name@example.com"); + const itemToDelete = await documentStore.operations.send(getCmpXchgOp); + + if (itemToDelete) + { + // Define the delete compare-exchange operation + // Pass the item's KEY and INDEX (its version) + const deleteCmpXchgOp = new DeleteCompareExchangeValueOperation(itemToDelete.key, itemToDelete.index); + + // Execute the delete operation by passing it to operations.send + const resultOfDelete = await documentStore.operations.send(deleteCmpXchgOp); + + // Check results + const successful = resultOfDelete.successful; // Has operation succeeded + const indexOfItem = resultOfDelete.index; // The version of the deleted item + + // If 'successful' is true - the compare-exchange item was deleted. + // If 'successful' is false - the item was not deleted (index mismatch). + } + ``` + + + +--- + +## Delete compare-exchange items using the Studio + +You can delete one or multiple compare-exchange items from the Studio. + +![The compare-exchange view](../assets/delete-cmpxchg.png) + +1. Go to **Documents > Compare Exchange**. +2. Select the compare-exchange items you want to delete. +3. Click **Delete**. + +--- + +## Syntax + +--- + +### `DeleteCompareExchangeValueOperation` +Delete compare-exchange item using a store operation: + + +```js +const deleteCmpXchgOp = new DeleteCompareExchangeValueOperation(key, index, clazz?); +``` + + +| Parameter | Type | Description | +|-----------|----------|-------------| +| **key** | `string` | The unique key of the compare-exchange item to be deleted. | +| **index** | `long` | The current version of the item to be deleted.
Deletion will only succeed if this matches the version stored on the server. | +| **clazz** | `object` | When the item's value is a class, you can specify its type in this parameter. | + +**Returned object**: + + +```js +// Return value of store.operations.send(deleteCmpXchgOp) +// ====================================================== + +class CompareExchangeResult +{ + Successful; + Value; + Index; +} +``` + + +| Return Value | Type | Description | +|---------------|-----------|-------------| +| **Successful**| `boolean` |
  • `true` if the delete operation completed successfully.
  • `true` if _key_ doesn't exist
  • `false` if the delete operation has failed, e.g. when the index version doesn't match.
| +| **Value** | `object` |
  • The value that was deleted upon a successful delete.
  • `null` if _key_ doesn't exist
  • The currently existing value on the server if the delete operation has failed.
| +| **Index** | `number` |
  • The next available version number upon success.
  • The next available version number if _key_ doesn't exist.
  • The currently existing index on the server if the delete operation has failed.
| + +--- + +### `deleteCompareExchangeValue` +Delete compare-exchange item using cluster-wide session: + + +```js +// Available overloads: +deleteCompareExchangeValue(key, index); +deleteCompareExchangeValue(item); +``` + + +| Parameter | Type | Description | +|-----------|-------------------------|-------------| +| **item** | `CompareExchangeValue` | The compare-exchange item to delete. | +| **key** | `string` | The unique key of the compare-exchange item. | +| **index** | `number` | The current version of the item.
Deletion will only succeed if this matches the version stored on the server. | diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx new file mode 100644 index 0000000000..4457940539 --- /dev/null +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx @@ -0,0 +1,79 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Existing compare-exchange items can be deleted. + +* An item is deleted only if the index you provide in the request matches the current index stored on the server + for the specified key. + +* Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. + Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. + E.g., indexes referencing the deleted item will update themselves to remove those references. + The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). + +* In this article: + * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) + * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) + * [Delete by key and index](../compare-exchange/delete-cmpxchg-items#delete-by-key-and-index) + * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) + * [Syntax](../compare-exchange/delete-cmpxchg-items#syntax) + + + +--- + +## Delete compare-exchange item using a cluster-wide session + +* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `saveChanges()`. + This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `deleteCompareExchangeValue()` to register the deletion of an existing compare-exchange item in the session. + The item will be deleted as part of the cluster-wide transaction when _saveChanges()_ is called. + +* If the item's index (its version) on the server is different from the index you provide, + _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session. + +--- + +## Delete compare-exchange items using the Studio + +You can delete one or multiple compare-exchange items from the Studio. + +![The compare-exchange view](../assets/delete-cmpxchg.png) + +1. Go to **Documents > Compare Exchange**. +2. Select the compare-exchange items you want to delete. +3. Click **Delete**. + +--- + +## Syntax + +--- + +### `deleteCompareExchangeValue` +Delete compare-exchange item using cluster-wide session: + + +```csharp +// Available overloads: +$session->advanced()->clusterTransaction()->deleteCompareExchangeValue($item); +$session->advanced()->clusterTransaction()->deleteCompareExchangeValue($key, $index); +``` + + +| Parameter | Type | Description | +|-----------|---------------------------|-------------| +| **item** | `CompareExchangeValue` | The compare-exchange item to delete. | +| **key** | `string` | The unique key of the compare-exchange item. | +| **index** | `long` | The current version of the item.
Deletion will only succeed if this matches the version stored on the server. | diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx new file mode 100644 index 0000000000..10ce8d7da2 --- /dev/null +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx @@ -0,0 +1,79 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Existing compare-exchange items can be deleted. + +* An item is deleted only if the index you provide in the request matches the current index stored on the server + for the specified key. + +* Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. + Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. + E.g., indexes referencing the deleted item will update themselves to remove those references. + The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). + +* In this article: + * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) + * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) + * [Delete by key and index](../compare-exchange/delete-cmpxchg-items#delete-by-key-and-index) + * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) + * [Syntax](../compare-exchange/delete-cmpxchg-items#syntax) + + + +--- + +## Delete compare-exchange item using a cluster-wide session + +* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `save_changes()`. + This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. + Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). + +* Use `delete_compare_exchange_value()` to register the deletion of an existing compare-exchange item in the session. + The item will be deleted as part of the cluster-wide transaction when _save_changes()_ is called. + +* If the item's index (its version) on the server is different from the index you provide, + _save_changes()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session. + +--- + +## Delete compare-exchange items using the Studio + +You can delete one or multiple compare-exchange items from the Studio. + +![The compare-exchange view](../assets/delete-cmpxchg.png) + +1. Go to **Documents > Compare Exchange**. +2. Select the compare-exchange items you want to delete. +3. Click **Delete**. + +--- + +## Syntax + +--- + +### `delete_compare_exchange_value` +Delete compare-exchange item using cluster-wide session: + + +```csharp +// Available overloads: +session.advanced.cluster_transaction.delete_compare_exchange_value(item) +session.advanced.cluster_transaction.delete_compare_exchange_value(key, index) +``` + + +| Parameter | Type | Description | +|-----------|---------------------------|-------------| +| **item** | `CompareExchangeValue[T]` | The compare-exchange item to delete. | +| **key** | `str` | The unique key of the compare-exchange item. | +| **index** | `int` | The current version of the item.
Deletion will only succeed if this matches the version stored on the server. | diff --git a/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx b/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx new file mode 100644 index 0000000000..a95a99cbbf --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx @@ -0,0 +1,514 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* To retrieve an existing compare-exchange item using the **Client API**, + use either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get a **single** compare-exchange item by its unique _key_. + To get **multiple** items at once, see [Get multiple compare-exchange items](../compare-exchange/get-cmpxchg-items). + +* In this article: + * [Get item using a **cluster-wide session**](../compare-exchange/get-cmpxchg-item#get-item-using-a-cluster-wide-session) + * [Get compare-exchange item](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item) + * [Get compare-exchange item lazily](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-lazily) + * [Retrieved compare-exchange items are tracked by the session](../compare-exchange/get-cmpxchg-item#retrieved-compare-exchange-items-are-tracked-by-the-session) + * [Get item using a **store operation**](../compare-exchange/get-cmpxchg-item#get-item-using-a-store-operation) + * [Get compare-exchange item that has a number value and metadata](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-that-has-a-number-value-and-metadata) + * [Get compare-exchange item that has a custom object value](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-that-has-a-custom-object-value) + * [Syntax](../compare-exchange/get-cmpxchg-item#syntax) + + + +--- + +## Get item using a cluster-wide session + +* You can retrieve compare-exchange items using a [cluster-wide session](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction). + The session must be opened in cluster-wide mode. + +* Use the `GetCompareExchangeValue` advanced session method to get a compare-exchange item by its _key_. + If the specified key does not exist, the method returns `null`. No exception is thrown. + +* Once a compare-exchange item is retrieved using a cluster-wide session, the item is **tracked** by the session. + Repeating the same `GetCompareExchangeValue` call with the same key does not send another request to the server, + the value is returned from the session's internal state. + To force a re-fetch from the server, call `session.Advanced.Clear()` first. + +* Examples: + + #### Get compare-exchange item + + + + ```csharp + // First, let's create a compare-exchange item for the example, + // e.g. store a user's email as the key and the user document id as the value. + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + CompareExchangeValue itemToCreate = + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Optionally, add some metadata: + itemToCreate.Metadata["email-type"] = "work email"; + + session.SaveChanges(); + + // Get the compare-exchange item: + // ============================== + + CompareExchangeValue retrievedItem = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + + if (retrievedItem != null) + { + // Access the VALUE of the retrieved item + var userDocumentId = retrievedItem.Value; // "users/1" + + // Access the METADATA of the retrieved item + var emailType = retrievedItem.Metadata["email-type"]; // "work email" + + // Access the VERSION number of the retrieved item + var version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + } + ``` + + + ```csharp + // First, let's create a compare-exchange item for the example, + // e.g. store a user's email as the key and the user document id as the value. + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + CompareExchangeValue itemToCreate = + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + // Optionally, add some metadata: + itemToCreate.Metadata["email-type"] = "work email"; + + await asyncSession.SaveChangesAsync(); + + // Get the compare-exchange item: + // ============================== + + CompareExchangeValue retrievedItem = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + + if (retrievedItem != null) + { + // Access the VALUE of the retrieved item + var userDocumentId = retrievedItem.Value; // "users/1" + + // Access the METADATA of the retrieved item + var emailType = retrievedItem.Metadata["email-type"]; // "work email" + + // Access the VERSION number of the retrieved item + var version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + } + ``` + + + + #### Get compare-exchange item lazily + + + + ```csharp + // Create a compare-exchange item for the example: + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + CompareExchangeValue itemToCreate = + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + session.SaveChanges(); + + // Get the compare-exchange item lazily: + // ===================================== + + var lazyItem = session.Advanced.ClusterTransaction.Lazily + .GetCompareExchangeValue("user1-name@example.com"); + + // Access the item: + CompareExchangeValue retrievedItem = lazyItem.Value; + + if (retrievedItem != null) { + // Access the VALUE of the retrieved item + var userDocumentId = retrievedItem.Value; // "users/1" + + // Access the VERSION number of the retrieved item + var version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + } + ``` + + + ```csharp + // Create a compare-exchange item for the example: + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + CompareExchangeValue itemToCreate = + asyncSession.Advanced.ClusterTransaction.CreateCompareExchangeValue( + key: "user1-name@example.com", + value: "users/1" + ); + + await asyncSession.SaveChangesAsync(); + + // Get the compare-exchange item lazily: + // ===================================== + + var lazyItem = asyncSession.Advanced.ClusterTransaction.Lazily + .GetCompareExchangeValueAsync("user1-name@example.com"); + + // Access the item: + CompareExchangeValue retrievedItem = await lazyItem.Value; + + if (retrievedItem != null) { + // Access the VALUE of the retrieved item + var userDocumentId = retrievedItem.Value; // "users/1" + + // Access the VERSION number of the retrieved item + var version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + } + ``` + + + + #### Retrieved compare-exchange items are tracked by the session + + + + ```csharp + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // First retrieval — server call will happen + var item1 = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + + // No server call - the item is returned from session + var item2 = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + + // Clear tracked entities and compare-exchange items + session.Advanced.Clear(); + + // Server call will happen again + var item3 = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + } + ``` + + + ```csharp + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // First retrieval — server call will happen + var item1 = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + + // No server call - the item is returned from session + var item2 = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + + // Clear tracked entities and compare-exchange items + asyncSession.Advanced.Clear(); + + // Server call will happen again + var item3 = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + } + ``` + + + +--- + +## Get item using a store operation + +* You can retrieve compare-exchange items using a [store operation](../client-api/operations/what-are-operations). + Use the `GetCompareExchangeValueOperation` operation to get a compare-exchange item by its _key_. + +* If the specified key does not exist, the operation returns `null`. No exception is thrown. + +* Examples: + + #### Get compare-exchange item that has a number value and metadata + + + + ```csharp + // First, let's create a new compare-exchange item for the example, + // e.g. store the number of sales made by an employee as the value + some metadata info: + var putCmpXchgOp = new PutCompareExchangeValueOperation("employees/1-A", 12345, 0, + new MetadataAsDictionary + { + { "Department", "Sales" }, + { "Role", "Salesperson" } + }); + + CompareExchangeResult putResult = store.Operations.Send(putCmpXchgOp); + + // Get the compare-exchange item: + // ============================== + + // Define the get compare-exchange operation, pass the unique item key + var getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A"); + + // Execute the operation by passing it to Operations.Send + CompareExchangeValue retrievedItem = store.Operations.Send(getCmpXchgOp); + + if (retrievedItem != null) + { + // Access the VALUE of the retrieved item + long numberOfSales = retrievedItem.Value; // 12345 + + // Access the METADATA of the retrieved item + var employeeRole = retrievedItem.Metadata["Role"]; // "Salesperson" + + // Access the VERSION number of the retrieved item + long version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + ``` + + + ```csharp + // First, let's create a new compare-exchange item for the example, + // e.g. store the number of sales made by an employee as the value + some metadata info: + var putCmpXchgOp = new PutCompareExchangeValueOperation("employees/1-A", 12345, 0, + new MetadataAsDictionary + { + { "Department", "Sales" }, + { "Role", "Salesperson" } + }); + + CompareExchangeResult putResult = await store.Operations.SendAsync(putCmpXchgOp); + + // Get the compare-exchange item: + // ============================== + + // Define the get compare-exchange operation, pass the unique item key + var getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A"); + + // Execute the operation by passing it to Operations.SendAsync + CompareExchangeValue retrievedItem = await store.Operations.SendAsync(getCmpXchgOp); + + if (retrievedItem != null) + { + // Access the VALUE of the retrieved item + long numberOfSales = retrievedItem.Value; // 12345 + + // Access the METADATA of the retrieved item + var employeeRole = retrievedItem.Metadata["Role"]; // "Salesperson" + + // Access the VERSION number of the retrieved item + long version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + ``` + + + + #### Get compare-exchange item that has a custom object value + + + + ```csharp + // Create a new compare-exchange item for the example: + // Put a new compare-exchange item with an object as the value + var employeeRole = new EmployeeRole + { + Role = "Salesperson", + Department = "Sales", + NumberOfSales = 12345 + }; + + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "employees/1-A", employeeRole, 0); + + CompareExchangeResult putResult = store.Operations.Send(putCmpXchgOp); + + // Get the compare-exchange item: + // ============================== + + // Define the get compare-exchange operation, pass the unique item key + var getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A"); + + // Execute the operation by passing it to Operations.Send + CompareExchangeValue retrievedItem = store.Operations.Send(getCmpXchgOp); + + if (retrievedItem != null) + { + // Access the VALUE of the retrieved item + var employeeDetails = retrievedItem.Value; + var objectType = employeeDetails.GetType(); // typeof(EmployeeRole) + var role = employeeDetails.Role; // "Salesperson" + var Dep = employeeDetails.Department; // "Sales" + var Sales = employeeDetails.NumberOfSales; // 12345 + + // Access the VERSION number of the retrieved item + long version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + ``` + + + ```csharp + // Create a new compare-exchange item for the example: + // Put a new compare-exchange item with an object as the value + var employeeRole = new EmployeeRole + { + Role = "Salesperson", + Department = "Sales", + NumberOfSales = 12345 + }; + + var putCmpXchgOp = new PutCompareExchangeValueOperation( + "employees/1-A", employeeRole, 0); + + CompareExchangeResult putResult = await store.Operations.SendAsync(putCmpXchgOp); + + // Get the compare-exchange item: + // ============================== + + // Define the get compare-exchange operation, pass the unique item key + var getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A"); + + // Execute the operation by passing it to Operations.SendAsync + CompareExchangeValue retrievedItem = await store.Operations.SendAsync(getCmpXchgOp); + + if (retrievedItem != null) + { + // Access the VALUE of the retrieved item + var employeeDetails = retrievedItem.Value; + var objectType = employeeDetails.GetType(); // typeof(EmployeeRole) + var role = employeeDetails.Role; // "Salesperson" + var Dep = employeeDetails.Department; // "Sales" + var Sales = employeeDetails.NumberOfSales; // 12345 + + // Access the VERSION number of the retrieved item + long version = retrievedItem.Index; + } + else + { + Console.WriteLine("Compare-exchange item not found"); + } + ``` + + + ```csharp + public class EmployeeRole + { + public string Id { get; set; } + public string Department { get; set; } = ""; + public string Role { get; set; } = ""; + public int NumberOfSales { get; set; } + } + ``` + + + +--- + +## Syntax + +--- + +### `GetCompareExchangeValueOperation` +Get compare-exchange item using a store operation: + + +```csharp +public GetCompareExchangeValueOperation(string key); +``` + + +### `GetCompareExchangeValue` +Get compare-exchange item using cluster-wide session: + + +```csharp +CompareExchangeValue GetCompareExchangeValue(string key); +Task> GetCompareExchangeValueAsync(string key, + CancellationToken token = default); + +Lazy> GetCompareExchangeValue(string key); +Lazy>> GetCompareExchangeValueAsync(string key, + CancellationToken token = default); +``` + + +| Input parameter | Type | Description | +|-----------------|----------|-----------------------------------------------------------------| +| **key** | `string` | The unique identifier of the compare-exchange item to retrieve. | + +| The returned object: | Description | +|---------------------------|----------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `null` if key doesn't exist. | + + +```csharp +public class CompareExchangeValue +{ + // The unique identifier of the compare-exchange item. + public string Key { get; } + + // The existing `value` of the returned compare-exchange item. + public T Value { get; set; } + + // The compare-exchange item's version. + public long Index { get; internal set; } + + // The existing `metadata` of the returned compare-exchange item. + public IMetadataDictionary Metadata; +} +``` + diff --git a/docs/compare-exchange/content/_get-cmpxchg-item-java.mdx b/docs/compare-exchange/content/_get-cmpxchg-item-java.mdx new file mode 100644 index 0000000000..3e8a562730 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-item-java.mdx @@ -0,0 +1,121 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* To retrieve an existing compare-exchange item using the **Client API**, + use either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get a **single** compare-exchange item by its unique _key_. + To get **multiple** items at once, see [Get multiple compare-exchange items](../compare-exchange/get-cmpxchg-items). + +* In this article: + * [Get item using a **store operation**](../compare-exchange/get-cmpxchg-item#get-item-using-a-store-operation) + * [Get compare-exchange item that has a number value](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-that-has-a-number-value) + * [Get compare-exchange item that has a custom object value](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-that-has-a-custom-object-value) + * [Syntax](../compare-exchange/get-cmpxchg-item#syntax) + + + +--- + +## Get item using a store operation + +* You can retrieve compare-exchange items using a [store operation](../client-api/operations/what-are-operations). + Use the `GetCompareExchangeValueOperation` operation to get a compare-exchange item by its _key_. + +* If the specified key does not exist, the operation returns `null`. No exception is thrown. + +* Examples: + + #### Get compare-exchange item that has a number value + + + ```java + CompareExchangeValue readResult = + store.operations().send(new GetCompareExchangeValueOperation<>(Long.class, "nextClientId")); + + Long value = readResult.getValue(); + ``` + + + #### Get compare-exchange item that has a custom object value + + + ```java + CompareExchangeValue readResult = store.operations().send( + new GetCompareExchangeValueOperation<>(User.class, "AdminUser")); + + User admin = readResult.getValue(); + ``` + + +--- + +## Syntax + +--- + +### `GetCompareExchangeValueOperation` +Get compare-exchange item using a store operation: + + +```java +GetCompareExchangeValueOperation(Class clazz, String key); +``` + + + +| Input parameter | Type | Description | +|-----------------|----------|-----------------------------------------------------------------| +| **key** | `String` | The unique identifier of the compare-exchange item to retrieve. | + +| The returned object: | Description | +|---------------------------|----------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `null` if key doesn't exist. | + + +```java +public class CompareExchangeValue { + private String key; // The unique identifier of the compare-exchange item. + private long index; // The compare-exchange item's version. + private T value; // The existing `value` of the returned compare-exchange item. + + public CompareExchangeValue(String key, long index, T value) { + this.key = key; + this.index = index; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public long getIndex() { + return index; + } + + public void setIndex(long index) { + this.index = index; + } + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } +} +``` + diff --git a/docs/compare-exchange/content/_get-cmpxchg-item-nodejs.mdx b/docs/compare-exchange/content/_get-cmpxchg-item-nodejs.mdx new file mode 100644 index 0000000000..2ff0323223 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-item-nodejs.mdx @@ -0,0 +1,346 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* To retrieve an existing compare-exchange item using the **Client API**, + use either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get a **single** compare-exchange item by its unique _key_. + To get **multiple** items at once, see [Get multiple compare-exchange items](../compare-exchange/get-cmpxchg-items). + +* In this article: + * [Get item using a **cluster-wide session**](../compare-exchange/get-cmpxchg-item#get-item-using-a-cluster-wide-session) + * [Get compare-exchange item](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item) + * [Get compare-exchange item lazily](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-lazily) + * [Retrieved compare-exchange items are tracked by the session](../compare-exchange/get-cmpxchg-item#retrieved-compare-exchange-items-are-tracked-by-the-session) + * [Get item using a **store operation**](../compare-exchange/get-cmpxchg-item#get-item-using-a-store-operation) + * [Get compare-exchange item that has a number value and metadata](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-that-has-a-number-value-and-metadata) + * [Get compare-exchange item that has a custom object value](../compare-exchange/get-cmpxchg-item#get-compare-exchange-item-that-has-a-custom-object-value) + * [Syntax](../compare-exchange/get-cmpxchg-item#syntax) + + + +--- + +## Get item using a cluster-wide session + +* You can retrieve compare-exchange items using a [cluster-wide session](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction). + The session must be opened in cluster-wide mode. + +* Use the `getCompareExchangeValue` advanced session method to get a compare-exchange item by its _key_. + If the specified key does not exist, the method returns `null`. No exception is thrown. + +* Once a compare-exchange item is retrieved using a cluster-wide session, the item is **tracked** by the session. + Repeating the same `getCompareExchangeValue` call with the same key does not send another request to the server, + the value is returned from the session's internal state. + To force a re-fetch from the server, call `session.advanced.clear()` first. + +* Examples: + + #### Get compare-exchange item + + + ```js + // First, let's create a compare-exchange item for the example, + // e.g. store a user's email as the key and the user document id as the value. + + // The session must be opened in cluster-wide mode. + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + const itemToCreate = session.advanced.clusterTransaction.createCompareExchangeValue( + "user1-name@example.com", "users/1" // key, value + ); + + // Optionally, add some metadata: + itemToCreate.metadata["email-type"] = "work email"; + + await session.saveChanges(); + + // Get the compare-exchange item: + // ============================== + + const item = await session.advanced.clusterTransaction.getCompareExchangeValue("user1-name@example.com"); + + if (item) { + // Access the VALUE of the retrieved item + const userDocumentId = item.value; // "users/1" + + // Access the METADATA of the retrieved item + const emailType = item.metadata["email-type"]; // "work email" + + // Access the VERSION number of the retrieved item + const version = item.index; + } else { + console.log("Compare-exchange item not found"); + } + ``` + + + + #### Get compare-exchange item lazily + + + + ```js + // Create a compare-exchange item for the example: + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + session.advanced.clusterTransaction.createCompareExchangeValue( + "user1-name@example.com", { userDocumentId: "users/1" } + ); + await session.saveChanges(); + + // Get the compare-exchange item lazily: + // ===================================== + + const lazyItem = session.advanced.clusterTransaction.lazily + .getCompareExchangeValue("user1-name@example.com"); + + // Access the item: + const item = await lazyItem.getValue(); + + if (item) { + // Access the VALUE of the retrieved item + const userDocumentId = item.value; // { "userDocumentId": "users/1" } + + // Access the VERSION number of the retrieved item + const version = item.index; + } else { + console.log("Compare-exchange item not found"); + } + ``` + + + + #### Retrieved compare-exchange items are tracked by the session + + + + ```js + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // First retrieval — server call will happen + const item1 = await session.advanced.clusterTransaction.getCompareExchangeValue( + "user1-name@example.com"); + + // No server call — the item is returned from session tracking + const item2 = await session.advanced.clusterTransaction.getCompareExchangeValue( + "user1-name@example.com"); + + // Clear tracked entities and compare-exchange items + session.advanced.clear(); + + // Server call will happen again + const item3 = await session.advanced.clusterTransaction.getCompareExchangeValue( + "user1-name@example.com"); + ``` + + + +--- + +## Get item uaing a store operation + +* You can retrieve compare-exchange items using a [store operation](../client-api/operations/what-are-operations). + Use the `GetCompareExchangeValueOperation` operation to get a compare-exchange item by its _key_. + +* If the specified key does not exist, the operation returns `null`. No exception is thrown. + +* Examples: + + #### Get compare-exchange item that has a number value and metadata + + + + ```js + // First, let's create a new compare-exchange item for the example, + // e.g. store the number of sales made by an employee as the value + some metadata info: + const putCmpXchgOp = new PutCompareExchangeValueOperation("employees/1-A", 12345, 0, { + "Department": "Sales", + "Role": "Salesperson", + }); + const putResult = await documentStore.operations.send(putCmpXchgOp); + + // Get the compare-exchange item: + // ============================== + + // Define the get compare-exchange operation, pass the unique item key + const getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A"); + + // Execute the operation by passing it to operations.send + const item = await documentStore.operations.send(getCmpXchgOp); + + if (item) { + // Access the VALUE of the retrieved item + const numberOfSales = item.value; // 12345 + + // Access the METADATA of the retrieved item + const employeeRole = item.metadata["Role"]; // "Salesperson" + + // Access the VERSION number of the retrieved item + const version = item.index; + } else { + console.log("Compare-exchange item not found"); + } + ``` + + + + #### Get compare-exchange item that has a custom object value + + + + ```js + // Put a new compare-exchange item with an object as the value + const employee = new EmployeeRole(); + employee.role = "Salesperson" + employee.department = "Sales"; + employee.numberOfSales = 12345; + + const putCmpXchgOp = new PutCompareExchangeValueOperation("employees/1-A", employee, 0); + const putResult = await documentStore.operations.send(putCmpXchgOp); + + // Get the compare-exchange item: + // ============================== + + // Define the get compare-exchange operation, pass the unique item key & the class type + const getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A", EmployeeRole); + + // Execute the operation by passing it to operations.send + const item = await documentStore.operations.send(getCmpXchgOp); + + if (item) { + // Access the VALUE of the retrieved item + const employeeResult = item.value; + const employeeClass = employeeResult.constructor; // EmployeeRole + + const employeeRole = employeeResult.role; // Salesperson + const employeeDep = employeeResult.department; // Sales + const employeeSales = employeeResult.numberOfSales; // 12345 + + // Access the VERSION number of the retrieved item + const version = item.index; + } else { + console.log("Compare-exchange item not found"); + } + ``` + + + ```js + class EmployeeRole { + constructor( + id = null, + department = "", + role = "", + numberOfSales = 0 + + ) { + Object.assign(this, { + id, + department, + role, + numberOfSales + }); + } + } + ``` + + + +--- + +## Syntax + +--- + +### `GetCompareExchangeValueOperation` +Get compare-exchange item using a store operation: + + +```js +const getCmpXchgOp = new GetCompareExchangeValueOperation(key, clazz, materializeMetadata); +``` + + +| Parameter | Type | Description | +|-------------------------|-----------|-----------------------------------------------------------------------------------------------------------------| +| **key** | `string` | The unique identifier of the compare-exchange item to retrieve. | +| **clazz** | `object` | The class type of the item's value. | +| **materializeMetadata** | `boolean` | The metadata will be retrieved and available regardless of the value of this param. Used for internal purposes. | + +| Returned object | Description | +|------------------------|---------------------------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `null` if key doesn't exist. | + +--- + +### `getCompareExchangeValue` +Get compare-exchange item using cluster-wide session: + + +```js +await session.advanced.clusterTransaction.getCompareExchangeValue(key); +``` + + +| Parameter | Type | Description | +|------------|----------|--------------------------------------------------| +| **key** | `string` | The key of the compare-exchange item to retrieve | + +| `getCompareExchangeValue` returns: | Description | +|---------------------------|---------------------------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `null` if key doesn't exist. | + +--- + +### `lazily.getCompareExchangeValue` +Get compare-exchange item using cluster-wide session lazily: + + +```js +await session.advanced.clusterTransaction.lazily.getCompareExchangeValue(key); +``` + + +| Parameter | Type | Description | +|------------|----------|--------------------------------------------------| +| **key** | `string` | The key of the compare-exchange item to retrieve | + +| Return value - after calling `getValue()` | Description | +|---------------------------|---------------------------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `null` if key doesn't exist. | + +--- + + +```js +// The CompareExchangeValue object: +// ================================ + +class CompareExchangeValue { + // The unique identifier of the compare-exchange item. + key; // string + + // The existing `value` of the returned compare-exchange item. + value; // object + + // The existing `metadata` of the returned compare-exchange item. + metadata; // object + + // The compare-exchange item's version. + index; // number +} +``` + diff --git a/docs/compare-exchange/content/_get-cmpxchg-item-php.mdx b/docs/compare-exchange/content/_get-cmpxchg-item-php.mdx new file mode 100644 index 0000000000..9615ea7e60 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-item-php.mdx @@ -0,0 +1,73 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* To retrieve an existing compare-exchange item using the **Client API**, + use either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get a **single** compare-exchange item by its unique _key_. + To get **multiple** items at once, see [Get multiple compare-exchange items](../compare-exchange/get-cmpxchg-items). + +* In this article: + * [Get item using a **cluster-wide session**](../compare-exchange/get-cmpxchg-item#get-item-using-a-cluster-wide-session) + * [Syntax](../compare-exchange/get-cmpxchg-item#syntax) + + + +--- + +## Get item using a cluster-wide session + +* You can retrieve compare-exchange items using a [cluster-wide session](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction). + The session must be opened in cluster-wide mode. + +* Use the `getCompareExchangeValue` advanced session method to get a compare-exchange item by its _key_. + If the specified key does not exist, the method returns `null`. No exception is thrown. + +--- + +## Syntax + +--- + +### `getCompareExchangeValue` +Get compare-exchange item using a cluster wide session: + + +```php +session.advanced.cluster_transaction.get_compare_exchange_value(key) +``` + + +| Input parameter | Type | Description | +|-----------------|----------|-----------------------------------------------------------------| +| **key** | `string` | The unique identifier of the compare-exchange item to retrieve. | + +| The returned object: | Description | +|---------------------------|----------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `null` if key doesn't exist. | + + +### `lazily()->getCompareExchangeValue` +Get compare-exchange item using a cluster wide session lazily: + + +```php +$session->advanced()->clusterTransaction()->lazily()->getCompareExchangeValue(null, $key); +``` + + +| Input parameter | Type | Description | +|-----------------|----------|-----------------------------------------------------------------| +| **key** | `string` | The unique identifier of the compare-exchange item to retrieve. | + +| The returned object: | Description | +|--------------------------------|----------------------------------------------------------------| +| `Lazy>` | The compare-exchange item is returned.
Returns `None` if key doesn't exist. | diff --git a/docs/compare-exchange/content/_get-cmpxchg-item-python.mdx b/docs/compare-exchange/content/_get-cmpxchg-item-python.mdx new file mode 100644 index 0000000000..bfeccdb9d6 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-item-python.mdx @@ -0,0 +1,73 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* To retrieve an existing compare-exchange item using the **Client API**, + use either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get a **single** compare-exchange item by its unique _key_. + To get **multiple** items at once, see [Get multiple compare-exchange items](../compare-exchange/get-cmpxchg-items). + +* In this article: + * [Get item using a **cluster-wide session**](../compare-exchange/get-cmpxchg-item#get-item-using-a-cluster-wide-session) + * [Syntax](../compare-exchange/get-cmpxchg-item#syntax) + + + +--- + +## Get item using a cluster-wide session + +* You can retrieve compare-exchange items using a [cluster-wide session](../client-api/session/cluster-transaction/overview#open-a-cluster-transaction). + The session must be opened in cluster-wide mode. + +* Use the `get_compare_exchange_value` advanced session method to get a compare-exchange item by its _key_. + If the specified key does not exist, the method returns `null`. No exception is thrown. + +--- + +## Syntax + +--- + +### `get_compare_exchange_value` +Get compare-exchange item using a cluster wide session: + + +```python +session.advanced.cluster_transaction.get_compare_exchange_value(key) +``` + + +| Input parameter | Type | Description | +|-----------------|-------|-----------------------------------------------------------------| +| **key** | `str` | The unique identifier of the compare-exchange item to retrieve. | + +| The returned object: | Description | +|---------------------------|----------------------------------------------------------------| +| `CompareExchangeValue` | The compare-exchange item is returned.
Returns `None` if key doesn't exist. | + + +### `lazily.get_compare_exchange_value` +Get compare-exchange item using a cluster wide session lazily: + + +```python +session.advanced.cluster_transaction.lazily.get_compare_exchange_value(key) +``` + + +| Input parameter | Type | Description | +|-----------------|-------|-----------------------------------------------------------------| +| **key** | `str` | The unique identifier of the compare-exchange item to retrieve. | + +| The returned object: | Description | +|---------------------------------|----------------------------------------------------------------| +| `Lazy[CompareExchangeValue[T]]` | The compare-exchange item is returned.
Returns `None` if key doesn't exist. | diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx new file mode 100644 index 0000000000..00333571d5 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx @@ -0,0 +1,454 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can retrieve multiple existing compare-exchange items at once using the **Client API** by either: + * specifying a list of unique keys, or + * using a common key prefix + + Retrieval can be done using either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get **multiple** compare-exchange items. + To get a **single** item, see [Get compare-exchange item](../compare-exchange/get-cmpxchg-item). + +* In this article: + * [Create sample compare-exchange items](../compare-exchange/get-cmpxchg-items#create-sample-compare-exchange-items) + * [Get compare-exchange items by list of keys](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-list-of-keys) + * [Get compare-exchange items by prefix](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-prefix) + * [Get compare-exchange items count](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-count) + * [Syntax](../compare-exchange/get-cmpxchg-items#syntax) + + + +--- + +## Create sample compare-exchange items + +Let’s create some sample compare-exchange items to use in the examples below. +To learn about ALL the available methods for creating a compare-exchange item, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + + +```csharp +store.Operations.Send( + new PutCompareExchangeValueOperation("employees/1", "someValue1", 0)); +store.Operations.Send( + new PutCompareExchangeValueOperation("employees/2", "someValue2", 0)); +store.Operations.Send( + new PutCompareExchangeValueOperation("employees/3", "someValue3", 0)); +store.Operations.Send( + new PutCompareExchangeValueOperation("customers/1", "someValue4", 0)); +store.Operations.Send( + new PutCompareExchangeValueOperation("customers/2", "someValue5", 0)); +``` + + +--- + +## Get compare-exchange items by list of keys + +* To retrieve multiple compare-exchange items by specifying a list of unique keys, use either: + + * **Cluster-wide session**: + Use the `GetCompareExchangeValues` session method – which also supports lazy retrieval. + If one of the specified keys does not exist, its corresponding entry in the returned dictionary will be `null`. + No exception is thrown. + + * **Store operation**: + Use the `GetCompareExchangeValuesOperation` store operation. + If one of the specified keys does not exist, the `.Value` property of the corresponding entry in the returned dictionary is `null`. + No exception is thrown. + +* Examples: + + #### Get compare-exchange items by list of keys + + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Define the list of keys of the compare-exchange items to retrieve + var keys = new[] { "employees/1", "employees/2", "customers/2", "non-existing-key" }; + + // Call 'GetCompareExchangeValues', pass the list of keys + Dictionary> items = + session.Advanced.ClusterTransaction.GetCompareExchangeValues(keys); + + // Check results + Debug.Assert(items.Count == 4); // 4 keys were requested + + // Access a retrieved item - an existing key + if (items.TryGetValue("employees/1", out var item)) + { + string value = item.Value; // "someValue1" + long version = item.Index; + } + + // The entry of a non-existing key will be null + if (items.TryGetValue("non-existing-key", out var nonExistingItem)) + { + Console.WriteLine(nonExistingItem == null); // true + } + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Define the list of keys of the compare-exchange items to retrieve + var keys = new[] { "employees/1", "employees/2", "customers/2", "non-existing-key" }; + + // Call 'GetCompareExchangeValues', pass the list of keys + Dictionary> items = + await asyncSession.Advanced.ClusterTransaction.GetCompareExchangeValuesAsync(keys); + + // Check results + Debug.Assert(items.Count == 4); // 4 keys were requested + + // Access a retrieved item - an existing key + if (items.TryGetValue("employees/1", out var item)) + { + string value = item.Value; // "someValue1" + long version = item.Index; + } + + // The entry of a non-existing key will be null + if (items.TryGetValue("non-existing-key", out var nonExistingItem)) + { + Console.WriteLine(nonExistingItem == null); // true + } + } + ``` + + + ```csharp + // Define the list of keys of the compare-exchange items to retrieve + var keys = new[] { "employees/1", "employees/2", "customers/2", "non-existing-key" }; + + // Define the get compare-exchange items operation, pass the unique item key + var getCmpXchgItemsOp = new GetCompareExchangeValuesOperation(keys); + + // Execute the operation by passing it to Operations.Send + Dictionary> items = store.Operations.Send(getCmpXchgItemsOp); + + // Check results + Debug.Assert(items.Count == 4); // 4 keys were requested + + // Access a retrieved item - an existing key + if (items.TryGetValue("employees/1", out var item)) + { + string value = item.Value; // "someValue1" + long version = item.Index; // e.g. 321 + } + + // The 'Value' of the non-existing key will be null + if (items.TryGetValue("non-existing-key", out var nonExistingItem)) + { + string value = nonExistingItem.Value; // null + long version = nonExistingItem.Index; // -1 + } + ``` + + + ```csharp + // Define the list of keys of the compare-exchange items to retrieve + var keys = new[] { "employees/1", "employees/2", "customers/2", "non-existing-key" }; + + // Define the get compare-exchange items operation, pass the unique item key + var getCmpXchgItemsOp = new GetCompareExchangeValuesOperation(keys); + + // Execute the operation by passing it to Operations.SendAsync + Dictionary> items = await + store.Operations.SendAsync(getCmpXchgItemsOp); + + // Check results + Debug.Assert(items.Count == 4); // 4 keys were requested + + // Access a retrieved item - an existing key + if (items.TryGetValue("employees/1", out var item)) + { + string value = item.Value; // "someValue1" + long version = item.Index; // e.g. 321 + } + + // The 'Value' of the non-existing key will be null + if (items.TryGetValue("non-existing-key", out var nonExistingItem)) + { + string value = nonExistingItem.Value; // null + long version = nonExistingItem.Index; // -1 + } + ``` + + + + #### Get compare-exchange items by list of keys - lazily + + A list of compare-exchange items can be retrieved lazily when working within a cluster-wide session. + + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Define the list of keys of the compare-exchange items to retrieve + var keys = new[] { "employees/1", "employees/2", "customers/2", "non-existing-key" }; + + // Call 'Lazily.GetCompareExchangeValues', pass the list of keys + var lazyItems = + session.Advanced.ClusterTransaction.Lazily.GetCompareExchangeValues(keys); + + Dictionary> items = lazyItems.Value; + + // Check results + Debug.Assert(items.Count == 4); // 4 keys were requested + + // Access a retrieved item - an existing key + if (items.TryGetValue("employees/1", out var item)) + { + string value = item.Value; // "someValue1" + long version = item.Index; // e.g. 321 + } + + // The entry of a non-existing key will be null + if (items.TryGetValue("non-existing-key", out var nonExistingItem)) + { + Console.WriteLine(nonExistingItem == null); // true + } + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Define the list of keys of the compare-exchange items to retrieve + var keys = new[] { "employees/1", "employees/2", "customers/2", "non-existing-key" }; + + // Call 'Lazily.GetCompareExchangeValues', pass the list of keys + var lazyItems = asyncSession.Advanced.ClusterTransaction + .Lazily.GetCompareExchangeValuesAsync(keys); + + Dictionary> items = await lazyItems.Value; + + // Check results + Debug.Assert(items.Count == 4); // 4 keys were requested + + // Access a retrieved item - an existing key + if (items.TryGetValue("employees/1", out var item)) + { + string value = item.Value; // "someValue1" + long version = item.Index; + } + + // The entry of a non-existing key will be null + if (items.TryGetValue("non-existing-key", out var nonExistingItem)) + { + Console.WriteLine(nonExistingItem == null); // true + } + } + ``` + + + +--- + +## Get compare-exchange items by prefix + +* You can retrieve compare-exchange items whose keys start with a specific **prefix**. + You can also control the **maximum number of items** to return and the **starting position** for paging. + +* Examples: + + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'GetCompareExchangeValues', pass: + // * startWith: The common key prefix + // * start: The start position (optional, default is 0) + // * pageSize: Max items to get (optional, default is 25) + Dictionary> items = + session.Advanced.ClusterTransaction.GetCompareExchangeValues( + startsWith: "employees", start: 0, pageSize: 10); + + // Results will include only compare-exchange items with keys that start with "employees" + Debug.Assert(items.Count == 3); // There are 3 keys with the "employees" prefix + } + ``` + + + ```csharp + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + using var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { + // Call 'GetCompareExchangeValues', pass: + // * startWith: The common key prefix + // * start: The start position (optional, default is 0) + // * pageSize: Max items to get (optional, default is 25) + Dictionary> items = await + asyncSession.Advanced.ClusterTransaction.GetCompareExchangeValuesAsync( + startsWith: "employees", start: 0, pageSize: 10); + + // Results will include only compare-exchange items with keys that start with "employees" + Debug.Assert(items.Count == 3); // There are 3 keys with the "employees" prefix + } + ``` + + + ```csharp + // Define the get compare-exchange items operation, pass: + // * startWith: The common key prefix + // * start: The start position (optional, default is 0) + // * pageSize: Max items to get (optional, default is int.MaxValue) + var getCmpXchgItemsOp = new GetCompareExchangeValuesOperation( + startWith: "employees", start: 0, pageSize: 10); + + // Execute the operation by passing it to Operations.Send + Dictionary> items = store.Operations.Send(getCmpXchgItemsOp); + + // Results will include only compare-exchange items with keys that start with "employees" + Debug.Assert(items.Count == 3); // There are 3 keys with the "employees" prefix + ``` + + + ```csharp + // Define the get compare-exchange items operation, pass: + // * startWith: The common key prefix + // * start: The start position (optional, default is 0) + // * pageSize: Max items to get (optional, default is int.MaxValue) + var getCmpXchgItemsOp = new GetCompareExchangeValuesOperation( + startWith: "employees", start: 0, pageSize: 10); + + // Execute the operation by passing it to Operations.SendAsync + Dictionary> items = await + store.Operations.SendAsync(getCmpXchgItemsOp); + + // Results will include only compare-exchange items with keys that start with "employees" + Debug.Assert(items.Count == 3); // There are 3 keys with the "employees" prefix + ``` + + + +--- + +## Get compare-exchange items count + +Use `GetDetailedStatisticsOperation` to get the total number of existing compare-exchange items. +This operation does not retrieve any actual items, only the total count. + + + +```csharp +var stats = store.Maintenance.Send(new GetDetailedStatisticsOperation()); +var itemsCount = stats.CountOfCompareExchange; +``` + + +```csharp +var stats = await store.Maintenance.SendAsync(new GetDetailedStatisticsOperation()); +var itemsCount = stats.CountOfCompareExchange; +``` + + + +--- + +## Syntax + +--- + +### `GetCompareExchangeValuesOperation` +Get multiple compare-exchange items using a store operation: + + +```csharp +// Available overloads: +GetCompareExchangeValuesOperation(string[] keys); +GetCompareExchangeValuesOperation(string startWith, int? start = null, int? pageSize = null) +``` + + +| Parameter | Type | Description | +|---------------|------------|-------------------------------------------------------| +| **keys** | `string[]` | Keys of the compare-exchange items to retrieve. | +| **startWith** | `string` | The common key prefix of the items to retrieve. | +| **start** | `int?` | The number of items that should be skipped. Default is `0` | +| **pageSize** | `int?` | The maximum number of values that will be retrieved. Default is `int.MaxValue` | + +| Returned object | Description | +|-----------------------------------------------|---------------------------------------------------| +| `Dictionary>` | A Dictionary with a compare-exchange item per key | + +--- + +### `GetCompareExchangeValues` +Get multiple compare-exchange items using cluster-wide session + + +```csharp +GetCompareExchangeValues(string[] keys); +GetCompareExchangeValues(string startsWith, int start = 0, int pageSize = 25); +``` + + +| Parameter | Type | Description | +|---------------|------------|-------------------------------------------------------| +| **keys** | `string[]` | Keys of the compare-exchange items to retrieve. | +| **startWith** | `string` | The common key prefix of the items to retrieve. | +| **start** | `int?` | The number of items that should be skipped. Default is `0` | +| **pageSize** | `int?` | The maximum number of values that will be retrieved. Default is `25` | + + +| Returned object | Description | +|-----------------------------------------------|---------------------------------------------------| +| `Dictionary>` | A Dictionary with a compare-exchange item per key | + +--- + + +```csharp +// The CompareExchangeValue object: +// ================================ + +public class CompareExchangeValue +{ + // The unique identifier of the compare-exchange item. + public string Key { get; } + + // The existing `value` of the returned compare-exchange item. + public T Value { get; set; } + + // The compare-exchange item's version. + public long Index { get; internal set; } + + // The existing `metadata` of the returned compare-exchange item. + public IMetadataDictionary Metadata; +} +``` + diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-java.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-java.mdx new file mode 100644 index 0000000000..a7db2144a4 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-items-java.mdx @@ -0,0 +1,98 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can retrieve multiple existing compare-exchange items at once using the **Client API** by either: + * specifying a list of unique keys, or + * using a common key prefix + + Retrieval can be done using either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get **multiple** compare-exchange items. + To get a **single** item, see [Get compare-exchange item](../compare-exchange/get-cmpxchg-item). + +* In this article: + * [Get compare-exchange items by list of keys](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-list-of-keys) + * [Get compare-exchange items by prefix](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-prefix) + * [Syntax](../compare-exchange/get-cmpxchg-items#syntax) + + + +--- + +## Get compare-exchange items by list of keys + +* Example: + + + ```java + Dictionary> compareExchangeValues + = store.Operations.Send( + new GetCompareExchangeValuesOperation(new[] { "Key-1", "Key-2" })); + ``` + + +--- + +## Get compare-exchange items by prefix + +* You can retrieve compare-exchange items whose keys start with a specific **prefix**. + You can also control the **maximum number of items** to return and the **starting position** for paging. + +* Example: + + + ```java + // Get values for keys that have the common prefix 'users' + // Retrieve maximum 20 entries + Dictionary> compareExchangeValues + = store.Operations.Send(new GetCompareExchangeValuesOperation("users", 0, 20)); + ``` + + +--- + +## Syntax + +--- + +### `GetCompareExchangeValuesOperation` +Get multiple compare-exchange items using a store operation: + + +```java +public GetCompareExchangeValuesOperation(Class clazz, String[] keys, boolean materializeMetadata) +public GetCompareExchangeValuesOperation(Class clazz, String startWith, Integer start, Integer pageSize) +``` + + +| Parameter | Type | Description | +|---------------|------------|-------------------------------------------------------| +| **keys** | `String[]` | Keys of the compare-exchange items to retrieve. | +| **startWith** | `String` | The common key prefix of the items to retrieve. | +| **start** | `Integer` | The number of items that should be skipped. Default is `0` | +| **pageSize** | `Integer` | The maximum number of values that will be retrieved. Default is `int.MaxValue` | + +| Returned object | Description | +|----------------------------------------|---------------------------------------------------| +| `Map>` | A Dictionary with a compare-exchange item per key | + +--- + + +```java +public class CompareExchangeValue +{ + public readonly string Key; + public readonly T Value; + public readonly long Index; +} +``` + diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx new file mode 100644 index 0000000000..a640881b4a --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx @@ -0,0 +1,293 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can retrieve multiple existing compare-exchange items at once using the **Client API** by either: + * specifying a list of unique keys, or + * using a common key prefix + + Retrieval can be done using either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get **multiple** compare-exchange items. + To get a **single** item, see [Get compare-exchange item](../compare-exchange/get-cmpxchg-item). + +* In this article: + * [Create sample compare-exchange items](../compare-exchange/get-cmpxchg-items#create-sample-compare-exchange-items) + * [Get compare-exchange items by list of keys](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-list-of-keys) + * [Get compare-exchange items by prefix](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-by-prefix) + * [Get compare-exchange items count](../compare-exchange/get-cmpxchg-items#get-compare-exchange-items-count) + * [Syntax](../compare-exchange/get-cmpxchg-items#syntax) + + + +--- + +## Create sample compare-exchange items + +Let’s create some sample compare-exchange items to use in the examples below. +To learn about ALL the available methods for creating a compare-exchange item, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + + +```js +await documentStore.operations.send( + new PutCompareExchangeValueOperation("employees/1", "someValue1", 0)); +await documentStore.operations.send( + new PutCompareExchangeValueOperation("employees/2", "someValue2", 0)); +await documentStore.operations.send( + new PutCompareExchangeValueOperation("employees/3", "someValue3", 0)); +await documentStore.operations.send( + new PutCompareExchangeValueOperation("customers/1", "someValue4", 0)); +await documentStore.operations.send( + new PutCompareExchangeValueOperation("customers/2", "someValue5", 0)); +``` + + +--- + +## Get compare-exchange items by list of keys + +* To retrieve multiple compare-exchange items by specifying a list of unique keys, use either: + * `GetCompareExchangeValuesOperation` store operation, or + * `getCompareExchangeValues` method of a cluster-wide session - which also supports lazy retrieval. + +* If one of the specified keys does not exist, its corresponding entry in the retrieved items will be `null`. + No exception is thrown. + +* Examples: + + #### Get compare-exchange items by list of keys + + + + ```js + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Define the list of keys of the compare-exchange items to retrieve + const keys = ["employees/1", "employees/2", "customers/2", "non-existing-key"]; + + // Call 'getCompareExchangeValues', pass the list of keys + const items = await session.advanced.clusterTransaction.getCompareExchangeValues(keys); + + // Check results + assert.equal(Object.keys(items).length, 4); // 4 keys were requested + + // Access the retrieved items + const value = items["employees/1"].value; + const version = items["employees/1"].index; + + // A non-existing item returns null + const nonExistingItem = items["non-existing-key"]; // null + ``` + + + ```js + // Define the list of keys of the compare-exchange items to retrieve + const keys = ["employees/1", "employees/2", "customers/2", "non-existing-key"]; + + // Define the get operation, pass the list of keys + const getCmpXchgOp = new GetCompareExchangeValuesOperation({keys}); + + // Execute the operation by passing it to operations.send + const items = await documentStore.operations.send(getCmpXchgOp); + + // Check results + assert.equal(Object.keys(items).length, 4); // 4 keys were requested + + // Access the retrieved items + const value = items["employees/1"].value; + const version = items["employees/1"].index; + + // The value of a non-existing item returns null + const nonExistingItem = items["non-existing-key"].value; // null + ``` + + + + #### Get compare-exchange items by list of keys - lazily + + A list of compare-exchange items can be retrieved lazily when working within a cluster-wide session. + + + + ```js + // The session must be opened in cluster-wide mode. + // An `InvalidOperationException` is thrown if the session is not opened in cluster-wide mode. + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + // Define the list of keys of the compare-exchange items to retrieve + const keys = ["employees/1", "employees/2", "customers/2", "non-existing-key"]; + + // Call 'lazily.getCompareExchangeValues', pass the list of keys + const lazyItems = await session.advanced.clusterTransaction.lazily.getCompareExchangeValues(keys); + + // Execute the lazy operation to get the actual items + const items = await lazyItems.getValue(); + + // Check results + assert.equal(Object.keys(items).length, 4); // 4 keys were requested + + // Access the retrieved items + const value = items["employees/1"].value; + const version = items["employees/1"].index; + + // A non-existing item returns null + const nonExistingItem = items["non-existing-key"]; // null + ``` + + + +--- + +## Get compare-exchange items by prefix + +* You can retrieve compare-exchange items whose keys start with a specific **prefix**. + You can also control the **maximum number of items** to return and the **starting position** for paging. + +* Example: + + + + ```js + // Define the get compare-exchange operation, specify: + // * startWith: The common key prefix + // * start: The start position (this is optional, default is 0) + // * pageSize: Max items to get (this is optional, default is int.MaxValue) + const getCmpXchgOp = new GetCompareExchangeValuesOperation({ + startWith: "employees", + start: 0, + pageSize: 10 + }); + + // Execute the operation by passing it to operations.send + const items = await documentStore.operations.send(getCmpXchgOp); + + // Results will include only compare-exchange items with keys that start with "employees" + ``` + + + +--- + +## Get compare-exchange items count + +Use `GetDetailedStatisticsOperation` to get the total number of existing compare-exchange items. +This operation does not retrieve any actual items, only the total count. + + + +```js +const stats = await documentStore.maintenance.send(new GetDetailedStatisticsOperation()); +const itemsCount = stats.countOfCompareExchange; +``` + + + +--- + +## Syntax + +--- + +### `GetCompareExchangeValuesOperation` +Get multiple compare-exchange items using a store operation: + + +```js +const getCmpXchgOp = new GetCompareExchangeValuesOperation(parameters); +``` + + + +```js +// the parameters object: +{ + // Keys of the items to retrieve + keys?; // string[] + + // The common key prefix of the items to retrieve + startWith?; // string + + // The number of items that should be skipped + start?; // number + + // The maximum number of values that will be retrieved + pageSize?; // number + + // When the item's value is a class, you can specify its type in this parameter + clazz?; // object + + // The metadata will be retrieved and available regardless of the value of this param. + // Used for internal purposes. + materializeMetadata?; +} +``` + + +| Returned object | Description | +|----------------------------------------|---------------------------------------------------| +| `Record` | A Dictionary with a compare-exchange item per key | + +--- + +### `getCompareExchangeValues` +Get multiple compare-exchange items using cluster-wide session + + +```js +await session.advanced.clusterTransaction.getCompareExchangeValues(keys); +``` + +### `lazily.getCompareExchangeValue` +Get compare-exchange item using cluster-wide session lazily + + +```js +await session.advanced.clusterTransaction.lazily.getCompareExchangeValues(keys); +``` + + + + +| Parameter | Type | Description | +|-----------|------------|-------------------------------------------------| +| **keys** | `string[]` | Keys of the compare-exchange items to retrieve | + +| Returned object | Description | +|---------------------------|-----------------------------------------------------------------| +| `Record` | A Dictionary with a compare-exchange item per key | + +--- + + +```js +// The CompareExchangeValue object: +// ================================ + +class CompareExchangeValue { + // The unique identifier of the compare-exchange item. + key; // string + + // The existing `value` of the returned compare-exchange item. + value; // object + + // The existing `metadata` of the returned compare-exchange item. + metadata; // object + + // The compare-exchange item's version. + index; // number +} +``` + diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-php.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-php.mdx new file mode 100644 index 0000000000..9500a8f0df --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-items-php.mdx @@ -0,0 +1,55 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can retrieve multiple existing compare-exchange items at once using the **Client API** by either: + * specifying a list of unique keys, or + * using a common key prefix + + Retrieval can be done using either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get **multiple** compare-exchange items. + To get a **single** item, see [Get compare-exchange item](../compare-exchange/get-cmpxchg-item). + +* In this article: + * [Syntax](../compare-exchange/get-cmpxchg-items#syntax) + + + +--- + +## Syntax + +--- + +### `getCompareExchangeValues` + + +```php +// Get compare-exchange item using a cluster wide session: +$session->advanced()->clusterTransaction()->getCompareExchangeValues(null, $keys); +``` + + + +```php +// Get compare-exchange item using a cluster wide session - lazily: +$session->advanced()->clusterTransaction()->lazily()->getCompareExchangeValues(null, $keys); +``` + + +| Parameter | Type | Description | +|---------------|------------|-------------------------------------------------------| +| **keys** | `string[]` | Keys of the compare-exchange items to retrieve. | + +| Returned object | Description | +|-----------------------------------------------------|-------------------------------------------------------------| +| `Dictionary>` | If a key doesn't exists the associate value will be `null`. | +| `Lazy>>` | If a key doesn't exists the associate value will be `null`. | diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-python.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-python.mdx new file mode 100644 index 0000000000..63cb6a2e02 --- /dev/null +++ b/docs/compare-exchange/content/_get-cmpxchg-items-python.mdx @@ -0,0 +1,55 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can retrieve multiple existing compare-exchange items at once using the **Client API** by either: + * specifying a list of unique keys, or + * using a common key prefix + + Retrieval can be done using either a store operation or a cluster-wide session - as described below. + A cluster-wide session also supports lazy retrieval. + +* To view existing compare-exchange items in the **Studio**, go to _Documents > Compare Exchange_, + as described in [Ways to manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items). + +* This article shows how to get **multiple** compare-exchange items. + To get a **single** item, see [Get compare-exchange item](../compare-exchange/get-cmpxchg-item). + +* In this article: + * [Syntax](../compare-exchange/get-cmpxchg-items#syntax) + + + +--- + +## Syntax + +--- + +### `get_compare_exchange_values` + + +```python +# Get compare-exchange item using a cluster wide session: +session.advanced.cluster_transaction.get_compare_exchange_values(keys) +``` + + + +```python +# Get compare-exchange item using a cluster wide session - lazily: +session.advanced.cluster_transaction.lazily.get_compare_exchange_values(keys) +``` + + +| Parameter | Type | Description | +|---------------|-------------|-------------------------------------------------| +| **keys** | `List[str]` | Keys of the compare-exchange items to retrieve. | + +| Returned object | Description | +|--------------------------------------------|-----------------| +| `Dict[str, CompareExchangeValue[T]]` | A Dictionary with a compare-exchange item per key.
If a key doesn't exist the value associated with it will be `None`. | +| `Lazy[Dict[str, CompareExchangeValue[T]]]` | A Dictionary with a compare-exchange item per key.
If a key doesn't exist the value associated with it will be `None`. | diff --git a/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx b/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx new file mode 100644 index 0000000000..e0b48bda79 --- /dev/null +++ b/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx @@ -0,0 +1,681 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items can be included when [loading entities](../client-api/session/loading-entities) + or when making [queries](../client-api/session/querying/how-to-query). + +* The Session [tracks](../client-api/session/what-is-a-session-and-how-does-it-work) the included compare-exchange items, + which means their values can be accessed later in the same session without making additional requests to the server. + +* In this page: + * [Sample data](../compare-exchange/include-cmpxchg-items#sample-data) + * [Include compare-exchange items when loading](../compare-exchange/include-cmpxchg-items#include-compare-exchange-items-when-loading) + * [Include compare-exchange items when querying](../compare-exchange/include-cmpxchg-items#include-compare-exchange-items-when-querying) + * [Syntax](../compare-exchange/include-cmpxchg-items#syntax) + + + +--- + +## Sample data + +The examples in this article are based on the following **sample data**: +To learn about ALL the available methods for creating a compare-exchange item, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + + + +```csharp +using (var session = store.OpenSession()) +{ + // Create some company documents: + // ============================== + + var company1 = new Company + { + Id = "companies/1", + Name = "Apple", + Supplier = "suppliers/1", + Workers = new[] { "employees/1", "employees/2" } + }; + + var company2 = new Company + { + Id = "companies/2", + Name = "Google", + Supplier = "suppliers/2", + Workers = new[] { "employees/3", "employees/4" } + }; + + var company3 = new Company + { + Id = "companies/3", + Name = "Microsoft", + Supplier = "suppliers/3", + Workers = new[] { "employees/6", "employees/5" } + }; + + session.Store(company1); + session.Store(company2); + session.Store(company3); + + session.SaveChanges(); +} +``` + + +```csharp +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Create some compare-exchange items: + // =================================== + + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + "employees/1", "content for employee 1 .."); + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + "employees/2", "content for employee 2 .."); + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + "employees/3", "content for employee 3 .."); + + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + "suppliers/1", "content for supplier 1 .."); + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + "suppliers/2", "content for supplier 2 .."); + session.Advanced.ClusterTransaction.CreateCompareExchangeValue( + "suppliers/3", "content for supplier 3 .."); + + session.SaveChanges(); +} +``` + + +```csharp +public class Company +{ + public string Id { get; set; } + public string Name { get; set; } + public string Supplier { get; set; } + public string[] Workers { get; set; } + + public Company() { } + + public Company(string id, string name, string supplier, string[] workers) + { + Id = id; + Name = name; + Supplier = supplier; + Workers = workers; + } +} +``` + + + +--- + +## Include compare-exchange items when loading + + + +**Include single item**: + + + +```csharp +// Open a session with cluster-wide mode to enable calling 'IncludeCompareExchangeValue' +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Load a company document + include a CmpXchg item: + // ================================================= + + var company1 = session.Load("companies/1", includes => + // Call 'IncludeCompareExchangeValue' + // "Supplier" is the document property that holds the CmpXchg key to include + includes.IncludeCompareExchangeValue(c => c.Supplier)); + + // Calling 'Load' has triggered a server call + var numberOfRequests = session.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg item: + // ================================= + + // Call 'GetCompareExchangeValue' to access the content of the included CmpXchg item. + // Pass the CmpXchg item KEY. This will NOT trigger another server call. + var item = session.Advanced.ClusterTransaction + .GetCompareExchangeValue(company1.Supplier); + + // You can assert that no further server calls were made + Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + + // The CmpXchg item value is available + var value = item.Value; +} +``` + + +```csharp +// Open a session with cluster-wide mode to enable calling 'IncludeCompareExchangeValue' +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Load a company document + include a CmpXchg item: + // ================================================= + + var company1 = await asyncSession.LoadAsync("companies/1", includes => + // Call 'IncludeCompareExchangeValue' + // "Supplier" is the document property that holds the CmpXchg key to include + includes.IncludeCompareExchangeValue(c => c.Supplier)); + + // Calling 'LoadAsync' has triggered a server call + var numberOfRequests = asyncSession.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg item: + // ================================= + + // Call 'GetCompareExchangeValue' to access the content of the included CmpXchg item, + // pass the CmpXchg item KEY. This will NOT trigger another server call. + var item = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync(company1.Supplier); + + // You can assert that no further server calls were made + Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); + + // The CmpXchg item value is available + var value = item.Value; +} +``` + + + + + + + +**Include multiple items**: + + + +```csharp +// Open a session with cluster-wide mode +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Load a company document + include multiple CmpXchg items: + // ========================================================= + + var company1 = session.Load("companies/1", includes => + // Call 'IncludeCompareExchangeValue' + // "Workers" is the document property that holds the list of keys to include + includes.IncludeCompareExchangeValue(c => c.Workers)); + + var numberOfRequests = session.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + // Call 'GetCompareExchangeValues' to access the content of the included CmpXchg items. + // Pass the list of KEYS. This will NOT trigger another server call. + var items = session.Advanced.ClusterTransaction + .GetCompareExchangeValues(company1.Workers); + + // You can assert that no further server calls were made + Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + + // The value of each item is available + var value1 = items["employees/1"].Value; + var value2 = items["employees/2"].Value; +} +``` + + +```csharp +// Open a session with cluster-wide mode +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Load a company document + include multiple CmpXchg items: + // ========================================================= + + var company1 = session.Load("companies/1", includes => + // Call 'IncludeCompareExchangeValue' + // "Workers" is the document property that holds the list of keys to include + includes.IncludeCompareExchangeValue(c => c.Workers)); + + var numberOfRequests = asyncSession.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + // Call 'GetCompareExchangeValues' to access the content of the included CmpXchg items. + // Pass the list of KEYS. This will NOT trigger another server call. + var items = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValuesAsync(company1.Workers); + + // You can assert that no further server calls were made + Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); + + // The value of each item is available + var value1 = items["employees/1"].Value; + var value2 = items["employees/2"].Value; +} +``` + + + + + +--- + +## Include compare-exchange items when querying + + + +**Dynamic query**: + + + +```csharp +// Open a session with cluster-wide mode to enable calling 'IncludeCompareExchangeValue' +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Make a dynamic query + include CmpXchg items: + // ============================================= + + var companies = session.Query() + // Call 'Include' with 'IncludeCompareExchangeValue' + // pass the PATH of the document property that contains the key of the CmpXchg item to include + .Include(x => x.IncludeCompareExchangeValue(c => c.Supplier)) + .ToList(); + + // Making the query has triggered a server call + var numberOfRequests = session.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + var cmpXchgItems = new List>(); + + foreach (var company in companies) + { + // Call 'GetCompareExchangeValue' to access the included CmpXchg item. + // Pass the KEY. This will NOT trigger another server call. + var item = session.Advanced.ClusterTransaction + .GetCompareExchangeValue(company.Supplier); + + cmpXchgItems.Add(item); + } + + // You can assert that no further server calls were made + Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); +} +``` + + +```csharp +// Open a session with cluster-wide mode to enable calling 'IncludeCompareExchangeValue' +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Make a dynamic query + include CmpXchg items: + // ============================================= + + var companies = await asyncSession.Query() + // Call 'Include' with 'IncludeCompareExchangeValue' + // pass the PATH of the document property that contains the key of the CmpXchg item to include + .Include(x => x.IncludeCompareExchangeValue(c => c.Supplier)) + .ToListAsync(); + + // Making the query has triggered a server call + var numberOfRequests = asyncSession.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + var cmpXchgItems = new List>(); + + foreach (var company in companies) + { + // Call 'GetCompareExchangeValue' to access the included CmpXchg item. + // Pass the KEY. This will NOT trigger another server call. + var item = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync(company.Supplier); + + cmpXchgItems.Add(item); + } + + // You can assert that no further server calls were made + Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); +} +``` + + +```csharp +// Open a session with cluster-wide mode to enable calling 'include cmpxchg' +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Make a raw query + include CmpXchg items: + // ========================================= + + // In the provided RQL: + // * Call 'include' with 'cmpxchg' + // * Pass the PATH of the document property that contains the key of the CmpXchg item to include + var companies = session.Advanced + .RawQuery(@" + from 'Companies' + include cmpxchg('Supplier')") + .ToList(); + + var numberOfRequests = session.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + var cmpXchgItems = new List>(); + + foreach (var company in companies) + { + // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, + // pass the KEY, this will NOT trigger another server call. + var item = session.Advanced.ClusterTransaction + .GetCompareExchangeValue(company.Supplier); + + cmpXchgItems.Add(item); + } + + Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); +} +``` + + +```csharp +// Open a session with cluster-wide mode to enable calling 'includes.cmpxchg' +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Make a raw query + include CmpXchg items using JavaScript method: + // ================================================================= + + // In the provided RQL: + // * Call 'includes.cmpxchg' + // * Pass the PATH of the document property that contains the key of the CmpXchg item to include + var companies = session.Advanced + .RawQuery(@" + declare function includeCmpXchg(company) { + includes.cmpxchg(company.Supplier); + return company; + } + + from companies as c + select includeCmpXchg(c)") + .ToList(); + + var numberOfRequests = session.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + var cmpXchgItems = new List>(); + + foreach (var company in companies) + { + // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, + // pass the KEY. This will NOT trigger another server call. + var item = session.Advanced.ClusterTransaction + .GetCompareExchangeValue(company.Supplier); + + cmpXchgItems.Add(item); + } + + Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); +} +``` + + +```sql +// RQL that can be used with a Raw Query: +// ====================================== + +from "Companies" +include cmpxchg("Supplier") + +// or: + +from companies as c +select c +include cmpxchg(c.Supplier) + +// Using JS method: +// ================ + +declare function includeCmpXchg(company) { + includes.cmpxchg(company.Supplier); + return company; +} + +from companies as c +select includeCmpXchg(c) +``` + + + + + + + +**Index query**: + + + +```csharp +// Open a session with cluster-wide mode +using (var session = store.OpenSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Make an index query + include CmpXchg items: + // ============================================ + + var companies = session.Query() + // Call 'Include' with 'IncludeCompareExchangeValue' + // pass the PATH of the property that contains the key of the CmpXchg item to include + .Include(x => x.IncludeCompareExchangeValue(c => c.Supplier)) + .OfType() + .ToList(); + + var numberOfRequests = session.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + var cmpXchgItems = new List>(); + + foreach (var company in companies) + { + var item = session.Advanced.ClusterTransaction + .GetCompareExchangeValue(company.Supplier); + + cmpXchgItems.Add(item); + } + + Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); +} +``` + + +```csharp +// Open a session with cluster-wide mode +using (var asyncSession = store.OpenAsyncSession(new SessionOptions +{ + TransactionMode = TransactionMode.ClusterWide +})) +{ + // Make an index query + include CmpXchg items: + // ============================================ + + var companies = await asyncSession.Query() + // Call 'Include' with 'IncludeCompareExchangeValue' + // pass the PATH of the property that contains the key of the CmpXchg item to include + .Include(x => x.IncludeCompareExchangeValue(c => c.Supplier)) + .OfType() + .ToListAsync(); + + var numberOfRequests = asyncSession.Advanced.NumberOfRequests; + Debug.Assert(numberOfRequests == 1); + + // Access the included CmpXchg items: + // ================================== + + var cmpXchgItems = new List>(); + + foreach (var company in companies) + { + var item = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync(company.Supplier); + + cmpXchgItems.Add(item); + } + + Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); +} +``` + + +```sql +// RQL that can be used with a Raw Query: +// ====================================== + +from index "Companies/ByNameAndSupplier" +include cmpxchg("Supplier") + +// Using JS method: +// ================ + +declare function includeCmpXchg(company) { + includes.cmpxchg(company.Supplier); + return company; +} + +from index "Companies/ByNameAndSupplier" as c +select includeCmpXchg(c) +``` + + +```csharp +public class Companies_ByNameAndSupplier : AbstractIndexCreationTask +{ + public class IndexEntry + { + public string Name { get; set;} + public string Supplier { get; set; } + } + + public Companies_ByNameAndSupplier() + { + Map = companies => from company in companies + select new IndexEntry() + { + Name = company.Name, + Supplier = company.Supplier + }; + } +} +``` + + + +* Note: + Similar to the above dynamic query example, you can query the index with a [raw query](../indexes/querying/query-index#query-an-index-by-rawquery) using the provided RQL. + + + +--- + +## Syntax + + + +**When loading entities or making queries**: + +* Use method `IncludeCompareExchangeValue()` to include compare-exchange items with `session.Load()` or with queries. + + +```csharp +// Available overloads: +IncludeCompareExchangeValue(string path); +IncludeCompareExchangeValue(Expression> path); +IncludeCompareExchangeValue(Expression>> path); + +``` + + +| Parameter | Type | Description | +|-----------|--------------------------------|--------------------------------------------------------------------------------------------------------------| +| **path** | `string` | The key of the compare-exchange item to include. | +| **path** | `Expression>` | An expression indicating the property path that resolves to the key of the compare-exchange item to include. | +| **path** | `Expression>>` | An expression indicating the property path that resolves to an array of keys of the items to include. | + + + + + +**When querying with RQL**: + +* Use the [include](../client-api/session/querying/what-is-rql.mdx#include) keyword followed by `cmpxchg()` to include a compare-exchange item. + + +```sql +include cmpxchg(key) +``` + + + + + + +**When using JavaScript functions within RQL**: + +* Use `includes.cmpxchg()` In [JavaScript functions](../client-api/session/querying/what-is-rql.mdx#declare) within RQL queries. + + +```csharp +includes.cmpxchg(key); +``` + + +| Parameter | Type | Description | +|-----------|-----------|----------------------------------------------------------------------------------| +| **key** | `string` | The key of the compare exchange value you want to include, or a path to the key. | + + diff --git a/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx b/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx new file mode 100644 index 0000000000..baa682b881 --- /dev/null +++ b/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx @@ -0,0 +1,468 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items can be included when [loading entities](../client-api/session/loading-entities) + or when making [queries](../client-api/session/querying/how-to-query). + +* The Session [tracks](../client-api/session/what-is-a-session-and-how-does-it-work) the included compare-exchange items, + which means their values can be accessed later in the same session without making additional requests to the server. + +* In this page: + * [Sample data](../compare-exchange/include-cmpxchg-items#sample-data) + * [Include compare-exchange items when loading](../compare-exchange/include-cmpxchg-items#include-compare-exchange-items-when-loading) + * [Include compare-exchange items when querying](../compare-exchange/include-cmpxchg-items#include-compare-exchange-items-when-querying) + * [Syntax](../compare-exchange/include-cmpxchg-items#syntax) + + + +--- + +## Sample data + +The examples in this article are based on the following **sample data**: +To learn about ALL the available methods for creating a compare-exchange item, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + + + +```js +{ + // Create some company documents: + // ============================== + + const session = documentStore.openSession(); + + const company1 = new Company(); + company1.id = "companies/1"; + company1.name = "Apple"; + company1.supplier = "suppliers/1"; + company1.workers = ["employees/1", "employees/2"]; + + const company2 = new Company( + "companies/2", "Google", "suppliers/2", ["employees/3", "employees/4"]); + + const company3 = new Company( + "companies/3", "Microsoft", "suppliers/3", ["employees/6", "employees/5"]); + + await session.store(company1); + await session.store(company2); + await session.store(company3); + + await session.saveChanges(); +} +``` + + +```js +{ + // Create some compare-exchange items: + // =================================== + + // Open a session with cluster-wide mode so that we can call 'createCompareExchangeValue' + const session = documentStore.openSession({ + transactionMode: "ClusterWide" + }); + + session.advanced.clusterTransaction.createCompareExchangeValue( + "employees/1", "content for employee 1 .."); + session.advanced.clusterTransaction.createCompareExchangeValue( + "employees/2", "content for employee 2 .."); + session.advanced.clusterTransaction.createCompareExchangeValue( + "employees/3", "content for employee 3 .."); + + session.advanced.clusterTransaction.createCompareExchangeValue( + "suppliers/1", "content for supplier 1 .."); + session.advanced.clusterTransaction.createCompareExchangeValue( + "suppliers/2", "content for supplier 2 .."); + session.advanced.clusterTransaction.createCompareExchangeValue( + "suppliers/3", "content for supplier 3 .."); + + await session.saveChanges(); +} +``` + + +```js +class Company { + constructor( + id = null, + name = "", + supplier = "", + workers = [] + + ) { + Object.assign(this, { + id, + name, + supplier, + workers + }); + } +} +``` + + + +--- + +## Include compare-exchange items when loading + + + +**Include single item**: + + +```js +// Open a session with cluster-wide mode to enable calling 'includeCompareExchangeValue' +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Load a company document + include a CmpXchg item: +// ================================================= + +// Call 'includeCompareExchangeValue' within the 'load' options, +// pass the PATH of the document property that contains the key of the CmpXchg item to include +const company1 = await session.load("companies/1", { + documentType: Company, + // "supplier" is the document property that holds the CmpXchg key + includes: i => i.includeCompareExchangeValue("supplier") +}); + +// Calling 'load' has triggered a server call +const numberOfRequests = session.advanced.numberOfRequests; +assert.equal(numberOfRequests, 1); + +// Access the included CmpXchg item: +// ================================= + +// Call 'getCompareExchangeValue' to access the content of the included CmpXchg item, +// pass the CmpXchg item KEY. This will NOT trigger another server call. +const item = await session.advanced.clusterTransaction + .getCompareExchangeValue(company1.supplier); + +// You can assert that no further server calls were made +assert.equal(session.advanced.numberOfRequests, numberOfRequests); + +// The CmpXchg item value is available +const value = item.value; +``` + + + + + + +**Include multiple items**: + + +```js +// Open a session with cluster-wide mode +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Load a company document + include multiple CmpXchg items: +// ========================================================= + +// Call 'includeCompareExchangeValue' within the 'load' options, +// pass the PATH of the document property that contains the list of the CmpXchg items to include +const company1 = await session.load("companies/1", { + documentType: Company, + // "workers" is the document property that holds the list of keys + includes: i => i.includeCompareExchangeValue("workers") +}); + +const numberOfRequests = session.advanced.numberOfRequests; +assert.equal(numberOfRequests, 1); + +// Access the included CmpXchg items: +// ================================== + +// Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, +// pass the list of KEYS. This will NOT trigger another server call. +const items = await session.advanced.clusterTransaction + .getCompareExchangeValues(company1.workers); + +assert.equal(session.advanced.numberOfRequests, numberOfRequests); + +// The value of each item is available +const value1 = items["employees/1"].value; +const value2 = items["employees/2"].value; +``` + + + + +--- + +## Include compare-exchange items when querying + + + +**Dynamic query**: + + + +```js +// Open a session with cluster-wide mode to enable calling 'includeCompareExchangeValue' +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Make a dynamic query + include CmpXchg items: +// ============================================= + +const companies = await session.query({ collection: "companies" }) + // Call 'include' with 'includeCompareExchangeValue' + // pass the PATH of the document property that contains the key of the CmpXchg item to include + .include(x => x.includeCompareExchangeValue("supplier")) + .all(); + +// Making the query has triggered a server call +const numberOfRequests = session.advanced.numberOfRequests; +assert.equal(numberOfRequests, 1); + +// Access the included CmpXchg items: +// ================================== + +const cmpXchgItems = []; + +for (let i = 0; i < companies.length; i++) { + // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, + // pass the KEY. This will NOT trigger another server call. + const item = await session.advanced.clusterTransaction + .getCompareExchangeValue(companies[i].supplier); + + cmpXchgItems.push(item); +} + +// You can assert that no further server calls were made +assert.equal(session.advanced.numberOfRequests, numberOfRequests); +``` + + +```js +// Open a session with cluster-wide mode to enable calling 'include cmpxchg' +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Make a raw query + include CmpXchg items: +// ========================================= + +// In the provided RQL: +// * Call 'include' with 'cmpxchg' +// * Pass the PATH of the document property that contains the key of the CmpXchg item to include +const companies = await session.advanced + .rawQuery(`from companies as c + select c + include cmpxchg(c.supplier)`) + .all(); + +const numberOfRequests = session.advanced.numberOfRequests; +assert.equal(numberOfRequests, 1); + +// Access the included CmpXchg items: +// ================================== + +const cmpXchgItems = []; + +for (let i = 0; i < companies.length; i++) { + // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, + // pass the KEY, this will NOT trigger another server call. + const item = await session.advanced.clusterTransaction + .getCompareExchangeValue(companies[i].supplier); + + cmpXchgItems.push(item); +} + +assert.equal(session.advanced.numberOfRequests, numberOfRequests); +``` + + +```js +// Open a session with cluster-wide mode to enable calling 'includes.cmpxchg' +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Make a raw query + include CmpXchg items using Javascript method: +// ================================================================= + +// In the provided RQL: +// * Call 'includes.cmpxchg' +// * Pass the PATH of the document property that contains the key of the CmpXchg item to include +const companies = await session.advanced + .rawQuery(`declare function includeCmpXchg(company) { + includes.cmpxchg(company.supplier); + return company; + } + + from companies as c + select includeCmpXchg(c)`) + .all(); + +const numberOfRequests = session.advanced.numberOfRequests; +assert.equal(numberOfRequests, 1); + +// Access the included CmpXchg items: +// ================================== + +const cmpXchgItems = []; + +for (let i = 0; i < companies.length; i++) { + // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, + // pass the KEY. This will NOT trigger another server call. + const item = await session.advanced.clusterTransaction + .getCompareExchangeValue(companies[i].supplier); + + cmpXchgItems.push(item); +} + +assert.equal(session.advanced.numberOfRequests, numberOfRequests); +``` + + + + + + + +**Index query**: + + + +```js +// Open a session with cluster-wide mode +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Make an index query + include CmpXchg items: +// ============================================ + +// Call 'include' with 'includeCompareExchangeValue' +// pass the PATH of the document property that contains the key of the CmpXchg item to include +const companies = await session.query({ indexName: "Companies/ByName" }) + .include(x => x.includeCompareExchangeValue("supplier")) + .all(); + +const numberOfRequests = session.advanced.numberOfRequests; +assert.equal(numberOfRequests, 1); + +// Access the included CmpXchg items: +// ================================== + +const cmpXchgItems = []; + +for (let i = 0; i < companies.length; i++) { + // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, + // pass the KEY. This will NOT trigger another server call. + const item = await session.advanced.clusterTransaction + .getCompareExchangeValue(companies[i].supplier); + + cmpXchgItems.push(item); +} + +assert.equal(session.advanced.numberOfRequests, numberOfRequests); +``` + + +```sql +// RQL that can be used with a Raw Query: +// ====================================== + +from index "Companies/ByName" +include cmpxchg("supplier") + +// Using JS method: +// ================ + +declare function includeCmpXchg(company) { + includes.cmpxchg(company.supplier); + return company; +} + +from index "Companies/ByName" as c +select includeCmpXchg(c) +``` + + +```js +class Companies_ByName extends AbstractJavaScriptIndexCreationTask { + constructor() { + super(); + + this.map('companies', company => { + return { + name: company.name + }; + }); + } +} +``` + + + +* Note: + Similar to the above dynamic query example, you can query the index with a [raw query](../indexes/querying/query-index#query-an-index-by-rawquery) using the provided RQL. + + + +--- + +## Syntax + + + +**When loading entities or making queries**: + +* Use method `includeCompareExchangeValue()` to include compare-exchange items with `session.load()` or with queries. + + +```js +includeCompareExchangeValue(path); +``` + + +| Parameter | Type | Description | +|-----------|-----------|------------------------------------------------------------------------------------------------------------| +| **path** | `string` | The path of the document property that contains the key (or list of keys) of the CmpXchg items to include. | + + + + + +**When querying with RQL**: + +* Use the [include](../client-api/session/querying/what-is-rql.mdx#include) keyword followed by `cmpxchg()` to include a compare-exchange item. + + +```sql +include cmpxchg(key) +``` + + + + + + +**When using JavaScript functions within RQL**: + +* Use `includes.cmpxchg()` In [JavaScript functions](../client-api/session/querying/what-is-rql.mdx#declare) within RQL queries. + + +```js +includes.cmpxchg(key); +``` + + +| Parameter | Type | Description | +|-----------|-----------|----------------------------------------------------------------------------------| +| **key** | `string` | The key of the compare exchange value you want to include, or a path to the key. | + + diff --git a/docs/compare-exchange/content/_indexing-compare-exchange-values-csharp.mdx b/docs/compare-exchange/content/_indexing-compare-exchange-values-csharp.mdx new file mode 100644 index 0000000000..c72007f252 --- /dev/null +++ b/docs/compare-exchange/content/_indexing-compare-exchange-values-csharp.mdx @@ -0,0 +1,556 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can index compare-exchange values in a static-index. + This lets you query documents based on values stored in compare-exchange items. + +* Modifications to the indexed compare-exchange values will trigger index updates. + The index will be updated whenever an indexed compare-exchange value changes, + or when documents in the indexed collection(s) are modified. + +* In this article: + * [Create sample compare-exchange items](../compare-exchange/indexing-cmpxchg-values#create-sample-compare-exchange-items) + * [Index compare-exchange values](../compare-exchange/indexing-cmpxchg-values#index-compare-exchange-values) + * [Query the index](../compare-exchange/indexing-cmpxchg-values#query-the-index) + * [Query the index and project compare-exchange values](../compare-exchange/indexing-cmpxchg-values#query-the-index-and-project-compare-exchange-values) + * [Syntax](../compare-exchange/indexing-cmpxchg-values#syntax) + + + +--- + +## Create sample compare-exchange items + +Let’s create some sample documents and compare-exchange items to use in the examples below. +To learn about ALL the available methods for creating a compare-exchange item, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + + + +```csharp +// Create some hotel room DOCUMENTS with general info: +// =================================================== + +using (var session = store.OpenSession()) +{ + for (int i = 215; i <= 217; i++) + { + var room = new HotelRoom + { + RoomNumber = $"R{i}", + Description = $"Description of room number R{i}" + }; + + session.Store(room, $"hotelRooms/R{i}"); + } + + session.SaveChanges(); +} +``` + + +```csharp +// Create some COMPARE-EXCHANGE ITEMS to track current details of each room: +// ========================================================================= + +// Value for room R215 +var hotelRoomDetails = new HotelRoomCurrentDetails() +{ + CurrentNumberOfGuests = 2, + ReservedBy = "customers/2", + ReservedUntil = DateTime.Now.AddDays(2), + FullyPaid = true, + CustomerEmail = "customer2@gmail.com", + CustomerPhone = "123-123-1234" +}; + +CompareExchangeResult putResult = store.Operations.Send( + new PutCompareExchangeValueOperation( + "R215", hotelRoomDetails, 0)); + +// Value for room R216 +hotelRoomDetails = new HotelRoomCurrentDetails() +{ + CurrentNumberOfGuests = 3, + ReservedBy = "customers/3", + ReservedUntil = DateTime.Now.AddDays(5), + FullyPaid = false, + CustomerEmail = "customer3@gmail.com", + CustomerPhone = "456-456-6789" +}; + +putResult = store.Operations.Send( + new PutCompareExchangeValueOperation( + "R216", hotelRoomDetails, 0)); + +// Value for room R217 +// This room is currently not occupied... +hotelRoomDetails = new HotelRoomCurrentDetails() +{ + CurrentNumberOfGuests = 0 +}; + +putResult = store.Operations.Send( + new PutCompareExchangeValueOperation( + "R217", hotelRoomDetails, 0)); +``` + + +```csharp +// Sample classes used: +// ==================== + +// The document +public class HotelRoom +{ + public string RoomNumber { get; set; } + public string Description { get; set; } +} + +// The compare-exchange value +public class HotelRoomCurrentDetails +{ + public int CurrentNumberOfGuests { get; set; } + public string ReservedBy { get; set; } + public DateTime ReservedUntil { get; set; } + public bool FullyPaid { get; set; } + public string CustomerEmail { get; set; } + public string CustomerPhone { get; set; } +} + +// Projected content +public class ProjectedCustomerDetails +{ + public string CustomerEmail { get; set; } + public string CustomerPhone { get; set; } + public string RoomNumber { get; set; } +} + +// Projected content +public class ProjectedNumberOfGuests +{ + public int CurrentNumberOfGuests { get; set; } + public string RoomNumber { get; set; } +} +``` + + + +--- + +## Index compare-exchange values + + +* This index maps the rooms in a hotel, as well as compare-exchange values representing the guests in those rooms. + +* Use method `LoadCompareExchangeValue` to load the current details of each room from the associated compare-exchange value. + + + +```csharp +public class Rooms_ByGuestsAndPaymentStatus : AbstractIndexCreationTask +{ + // The index-fields + public class IndexEntry + { + public string RoomNumber; + public int? NumberOfGuests; + public boo? FullyPaid { get; set; } + } + + public Rooms_ByGuestsAndPaymentStatus() + { + Map = HotelRooms => from room in HotelRooms + // Call method 'LoadCompareExchangeValue' + // to load the compare-exchange value by its key (room number) + let cmpXchgValue = LoadCompareExchangeValue(room.RoomNumber) + + // Define the index-fields + select new IndexEntry() + { + // Index content from the document: + RoomNumber = room.RoomNumber, + + // Index content from the compare-exchange value: + NumberOfGuests = cmpXchgValue != null ? cmpXchgValue.CurrentNumberOfGuests : (int?)null, + FullyPaid = cmpXchgValue != null ? cmpXchgValue.FullyPaid : (bool?)null + }; + } +} +``` + + +```csharp +public class Rooms_ByGuestsAndPaymentStatus_JS : AbstractJavaScriptIndexCreationTask +{ + public Compare_Exchange_JS_Index() + { + Maps = new HashSet + { + @" + map('HotelRooms', function(room) { + // Call method 'cmpxchg' + // to load the compare-exchange value by its key (room number) + var cmpXchgValue = cmpxchg(room.RoomNumber); + + // Define the index-fields + return { + // Index content from the document: + RoomNumber: room.RoomNumber, + + // Index content from the compare-exchange value: + NumberOfGuests: cmpXchgValue ? cmpXchgValue.CurrentNumberOfGuests : null, + FullyPaid: cmpXchgValue ? cmpXchgValue.FullyPaid : null + }; + }); + " + }; + } +} +``` + + +```csharp +var indexDefinition = new IndexDefinition +{ + Name = "Rooms/ByGuestsAndPaymentStatus", + + Maps = new HashSet + { + @"from room in docs.HotelRooms + + // Call method 'LoadCompareExchangeValue' + // to load the compare-exchange value by its key (room number) + let cmpXchgValue = LoadCompareExchangeValue(room.RoomNumber) + where cmpXchgValue != null + + select new + { + // Index content from the document: + RoomNumber = room.RoomNumber, + + // Index content from the compare-exchange value: + NumberOfGuests = cmpXchgValue.CurrentNumberOfGuests, + FullyPaid = cmpXchgValue.FullyPaid + }" + } +}; + +store.Maintenance.Send(new PutIndexesOperation(indexDefinition)); +``` + + + +--- + +## Query the index + +* Using the index above, you can query for all rooms (room documents) that are occupied by a specific number of guests. + The _NumberOfGuests_ index-field, which is used in the query, contains the number of guests taken from the related compare-exchange value. + +* For example, you can find all vacant rooms (0 guests) or rooms occupied by any specific number of guests. + + + +```csharp +// When querying the index, +// the session does not need to be opened in cluster-wide mode. +using (var session = store.OpenSession()) +{ + // Query for all vacant rooms (0 guests) + List vacantRooms = session + .Query() + // Index-field 'NumberOfGuests' contains the guest count for each room, + // taken from the compare-exchange item. + .Where(x => x.NumberOfGuests == 0) + .OfType() + .ToList(); + + // Using the sample data created above, Room R217 will be returned, since it has no guests. +} +``` + + +```csharp +// When querying the index, +// the session does not need to be opened in cluster-wide mode. +using (var asyncSession = store.OpenAsyncSession()) +{ + // Query for all vacant rooms (0 guests) + List vacantRooms = await asyncSession + .Query() + // Index-field 'NumberOfGuests' contains the guest count for each room, + // taken from the compare-exchange item. + .Where(x => x.NumberOfGuests == 0) + .OfType() + .ToListAsync(); + + // Using the sample data created above, Room R217 will be returned, since it has no guests. +} +``` + + +```csharp +using (var session = store.OpenSession()) +{ + List vacantRooms = session.Advanced + .DocumentQuery() + .WhereEquals(x => x.NumberOfGuests, 0) + .OfType() + .ToList(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession()) +{ + List vacantRooms = await asyncSession.Advanced + .AsyncDocumentQuery() + .WhereEquals(x => x.NumberOfGuests, 0) + .OfType() + .ToListAsync(); +} +``` + + +```csharp +using (var session = store.OpenSession()) +{ + var vacantRooms = session.Advanced + .RawQuery(@" + from index 'Rooms/ByGuestsAndPaymentStatus' + where NumberOfGuests == 0") + .ToList(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession()) +{ + var vacantRooms = await asyncSession.Advanced + .AsyncRawQuery(@" + from index 'Rooms/ByGuestsAndPaymentStatus' + where NumberOfGuests = 0") + .ToListAsync(); +} +``` + + +```sql +from index "Rooms/ByGuestsAndPaymentStatus" +where NumberOfGuests == 0 +``` + + + +--- + +## Query the index and project compare-exchange values + +* In addition to querying index-fields that already contain information from the related compare-exchange value, + you can also project fields from the compare-exchange value into the query results. + +* In the following query example, we retrieve all customers who haven't fully paid yet, + and project their phone number from the compare-exchange value using `RavenQuery.CmpXchg`. + + + +```csharp +// The session does not need to be opened in cluster-wide mode +using (var session = store.OpenSession()) +{ + List phonesOfCustomersThatNeedToPay = session + .Query() + // Index-field 'FullyPaid' contains info from the compare-exchange item + .Where(x => x.FullyPaid == false && x.NumberOfGuests > 0) + // Project query results: + .Select(x => new ProjectedCustomerDetails + { + // Project content from the compare-exchange item: + // Call 'RavenQuery.CmpXchg' to load the compare-exchange value by its key. + CustomerPhone = RavenQuery.CmpXchg(x.RoomNumber).CustomerPhone, + // Project content from the index-field: + RoomNumber = x.RoomNumber + }) + .ToList(); + + // Using the sample data created above, customer from room R216 will be returned + // in the projected data, since they haven't fully paid yet. +} +``` + + +```csharp +// The session does not need to be opened in cluster-wide mode +using (var asyncSession = store.OpenAsyncSession()) +{ + List phonesOfCustomersThatNeedToPay = await asyncSession + .Query() + // Index-field 'FullyPaid' contains info from the compare-exchange item + .Where(x => x.FullyPaid == false && x.NumberOfGuests > 0) + // Project query results: + .Select(x => new ProjectedCustomerDetails + { + // Project content from the compare-exchange item: + // Call 'RavenQuery.CmpXchg' to load the compare-exchange value by its key. + CustomerPhone = RavenQuery.CmpXchg(x.RoomNumber).CustomerPhone, + // Project content from the index-field: + RoomNumber = x.RoomNumber + }) + .ToListAsync(); + + // Using the sample data created above, customer from room R216 will be returned + // in the projected data, since they haven't fully paid yet. +} +``` + + +```csharp +using (var session = store.OpenSession()) +{ + List phonesOfCustomersThatNeedToPay = session.Advanced + .DocumentQuery() + .WhereEquals(x => x.FullyPaid, false) + .AndAlso() + .WhereGreaterThan(x=> x.NumberOfGuests, 0) + // Define the projection using a custom function: + .SelectFields(QueryData.CustomFunction( + alias: "room", + func: @"{ + // Project content from the compare-exchange item: + // Call 'cmpxchg' to load the compare-exchange value by its key. + CustomerPhone : cmpxchg(room.RoomNumber).CustomerPhone, + + // Project content from the index-field: + RoomNumber : room.RoomNumber + }") + ) + .ToList(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession()) +{ + List phonesOfCustomersThatNeedToPay = await asyncSession.Advanced + .AsyncDocumentQuery() + .WhereEquals(x => x.FullyPaid, false) + .AndAlso() + .WhereGreaterThan(x=> x.NumberOfGuests, 0) + // Define the projection using a custom function: + .SelectFields(QueryData.CustomFunction( + alias: "room", + func: @"{ + // Project content from the compare-exchange item: + // Call 'cmpxchg' to load the compare-exchange value by its key. + CustomerPhone : cmpxchg(room.RoomNumber).CustomerPhone, + + // Project content from the index-field: + RoomNumber : room.RoomNumber + }") + ) + .ToListAsync(); +} +``` + + +```csharp +using (var session = store.OpenSession()) +{ + var phonesOfCustomersThatNeedToPay = session.Advanced + .RawQuery(@" + from index "Rooms/ByGuestsAndPaymentStatus" as x + where x.FullyPaid = false and (x.NumberOfGuests > 0 and x.NumberOfGuests != null) + select { + CustomerPhone : cmpxchg(x.RoomNumber).CustomerPhone, + RoomNumber : x.RoomNumber + } + ") + .ToList(); +} +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession()) +{ + var phonesOfCustomersThatNeedToPay = await asyncSession.Advanced + .AsyncRawQuery(@" + from index "Rooms/ByGuestsAndPaymentStatus" as x + where x.FullyPaid = false and (x.NumberOfGuests > 0 and x.NumberOfGuests != null) + select { + CustomerPhone : cmpxchg(x.RoomNumber).CustomerPhone, + RoomNumber : x.RoomNumber + } + ") + .ToListAsync(); +} +``` + + +```sql +from index "Rooms/ByGuestsAndPaymentStatus" as x +where x.FullyPaid = false and (x.NumberOfGuests > 0 and x.NumberOfGuests != null) +select { + CustomerPhone : cmpxchg(x.RoomNumber).CustomerPhone, + RoomNumber : x.RoomNumber +} +``` + + + +--- + +## Syntax + +--- + +### `LoadCompareExchangeValue()` +Load a compare exchange value in the LINQ index-definition by its key. + + +```csharp +//Load one compare exchange value +T LoadCompareExchangeValue(string key); + +//Load multiple compare exchange values +T[] LoadCompareExchangeValue(IEnumerable keys); +``` + + +### `cmpxchg()` +Load a compare exchange value in the JavaScript index-definition by its key. + + +```js +//Load one compare exchange value +cmpxchg(key); + +``` + + +| Parameter | Type | Description | +|-----------|----------------------|---------------------------------------------------| +| **T** | `object` | The type of the compare-exchange item's value | +| **key** | `string` | The key of a particular compare exchange value. | +| **keys** | `IEnumerable`| The keys of multiple compare exchange values. | + +### `RavenQuery.CmpXchg()` +This method is used when **querying the index** with a LINQ query +and projecting fields from the compare-exchange value into the query results. + + +```csharp +// Get a compare-exchange value by key. +public static T CmpXchg(string key) +``` + diff --git a/docs/compare-exchange/content/_indexing-compare-exchange-values-java.mdx b/docs/compare-exchange/content/_indexing-compare-exchange-values-java.mdx new file mode 100644 index 0000000000..4210ecca70 --- /dev/null +++ b/docs/compare-exchange/content/_indexing-compare-exchange-values-java.mdx @@ -0,0 +1,66 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can index compare-exchange values in a static-index. + This lets you query documents based on values stored in compare-exchange items. + +* Modifications to the indexed compare-exchange values will trigger index updates. + The index will be updated whenever an indexed compare-exchange value changes, + or when documents in the indexed collection(s) are modified. + +* In this page: + * [How to use](../indexes/indexing-compare-exchange-values.mdx#how-to-use) + * [Examples](../indexes/indexing-compare-exchange-values.mdx#examples) + * [Querying the Index](../indexes/indexing-compare-exchange-values.mdx#querying-the-index) + + + +## How to use + +When creating an index using `AbstractIndexCreationTask`, use javaScript +to load a compare exchange value by its key. + +### Examples + +These indexes map the rooms in a hotel, as well as compare exchange values +representing the guests in those rooms. + + + + +{`private class Compare_Exchange_JS_Index extends AbstractJavaScriptIndexCreationTask{ + public Compare_Exchange_JS_Index() + { + setMaps(Collections.singleton( + "map('HotelRooms', function (room) {\\n"+ + " var guests = cmpxchg(room.RoomID);\\n"+ + " return {\\n"+ + " RoomID: room.RoomID,\\n"+ + " Guests: guests\\n"+ + " }\\n"+ + "});" + ) + ); + }; +} +`} + + + + +## Querying the Index + + + + +{`IRawDocumentQuery VIPRooms = session.advanced().rawQuery(Hotelroom.class, + "from Hotelrooms as room\\n" + + "where room.Guests == cmpxchg('VIP')"); +`} + + + diff --git a/docs/compare-exchange/content/_indexing-compare-exchange-values-nodejs.mdx b/docs/compare-exchange/content/_indexing-compare-exchange-values-nodejs.mdx new file mode 100644 index 0000000000..65b08dd941 --- /dev/null +++ b/docs/compare-exchange/content/_indexing-compare-exchange-values-nodejs.mdx @@ -0,0 +1,323 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* You can index compare-exchange values in a static-index. + This lets you query documents based on values stored in compare-exchange items. + +* Modifications to the indexed compare-exchange values will trigger index updates. + The index will be updated whenever an indexed compare-exchange value changes, + or when documents in the indexed collection(s) are modified. + +* In this article: + * [Create sample compare-exchange items](../compare-exchange/indexing-cmpxchg-values#create-sample-compare-exchange-items) + * [Index compare-exchange values](../compare-exchange/indexing-cmpxchg-values#index-compare-exchange-values) + * [Query the index](../compare-exchange/indexing-cmpxchg-values#query-the-index) + * [Query the index and project compare-exchange values](../compare-exchange/indexing-cmpxchg-values#query-the-index-and-project-compare-exchange-values) + * [Syntax](../compare-exchange/indexing-cmpxchg-values#syntax) + + + +--- + +## Create sample compare-exchange items + +Let’s create some sample documents and compare-exchange items to use in the examples below. +To learn about ALL the available methods for creating a compare-exchange item, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + + + +```js +// Create some hotel room DOCUMENTS with general info: +// =================================================== + +const session = documentStore.openSession(); + +for (let i = 215; i <= 217; i++) { + const room = new HotelRoom(`R${i}`, `Description of room number R${i}`); + await session.store(room, `hotelRooms/R${i}`); +} + +await session.saveChanges(); +``` + + +```js +// Create some COMPARE-EXCHANGE ITEMS to track current details of each room: +// ========================================================================== + +// Value for room R215 +let hotelRoomDetails = new HotelRoomCurrentDetails({ + CurrentNumberOfGuests: 2, + ReservedBy: "customers/2", + ReservedUntil: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000), + FullyPaid: true, + CustomerEmail: "customer2@gmail.com", + CustomerPhone: "123-123-1234" +}); + +let putResult = await documentStore.operations.send( + new PutCompareExchangeValueOperation("R215", hotelRoomDetails, 0) +); + +// Value for room R216 +hotelRoomDetails = new HotelRoomCurrentDetails({ + CurrentNumberOfGuests: 3, + ReservedBy: "customers/3", + ReservedUntil: new Date(Date.now() + 5 * 24 * 60 * 60 * 1000), + FullyPaid: false, + CustomerEmail: "customer3@gmail.com", + CustomerPhone: "456-456-6789" +}); + +putResult = await documentStore.operations.send( + new PutCompareExchangeValueOperation("R216", hotelRoomDetails, 0) +); + +// Value for room R217 +// This room is currently not occupied... +hotelRoomDetails = new HotelRoomCurrentDetails({ + CurrentNumberOfGuests: 0 +}); + +putResult = await documentStore.operations.send( + new PutCompareExchangeValueOperation("R217", hotelRoomDetails, 0) +); +``` + + +```js +// Sample classes used: +// ==================== + +// The document +class HotelRoom { + constructor(roomNumber = '', description = '') { + Object.assign(this, { + RoomNumber: roomNumber, + Description: description + }); + } +} + +// The compare-exchange value +class HotelRoomCurrentDetails { + constructor({ + CurrentNumberOfGuests = 0, + ReservedBy = null, + ReservedUntil = null, + FullyPaid = false, + CustomerEmail = null, + CustomerPhone = null + } = {}) { + Object.assign(this, { + CurrentNumberOfGuests, + ReservedBy, + ReservedUntil, + FullyPaid, + CustomerEmail, + CustomerPhone + }); + } +} + +// Projected content +class ProjectedCustomerDetails { + constructor({ + CustomerEmail = null, + CustomerPhone = null, + RoomNumber = null + } = {}) { + Object.assign(this, { + CustomerEmail, + CustomerPhone, + RoomNumber + }); + } +} + +// Projected content +class ProjectedNumberOfGuests { + constructor({ + CurrentNumberOfGuests = 0, + RoomNumber = null + } = {}) { + Object.assign(this, { + CurrentNumberOfGuests, + RoomNumber + }); + } +} +``` + + + +--- + +## Index compare-exchange values + +* This index maps the rooms in a hotel, as well as compare-exchange values representing the guests in those rooms. + +* Use method `cmpxchg` to load the current details of each room from the associated compare-exchange value. + + + +```js +class Rooms_ByGuestsAndPaymentStatus extends AbstractJavaScriptIndexCreationTask { + constructor() { + super(); + + this.map("HotelRooms", room => { + // Call method 'cmpxchg' + // to load the compare-exchange value by its key (room number) + const cmpXchgValue = cmpxchg(room.RoomNumber); + + return { + // Index content from the document: + RoomNumber: room.RoomNumber, + + // Index content from the compare-exchange value: + NumberOfGuests: cmpXchgValue ? cmpXchgValue.CurrentNumberOfGuests : null, + FullyPaid: cmpXchgValue ? cmpXchgValue.FullyPaid : null + }; + }); + } +} +``` + + + +--- + +## Query the index + +* Using the index above, you can query for all rooms (room documents) that are occupied by a specific number of guests. + The _NumberOfGuests_ index-field, which is used in the query, contains the number of guests taken from the related compare-exchange value. + +* For example, you can find all vacant rooms (0 guests) or rooms occupied by any specific number of guests. + + + +```js +// When querying the index, +// the session does not need to be opened in cluster-wide mode. +const session = documentStore.openSession(); + +// Query for all vacant rooms (0 guests) +const vacantRooms = await session + .query({ + indexName: "Rooms/ByGuestsAndPaymentStatus" + }) + // Index-field 'NumberOfGuests' contains guest count from the compare-exchange item + .whereEquals("NumberOfGuests", 0) + .all(); + +// Using the sample data created above, Room R217 will be returned, since it has no guests. +``` + + +```js +const session = documentStore.openSession(); + +const vacantRooms = await session.advanced + .rawQuery("from index 'Rooms/ByGuestsAndPaymentStatus' where NumberOfGuests == 0") + .all(); +``` + + +```sql +from index "Rooms/ByGuestsAndPaymentStatus" +where NumberOfGuests == 0 +``` + + + +--- + +## Query the index and project compare-exchange values + +* In addition to querying index-fields that already contain information from the related compare-exchange value, + you can also project fields from the compare-exchange value into the query results. + +* In the following query example, we retrieve all customers who haven't fully paid yet, + and project their phone number from the compare-exchange value using `cmpxchg()`. + + + +```js +// The session does not need to be opened in cluster-wide mode +const session = documentStore.openSession(); + +// Define the projection +const queryData = QueryData.customFunction("room", `{ + // Use method 'cmpxchg' to retrieve data from the compare-exchange value + customerPhone: cmpxchg(room.RoomNumber).CustomerPhone, + roomNumber: room.RoomNumber +}`); + +const phonesOfCustomersThatNeedToPay = await session + .query({ indexName: "Rooms/ByGuestsAndPaymentStatus" }) + // Index-fields 'FullyPaid' & 'NumberOfGuests' contain info from the compare-exchange item + .whereGreaterThanOrEqual("NumberOfGuests", 1) + .andAlso() + .whereEquals("FullyPaid", false) + // Project query results + .selectFields(queryData) + .all(); + +// Using the sample data created above, +// customer from room R216 will be returned in the projected data, since they haven't fully paid yet. +``` + + +```js +const session = documentStore.openSession(); + +const phonesOfCustomersThatNeedToPay = await session.advanced + .rawQuery(` + from index "Rooms/ByGuestsAndPaymentStatus" as x + where x.FullyPaid = false + and (x.NumberOfGuests > 0 and x.NumberOfGuests != null) + select { + CustomerPhone : cmpxchg(x.RoomNumber).CustomerPhone, + RoomNumber : x.RoomNumber + } + `) + .all(); +``` + + +```sql +from index "Rooms/ByGuestsAndPaymentStatus" as x +where x.FullyPaid = false and (x.NumberOfGuests > 0 and x.NumberOfGuests != null) +select { + CustomerPhone : cmpxchg(x.RoomNumber).CustomerPhone, + RoomNumber : x.RoomNumber +} +``` + + + +--- + +## Syntax + +--- + +### `cmpxchg()` +Load a compare exchange value in the index-definition by its key. + + +```js +// Load one compare exchange value +cmpxchg(key); + +``` + + +| Parameter | Type | Description | +|-----------|----------------------|---------------------------------------------------| +| **key** | `string` | The key of a particular compare exchange value. | diff --git a/docs/compare-exchange/content/_overview-csharp.mdx b/docs/compare-exchange/content/_overview-csharp.mdx new file mode 100644 index 0000000000..721964e401 --- /dev/null +++ b/docs/compare-exchange/content/_overview-csharp.mdx @@ -0,0 +1,345 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items are **key/value pairs** where the key is unique across your database. + +* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. + +* In this article: + * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) + * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) + * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) + * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) + * [Example III - Ensuring unique values without using compare-exchange](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) + + + +--- + +## What compare-exchange items are + +Compare-exchange items are key/value pairs where the key serves as a unique value across your database. + +* Each compare-exchange item contains: + * **A key** - A unique string identifier in the database scope. + * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. + For example, the metadata can be used to set expiration time for the compare-exchange item. + Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + * **Raft index** - The compare-exchange item's version. + Any change to the value or metadata will increase this number. + +* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) + interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. + Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. + +--- + +## Ways to create and manage compare-exchange items + +Compare exchange items can be created and managed using any of the following approaches: + +* **Document Store Operations** + You can create and manage compare-exchange items using _document store_ operations. + For example, see [Create items using a store operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation). + +* **Cluster-Wide Sessions** + You can create and manage compare-exchange items from within a [Cluster-Wide session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction). + For example, see [Create items using a cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + When using a cluster-wide session, the compare-exchange item is created as part of the cluster-wide transaction. + If the session fails, the item creation also fails, and none of the nodes in the database group will store the new compare-exchange item. + +* **Atomic Guards** + When creating _documents_ using a cluster-wide session, RavenDB automatically creates [Atomic Guards](../compare-exchange/atomic-guards), + which are special compare-exchange items that guarantee ACID transactions. + See [Cluster-wide transaction vs. Single-node transaction](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) for a session comparison overview. + +* **Studio** + All compare-exchange items can also be managed from the **Compare-Exchange view** in the [Studio](../todo..): + + ![The compare-exchange view](../assets/the-cmpxchg-view.png) + + 1. Open the **Documents** section in the Studio sidebar. + 2. Click on the **Compare-Exchange** tab. + 3. This is a compare-exchange item. + In this view you can create, edit, and delete compare-exchange items. + +--- + +## Why compare-exchange items are not replicated to external databases + +* Each cluster defines its own policies and configurations, and should ideally have sole responsibility for managing its own documents. + Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) + to learn more about why global database modeling is more efficient this way. + +* When creating a compare-exchange item, a Raft consensus is required from the nodes in the database group. + Externally replicating such data is problematic because the target database may reside within a cluster that is in an + unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. + +* Conflicts between documents that occur between two databases are resolved using the documents' change-vector. + Compare-exchange conflicts cannot be resolved in the same way, as they lack a similar conflict resolution mechanism. + +* To ensure unique values between two databases without using compare-exchange items see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + +* Learn more about Replication in RavenDB in [Replication overview](../server/clustering/replication/replication-overview). + For details about what is and what isn't replicated in [What is Replicated](../server/ongoing-tasks/external-replication#what-is-replicated). + +--- + +## Example I - Email address reservation + +The following example shows how to use compare-exchange to create documents with unique values. +The scope is within the database group on a single cluster. + +Compare-exchange items are not externally replicated to other databases. +To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + + +```csharp +string email = "user@example.com"; + +User user = new User +{ + Email = email +}; + +using (IDocumentSession session = store.OpenSession()) +{ + session.Store(user); + // At this point, the user document has an Id assigned + + // Try to reserve a new user email + // Note: This operation takes place outside of the session transaction, + // It is a cluster-wide reservation + CompareExchangeResult cmpXchgResult + = store.Operations.Send( + new PutCompareExchangeValueOperation(email, user.Id, 0)); + + if (cmpXchgResult.Successful == false) + throw new Exception("Email is already in use"); + + // At this point we managed to reserve/save the user email - + // The document can be saved in SaveChanges + session.SaveChanges(); +} +``` + + +**Implications**: + +* This compare-exchange item was [created as an operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation) + rather than with a [cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + Thus, if `session.SaveChanges` fails, then the email reservation is Not rolled back automatically. + It is your responsibility to do so. + +* The compare-exchange value that was saved can be accessed in a query using the `CmpXchg` method: + + + +```csharp + using (var session = store.OpenSession()) + { + // Retrieve the user document that has the specified email: + var user = session.Query() + // Access the compare-exchange value using the CmpXchg method: + .Where(x => x.Id == RavenQuery.CmpXchg("ayende@ayende.com")) + .FirstOrDefault(); + } +``` + + +```csharp +using (var asyncSession = store.OpenAsyncSession()) +{ + var user = await asyncSession.Query() + .Where(x => x.Id == RavenQuery.CmpXchg("ayende@ayende.com")) + .FirstOrDefaultAsync(); +} +``` + + +```csharp +using (var session = store.OpenSession()) +{ + var user = session.Advanced + .DocumentQuery() + .WhereEquals("Id", CmpXchg.Value("ayende@ayende.com")) + .FirstOrDefault(); + } +``` + + +```sql +from "Users" +where id() == cmpxchg("ayende@ayende.com") +limit 0, 1 // take the first result +``` + + + +--- + +## Example II - Reserve a shared resource + +In the following example, we use compare-exchange to reserve a shared resource. +The scope is within the database group on a single cluster. + +The code also checks for clients which never release resources (i.e. due to failure) by using timeout. + + +```csharp +private class SharedResource +{ + public DateTime? ReservedUntil { get; set; } +} + +public void PrintWork() +{ + // Try to get hold of the printer resource + long reservationIndex = LockResource(store, "Printer/First-Floor", TimeSpan.FromMinutes(20)); + + try + { + // Do some work for the duration that was set. + // Don't exceed the duration, otherwise resource is available for someone else. + } + finally + { + ReleaseResource(store, "Printer/First-Floor", reservationIndex); + } +} + +public long LockResource(IDocumentStore store, string resourceName, TimeSpan duration) +{ + while (true) + { + DateTime now = DateTime.UtcNow; + + SharedResource resource = new SharedResource + { + ReservedUntil = now.Add(duration) + }; + + CompareExchangeResult putResult = store.Operations.Send( + new PutCompareExchangeValueOperation(resourceName, resource, 0)); + + if (putResult.Successful) + { + // resourceName wasn't present - we managed to reserve + return putResult.Index; + } + + // At this point, Put operation failed - someone else owns the lock or lock time expired + if (putResult.Value.ReservedUntil < now) + { + // Time expired - Update the existing key with the new value + CompareExchangeResult takeLockWithTimeoutResult = store.Operations.Send( + new PutCompareExchangeValueOperation( + resourceName, resource, putResult.Index + )); + + if (takeLockWithTimeoutResult.Successful) + { + return takeLockWithTimeoutResult.Index; + } + } + + // Wait a little bit and retry + Thread.Sleep(20); + } +} + +public void ReleaseResource(IDocumentStore store, string resourceName, long index) +{ + CompareExchangeResult deleteResult = store.Operations.Send( + new DeleteCompareExchangeValueOperation(resourceName, index)); + + // We have 2 options here: + // deleteResult.Successful is true - we managed to release resource + // deleteResult.Successful is false - someone else took the lock due to timeout +} +``` + + +--- + +## Example III - Ensuring unique values without using compare exchange + +Unique values can also be ensured without using compare-exchange. + +The below example shows how to achieve that by using **reference documents**. +The reference documents' IDs will contain the unique values instead of the compare-exchange items. + +Using reference documents is especially useful when [External Replication](../server/ongoing-tasks/external-replication) +is defined between two databases that need to be synced with unique values. +The reference documents will replicate to the destination database, +as opposed to compare-exchange items, which are not externally replicated. + + +Sessions which process fields that must be unique should be set to [TransactionMode.ClusterWide](../client-api/session/cluster-transaction/overview). + + + +```csharp +// When you create documents that must contain a unique value such as a phone or email, etc., +// you can create reference documents that will have that unique value in their IDs. +// To know if a value already exists, all you need to do is check whether a reference document with such ID exists. + +// The reference document class +class UniquePhoneReference +{ + public class PhoneReference + { + public string Id; + public string CompanyId; + } + + static void Main(string[] args) + { + // A company document class that must be created with a unique 'Phone' field + Company newCompany = new Company + { + Name = "companyName", + Phone = "phoneNumber", + Contact = new Contact + { + Name = "contactName", + Title = "contactTitle" + }, + }; + + void CreateCompanyWithUniquePhone(Company newCompany) + { + // Open a cluster-wide session in your document store + using var session = DocumentStoreHolder.Store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide } + ); + + // Check whether the new company phone already exists + // by checking if there is already a reference document that has the new phone in its ID. + var phoneRefDocument = session.Load("phones/" + newCompany.Phone); + if (phoneRefDocument != null) + { + var msg = $"Phone '{newCompany.Phone}' already exists in ID: {phoneRefDocument.CompanyId}"; + throw new ConcurrencyException(msg); + } + + // If the new phone number doesn't already exist, store the new entity + session.Store(newCompany); + // Store a new reference document with the new phone value in its ID for future checks. + session.Store(new PhoneReference { CompanyId = newCompany.Id }, "phones/" + newCompany.Phone); + + // May fail if called concurrently with the same phone number + session.SaveChanges(); + } + } +} +``` + diff --git a/docs/compare-exchange/content/_overview-java.mdx b/docs/compare-exchange/content/_overview-java.mdx new file mode 100644 index 0000000000..217e335710 --- /dev/null +++ b/docs/compare-exchange/content/_overview-java.mdx @@ -0,0 +1,246 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items are **key/value pairs** where the key is unique across your database. + +* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. + +* In this article: + * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) + * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) + * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) + * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) + + + +--- + +## What compare-exchange items are + +Compare-exchange items are key/value pairs where the key serves as a unique value across your database. + +* Each compare-exchange item contains: + * **A key** - A unique string identifier in the database scope. + * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. + For example, the metadata can be used to set expiration time for the compare-exchange item. + Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + * **Raft index** - The compare-exchange item's version. + Any change to the value or metadata will increase this number. + +* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) + interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. + Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. + +--- + +## Ways to create and manage compare-exchange items + +Compare exchange items can be created and managed using any of the following approaches: + +* **Document Store Operations** + You can create and manage compare-exchange items using _document store_ operations. + For example, see [Create items using a store operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation). + +* **Cluster-Wide Sessions** + You can create and manage compare-exchange items from within a [Cluster-Wide session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction). + For example, see [Create items using a cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + When using a cluster-wide session, the compare-exchange item is created as part of the cluster-wide transaction. + If the session fails, the item creation also fails, and none of the nodes in the database group will store the new compare-exchange item. + +* **Atomic Guards** + When creating _documents_ using a cluster-wide session, RavenDB automatically creates [Atomic Guards](../compare-exchange/atomic-guards), + which are special compare-exchange items that guarantee ACID transactions. + See [Cluster-wide transaction vs. Single-node transaction](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) for a session comparison overview. + +* **Studio** + All compare-exchange items can also be managed from the **Compare-Exchange view** in the [Studio](../todo..): + + ![The compare-exchange view](../assets/the-cmpxchg-view.png) + + 1. Open the **Documents** section in the Studio sidebar. + 2. Click on the **Compare-Exchange** tab. + 3. This is a compare-exchange item. + In this view you can create, edit, and delete compare-exchange items. + +--- + +## Why compare-exchange items are not replicated to external databases + +* Each cluster defines its own policies and configurations, and should ideally have sole responsibility for managing its own documents. + Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) + to learn more about why global database modeling is more efficient this way. + +* When creating a compare-exchange item, a Raft consensus is required from the nodes in the database group. + Externally replicating such data is problematic because the target database may reside within a cluster that is in an + unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. + +* Conflicts between documents that occur between two databases are resolved using the documents' change-vector. + Compare-exchange conflicts cannot be resolved in the same way, as they lack a similar conflict resolution mechanism. + +* To ensure unique values between two databases without using compare-exchange items see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + +* Learn more about Replication in RavenDB in [Replication overview](../server/clustering/replication/replication-overview). + For details about what is and what isn't replicated in [What is Replicated](../server/ongoing-tasks/external-replication#what-is-replicated). + +--- + +## Example I - Email address reservation + +The following example shows how to use compare-exchange to create documents with unique values. +The scope is within the database group on a single cluster. + +Compare-exchange items are not externally replicated to other databases. +To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + + +```java +String email = "user@example.com"; + +User user = new User(); +user.setEmail(email); + +try (IDocumentSession session = store.openSession()) { + session.store(user); + + // At this point, the user document has an Id assigned + + // Try to reserve a new user email + // Note: This operation takes place outside of the session transaction, + // It is a cluster-wide reservation + CompareExchangeResult cmpXchgResult = store + .operations().send( + new PutCompareExchangeValueOperation<>(email, user.getId(), 0)); + + if (!cmpXchgResult.isSuccessful()) { + throw new RuntimeException("Email is already in use"); + } + + // At this point we managed to reserve/save the user email - + // The document can be saved in SaveChanges + session.saveChanges(); +} +``` + + +**Implications**: + +* This compare-exchange item was [created as an operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation) + rather than with a [cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + Thus, if `session.SaveChanges` fails, then the email reservation is Not rolled back automatically. + It is your responsibility to do so. + +* The compare-exchange value that was saved can be accessed in a query using the `CmpXchg` method: + + + + + +{`try (IDocumentSession session = store.openSession()) { + List query = session.advanced().rawQuery(User.class, + "from Users as s where id() == cmpxchg(\\"ayende@ayende.com\\")") + .toList(); + + IDocumentQuery q = session.advanced() + .documentQuery(User.class) + .whereEquals("id", CmpXchg.value("ayende@ayende.com")); +} +`} + + + +```sql +from "Users" +where id() == cmpxchg("ayende@ayende.com") +limit 0, 1 // take the first result +``` + + + +--- + +## Example II - Reserve a shared resource + +In the following example, we use compare-exchange to reserve a shared resource. +The scope is within the database group on a single cluster. + +The code also checks for clients which never release resources (i.e. due to failure) by using timeout. + + + +{`private class SharedResource \{ + private LocalDateTime reservedUntil; + + public LocalDateTime getReservedUntil() \{ + return reservedUntil; + \} + + public void setReservedUntil(LocalDateTime reservedUntil) \{ + this.reservedUntil = reservedUntil; + \} +\} + +public void printWork() throws InterruptedException \{ + // Try to get hold of the printer resource + long reservationIndex = lockResource(store, "Printer/First-Floor", Duration.ofMinutes(20)); + + try \{ + // Do some work for the duration that was set. + // Don't exceed the duration, otherwise resource is available for someone else. + \} finally \{ + releaseResource(store, "Printer/First-Floor", reservationIndex); + \} +\} + +public long lockResource(IDocumentStore store, String resourceName, Duration duration) throws InterruptedException \{ + while (true) \{ + LocalDateTime now = LocalDateTime.now(); + + SharedResource resource = new SharedResource(); + resource.setReservedUntil(now.plus(duration)); + + CompareExchangeResult saveResult = + store.operations().send( + new PutCompareExchangeValueOperation(resourceName, resource, 0)); + + if (saveResult.isSuccessful()) \{ + // resourceName wasn't present - we managed to reserve + return saveResult.getIndex(); + \} + + // At this point, Put operation failed - someone else owns the lock or lock time expired + if (saveResult.getValue().reservedUntil.isBefore(now)) \{ + // Time expired - Update the existing key with the new value + CompareExchangeResult takeLockWithTimeoutResult = + store.operations().send( + new PutCompareExchangeValueOperation<>(resourceName, resource, saveResult.getIndex())); + + if (takeLockWithTimeoutResult.isSuccessful()) \{ + return takeLockWithTimeoutResult.getIndex(); + \} + \} + + // Wait a little bit and retry + Thread.sleep(20); + \} +\} + +public void releaseResource(IDocumentStore store, String resourceName, long index) \{ + CompareExchangeResult deleteResult = store + .operations().send( + new DeleteCompareExchangeValueOperation<>(SharedResource.class, resourceName, index)); + + // We have 2 options here: + // deleteResult.Successful is true - we managed to release resource + // deleteResult.Successful is false - someone else took the lock due to timeout +\} +`} + + diff --git a/docs/compare-exchange/content/_overview-php.mdx b/docs/compare-exchange/content/_overview-php.mdx new file mode 100644 index 0000000000..b25eff4de4 --- /dev/null +++ b/docs/compare-exchange/content/_overview-php.mdx @@ -0,0 +1,368 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items are **key/value pairs** where the key is unique across your database. + +* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. + +* In this article: + * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) + * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) + * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) + * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) + * [Example III - Ensuring unique values without using compare-exchange](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) + + + +--- + +## What compare-exchange items are + +Compare-exchange items are key/value pairs where the key serves as a unique value across your database. + +* Each compare-exchange item contains: + * **A key** - A unique string identifier in the database scope. + * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. + For example, the metadata can be used to set expiration time for the compare-exchange item. + Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + * **Raft index** - The compare-exchange item's version. + Any change to the value or metadata will increase this number. + +* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) + interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. + Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. + +--- + +## Ways to create and manage compare-exchange items + +Compare exchange items can be created and managed using any of the following approaches: + +* **Document Store Operations** + You can create and manage compare-exchange items using _document store_ operations. + For example, see [Create items using a store operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation). + +* **Cluster-Wide Sessions** + You can create and manage compare-exchange items from within a [Cluster-Wide session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction). + For example, see [Create items using a cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + When using a cluster-wide session, the compare-exchange item is created as part of the cluster-wide transaction. + If the session fails, the item creation also fails, and none of the nodes in the database group will store the new compare-exchange item. + +* **Atomic Guards** + When creating _documents_ using a cluster-wide session, RavenDB automatically creates [Atomic Guards](../compare-exchange/atomic-guards), + which are special compare-exchange items that guarantee ACID transactions. + See [Cluster-wide transaction vs. Single-node transaction](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) for a session comparison overview. + +* **Studio** + All compare-exchange items can also be managed from the **Compare-Exchange view** in the [Studio](../todo..): + + ![The compare-exchange view](../assets/the-cmpxchg-view.png) + + 1. Open the **Documents** section in the Studio sidebar. + 2. Click on the **Compare-Exchange** tab. + 3. This is a compare-exchange item. + In this view you can create, edit, and delete compare-exchange items. + +--- + +## Why compare-exchange items are not replicated to external databases + +* Each cluster defines its own policies and configurations, and should ideally have sole responsibility for managing its own documents. + Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) + to learn more about why global database modeling is more efficient this way. + +* When creating a compare-exchange item, a Raft consensus is required from the nodes in the database group. + Externally replicating such data is problematic because the target database may reside within a cluster that is in an + unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. + +* Conflicts between documents that occur between two databases are resolved using the documents' change-vector. + Compare-exchange conflicts cannot be resolved in the same way, as they lack a similar conflict resolution mechanism. + +* To ensure unique values between two databases without using compare-exchange items see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + +* Learn more about Replication in RavenDB in [Replication overview](../server/clustering/replication/replication-overview). + For details about what is and what isn't replicated in [What is Replicated](../server/ongoing-tasks/external-replication#what-is-replicated). + +--- + +## Example I - Email address reservation + +The following example shows how to use compare-exchange to create documents with unique values. +The scope is within the database group on a single cluster. + +Compare-exchange items are not externally replicated to other databases. +To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + + + +{`$email = "user@example.com"; + +$user = new User(); +$user->setEmail($email); + +$session = $store->openSession(); +try \{ + $session->store($user); + + // At this point, the user document has an Id assigned + + // Try to reserve a new user email + // Note: This operation takes place outside of the session transaction, + // It is a cluster-wide reservation + + /** @var CompareExchangeResult $cmpXchgResult */ + $cmpXchgResult = $store->operations()->send(new PutCompareExchangeValueOperation("emails/" . $email, $user->getId(), 0)); + + if (!$cmpXchgResult->isSuccessful()) \{ + throw new RuntimeException("Email is already in use"); + \} + + // At this point we managed to reserve/save the user email - + // The document can be saved in SaveChanges + $session->saveChanges(); +\} finally \{ + $session->close(); +\} +`} + + + +**Implications**: + +* This compare-exchange item was [created as an operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation) + rather than with a [cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + Thus, if `session.SaveChanges` fails, then the email reservation is Not rolled back automatically. + It is your responsibility to do so. + +* The compare-exchange value that was saved can be accessed in a query using the `CmpXchg` method: + + + + +{`$query = $session->advanced()->rawQuery(User::class, + "from Users as s where id() == cmpxchg(\\"emails/ayende@ayende.com\\")") + ->toList(); +`} + + + + +{`$q = $session->advanced() + ->documentQuery(User::class) + ->whereEquals("id", CmpXchg::value("emails/ayende@ayende.com")); +`} + + + + +{`from Users as s where id() == cmpxchg("emails/ayende@ayende.com") +`} + + + + +--- + +## Example II - Reserve a shared resource + +In the following example, we use compare-exchange to reserve a shared resource. +The scope is within the database group on a single cluster. + +The code also checks for clients which never release resources (i.e. due to failure) by using timeout. + + + +{`class SharedResource +\{ + private ?DateTime $reservedUntil = null; + + public function getReservedUntil(): ?DateTime + \{ + return $this->reservedUntil; + \} + + public function setReservedUntil(?DateTime $reservedUntil): void + \{ + $this->reservedUntil = $reservedUntil; + \} +\} + +class CompareExchangeSharedResource +\{ + private ?DocumentStore $store = null; + + public function printWork(): void + \{ + // Try to get hold of the printer resource + $reservationIndex = $this->lockResource($this->store, "Printer/First-Floor", Duration::ofMinutes(20)); + + try \{ + // Do some work for the duration that was set. + // Don't exceed the duration, otherwise resource is available for someone else. + \} finally \{ + $this->releaseResource($this->store, "Printer/First-Floor", $reservationIndex); + \} + \} + + /** throws InterruptedException */ + public function lockResource(DocumentStoreInterface $store, ?string $resourceName, Duration $duration): int + \{ + while (true) \{ + $now = new DateTime(); + + $resource = new SharedResource(); + $resource->setReservedUntil($now->add($duration->toDateInterval())); + + /** @var CompareExchangeResult $saveResult */ + $saveResult = $store->operations()->send( + new PutCompareExchangeValueOperation($resourceName, $resource, 0)); + + if ($saveResult->isSuccessful()) \{ + // resourceName wasn't present - we managed to reserve + return $saveResult->getIndex(); + \} + + // At this point, Put operation failed - someone else owns the lock or lock time expired + if ($saveResult->getValue()->getReservedUntil() < $now) \{ + // Time expired - Update the existing key with the new value + /** @var CompareExchangeResult takeLockWithTimeoutResult */ + $takeLockWithTimeoutResult = $store->operations()->send( + new PutCompareExchangeValueOperation($resourceName, $resource, $saveResult->getIndex())); + + if ($takeLockWithTimeoutResult->isSuccessful()) \{ + return $takeLockWithTimeoutResult->getIndex(); + \} + \} + + // Wait a little bit and retry + usleep(20000); + \} + \} + + public function releaseResource(DocumentStoreInterface $store, ?string $resourceName, int $index): void + \{ + $deleteResult = $store->operations()->send( + new DeleteCompareExchangeValueOperation(SharedResource::class, $resourceName, $index) + ); + + // We have 2 options here: + // $deleteResult->isSuccessful is true - we managed to release resource + // $deleteResult->isSuccessful is false - someone else took the lock due to timeout + \} +\} +`} + + + +--- + +## Example III - Ensuring unique values without using compare-exchange + +Unique values can also be ensured without using compare-exchange. + +The below example shows how to achieve that by using **reference documents**. +The reference documents' IDs will contain the unique values instead of the compare-exchange items. + +Using reference documents is especially useful when [External Replication](../server/ongoing-tasks/external-replication) +is defined between two databases that need to be synced with unique values. +The reference documents will replicate to the destination database, +as opposed to compare-exchange items, which are not externally replicated. + + +Sessions which process fields that must be unique should be set to [TransactionMode::clusterWide()](../client-api/session/cluster-transaction/overview). + + + + +{`// When you create documents that must contain a unique value such as a phone or email, etc., +// you can create reference documents that will have that unique value in their IDs. +// To know if a value already exists, all you need to do is check whether a reference document with such ID exists. + +public + +class PhoneReference +\{ + public ?string $id = null; + public ?string $companyId = null; + + public function getId(): ?string + \{ + return $this->id; + \} + + public function setId(?string $id): void + \{ + $this->id = $id; + \} + + public function getCompanyId(): ?string + \{ + return $this->companyId; + \} + + public function setCompanyId(?string $companyId): void + \{ + $this->companyId = $companyId; + \} +\} + +// The reference document class +class UniquePhoneReference +\{ + public function sample(): void + \{ + // A company document class that must be created with a unique 'Phone' field + $newCompany = new Company(); + $newCompany->setName("companyName"); + $newCompany->setPhone("phoneNumber"); + + $newContact = new Contact(); + $newContact->setName("contactName"); + $newContact->setTitle("contactTitle"); + + $newCompany->setContact($newContact); + + $this->createCompanyWithUniquePhone($newCompany); + \} + + public function createCompanyWithUniquePhone(Company $newCompany): void + \{ + // Open a cluster-wide session in your document store + $sessionOptions = new SessionOptions(); + $sessionOptions->setTransactionMode(TransactionMode::clusterWide()); + $session = DocumentStoreHolder::getStore()->openSession($sessionOptions); + + try \{ + // Check whether the new company phone already exists + // by checking if there is already a reference document that has the new phone in its ID. + $phoneRefDocument = $session->load(PhoneReference::class, "phones/" . $newCompany->getPhone()); + if ($phoneRefDocument != null) \{ + $msg = "Phone '" . $newCompany->getPhone() . "' already exists in ID: " . $phoneRefDocument->getCompanyId(); + throw new ConcurrencyException($msg); + \} + + // If the new phone number doesn't already exist, store the new entity + $session->store($newCompany); + // Store a new reference document with the new phone value in its ID for future checks. + $newPhoneReference = new PhoneReference(); + $newPhoneReference->setCompanyId($newCompany->getId()); + $session->store($newPhoneReference, "phones/" . $newCompany->getPhone()); + + // May fail if called concurrently with the same phone number + $session->saveChanges(); + \} finally \{ + $session->close(); + \} + \} +\} +`} + + diff --git a/docs/compare-exchange/content/_overview-python.mdx b/docs/compare-exchange/content/_overview-python.mdx new file mode 100644 index 0000000000..33ce33b830 --- /dev/null +++ b/docs/compare-exchange/content/_overview-python.mdx @@ -0,0 +1,276 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Compare-exchange items are **key/value pairs** where the key is unique across your database. + +* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. + +* In this article: + * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) + * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) + * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) + * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) + * [Example III - Ensuring unique values without using compare-exchange](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) + + + +--- + +## What compare-exchange items are + +Compare-exchange items are key/value pairs where the key serves as a unique value across your database. + +* Each compare-exchange item contains: + * **A key** - A unique string identifier in the database scope. + * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. + For example, the metadata can be used to set expiration time for the compare-exchange item. + Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + * **Raft index** - The compare-exchange item's version. + Any change to the value or metadata will increase this number. + +* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) + interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. + Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. + +--- + +## Ways to create and manage compare-exchange items + +Compare exchange items can be created and managed using any of the following approaches: + +* **Document Store Operations** + You can create and manage compare-exchange items using _document store_ operations. + For example, see [Create items using a store operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation). + +* **Cluster-Wide Sessions** + You can create and manage compare-exchange items from within a [Cluster-Wide session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction). + For example, see [Create items using a cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + When using a cluster-wide session, the compare-exchange item is created as part of the cluster-wide transaction. + If the session fails, the item creation also fails, and none of the nodes in the database group will store the new compare-exchange item. + +* **Atomic Guards** + When creating _documents_ using a cluster-wide session, RavenDB automatically creates [Atomic Guards](../compare-exchange/atomic-guards), + which are special compare-exchange items that guarantee ACID transactions. + See [Cluster-wide transaction vs. Single-node transaction](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction) for a session comparison overview. + +* **Studio** + All compare-exchange items can also be managed from the **Compare-Exchange view** in the [Studio](../todo..): + + ![The compare-exchange view](../assets/the-cmpxchg-view.png) + + 1. Open the **Documents** section in the Studio sidebar. + 2. Click on the **Compare-Exchange** tab. + 3. This is a compare-exchange item. + In this view you can create, edit, and delete compare-exchange items. + +--- + +## Why compare-exchange items are not replicated to external databases + +* Each cluster defines its own policies and configurations, and should ideally have sole responsibility for managing its own documents. + Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) + to learn more about why global database modeling is more efficient this way. + +* When creating a compare-exchange item, a Raft consensus is required from the nodes in the database group. + Externally replicating such data is problematic because the target database may reside within a cluster that is in an + unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. + +* Conflicts between documents that occur between two databases are resolved using the documents' change-vector. + Compare-exchange conflicts cannot be resolved in the same way, as they lack a similar conflict resolution mechanism. + +* To ensure unique values between two databases without using compare-exchange items see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + +* Learn more about Replication in RavenDB in [Replication overview](../server/clustering/replication/replication-overview). + For details about what is and what isn't replicated in [What is Replicated](../server/ongoing-tasks/external-replication#what-is-replicated). + +--- + +## Example I - Email address reservation + +The following example shows how to use compare-exchange to create documents with unique values. +The scope is within the database group on a single cluster. + +Compare-exchange items are not externally replicated to other databases. +To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). + + + +{`email = "user@example.com" + +user = User(email=email) + +with store.open_session() as session: + session.store(user) + # At this point, the user document has an Id assigned + + # Try to reserve a new user email + # Note: This operation takes place outside the session transaction, + # It is a cluster-wide reservation + cmp_xchg_result = store.operations.send(PutCompareExchangeValueOperation(f"emails/\{email\}", user.Id, 0)) + + if cmp_xchg_result.successful is False: + raise RuntimeError("Email is already in use") + + # At this point we managed to reserve/save the user mail - + # The document can be saved in save_changes + session.save_changes() +`} + + + +**Implications**: + +* This compare-exchange item was [created as an operation](../compare-exchange/create-cmpxchg-items#create-items-using-a-store-operation) + rather than with a [cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). + Thus, if `session.SaveChanges` fails, then the email reservation is Not rolled back automatically. + It is your responsibility to do so. + +* The compare-exchange value that was saved can be accessed in a query using the `CmpXchg` method: + + + + +{`query = sesion.query(object_type=User).where_equals("Id", CmpXchg.value("emails/ayende@ayende.com")) +`} + + + + +{`from Users as s where id() == cmpxchg("emails/ayende@ayende.com") +`} + + + + +--- + +## Example II - Reserve a shared resource + +In the following example, we use compare-exchange to reserve a shared resource. +The scope is within the database group on a single cluster. + +The code also checks for clients which never release resources (i.e. due to failure) by using timeout. + + + +{`class SharedResource: + def __init__(self, reserved_until: datetime = None): + self.reserved_until = reserved_until + +def print_work() -> None: + # Try to get hold of the printer resource + reservation_index = lock_resource(store, "Printer/First-Floor", timedelta(minutes=20)) + + try: + ... + # Do some work for the duration that was set + # Don't exceed the duration, otherwise resource is available for someone else + finally: + release_resource(store, "Printer/First-Floor", reservation_index) + +def lock_resource(document_store: DocumentStore, resource_name: str, duration: timedelta): + while True: + now = datetime.utcnow() + + resource = SharedResource(reserved_until=now + duration) + save_result = document_store.operations.send( + PutCompareExchangeValueOperation(resource_name, resource, 0) + ) + + if save_result.successful: + # resource_name wasn't present - we managed to reserve + return save_result.index + + # At this point, Put operation failed - someone else owns the lock or lock time expired + if save_result.value.reserved_until < now: + # Time expired - Update the existing key with new value + take_lock_with_timeout_result = document_store.operations.send( + PutCompareExchangeValueOperation(resource_name, resource, save_result.index) + ) + + if take_lock_with_timeout_result.successful: + return take_lock_with_timeout_result.index + + # Wait a little bit and retry + time.sleep(0.02) + +def release_resource(store: DocumentStore, resource_name: str, index: int) -> None: + delete_result = store.operations.send(DeleteCompareExchangeValueOperation(resource_name, index)) + + # We have 2 options here: + # delete_result.successful is True - we managed to release resource + # delete_result.successful is False - someone else took the lock due to timeout +`} + + + +--- + +## Example III - Ensuring unique values without using compare-exchange + +Unique values can also be ensured without using compare-exchange. + +The below example shows how to achieve that by using **reference documents**. +The reference documents' IDs will contain the unique values instead of the compare-exchange items. + +Using reference documents is especially useful when [External Replication](../server/ongoing-tasks/external-replication) +is defined between two databases that need to be synced with unique values. +The reference documents will replicate to the destination database, +as opposed to compare-exchange items, which are not externally replicated. + + +Sessions which process fields that must be unique should be set to [TransactionMode.CLUSTER_WIDE](../client-api/session/cluster-transaction/overview). + + + + +{`# When you create documents that must contain a unique value such as a phone or email, etc., +# you can create reference documents that will have that unique value in their IDs. +# To know if a value already exists, all you need to do is check whether a reference document with such ID exists. + +# The reference document class +class UniquePhoneReference: + class PhoneReference: + def __init__(self, Id: str = None, company_id: str = None): + self.Id = Id + self.company_id = company_id + + def main(self): + # A company document class that must be created with a unique 'Phone' field + new_company = Company( + name="companyName", phone="phoneNumber", contact=Contact(name="contactName", title="contactTitle") + ) + + def create_company_with_unique_phone(new_company: Company) -> None: + # Open a cluster-wide session in your document store + with store.open_session( + session_options=SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) + ) as session: + # Check whether the new company phone already exists + # by checking if there is already a reference document that has the new phone in its ID. + phone_ref_document = session.load(f"phones/\{new_company.phone\}") + if phone_ref_document is not None: + msg = f"Phone '\{new_company.phone\}' already exists, store the new entity" + raise RuntimeError(msg) + + # If the new phone number doesn't already exist, store the new entity + session.store(new_company) + # Store a new reference document with the new phone value in its ID for future checks + session.store( + UniquePhoneReference.PhoneReference(company_id=new_company.Id), + f"phones/\{new_company.phone\}", + ) + + # May fail if called concurrently with the same phone number + session.save_changes() +`} + + diff --git a/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx b/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx new file mode 100644 index 0000000000..2a11b54bbb --- /dev/null +++ b/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx @@ -0,0 +1,236 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* An existing compare-exchange item can be updated in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* In this article: + * [Update compare-exchange item using a **cluster-wide session**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-cluster-wide-session) + * [Update compare-exchange item using a **store operation**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-store-operation) + * [Update compare-exchange item using the **Studio**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-the-studio) + * [Syntax](../compare-exchange/update-cmpxchg-item#syntax) + + + +--- + +## Update compare-exchange item using a cluster-wide session + + + +```csharp +// The session must be opened in cluster-wide mode. +using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) +{ + // Get the existing item from the server + // ===================================== + + CompareExchangeValue item = session.Advanced.ClusterTransaction + .GetCompareExchangeValue("user1-name@example.com"); + + // The item is now tracked in the session's internal state + // Modify the value / metadata as needed + // ===================================== + + item.Value = "users/99"; + item.Metadata["email-type"] = "work email"; + item.Metadata["updated-at"] = DateTime.UtcNow.ToString("o"); + + // Save changes for the update to take effect + // ========================================== + + session.SaveChanges(); + + // A 'ClusterTransactionConcurrencyException' is thrown if the compare-exchange item + // no longer exists on the server at the time of calling saveChanges(). + // This can happen if another client deletes or modifies the item before your update is saved. +} +``` + + +```csharp +// The session must be opened in cluster-wide mode. +using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) +{ + // Get the existing item from the server + // ===================================== + + CompareExchangeValue item = await asyncSession.Advanced.ClusterTransaction + .GetCompareExchangeValueAsync("user1-name@example.com"); + + // The item is now tracked in the session's internal state + // Modify the value / metadata as needed + // ===================================== + + item.Value = "users/99"; + item.Metadata["email-type"] = "work email"; + item.Metadata["updated-at"] = DateTime.UtcNow.ToString("o"); + + // Save changes for the update to take effect + // ========================================== + + await asyncSession.SaveChangesAsync(); +} +``` + + + +--- + +## Update compare-exchange item using a store operation + +* Use `PutCompareExchangeValueOperation` to **update the _value_ and/or _metadata_** of an existing compare-exchange item. + This operation is also used to create new compare-exchange items, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + +* To perform an update, provide: + * The existing key + * A new value and/or metadata + * The latest index (version) of the item as last seen by the client. + +* The update will succeed only if the index you provide exactly matches the current index stored on the server for that key. + This ensures that the item hasn’t been modified by another client since you last read it. + +* If the index does not match, or if the specified key does not exist: + * The item is not updated. + * No exception is thrown. + * The operation result has `Successful = false`. + +* If the update is successful: + * The value and/or metadata are updated. + * The server increments the index number of the item. + * The operation result has `Successful = true` and will contain the new value and new index. + + + +```csharp +// Get the existing item from the server +// ===================================== + +CompareExchangeValue item = store.Operations.Send( + new GetCompareExchangeValueOperation("user1-name@example.com")); + +// Modify the value / metadata as needed +// ===================================== + +var newValue = "users/99"; // Modify the value to be associated with the unique email key +var newMetadata = new MetadataAsDictionary +{ + { "email-type", "work email" }, + { "updated-at", DateTime.UtcNow.ToString("o") } // Add entries / modify the metadata +}; + +// Update the item +// =============== + +// The put operation will succeed only if the 'index' of the compare-exchange item +// has not changed between the read and write operations. +CompareExchangeResult putResult = store.Operations.Send( + new PutCompareExchangeValueOperation(item.Key, newValue, item.Index, newMetadata)); + +// Check results +// ============= + +bool putResultSuccessful = putResult.Successful; // Has operation succeeded +long putResultIndex = putResult.Index; // The new version number assigned if update succeeded +``` + + +```csharp +// Get the existing item from the server +// ===================================== + +CompareExchangeValue item = await store.Operations.SendAsync( + new GetCompareExchangeValueOperation("user1-name@example.com")); + +// Modify the value / metadata as needed +// ===================================== + +var newValue = "users/99"; // Modify the value associated with the unique email key +var newMetadata = new MetadataAsDictionary +{ + { "email-type", "work email" }, + { "updated-at", DateTime.UtcNow.ToString("o") } // Add entries / modify the metadata +}; + +// Update the item +// =============== + +// The put operation will succeed only if the 'index' of the compare-exchange item +// has not changed between the read and write operations. +CompareExchangeResult putResult = await store.Operations.SendAsync( + new PutCompareExchangeValueOperation(item.Key, newValue, item.Index, newMetadata)); + +// Check results +// ============= + +bool putResultSuccessful = putResult.Successful; // Has operation succeeded +long putResultIndex = putResult.Index; // The new version number assigned if update succeeded +``` + + + +--- + +## Update compare-exchange item using the Studio + +You can update any existing compare-exchange item from the Studio. + +![The compare-exchange view](../assets/update-cmpxchg-1.png) + +1. Go to **Documents > Compare Exchange**. +2. Click to edit a compare-exchange item. + +--- + +![The compare-exchange view](../assets/update-cmpxchg-2.png) + +1. Enter the value. +2. Enter the metadata (optional). +3. Click _Save_ to update the item. + +--- + +## Syntax + +**Method**: + + +```csharp +public PutCompareExchangeValueOperation( + string key, T value, long index, IMetadataDictionary metadata = null) +``` + + +| Parameter | Type | Description | +|--------------|----------|-------------------------------------------------------------------------------------------------------------------------| +| **key** | `string` | The unique identifier in the database scope. | +| **value** | `T` | The value to be saved for the specified _key_.
Can be any object (number, string, array, or any valid JSON object). | +| **index** | `long` | The current version of the item when updating an existing item.
Pass `0` to [create a new key](../compare-exchange/create-cmpxchg-items). | +| **metadata** | `IMetadataDictionary` | Metadata to be saved for the specified key.
Must be a valid JSON object. | + +**Returned object**: + + +```csharp +public class CompareExchangeResult +{ + public bool Successful; + public T Value; + public long Index; +} +``` + + +| Return Value | Type | Description | +|---------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| **Successful**| `bool` |
  • _true_ if the put operation has completed successfully.
  • _false_ if the put operation failed.
| +| **Value** | `T` |
  • Upon success - the value of the compare-exchange item that was saved.
  • Upon failure - the existing value on the server.
| +| **Index** | `long` |
  • Upon success - the updated version (the incremented index of the modified item).
  • Upon failure (if indexes do not match) - the existing version from the server.
| diff --git a/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx b/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx new file mode 100644 index 0000000000..bd12e950e5 --- /dev/null +++ b/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx @@ -0,0 +1,140 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* Use `PutCompareExchangeValueOperation` to **update the _value_ and/or _metadata_** of an existing compare-exchange item. + This operation is also used to create new compare-exchange items, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + +* To perform an update, provide: + * The existing key + * A new value and/or metadata + * The latest index (version) of the item as last seen by the client. + +* The update will succeed only if the index you provide exactly matches the current index stored on the server for that key. + This ensures that the item hasn’t been modified by another client since you last read it. + +* If the index does not match, or if the specified key does not exist: + * The item is not updated. + * No exception is thrown. + * The operation result has `Successful = false`. + +* If the update is successful: + * The value and/or metadata are updated. + * The server increments the index number of the item. + * The operation result has `Successful = true` and will contain the new value and new index. + +--- + +* In this article: + * [Update compare-exchange item using a **store operation**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-store-operation) + * [Update compare-exchange item using the **Studio**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-the-studio) + * [Syntax](../compare-exchange/update-cmpxchg-item#syntax) + + + +--- + +## Update compare-exchange item using a Store operation + + + +```java +// Get existing value +CompareExchangeValue readResult + = store.operations().send( + new GetCompareExchangeValueOperation<>(User.class, "AdminUser")); + +readResult.getValue().setAge(readResult.getValue().getAge() + 1); + +// Update value +CompareExchangeResult saveResult + = store.operations().send( + new PutCompareExchangeValueOperation<>("AdminUser", readResult.getValue(), readResult.getIndex())); + +// The save result is successful only if 'index' wasn't changed between the read and write operations +boolean saveResultSuccessful = saveResult.isSuccessful(); +``` + + + +--- + +## Update compare-exchange item using the Studio + +You can update any existing compare-exchange item from the Studio. + +![The compare-exchange view](../assets/update-cmpxchg-1.png) + +1. Go to **Documents > Compare Exchange**. +2. Click to edit a compare-exchange item. + +--- + +![The compare-exchange view](../assets/update-cmpxchg-2.png) + +1. Enter the value. +2. Enter the metadata (optional). +3. Click _Save_ to update the item. + +--- + +## Syntax + +**Method**: + + +```java +public PutCompareExchangeValueOperation(String key, T value, long index) +``` + + +| Parameter | Type | Description | +|--------------|----------|------------------------------------------------| +| **key** | `String` | The unique identifier in the database scope. | +| **value** | `T` | The value to be saved for the specified _key_. | +| **index** | `long` | The current version of the item when updating an existing item. | + +**Returned object**: + + +```java +public class CompareExchangeResult { + private T value; + private long index; + private boolean successful; + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + + public long getIndex() { + return index; + } + + public void setIndex(long index) { + this.index = index; + } + + public boolean isSuccessful() { + return successful; + } + + public void setSuccessful(boolean successful) { + this.successful = successful; + } +} +``` + + +| Return Value | Type | Description | +|---------------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| **Successful**| `boolean` |
  • _true_ if the put operation has completed successfully.
  • _false_ if the put operation failed.
| +| **Value** | `T` |
  • Upon success - the value of the compare-exchange item that was saved.
  • Upon failure - the existing value on the server.
| +| **Index** | `long` |
  • Upon success - the updated version (the incremented index of the modified item).
  • Upon failure (if indexes do not match) - the existing version from the server.
| diff --git a/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx b/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx new file mode 100644 index 0000000000..3f057dd940 --- /dev/null +++ b/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx @@ -0,0 +1,178 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + + +* An existing compare-exchange item can be updated in the following ways: + * Using a cluster-wide session + * Using a store operation + * Using the Studio + +* In this article: + * [Update compare-exchange item using a **cluster-wide session**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-cluster-wide-session) + * [Update compare-exchange item using a **store operation**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-a-store-operation) + * [Update compare-exchange item using the **Studio**](../compare-exchange/update-cmpxchg-item#update-compare-exchange-item-using-the-studio) + * [Syntax](../compare-exchange/update-cmpxchg-item#syntax) + + + +--- + +## Update compare-exchange item using a cluster-wide session + + + +```csharp +// The session must be opened in cluster-wide mode. +const session = documentStore.openSession({ + transactionMode: "ClusterWide" +}); + +// Get the existing item from the server +// ===================================== + +const item = await session.advanced.clusterTransaction + .getCompareExchangeValue("user1-name@example.com"); + +// The item is now tracked in the session's internal state +// Modify the value / metadata as needed +// ===================================== + +item.value = "users/99"; +item.metadata["email-type"] = "work email"; +item.metadata["updated-at"] = new Date().toISOString(); + +// Save changes for the update to take effect +// ========================================== + +await session.saveChanges(); + +// A 'ClusterTransactionConcurrencyException' is thrown if the compare-exchange item +// no longer exists on the server at the time of calling saveChanges(). +// This can happen if another client deletes or modifies the item before your update is saved. +``` + + + +--- + +## Update compare-exchange item using a Store operation + +* Use `PutCompareExchangeValueOperation` to **update the _value_ and/or _metadata_** of an existing compare-exchange item. + This operation is also used to create new compare-exchange items, see [Create compare-exchange item](../compare-exchange/create-cmpxchg-items). + +* To perform an update, provide: + * The existing key + * A new value and/or metadata + * The latest index (version) of the item as last seen by the client. + +* The update will succeed only if the index you provide exactly matches the current index stored on the server for that key. + This ensures that the item hasn’t been modified by another client since you last read it. + +* If the index does not match, or if the specified key does not exist: + * The item is not updated. + * No exception is thrown. + * The operation result has `Successful = false`. + +* If the update is successful: + * The value and/or metadata are updated. + * The server increments the index number of the item. + * The operation result has `Successful = true` and will contain the new value and new index. + + + +```js +// Get the existing item from the server +// ===================================== + +const getCmpXchgOp = new GetCompareExchangeValueOperation("user1-name@example.com"); +const item = await documentStore.operations.send(getCmpXchgOp); + +// Modify the value / metadata as needed +// ===================================== + +const newValue = "users/99"; // Modify the value associated with the unique email key +const newMetadata = { + "email-type": "work email", + "updated-at": new Date().toISOString() // Add entries / modify the metadata +}; + +// Update the item +// =============== + +// The put operation will succeed only if the 'index' of the compare-exchange item +// has not changed between the read and write operations. +const putCmpXchgOp = new PutCompareExchangeValueOperation(item.key, newValue, item.index, newMetadata); +const putResult = await documentStore.operations.send(putCmpXchgOp); + +// Check results +// ============= + +const successful = putResult.successful; // Has operation succeeded +const indexForItem = putResult.index; // The new version number assigned if update succeeded +``` + + + +--- + +## Update compare-exchange item using the Studio + +You can update any existing compare-exchange item from the Studio. + +![The compare-exchange view](../assets/update-cmpxchg-1.png) + +1. Go to **Documents > Compare Exchange**. +2. Click to edit a compare-exchange item. + +--- + +![The compare-exchange view](../assets/update-cmpxchg-2.png) + +1. Enter the value. +2. Enter the metadata (optional). +3. Click _Save_ to update the item. + +--- + +## Syntax + +**Method**: + + +```js +// Available overloads: +// ==================== +const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index); +const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index, metadata); +``` + + +| Parameter | Type | Description | +|--------------|----------|-------------------------------------------------------------------------------------------------------------------------| +| **key** | `string` | The unique identifier in the database scope. | +| **value** | `object` | The value to be saved for the specified _key_.
Can be any object (number, string, array, or any valid JSON object). | +| **index** | `number` | The current version of the item when updating an existing item.
Pass `0` to [create a new key](../compare-exchange/create-cmpxchg-items). | +| **metadata** | `object` | Metadata to be saved for the specified key.
Must be a valid JSON object. | + +**Returned object**: + + +```js +// Return value of store.operations.send(putCmpXchgOp) +// =================================================== +class CompareExchangeResult { + successful; + value; + index; +} +``` + + +| Return Value | Type | Description | +|---------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| **Successful**| `bool` |
  • _true_ if the put operation has completed successfully.
  • _false_ if the put operation failed.
| +| **Value** | `T` |
  • Upon success - the value of the compare-exchange item that was saved.
  • Upon failure - the existing value on the server.
| +| **Index** | `long` |
  • Upon success - the updated version (the incremented index of the modified item).
  • Upon failure (if indexes do not match) - the existing version from the server.
| diff --git a/docs/compare-exchange/create-cmpxchg-items.mdx b/docs/compare-exchange/create-cmpxchg-items.mdx new file mode 100644 index 0000000000..a9b6a98bf0 --- /dev/null +++ b/docs/compare-exchange/create-cmpxchg-items.mdx @@ -0,0 +1,48 @@ +--- +title: "Create Compare-Exchange Items" +hide_table_of_contents: true +sidebar_label: "Create Compare-Exchange Items" +sidebar_position: 2 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import CreateCmpXchgItemsCsharp from './content/_create-cmpxchg-items-csharp.mdx'; +import CreateCmpXchgItemsJava from './content/_create-cmpxchg-items-java.mdx'; +import CreateCmpXchgItemsNodejs from './content/_create-cmpxchg-items-nodejs.mdx'; +import CreateCmpXchgItemsPython from './content/_create-cmpxchg-items-python.mdx'; +import CreateCmpXchgItemsPhp from './content/_create-cmpxchg-items-php.mdx'; + +export const supportedLanguages = ["csharp", "java", "python", "php", "nodejs"]; + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/delete-cmpxchg-items.mdx b/docs/compare-exchange/delete-cmpxchg-items.mdx new file mode 100644 index 0000000000..8d36c64cc6 --- /dev/null +++ b/docs/compare-exchange/delete-cmpxchg-items.mdx @@ -0,0 +1,46 @@ +--- +title: "Delete Compare-Exchange Items" +hide_table_of_contents: true +sidebar_label: "Delete Compare-Exchange Items" +sidebar_position: 5 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import DeleteCmpXchgItemsCsharp from './content/_delete-cmpxchg-items-csharp.mdx'; +import DeleteCmpXchgItemsJava from './content/_delete-cmpxchg-items-java.mdx'; +import DeleteCmpXchgItemsNodejs from './content/_delete-cmpxchg-items-nodejs.mdx'; +import DeleteCmpXchgItemsPython from './content/_delete-cmpxchg-items-python.mdx'; +import DeleteCmpXchgItemsPhp from './content/_delete-cmpxchg-items-php.mdx'; + +export const supportedLanguages = ["csharp", "java", "python", "php", "nodejs"]; + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/get-cmpxchg-item.mdx b/docs/compare-exchange/get-cmpxchg-item.mdx new file mode 100644 index 0000000000..7d3204c85d --- /dev/null +++ b/docs/compare-exchange/get-cmpxchg-item.mdx @@ -0,0 +1,46 @@ +--- +title: "Get Compare-Exchange Item" +hide_table_of_contents: true +sidebar_label: "Get Compare-Exchange Item" +sidebar_position: 3 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import GetCmpXchgItemCsharp from './content/_get-cmpxchg-item-csharp.mdx'; +import GetCmpXchgItemJava from './content/_get-cmpxchg-item-java.mdx'; +import GetCmpXchgItemNodejs from './content/_get-cmpxchg-item-nodejs.mdx'; +import GetCmpXchgItemPython from './content/_get-cmpxchg-item-python.mdx'; +import GetCmpXchgItemPhp from './content/_get-cmpxchg-item-php.mdx'; + +export const supportedLanguages = ["csharp", "java", "python", "php", "nodejs"]; + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/get-cmpxchg-items.mdx b/docs/compare-exchange/get-cmpxchg-items.mdx new file mode 100644 index 0000000000..21adaf744d --- /dev/null +++ b/docs/compare-exchange/get-cmpxchg-items.mdx @@ -0,0 +1,46 @@ +--- +title: "Get Multiple Compare-Exchange Items" +hide_table_of_contents: true +sidebar_label: "Get Compare-Exchange Items" +sidebar_position: 4 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import GetCmpXchgItemsCsharp from './content/_get-cmpxchg-items-csharp.mdx'; +import GetCmpXchgItemsJava from './content/_get-cmpxchg-items-java.mdx'; +import GetCmpXchgItemsNodejs from './content/_get-cmpxchg-items-nodejs.mdx'; +import GetCmpXchgItemsPython from './content/_get-cmpxchg-items-python.mdx'; +import GetCmpXchgItemsPhp from './content/_get-cmpxchg-items-php.mdx'; + +export const supportedLanguages = ["csharp", "java", "python", "php", "nodejs"]; + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/include-cmpxchg-items.mdx b/docs/compare-exchange/include-cmpxchg-items.mdx new file mode 100644 index 0000000000..fd60e9878b --- /dev/null +++ b/docs/compare-exchange/include-cmpxchg-items.mdx @@ -0,0 +1,33 @@ +--- +title: "Include Compare-Exchange Items" +hide_table_of_contents: true +sidebar_label: "Include Compare-Exchange Items" +sidebar_position: 7 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import IncludeCmpXchgItemsCsharp from './content/_include-compare-exchange-items-csharp.mdx'; +import IncludeCmpXchgItemsNodejs from './content/_include-compare-exchange-items-nodejs.mdx'; + +export const supportedLanguages = ["csharp", "nodejs"]; + + + + + + + + + + + + diff --git a/docs/compare-exchange/indexing-cmpxchg-values.mdx b/docs/compare-exchange/indexing-cmpxchg-values.mdx new file mode 100644 index 0000000000..33b7ee1ac3 --- /dev/null +++ b/docs/compare-exchange/indexing-cmpxchg-values.mdx @@ -0,0 +1,42 @@ +--- +title: "Indexing Compare-Exchange Values" +hide_table_of_contents: true +sidebar_label: "Indexing Compare-Exchange Values" +sidebar_position: 8 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import IndexingCmpXchgValuesCsharp from './content/_indexing-compare-exchange-values-csharp.mdx'; +import IndexingCmpXchgValuesJava from './content/_indexing-compare-exchange-values-java.mdx'; +import IndexingCmpXchgValuesNodejs from './content/_indexing-compare-exchange-values-nodejs.mdx'; + +export const supportedLanguages = ["csharp", "java", "nodejs"]; + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/overview.mdx b/docs/compare-exchange/overview.mdx new file mode 100644 index 0000000000..510d9e2c59 --- /dev/null +++ b/docs/compare-exchange/overview.mdx @@ -0,0 +1,45 @@ +--- +title: "Compare Exchange Overview" +hide_table_of_contents: true +sidebar_label: Overview +sidebar_position: 1 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import OverviewCsharp from './content/_overview-csharp.mdx'; +import OverviewJava from './content/_overview-java.mdx'; +import OverviewPython from './content/_overview-python.mdx'; +import OverviewPhp from './content/_overview-php.mdx'; + +export const supportedLanguages = ["csharp", "java", "python", "php"]; + + + + + + + + + + + + + + + + + + + + diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx new file mode 100644 index 0000000000..f1734ee065 --- /dev/null +++ b/docs/compare-exchange/start.mdx @@ -0,0 +1,40 @@ +--- +title: "Start" +hide_table_of_contents: true +sidebar_label: "Start" +sidebar_position: 0 +--- + +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +### Overview + +todo.. + +### Use cases + +todo.. + +### Blog posts + +* [Distributed compare-exchange operations with RavenDB](https://ayende.com/blog/182948-C/distributed-compare-exchange-operations-with-ravendb) +* [Cluster wide ACID transactions](https://ayende.com/blog/183426-C/ravendb-4-1-features-cluster-wide-acid-transactions) +* [Complex distributed transactions with RavenDB](https://ayende.com/blog/190978-B/complex-distributed-transactions-with-ravendb) + +### RavenDB Demo + +* https://demo.ravendb.net/demos/csharp/compare-exchange/create-compare-exchange + +### Documentation articles + +* [Overview](../compare-exchange/overview) +* [Create Compare-Exchange Items](../compare-exchange/create-cmpxchg-items) + +### In-depth articles + +todo... diff --git a/docs/compare-exchange/update-cmpxchg-item.mdx b/docs/compare-exchange/update-cmpxchg-item.mdx new file mode 100644 index 0000000000..e871f63245 --- /dev/null +++ b/docs/compare-exchange/update-cmpxchg-item.mdx @@ -0,0 +1,37 @@ +--- +title: "Update Compare-Exchange Item" +hide_table_of_contents: true +sidebar_label: "Update Compare-Exchange Item" +sidebar_position: 6 +--- + +import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; +import LanguageContent from "@site/src/components/LanguageContent"; + +import UpdateCmpXchgItemCsharp from './content/_update-cmpxchg-item-csharp.mdx'; +import UpdateCmpXchgItemJava from './content/_update-cmpxchg-item-java.mdx'; +import UpdateCmpXchgItemNodejs from './content/_update-cmpxchg-item-nodejs.mdx'; + +export const supportedLanguages = ["csharp", "java", "nodejs"]; + + + + + + + + + + + + + + + + diff --git a/sidebars.ts b/sidebars.ts index 2eefd0ccda..24afb6cc99 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -1,85 +1,90 @@ - import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; +import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; const sidebars: SidebarsConfig = { - docs: [ - { - type: 'doc', - id: 'home', - label: 'Home', - className: 'hidden' // <-- This makes the default item invisible, while still rendering the sidebar - }, - { - type: 'doc', - id: 'whats-new', - label: 'Whats New', - className: 'hidden' - }, - { - type: 'category', - label: 'Getting Started', - items: [{ type: 'autogenerated', dirName: 'start' }], - }, - { - type: 'category', - label: 'Client API', - items: [{ type: 'autogenerated', dirName: 'client-api' }], - }, - { - type: 'category', - label: 'Indexes', - items: [{ type: 'autogenerated', dirName: 'indexes' }], - }, - { - type: 'category', - label: 'Document Extensions', - items: [{ type: 'autogenerated', dirName: 'document-extensions' }], - }, - { - type: 'category', - label: 'Data Archival', - items: [{ type: 'autogenerated', dirName: 'data-archival' }], - }, - { - type: 'category', - label: 'Server', - items: [{ type: 'autogenerated', dirName: 'server' }], - }, - { - type: 'category', - label: 'Studio', - items: [{ type: 'autogenerated', dirName: 'studio' }], - }, - { - type: 'category', - label: 'Migration Guide', - items: [{ type: 'autogenerated', dirName: 'migration' }], - }, - { - type: 'category', - label: 'Integrations', - items: [{ type: 'autogenerated', dirName: 'integrations' }], - }, - { - type: 'category', - label: 'AI Integration', - items: [{ type: 'autogenerated', dirName: 'ai-integration' }], - }, - { - type: 'category', - label: 'Glossary', - items: [{ type: 'autogenerated', dirName: 'glossary' }], - }, - { - type: 'category', - label: 'Users Issues', - items: [{ type: 'autogenerated', dirName: 'users-issues' }], - }, - { - type: 'category', - label: 'Sharding', - items: [{ type: 'autogenerated', dirName: 'sharding' }], - }, - ] + docs: [ + { + type: 'doc', + id: 'home', + label: 'Home', + className: 'hidden' // <-- This makes the default item invisible, while still rendering the sidebar + }, + { + type: 'doc', + id: 'whats-new', + label: 'Whats New', + className: 'hidden' + }, + { + type: 'category', + label: 'Getting Started', + items: [{type: 'autogenerated', dirName: 'start'}], + }, + { + type: 'category', + label: 'Client API', + items: [{type: 'autogenerated', dirName: 'client-api'}], + }, + { + type: 'category', + label: 'Indexes', + items: [{type: 'autogenerated', dirName: 'indexes'}], + }, + { + type: 'category', + label: 'Document Extensions', + items: [{type: 'autogenerated', dirName: 'document-extensions'}], + }, + { + type: 'category', + label: 'Data Archival', + items: [{type: 'autogenerated', dirName: 'data-archival'}], + }, + { + type: 'category', + label: 'Server', + items: [{type: 'autogenerated', dirName: 'server'}], + }, + { + type: 'category', + label: 'Studio', + items: [{type: 'autogenerated', dirName: 'studio'}], + }, + { + type: 'category', + label: 'Migration Guide', + items: [{type: 'autogenerated', dirName: 'migration'}], + }, + { + type: 'category', + label: 'Integrations', + items: [{type: 'autogenerated', dirName: 'integrations'}], + }, + { + type: 'category', + label: 'AI Integration', + items: [{type: 'autogenerated', dirName: 'ai-integration'}], + }, + { + type: 'category', + label: 'Glossary', + items: [{type: 'autogenerated', dirName: 'glossary'}], + }, + { + type: 'category', + label: 'Users Issues', + items: [{type: 'autogenerated', dirName: 'users-issues'}], + }, + { + type: 'category', + label: 'Sharding', + items: [{type: 'autogenerated', dirName: 'sharding'}], + }, + { + type: 'category', + label: 'Compare-Exchange', + items: [{type: 'autogenerated', dirName: 'compare-exchange'}], + }, + ] }; -export default sidebars; \ No newline at end of file +export default sidebars; diff --git a/src/components/Homepage/Features/Features.tsx b/src/components/Homepage/Features/Features.tsx index e0736bb2fc..d2617a5125 100644 --- a/src/components/Homepage/Features/Features.tsx +++ b/src/components/Homepage/Features/Features.tsx @@ -14,7 +14,7 @@ import IntegrationFeaturesGrid from "@site/src/components/Homepage/Features/Feat export default function Features() { return (
- Browse by features + Browse by feature
From 19a0eb1c7ca56da77d07785cf9a9f9995859e190 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Sun, 28 Sep 2025 14:55:29 +0300 Subject: [PATCH 02/10] RDoc-2293 The start page + Card.tsx --- docs/compare-exchange/start.mdx | 291 ++++++++++++++++++++++++++++++-- src/components/Common/Card.tsx | 49 ++++++ 2 files changed, 322 insertions(+), 18 deletions(-) create mode 100644 src/components/Common/Card.tsx diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index f1734ee065..5dd906b02c 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -5,36 +5,291 @@ sidebar_label: "Start" sidebar_position: 0 --- +import Card from "@site/src/components/Common/Card"; +import CardWithImage from "@site/src/components/Common/CardWithImage"; +import CardWithImageHorizontal from "@site/src/components/Common/CardWithImageHorizontal"; +import ColGrid from "@site/src/components/ColGrid"; +import CardWithIcon from "@site/src/components/Common/CardWithIcon"; import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; -### Overview +## Compare-exchange overview -todo.. + -### Use cases +* Compare-exchange is a RavenDB feature for storing atomic, cluster-wide key-value pairs. + Each item is globally unique within the database, versioned, and managed at the cluster level, + making it a reliable foundation for coordination and global consistency. -todo.. +* Each Compare-exchange item is: + * Cluster-wide - visible and consistent across all nodes. + * Atomic - only one client can successfully modify an item at a time; each change is all-or-nothing. + * Versioned - every update increments the version, allowing you to detect concurrency conflicts. + * Flexible - values can be strings, numbers, arrays, or JSON objects. + * Internal to the database - compare-exchange items not replicated externally. -### Blog posts +* Compare-exchange is ideal when you need reliable coordination in distributed scenarios - + assigning work to only one node, reserving a resource once, or safely handling concurrent updates. + It gives you a built-in consensus mechanism, removing the need for external services or custom locking logic. -* [Distributed compare-exchange operations with RavenDB](https://ayende.com/blog/182948-C/distributed-compare-exchange-operations-with-ravendb) -* [Cluster wide ACID transactions](https://ayende.com/blog/183426-C/ravendb-4-1-features-cluster-wide-acid-transactions) -* [Complex distributed transactions with RavenDB](https://ayende.com/blog/190978-B/complex-distributed-transactions-with-ravendb) +* Distributed systems are hard to get right, especially when multiple nodes must agree on shared state. + Compare-exchange provides a ready-to-use consensus layer inside RavenDB, allowing you to: + * Enforce global uniqueness (e.g., a username claimed once across the cluster). + * Coordinate processes across nodes without conflicts. + * Guarantee safe cluster-wide transactions. -### RavenDB Demo +* On this start page, you'll find: + * [Sample use cases](../compare-exchange/start#sample-use-cases) + * [Documentation links](../compare-exchange/start#documentation-links) + * [RavenDB Demos](../compare-exchange/start#ravendb-demos) + * [Related blog posts](../compare-exchange/start#related-blog-posts) + * [Related articles](../compare-exchange/start#related-articles) + + -* https://demo.ravendb.net/demos/csharp/compare-exchange/create-compare-exchange +## Sample use cases -### Documentation articles + + +### Enforce unique usernames or emails + +* Use Compare-Exchange to enforce global uniqueness in your database even under concurrent operations. + For example, ensure that no two users can register with the same username or email, even if they do so simultaneously on different servers. + Compare-Exchange guarantees that a specific value can only be claimed once across the cluster reliably and without race conditions. + +* ✅ Why compare-exchange? + It provides a guaranteed, cluster-wide check for uniqueness. + +* How it works: + * When a user registers, the app attempts to create a compare-exchange item like + (**key**: `"emails/john@example.com"`, **value**: `"users/1-A"`). + * Only the first attempt to claim this key succeeds. + * Any concurrent or repeated attempts to claim the same key fail automatically. + +* This makes it easy to enforce rules like: + * No two users can register with the same email address. + * No two orders can use the same external reference ID. + + + + + +### Claim a job or task once + +* Use compare-exchange to safely assign background jobs or tasks in a distributed system, + ensuring each task is picked up only once. + +* ✅ Why compare-exchange? + It provides a reliable, cluster-wide locking mechanism for coordination within your database scope. + +* How it works: + * Each worker tries to create a Compare-Exchange item like (**key**: `"locks/job/1234"`, **value**: `"worker-A"`). + * The first worker to succeed gets the job. + * Other workers trying to claim the same job will fail — and can back off or retry later. + +* This ensures: + * No two workers process the same job. + * Jobs run exactly once, even with multiple competing workers or nodes. + +* Also useful for: + * Implementing mutex-style locks between clients. + * Ensuring that scheduled tasks or batch jobs run only once across the cluster. + + + + + +### Prevent double processing + +* Use compare-exchange to make sure an operation runs only once even in a distributed setup. + This is useful for avoiding things like sending the same email twice, processing the same order multiple times, or executing duplicate actions after retries. + +* ✅ Why compare-exchange? + It acts as a once-only flag - a lightweight, atomic check to prevent duplicate processing. + +* How it works: + * Before running the operation, try to create a compare-exchange key like `processed/orders/9876`. + * If the key creation succeeds - run the operation. + * If the key already exists - skip processing. It's already been handled. + +* This approach is especially useful in retry scenarios, background jobs, or any flow where idempotency matters. + + + + + +### Run business logic only if data didn’t change + +* Use compare-exchange as a version guard to make sure no one modified the data while you were working on it. + This is useful when applying business logic that depends on the current state of the data - like approving a request, processing a payment, or updating a workflow step. + +* ✅ Why compare-exchange? + It helps you detect changes and avoid acting on stale or outdated data. + +* How it works: + * Load the compare-exchange item that tracks the current version or state of the resource. + * After performing your checks and logic, update the item - but only if the version hasn’t changed. + * If the item was modified in the meantime, the update fails and you can safely abort or retry. + +* This pattern helps you maintain correctness and consistency in flows that involve multiple steps, + long-running tasks, or user input. + + + + + +### Reserve a resource + +* Need to reserve a table in a restaurant app or a seat at an event? + Use compare-exchange to lock the reservation and prevent double booking, even when multiple users act at the same time. + +* ✅ Why compare-exchange? + It gives you a reliable, cluster-wide way to reserve something exactly once - no race conditions, no conflicts. + +* How it works: + * Try to create a Compare-Exchange item for the resource (e.g., **key**: `"reservations/seat/17"`, **value**: `"user/123"`). + * If the item doesn't exist, the reservation is successful. + * If it already exists, someone else claimed it - you can show an error or let the user pick another. + +* This pattern is useful for: + * Reserving seats, tables, or event slots. + * Assigning support engineers to incoming tickets. + * Allocating limited resources like promotion codes or serial numbers. + +* Only one client can claim the item so your reservation logic stays safe and simple, even under high load. + + + + + +### Lock a document for editing + +* In collaborative systems, it's common to let only one user edit a document at a time. + Use Compare-Exchange to create a lightweight, distributed lock on a document. + +* ✅ Why compare-exchange? + It ensures that only one client can acquire the lock - preventing conflicting edits across users or servers. + +* How it works: + * When a user starts editing a document (e.g., `task 72`), try to create a compare-exchange item: + (**key**: `"editing/task/72"`, **value**: `"user/123"`). + * If the item is created successfully, the user holds the lock. + * Other users attempting the same key will fail and can be blocked, shown a message, or put into read-only mode. + * When editing is done, delete the compare-exchange item to release the lock. + +* This is useful for: + * Locking tasks, issues, or shared forms during editing. + * Preventing data loss or conflicts from simultaneous updates. + * Letting users know who’s currently editing a shared resource. + +* Simple to implement and works seamlessly across the cluster. + + + + + +### Add safety to cluster-wide transactions + +* RavenDB uses **compare-exchange items** behind the scenes to protect cluster-wide transactions. + +* ✅ Why Compare-Exchange? + In cluster-wide sessions, RavenDB automatically creates internal compare-exchange entries, + called **atomic guards**, to coordinate concurrent access and prevent conflicting writes. + +* How it works: + * When you store or update a document in a cluster-wide session, + RavenDB generates an atomic guard with a Raft-based version. + * This guard tracks the document’s state across the cluster. + * If another session modifies the document (or its state changes due to replication), + your transaction will fail with a `ConcurrencyException`, ensuring consistency is preserved. + +* This protects you from: + * Writing over documents that were modified by other sessions. + * Acting on stale data in a distributed environment. + * Violating ACID guarantees in multi-node clusters. + +* You don’t need to manage these guards manually - + RavenDB handles everything automatically when you use `TransactionMode.ClusterWide`. + + + +--- + +### 🔗 Documentation links * [Overview](../compare-exchange/overview) * [Create Compare-Exchange Items](../compare-exchange/create-cmpxchg-items) +* [Get Compare-Exchange Item](../compare-exchange/get-cmpxchg-item) +* [Get Compare-Exchange Items](../compare-exchange/get-cmpxchg-items) +* [Delete Compare-Exchange Items](../compare-exchange/delete-cmpxchg-items) +* [Update Compare-Exchange Item](../compare-exchange/update-cmpxchg-item) +* [Include Compare-Exchange Items](../compare-exchange/include-cmpxchg-items) +* [Indexing Compare-Exchange Values](../compare-exchange/indexing-cmpxchg-values) +* [Compare-Exchange in Dynamic Queries](../compare-exchange/cmpxchg-in-dynamic-queries) +* [Compare-Exchange Expiration](../compare-exchange/cmpxchg-expiration) +* [Atomic Guards](../compare-exchange/atomic-guards) + +--- + +### RavenDB Demos + + + + + + +### Related blog posts + + + + + + -### In-depth articles +### Related articles -todo... + + + + diff --git a/src/components/Common/Card.tsx b/src/components/Common/Card.tsx new file mode 100644 index 0000000000..83bda950ad --- /dev/null +++ b/src/components/Common/Card.tsx @@ -0,0 +1,49 @@ +import React, { ReactNode } from "react"; +import Heading from "@theme/Heading"; +import Button, { type ButtonVariant } from "@site/src/components/Common/Button"; +import { Icon } from "@site/src/components/Common/Icon"; +import { IconName } from "@site/src/typescript/iconName"; +import Badge from "@site/src/components/Common/Badge"; +import isInternalUrl from "@docusaurus/isInternalUrl"; + +export interface CardProps { + title: string; + description: ReactNode; + url?: string; + buttonVariant?: ButtonVariant; + ctaLabel?: string; + iconName?: IconName; // optional icon at top +} + +export default function Card({ + title, + description, + url, + buttonVariant = "secondary", + ctaLabel = "Read now", + iconName, +}: CardProps) { + return ( +
+ {iconName && ( +
+ + {url && !isInternalUrl(url) && ( + + External + + )} +
+ )} + + {title} + +

{description}

+ {url && ( + + )} +
+ ); +} From 727858c925fbd1ec27a8b84b284b1cdb7aef24d8 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Sun, 28 Sep 2025 17:25:41 +0300 Subject: [PATCH 03/10] RDoc-2293 fix the start page --- docs/compare-exchange/start.mdx | 61 +++++++++++++++------------------ 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index 5dd906b02c..4422cf9a94 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -1,5 +1,5 @@ --- -title: "Start" +title: "Compare-Exchange: Start" hide_table_of_contents: true sidebar_label: "Start" sidebar_position: 0 @@ -12,37 +12,30 @@ import ColGrid from "@site/src/components/ColGrid"; import CardWithIcon from "@site/src/components/Common/CardWithIcon"; import Admonition from '@theme/Admonition'; -## Compare-exchange overview - -* Compare-exchange is a RavenDB feature for storing atomic, cluster-wide key-value pairs. +* Compare-exchange is a RavenDB feature for storing atomic, cluster-wide **key-value pairs**. Each item is globally unique within the database, versioned, and managed at the cluster level, - making it a reliable foundation for coordination and global consistency. - -* Each Compare-exchange item is: - * Cluster-wide - visible and consistent across all nodes. - * Atomic - only one client can successfully modify an item at a time; each change is all-or-nothing. - * Versioned - every update increments the version, allowing you to detect concurrency conflicts. - * Flexible - values can be strings, numbers, arrays, or JSON objects. - * Internal to the database - compare-exchange items not replicated externally. + providing a built-in consensus mechanism for coordination and global consistency. -* Compare-exchange is ideal when you need reliable coordination in distributed scenarios - - assigning work to only one node, reserving a resource once, or safely handling concurrent updates. - It gives you a built-in consensus mechanism, removing the need for external services or custom locking logic. +* Compare-exchange is ideal for safe coordination in distributed environments, allowing you to: + * Enforce global uniqueness (e.g., prevent duplicate usernames or emails). + * Assign work to a single client or reserve a resource once. + * Handle concurrency safely, without external services or custom locking logic. -* Distributed systems are hard to get right, especially when multiple nodes must agree on shared state. - Compare-exchange provides a ready-to-use consensus layer inside RavenDB, allowing you to: - * Enforce global uniqueness (e.g., a username claimed once across the cluster). - * Coordinate processes across nodes without conflicts. - * Guarantee safe cluster-wide transactions. +* Key Characteristics of a compare-exchange item: + * Cluster-wide - Visible and consistent across all nodes. + * Atomic - Only one client can successfully modify an item at a time (all-or-nothing updates). + * Versioned - Each update increments the version, enabling conflict detection. + * Flexible - Values can be strings, numbers, arrays, or JSON objects. + * Internal - Not replicated outside the database. * On this start page, you'll find: * [Sample use cases](../compare-exchange/start#sample-use-cases) - * [Documentation links](../compare-exchange/start#documentation-links) - * [RavenDB Demos](../compare-exchange/start#ravendb-demos) + * [Technical documentation links](../compare-exchange/start#technical-documentation-links-) + * [RavenDB Demo links](../compare-exchange/start#ravendb-demo-links) * [Related blog posts](../compare-exchange/start#related-blog-posts) - * [Related articles](../compare-exchange/start#related-articles) + * [Related in-depth articles](../compare-exchange/start#related-in-depth-articles) @@ -214,7 +207,7 @@ import Admonition from '@theme/Admonition'; --- -### 🔗 Documentation links +## Technical documentation links ✨ * [Overview](../compare-exchange/overview) * [Create Compare-Exchange Items](../compare-exchange/create-cmpxchg-items) @@ -230,7 +223,7 @@ import Admonition from '@theme/Admonition'; --- -### RavenDB Demos +## RavenDB Demo links -### Related blog posts +## Related blog posts -### Related articles +## Related in-depth articles From 6e9d275d793a0588a1cbe2fdc5f4bb93c4ef06d2 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Sun, 28 Sep 2025 18:14:48 +0300 Subject: [PATCH 04/10] RDoc-2293 Remove 'old' files & adjust order of articles --- .../_what-are-operations-csharp.mdx | 8 +- .../operations/_what-are-operations-java.mdx | 2 +- .../_what-are-operations-nodejs.mdx | 8 +- .../operations/_what-are-operations-php.mdx | 8 +- .../_what-are-operations-python.mdx | 8 +- .../compare-exchange/_category_.json | 4 - .../_compare-exchange-expiration-csharp.mdx | 81 --- .../_compare-exchange-metadata-csharp.mdx | 68 --- .../_delete-compare-exchange-value-csharp.mdx | 73 --- .../_delete-compare-exchange-value-java.mdx | 96 ---- .../_delete-compare-exchange-value-nodejs.mdx | 88 ---- .../_get-compare-exchange-value-csharp.mdx | 79 --- .../_get-compare-exchange-value-java.mdx | 100 ---- .../_get-compare-exchange-value-nodejs.mdx | 160 ------ .../_get-compare-exchange-values-csharp.mdx | 88 ---- .../_get-compare-exchange-values-java.mdx | 116 ----- .../_get-compare-exchange-values-nodejs.mdx | 140 ------ .../_include-compare-exchange-csharp.mdx | 180 ------- .../_include-compare-exchange-nodejs.mdx | 460 ------------------ .../compare-exchange/_overview-csharp.mdx | 326 ------------- .../compare-exchange/_overview-java.mdx | 219 --------- .../compare-exchange/_overview-php.mdx | 366 -------------- .../compare-exchange/_overview-python.mdx | 274 ----------- .../_put-compare-exchange-value-csharp.mdx | 121 ----- .../_put-compare-exchange-value-java.mdx | 122 ----- .../_put-compare-exchange-value-nodejs.mdx | 167 ------- .../compare-exchange-expiration.mdx | 32 -- .../compare-exchange-metadata.mdx | 32 -- .../delete-compare-exchange-value.mdx | 43 -- .../get-compare-exchange-value.mdx | 46 -- .../get-compare-exchange-values.mdx | 42 -- .../include-compare-exchange.mdx | 37 -- .../operations/compare-exchange/overview.mdx | 68 --- .../put-compare-exchange-value.mdx | 40 -- .../operations/patching/_category_.json | 4 +- docs/compare-exchange/start.mdx | 13 +- ...ndexing-compare-exchange-values-csharp.mdx | 139 ------ ..._indexing-compare-exchange-values-java.mdx | 72 --- ...ndexing-compare-exchange-values-nodejs.mdx | 65 --- docs/indexes/additional-assemblies.mdx | 2 +- docs/indexes/boosting.mdx | 4 +- docs/indexes/extending-indexes.mdx | 4 +- docs/indexes/index-throttling.mdx | 2 +- .../indexing-compare-exchange-values.mdx | 41 -- docs/indexes/indexing-metadata.mdx | 4 +- docs/indexes/number-type-conversion.mdx | 4 +- docs/indexes/rolling-index-deployment.mdx | 2 +- docs/indexes/search-engine/_category_.json | 4 +- docs/indexes/storing-data-in-index.mdx | 4 +- docs/indexes/troubleshooting/_category_.json | 4 +- docs/indexes/using-analyzers.mdx | 4 +- docs/indexes/using-dynamic-fields.mdx | 4 +- docs/indexes/using-term-vectors.mdx | 4 +- 53 files changed, 50 insertions(+), 4032 deletions(-) delete mode 100644 docs/client-api/operations/compare-exchange/_category_.json delete mode 100644 docs/client-api/operations/compare-exchange/_compare-exchange-expiration-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_compare-exchange-metadata-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-java.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-nodejs.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_get-compare-exchange-value-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_get-compare-exchange-value-java.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_get-compare-exchange-value-nodejs.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_get-compare-exchange-values-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_get-compare-exchange-values-java.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_get-compare-exchange-values-nodejs.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_include-compare-exchange-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_include-compare-exchange-nodejs.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_overview-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_overview-java.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_overview-php.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_overview-python.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_put-compare-exchange-value-csharp.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_put-compare-exchange-value-java.mdx delete mode 100644 docs/client-api/operations/compare-exchange/_put-compare-exchange-value-nodejs.mdx delete mode 100644 docs/client-api/operations/compare-exchange/compare-exchange-expiration.mdx delete mode 100644 docs/client-api/operations/compare-exchange/compare-exchange-metadata.mdx delete mode 100644 docs/client-api/operations/compare-exchange/delete-compare-exchange-value.mdx delete mode 100644 docs/client-api/operations/compare-exchange/get-compare-exchange-value.mdx delete mode 100644 docs/client-api/operations/compare-exchange/get-compare-exchange-values.mdx delete mode 100644 docs/client-api/operations/compare-exchange/include-compare-exchange.mdx delete mode 100644 docs/client-api/operations/compare-exchange/overview.mdx delete mode 100644 docs/client-api/operations/compare-exchange/put-compare-exchange-value.mdx delete mode 100644 docs/indexes/_indexing-compare-exchange-values-csharp.mdx delete mode 100644 docs/indexes/_indexing-compare-exchange-values-java.mdx delete mode 100644 docs/indexes/_indexing-compare-exchange-values-nodejs.mdx delete mode 100644 docs/indexes/indexing-compare-exchange-values.mdx diff --git a/docs/client-api/operations/_what-are-operations-csharp.mdx b/docs/client-api/operations/_what-are-operations-csharp.mdx index 4d1cab2c70..135caa5cf9 100644 --- a/docs/client-api/operations/_what-are-operations-csharp.mdx +++ b/docs/client-api/operations/_what-are-operations-csharp.mdx @@ -169,10 +169,10 @@ Task> SendAsync(PatchOperation        [DeleteByQueryOperation](../../client-api/operations/common/delete-by-query.mdx) * **Compare-exchange**: -        [PutCompareExchangeValueOperation](../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) -        [GetCompareExchangeValueOperation](../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx) -        [GetCompareExchangeValuesOperation](../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx) -        [DeleteCompareExchangeValueOperation](../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx) +        [PutCompareExchangeValueOperation](../../compare-exchange/create-cmpxchg-items#create-item-using-a-store-operation) +        [GetCompareExchangeValueOperation](../../compare-exchange/get-cmpxchg-item#get-item-using-a-store-operation) +        [GetCompareExchangeValuesOperation](../../compare-exchange/get-cmpxchg-items) +        [DeleteCompareExchangeValueOperation](../../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) diff --git a/docs/client-api/operations/_what-are-operations-java.mdx b/docs/client-api/operations/_what-are-operations-java.mdx index e2c6c11e42..e73c3f9ba8 100644 --- a/docs/client-api/operations/_what-are-operations-java.mdx +++ b/docs/client-api/operations/_what-are-operations-java.mdx @@ -50,7 +50,7 @@ public Operation sendAsync(IOperation operation, SessionInfo #### Compare Exchange -* [CompareExchange](../../client-api/operations/compare-exchange/overview.mdx) +* [CompareExchange](../../compare-exchange/overview) #### Attachments diff --git a/docs/client-api/operations/_what-are-operations-nodejs.mdx b/docs/client-api/operations/_what-are-operations-nodejs.mdx index d939005e4f..d96ef939eb 100644 --- a/docs/client-api/operations/_what-are-operations-nodejs.mdx +++ b/docs/client-api/operations/_what-are-operations-nodejs.mdx @@ -142,10 +142,10 @@ await send(patchOperation, sessionInfo, resultType);        [DeleteByQueryOperation](../../client-api/operations/common/delete-by-query.mdx) * __Compare-exchange__: -        PutCompareExchangeValueOperation -        GetCompareExchangeValueOperation -        GetCompareExchangeValuesOperation -        DeleteCompareExchangeValueOperation +        [PutCompareExchangeValueOperation](../../compare-exchange/create-cmpxchg-items#create-item-using-a-store-operation) +        [GetCompareExchangeValueOperation](../../compare-exchange/get-cmpxchg-item#get-item-using-a-store-operation) +        [GetCompareExchangeValuesOperation](../../compare-exchange/get-cmpxchg-items) +        [DeleteCompareExchangeValueOperation](../../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) diff --git a/docs/client-api/operations/_what-are-operations-php.mdx b/docs/client-api/operations/_what-are-operations-php.mdx index 6ca3645f83..9b7d330139 100644 --- a/docs/client-api/operations/_what-are-operations-php.mdx +++ b/docs/client-api/operations/_what-are-operations-php.mdx @@ -138,10 +138,10 @@ public function send(...$parameters);        [DeleteByQueryOperation](../../client-api/operations/common/delete-by-query.mdx) * **Compare-exchange**: -        [PutCompareExchangeValueOperation](../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) -        [GetCompareExchangeValueOperation](../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx) -        [GetCompareExchangeValuesOperation](../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx) -        [DeleteCompareExchangeValueOperation](../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx) +        PutCompareExchangeValueOperation +        GetCompareExchangeValueOperation +        [GetCompareExchangeValuesOperation](../../compare-exchange/get-cmpxchg-items) +        DeleteCompareExchangeValueOperation diff --git a/docs/client-api/operations/_what-are-operations-python.mdx b/docs/client-api/operations/_what-are-operations-python.mdx index 81080490c7..2953c39ffd 100644 --- a/docs/client-api/operations/_what-are-operations-python.mdx +++ b/docs/client-api/operations/_what-are-operations-python.mdx @@ -138,10 +138,10 @@ def send_patch_operation_with_entity_class(        [DeleteByQueryOperation](../../client-api/operations/common/delete-by-query.mdx) * **Compare-exchange**: -        [PutCompareExchangeValueOperation](../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) -        [GetCompareExchangeValueOperation](../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx) -        [GetCompareExchangeValuesOperation](../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx) -        [DeleteCompareExchangeValueOperation](../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx) +        PutCompareExchangeValueOperation +        GetCompareExchangeValueOperation +        [GetCompareExchangeValuesOperation](../../compare-exchange/get-cmpxchg-items) +        DeleteCompareExchangeValueOperation] diff --git a/docs/client-api/operations/compare-exchange/_category_.json b/docs/client-api/operations/compare-exchange/_category_.json deleted file mode 100644 index c528bcf4fc..0000000000 --- a/docs/client-api/operations/compare-exchange/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "position": 7, - "label": Compare Exchange, -} \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/_compare-exchange-expiration-csharp.mdx b/docs/client-api/operations/compare-exchange/_compare-exchange-expiration-csharp.mdx deleted file mode 100644 index 393003ab47..0000000000 --- a/docs/client-api/operations/compare-exchange/_compare-exchange-expiration-csharp.mdx +++ /dev/null @@ -1,81 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare exchange value expiration works very similar to [document expiration](../../../server/extensions/expiration.mdx). - -* Use the `@expires` field in a [compare exchange value's metadata](../../../client-api/operations/compare-exchange/compare-exchange-metadata.mdx) to schedule its expiration. - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/compare-exchange-expiration.mdx#syntax) - * [Examples](../../../client-api/operations/compare-exchange/compare-exchange-expiration.mdx#examples) - - -## Syntax - -`@expires` is a metadata property that holds a `DateTime` value. Once the -specified date and time has passed, the compare exchange value is set for -deletion by the expiration feature. The _exact_ time this happens depends -on the expiration frequency and other -[expiration configurations](../../../server/extensions/expiration.mdx#configuring-the-expiration-feature). - -To set a compare exchange value to expire, simply put a `DateTime` value -(in UTC format) in the `@expires` field, then to send it to the server. - - - -## Examples - -Creating a new key with `CreateCompareExchangeValue()`: - - - -{`using (IAsyncDocumentSession session = store.OpenAsyncSession()) -\{ - // Set a time exactly one week from now - DateTime expirationTime = DateTime.UtcNow.AddDays(7); - - // Create a new compare exchange value - var cmpxchgValue = session.Advanced.ClusterTransaction.CreateCompareExchangeValue("key", "value"); - - // Edit Metadata - cmpxchgValue.Metadata[Constants.Documents.Metadata.Expires] = expirationTime; - - // Send to server - session.SaveChangesAsync(); -\} -`} - - - -Updating an existing key with `PutCompareExchangeValueOperation`: - - - -{`// Retrieve an existing key -CompareExchangeValue cmpxchgValue = store.Operations.Send( - new GetCompareExchangeValueOperation("key")); - -// Set time -DateTime expirationTime = DateTime.UtcNow.AddDays(7); - -// Edit Metadata -cmpxchgValue.Metadata[Constants.Documents.Metadata.Expires] = expirationTime; - -// Update value. Index must match the index on the server side, -// or the operation will fail. -CompareExchangeResult result = store.Operations.Send( - new PutCompareExchangeValueOperation( - cmpxchgValue.Key, - cmpxchgValue.Value, - cmpxchgValue.Index)); -`} - - - - - - diff --git a/docs/client-api/operations/compare-exchange/_compare-exchange-metadata-csharp.mdx b/docs/client-api/operations/compare-exchange/_compare-exchange-metadata-csharp.mdx deleted file mode 100644 index e4871b3bfa..0000000000 --- a/docs/client-api/operations/compare-exchange/_compare-exchange-metadata-csharp.mdx +++ /dev/null @@ -1,68 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* RavenDB 5.0 added metadata to compare exchange values. - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/compare-exchange-metadata.mdx#syntax) - - -## Syntax - -A compare exchange value's metadata is very similar to a -[document's metadata](../../../client-api/session/how-to/get-and-modify-entity-metadata.mdx). - -The metadata can be used to set [compare exchange expiration](../../../client-api/operations/compare-exchange/compare-exchange-expiration.mdx). - -The metadata is accessible as a root property of the compare exchange value object: - - - -{`using (IAsyncDocumentSession session = store.OpenAsyncSession( - new SessionOptions \{ - TransactionMode = TransactionMode.ClusterWide - \})) -\{ - // Create a new compare exchange value - var cmpxchgValue = session.Advanced.ClusterTransaction.CreateCompareExchangeValue("key", "value"); - - // Add a field to the metadata - // with a value of type string - cmpxchgValue.Metadata["Field name"] = "some value"; - - // Retrieve metadata as a dictionary - IDictionary cmpxchgMetadata = cmpxchgValue.Metadata; -\} -`} - - - -You can send it as a parameter of the -[Put Compare Exchange Value operation](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx): - - - -{`// Create some metadata -var cmpxchgMetadata = new MetadataAsDictionary \{ - ["Year"] = "2020" - \}; - -// Create/update the compare exchange value "best" -await documentStore.Operations.SendAsync( - new PutCompareExchangeValueOperation( - "best", - new User \{ Name = "Alice" \}, - 0, - cmpxchgMetadata)); -`} - - - - - - - diff --git a/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-csharp.mdx b/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-csharp.mdx deleted file mode 100644 index a32f08a32a..0000000000 --- a/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-csharp.mdx +++ /dev/null @@ -1,73 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `DeleteCompareExchangeValueOperation` to delete a _Key_ and its _Value_. - -* The _Key_ and its _Value_ are deleted only if the _index_ in the request matches the current index stored in the server for the specified key. - -* For an overview of the 'Compare Exchange' feature click: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx) - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#syntax) - * [Example](../../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx#example) - -## Syntax - -**Method**: - - -{`public DeleteCompareExchangeValueOperation(string key, long index) -`} - - - -| Parameters | | | -| ------------- | ------------- | ----- | -| **key** | string | The key to be deleted | -| **index** | long | The version number of the value to be deleted | - -**Returned object**: - - -{`public class CompareExchangeResult -\{ - public bool Successful; - public T Value; - public long Index; -\} -`} - - - -| Return Value | Type | Description | -|----------------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Successful** | bool | * _True_ if the delete operation was successfully completed
* _True_ if _key_ doesn't exist
* _False_ if the delete operation failed | -| **Value** | `T` | * The value that was deleted upon a successful delete
* `null` if _key_ doesn't exist
* The currently existing value on the server if delete operation failed | -| **Index** | long | * The next available version number upon success
* The next available version number if _key_ doesn't exist
* The currently existing index on the server if the delete operation failed | - -## Example - - - -{`// First, get existing value -CompareExchangeValue readResult = - store.Operations.Send( - new GetCompareExchangeValueOperation("AdminUser")); - -// Delete the key - use the index received from the 'Get' operation -CompareExchangeResult deleteResult - = store.Operations.Send( - new DeleteCompareExchangeValueOperation("AdminUser", readResult.Index)); - -// The delete result is successful only if the index has not changed between the read and delete operations -bool deleteResultSuccessful = deleteResult.Successful; -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-java.mdx b/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-java.mdx deleted file mode 100644 index 4334b3027e..0000000000 --- a/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-java.mdx +++ /dev/null @@ -1,96 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `DeleteCompareExchangeValueOperation` to delete a _Key_ and its _Value_. - -* The _Key_ and its _Value_ are deleted only if the _index_ in the request matches the current index stored in the server for the specified key. - -* For an overview of the 'Compare Exchange' feature click: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx) - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#syntax) - * [Example](../../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx#example) - -## Syntax - -**Method**: - - -{`public DeleteCompareExchangeValueOperation(Class clazz, String key, long index) -`} - - - -| Parameters | | | -| ------------- | ------------- | ----- | -| **key** | String | The key to be deleted | -| **index** | long | The version number of the value to be deleted | - -**Returned object**: - - -{`public class CompareExchangeResult \{ - private T value; - private long index; - private boolean successful; - - public T getValue() \{ - return value; - \} - - public void setValue(T value) \{ - this.value = value; - \} - - public long getIndex() \{ - return index; - \} - - public void setIndex(long index) \{ - this.index = index; - \} - - public boolean isSuccessful() \{ - return successful; - \} - - public void setSuccessful(boolean successful) \{ - this.successful = successful; - \} -\} -`} - - - -| Return Value | Type | Description | -|----------------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Successful** | boolean | * _True_ if the delete operation was successfully completed
* _True_ if _key_ doesn't exist
* _False_ if the delete operation failed | -| **Value** | `T` | * The value that was deleted upon a successful delete
* `null` if _key_ doesn't exist
* The currently existing value on the server if delete operation failed | -| **Index** | long | * The next available version number upon success
* The next available version number if _key_ doesn't exist
* The currently existing index on the server if the delete operation failed | - -## Example - - - -{`// First, get existing value -CompareExchangeValue readResult - = store.operations().send( - new GetCompareExchangeValueOperation<>(User.class, "AdminUser")); - -// Delete the key - use the index received from the 'Get' operation -CompareExchangeResult deleteResult - = store.operations().send( - new DeleteCompareExchangeValueOperation<>(User.class, "AdminUser", readResult.getIndex())); - -// The delete result is successful only if the index has not changed between the read and delete operations -boolean deleteResultSuccessful = deleteResult.isSuccessful(); -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-nodejs.mdx b/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-nodejs.mdx deleted file mode 100644 index 7a4b153086..0000000000 --- a/docs/client-api/operations/compare-exchange/_delete-compare-exchange-value-nodejs.mdx +++ /dev/null @@ -1,88 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `DeleteCompareExchangeValueOperation` to delete a compare-exchange item. - -* The compare-exchange item is only deleted if the _index_ in the request is __equal__ to the current _index_ - stored on the server for the specified _key_. - -* Compare-exchange items can also be deleted via [advanced session methods](../../../client-api/session/cluster-transaction/compare-exchange.mdx), - or from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx). - -* In this page: - * [Delete compare exchange item](../../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx#delete-compare-exchange-item) - * [Syntax](../../../client-api/operations/compare-exchange/delete-compare-exchange-value.mdx#syntax) - - -## Delete compare exchange item - - - -{`// Get an existing compare-exchange item -const getCmpXchgOp = new GetCompareExchangeValueOperation("johnDoe@gmail.com"); -const itemResult = await documentStore.operations.send(getCmpXchgOp); - -// Keep the item's version -const versionOfItem = itemResult.index; - -// Delete the compare-exchange item: -// ================================= - -// Define the delete compare-exchange operation, pass: -// * The item's KEY -// * The item's INDEX (its version) -// The compare-exchange item will only be deleted if this number -// is equal to the one stored on the server when the delete operation is executed. -const deleteCmpXchgOp = new DeleteCompareExchangeValueOperation("johnDoe@gmail.com", versionOfItem); - -// Execute the operation by passing it to operations.send -const deleteResult = await documentStore.operations.send(deleteCmpXchgOp); - -// Verify delete results: -assert.ok(deleteResult.successful); -`} - - - - - -## Syntax - - - -{`const deleteCmpXchgOp = new DeleteCompareExchangeValueOperation(key, index, clazz?); -`} - - - -| Parameter | Type | Description | -|-------------|--------|------------------------------------------------------------------------------| -| __key__ | string | The key of the item to be deleted | -| __index__ | number | The version number of the item to be deleted | -| __clazz__ | object | When the item's value is a class, you can specify its type in this parameter | - - - -{`// Return value of store.operations.send(deleteCmpXchgOp) -// ====================================================== -class CompareExchangeResult \{ - successful; - value; - index; -\} -`} - - - -| Return Value | Type | Description | -|----------------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| __successful__ | boolean |
  • `true` if the delete operation was successfully completed.
  • `true` if _key_ doesn't exist.
  • `false` if the delete operation has failed, e.g. when the index version doesn't match.
| -| __value__ | object |
  • The value that was deleted upon a successful delete.
  • `null` if _key_ doesn't exist.
  • The currently existing _value_ on the server if the delete operation has failed.
| -| __index__ | number |
  • The next available version number upon success.
  • The next available version number if _key_ doesn't exist.
  • The currently existing _index_ on the server if the delete operation has failed.
| - - - diff --git a/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-csharp.mdx b/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-csharp.mdx deleted file mode 100644 index a7064f42be..0000000000 --- a/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-csharp.mdx +++ /dev/null @@ -1,79 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `GetCompareExchangeValueOperation` to return the saved compare-exchange _Value_ for the specified _Key_. - -* For an overview of the 'Compare Exchange' feature click: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx) - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#syntax) - * [Example I - Value is 'long'](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#example-i---value-is-) - * [Example II - Value is a custom object](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#example-ii---value-is-a-custom-object) - -## Syntax - -**Method**: - - -{`public GetCompareExchangeValueOperation(string key) -`} - - - -**Returned object**: - - -{`public class CompareExchangeValue -\{ - public readonly string Key; - public readonly T Value; - public readonly long Index; -\} -`} - - - -| Parameter | Type | Description | -|-----------|--------|--------------------------------------------------------------------------| -| **Key** | string | The unique object identifier | -| **Value** | `T` | The existing value that _Key_ has | -| **Index** | long | The version number of the _Value_ that is stored for the specified _Key_ | - - -You can also get compare exchange values through the [session cluster transactions](../../../client-api/session/cluster-transaction/compare-exchange.mdx#get-compare-exchange) -at `session.Advanced.ClusterTransaction`. - -This method also exposes methods getting compare exchange [lazily](../../../client-api/session/cluster-transaction/compare-exchange.mdx#get-compare-exchange). - - - - -## Example I - Value is 'long' - - -{`CompareExchangeValue readResult = - store.Operations.Send(new GetCompareExchangeValueOperation("NextClientId")); - -long value = readResult.Value; -`} - - - - -## Example II - Value is a custom object - - -{`CompareExchangeValue readResult = - store.Operations.Send(new GetCompareExchangeValueOperation("AdminUser")); - -User admin = readResult.Value; -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-java.mdx b/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-java.mdx deleted file mode 100644 index c9f10aa447..0000000000 --- a/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-java.mdx +++ /dev/null @@ -1,100 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `GetCompareExchangeValueOperation` to return the saved compare-exchange _Value_ for the specified _Key_. - -* For an overview of the 'Compare Exchange' feature click: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx) - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#syntax) - * [Example I - Value is 'long'](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#example-i---value-is-) - * [Example II - Value is a custom object](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#example-ii---value-is-a-custom-object) - -## Syntax - -**Method**: - - -{`GetCompareExchangeValueOperation(Class clazz, String key); -`} - - - -**Returned object**: - - -{`public class CompareExchangeValue \{ - private String key; - private long index; - private T value; - - public CompareExchangeValue(String key, long index, T value) \{ - this.key = key; - this.index = index; - this.value = value; - \} - - public String getKey() \{ - return key; - \} - - public void setKey(String key) \{ - this.key = key; - \} - - public long getIndex() \{ - return index; - \} - - public void setIndex(long index) \{ - this.index = index; - \} - - public T getValue() \{ - return value; - \} - - public void setValue(T value) \{ - this.value = value; - \} -\} -`} - - - -| Parameter | Type | Description | -|-----------|--------|--------------------------------------------------------------------------| -| **Key** | String | The unique object identifier | -| **Value** | `T` | The existing value that _Key_ has | -| **Index** | long | The version number of the _Value_ that is stored for the specified _Key_ | - -## Example I - Value is 'long' - - -{`CompareExchangeValue readResult - = store.operations().send(new GetCompareExchangeValueOperation<>(Long.class, "nextClientId")); - -Long value = readResult.getValue(); -`} - - - - -## Example II - Value is a custom object - - -{`CompareExchangeValue readResult - = store.operations().send( - new GetCompareExchangeValueOperation<>(User.class, "AdminUser")); - -User admin = readResult.getValue(); -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-nodejs.mdx b/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-nodejs.mdx deleted file mode 100644 index bdb6252636..0000000000 --- a/docs/client-api/operations/compare-exchange/_get-compare-exchange-value-nodejs.mdx +++ /dev/null @@ -1,160 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use the `GetCompareExchangeValueOperation` operation to get a compare-exchange item by its _key_. - -* Compare-exchange items can also be managed via [advanced session methods](../../../client-api/session/cluster-transaction/compare-exchange.mdx), - which also expose getting the compare-exchange lazily, - or from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx). - -* In this page: - * [Examples](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#examples) - * [Get cmpXchg item that has a number and metadata](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#get-cmpxchg-item-that-has-a-number-and-metadata) - * [Get cmpXchg item that has an object](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#get-cmpxchg-item-that-has-an-object) - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx#syntax) - - -## Examples - - - -
__Get cmpXchg item that has a number and metadata__: - - -{`// Put a new compare-exchange item, -// e.g. save the number of sales made by an employee as the value + some metadata info -const putCmpXchgOp = new PutCompareExchangeValueOperation("employees/1-A", 12345, 0,\{ - "Department": "Sales", - "Role": "Salesperson", -\}); -const result = await documentStore.operations.send(putCmpXchgOp); - -// Get the compare-exchange item: -// ============================== - -// Define the get compare-exchange operation, pass the unique item key -const getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A"); - -// Execute the operation by passing it to operations.send -const item = await documentStore.operations.send(getCmpXchgOp); - -// Access the value and metadata of the retrieved item -const numberOfSales = item.value; -const employeeRole = item.metadata["Role"]; - -// Access the version number of the retrieved item -const version = item.index; -`} - - - - - - - - __Get cmpXchg item that has an object__: - - - -{`// Put a new compare-exchange item, -// e.g. save an object as the value -const employee = new Employee(); -employee.role = "Salesperson" -employee.department = "Sales"; -employee.numberOfSales = 12345; - -const putCmpXchgOp = new PutCompareExchangeValueOperation("employees/1-A", employee, 0); -const result = await documentStore.operations.send(putCmpXchgOp); - -// Get the compare-exchange item: -// ============================== - -// Define the get compare-exchange operation, pass the unique item key & the class type -const getCmpXchgOp = new GetCompareExchangeValueOperation("employees/1-A", Employee); - -// Execute the operation by passing it to operations.send -const item = await documentStore.operations.send(getCmpXchgOp); - -// Access the value of the retrieved item -const employeeResult = item.value; -const employeeClass = employeeResult.constructor; // Employee - -const employeeRole = employeeResult.role; // Salesperson -const employeeDep = employeeResult.department; // Sales -const employeeSales = employeeResult.numberOfSales; // 12345 - -// Access the version number of the retrieved item -const version = item.index; -`} - - - - -{`class Employee { - constructor( - id = null, - department = "", - role = "", - numberOfSales = 0 - - ) { - Object.assign(this, { - id, - department, - role, - numberOfSales - }); - } -} -`} - - - - - - - - -## Syntax - - - -{`const getCmpXchgOp = new GetCompareExchangeValueOperation(key, clazz, materializeMetadata); -`} - - - -| Parameter | Type | Description | -|-------------------------|-----------|-----------------------------------------------------------------------------------------------------------------| -| __key__ | `string` | The unique identifier of the cmpXchg item. | -| __clazz__ | `object` | The class type of the item's value. | -| __materializeMetadata__ | `boolean` | The Metadata will be retrieved and available regardless of the value of this param. Used for internal purposes. | - - - -{`// Return value of store.operations.send(getCmpXchgOp) -// =================================================== -class CompareExchangeValue \{ - key; - value; - metadata; - index; -\} -`} - - - -| Parameter | Type | Description | -|--------------|----------|-------------------------------------------------------| -| __key__ | `string` | The unique identifier of the cmpXchg item. | -| __value__ | `object` | The existing `value` of the returned cmpXchg item. | -| __metadata__ | `object` | The existing `metadata` of the returned cmpXchg item. | -| __index__ | `number` | The compare-exchange item's version. | - - - - diff --git a/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-csharp.mdx b/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-csharp.mdx deleted file mode 100644 index d52ff3ebf2..0000000000 --- a/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-csharp.mdx +++ /dev/null @@ -1,88 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `GetCompareExchangeValuesOperation` to return the saved compare-exchange _Values_ for the specified _Keys_. - -* For an overview of the 'Compare Exchange' feature click: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx) - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#syntax) - * [Example I - Get Values for Specified Keys](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#example-i---get-values-for-specified-keys) - * [Example II - Get Values for Keys with Common Prefix](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#example-ii---get-values-for-keys-with-common-prefix) - -## Syntax - -**Methods**: - - - -{`public GetCompareExchangeValuesOperation(string startWith, int? start = null, int? pageSize = null) -`} - - - -| Parameters | Type | Description | -| ------------- | ------------- | ----- | -| **startWith** | string | A common prefix for those keys whose values should be returned | -| **start** | int | The number of items that should be skipped | -| **pageSize** | int | The maximum number of values that will be retrieved | - -**Returned object**: - - - -{`public class CompareExchangeValue -\{ - public readonly string Key; - public readonly T Value; - public readonly long Index; -\} -`} - - - -| Return Value | Description | -| ------------- | ----- | -| `Dictionary>` | A Dictionary containing _'Key'_ to _'CompareExchangeValue'_ associations | - - -You can also get compare exchange values through the [session cluster transactions](../../../client-api/session/cluster-transaction/compare-exchange.mdx#get-compare-exchange) -at `session.Advanced.ClusterTransaction`. - -This method also exposes methods getting compare exchange [lazily](../../../client-api/session/cluster-transaction/compare-exchange.mdx#get-compare-exchange). - - - - -## Example I - Get Values for Specified Keys - - - -{`Dictionary> compareExchangeValues - = store.Operations.Send( - new GetCompareExchangeValuesOperation(new[] \{ "Key-1", "Key-2" \})); -`} - - - - - -## Example II - Get Values for Keys with Common Prefix - - - -{`// Get values for keys that have the common prefix 'users' -// Retrieve maximum 20 entries -Dictionary> compareExchangeValues - = store.Operations.Send(new GetCompareExchangeValuesOperation("users", 0, 20)); -`} - - - - - - diff --git a/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-java.mdx b/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-java.mdx deleted file mode 100644 index 7ea4a14f70..0000000000 --- a/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-java.mdx +++ /dev/null @@ -1,116 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `GetCompareExchangeValuesOperation` to return the saved compare-exchange _Values_ for the specified _Keys_. - -* For an overview of the 'Compare Exchange' feature click: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx) - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#syntax) - * [Example I - Get Value for Specified Keys](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#example-i---get-values-for-specified-keys) - * [Example II - Get Values for Keys with Common Prefix](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#example-ii---get-values-for-keys-with-common-prefix) - -## Syntax - -**Methods**: - - -{`GetCompareExchangeValuesOperation(Class clazz, String[] keys); -`} - - - - - -{`GetCompareExchangeValuesOperation(Class clazz, String startWith) -GetCompareExchangeValuesOperation(Class clazz, String startWith, Integer start) -GetCompareExchangeValuesOperation(Class clazz, String startWith, Integer start, Integer pageSize) -`} - - - -| Parameters | Type | Description | -| ------------- | ------------- | ----- | -| **keys** | String[] | List of keys to get | -| **startWith** | String | A common prefix for those keys whose values should be returned | -| **start** | int | The number of items that should be skipped | -| **pageSize** | int | The maximum number of values that will be retrieved | - -**Returned object**: - - -{`public class CompareExchangeValue \{ - private String key; - private long index; - private T value; - - public CompareExchangeValue(String key, long index, T value) \{ - this.key = key; - this.index = index; - this.value = value; - \} - - public String getKey() \{ - return key; - \} - - public void setKey(String key) \{ - this.key = key; - \} - - public long getIndex() \{ - return index; - \} - - public void setIndex(long index) \{ - this.index = index; - \} - - public T getValue() \{ - return value; - \} - - public void setValue(T value) \{ - this.value = value; - \} -\} -`} - - - -| Return Value | Description | -| ------------- | ----- | -| `Map>` | A map containing _'Key'_ to _'CompareExchangeValue'_ associations | - - -## Example I - Get Values for Specified Keys - - - -{`Map> compareExchangeValues - = store.operations().send( - new GetCompareExchangeValuesOperation<>(String.class, new String[]\{"Key-1", "Key-2"\})); -`} - - - - -## Example II - Get Values for Keys with Common Prefix - - - -{`// Get values for keys that have the common prefix 'users' -// Retrieve maximum 20 entries -Map> compareExchangeValues - = store.operations().send( - new GetCompareExchangeValuesOperation<>(User.class, "users", 0, 20)); -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-nodejs.mdx b/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-nodejs.mdx deleted file mode 100644 index 45ad9102ca..0000000000 --- a/docs/client-api/operations/compare-exchange/_get-compare-exchange-values-nodejs.mdx +++ /dev/null @@ -1,140 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `GetCompareExchangeValuesOperation` to get multiple compare-exchange items by specifying either: - * List of keys - * A common prefix for keys to retrieve - -* Compare-exchange items can also be managed via [advanced session methods](../../../client-api/session/cluster-transaction/compare-exchange.mdx), - which also expose getting the compare-exchange lazily, - or from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx). - -* In this page: - * [Examples](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#examples) - * [Get cmpXchg items for specified keys](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#get-cmpxchg-items-for-specified-keys) - * [Get cmpXchg items for keys with common prefix](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#get-cmpxchg-items-for-keys-with-common-prefix) - * [Syntax](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx#syntax) - - -## Examples - - - - __Get cmpXchg items for specified keys__: - - -{`// Save some new compare-exchange items -await documentStore.operations.send( - new PutCompareExchangeValueOperation("employees/1-A", "someValue1", 0)); -await documentStore.operations.send( - new PutCompareExchangeValueOperation("employees/2-A", "someValue2", 0)); -await documentStore.operations.send( - new PutCompareExchangeValueOperation("employees/3-A", "someValue3", 0)); - -// Get multiple compare-exchange items by specifying keys: -// ======================================================= - -// Define the get compare-exchange operation, -// Specify the keys of the items to get -const getCmpXchgOp = new GetCompareExchangeValuesOperation(\{ - keys: ["employees/1-A", "employees/3-A"] -\}); - -// Execute the operation by passing it to operations.send -const items = await documentStore.operations.send(getCmpXchgOp); - -// Access the returned items: -assert.equal(Object.keys(items).length, 2); -assert.equal(items["employees/1-A"].value, "someValue1"); -assert.equal(items["employees/3-A"].value, "someValue3"); -`} - - - - - - - - __Get cmpXchg items for keys with common prefix__: - - -{`// Get multiple compare-exchange items with common key prefix: -// =========================================================== - -// Define the get compare-exchange operation, specify: -// * startWith: The common key prefix -// * pageSize: Max items to get (this is optional) -// * start: The start position (this is optional) -const getCmpXchgOp = new GetCompareExchangeValuesOperation(\{ - startWith: "employees", - pageSize: 10, - start: 0 -\}); - -// Execute the operation by passing it to operations.send -const items = await documentStore.operations.send(getCmpXchgOp); - -// Results will include only cmpXchg items with keys that start with "employees" -`} - - - - - - - -## Syntax - - - -{`const getCmpXchgOp = new GetCompareExchangeValuesOperation(parameters); -`} - - - - - -{`// the parameters object: -\{ - // Keys of the items to retrieve - keys?; // string[] - - // The common key prefix of the items to retrieve - startWith?; // string - - // The number of items that should be skipped - start?; // number - - // The maximum number of values that will be retrieved - pageSize?; // number - - // When the item's value is a class, you can specify its type in this parameter - clazz?; // object -\} -`} - - - -| Return value | Description | -|--------------------------------------------|------------------------------------------------------| -| `Dictionary` | A Dictionary with a compare-exchange value per _key_ | - - - -{`class CompareExchangeValue \{ - key; - value; - metadata; - index; -\} -`} - - - - - - diff --git a/docs/client-api/operations/compare-exchange/_include-compare-exchange-csharp.mdx b/docs/client-api/operations/compare-exchange/_include-compare-exchange-csharp.mdx deleted file mode 100644 index c49cfc40c6..0000000000 --- a/docs/client-api/operations/compare-exchange/_include-compare-exchange-csharp.mdx +++ /dev/null @@ -1,180 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare-Exchange items can be included when [loading entities](../../../client-api/session/loading-entities.mdx) - and when making [queries](../../../client-api/session/querying/how-to-query.mdx). - -* The Session [tracks](../../../client-api/session/what-is-a-session-and-how-does-it-work.mdx#tracking-changes) - the included Compare Exchange items which means their value can be accessed - in that Session without making an additional call to the server. - -* The Compare Exchange include syntax is based on the [include method](../../../client-api/how-to/handle-document-relationships.mdx#includes). - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#syntax) - * [Examples](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#examples) - - -## Syntax - -#### Include method - -Chain the method `IncludeCompareExchangeValue()` to include compare exchange values -along with `Session.Load()` or LINQ queries. - - - -{`public interface ICompareExchangeValueIncludeBuilder -\{ - TBuilder IncludeCompareExchangeValue(string path); - - TBuilder IncludeCompareExchangeValue(Expression> path); - - TBuilder IncludeCompareExchangeValue(Expression>> path); -\} -`} - - - -| Parameter | Type | Description | -|-----------|-------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------| -| **path** | `string`;
`Expression>`;
`Expression>>` | The key of the compare exchange value you want to include, a path to the key, or a path to a `string[]` of keys. | - -#### RQL - -In an RQL query, you can use the [`include` keyword](../../../client-api/session/querying/what-is-rql.mdx#include) -followed by `cmpxchg()` to include a compare exchange value: - - - -{`include cmpxchg(key) -`} - - - -In [javascript functions](../../../client-api/session/querying/what-is-rql.mdx#declare) within queries, -use `includes.cmpxchg()` (see the RawQuery example -[below](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#examples)): - - - -{`includes.cmpxchg(key); -`} - - - -| Parameter | Type | Description | -|-----------|----------------------------------|----------------------------------------------------------------------------------| -| **key** | `string`;
path to `string` | The key of the compare exchange value you want to include, or a path to the key. | - -## Examples - - - - -{`using (IDocumentSession session = documentStore.OpenSession()) -{ - // Load a user document, include the compare exchange value - // with the key equal to the user's Name field - var user = session.Load("users/1-A", - includes => includes.IncludeCompareExchangeValue( - x => x.Name)); - - // Getting the compare exchange value does not require - // another call to the server - var value = session.Advanced.ClusterTransaction - .GetCompareExchangeValue(user.Name); -} -`} - - - - -{`using (IAsyncDocumentSession session = documentStore.OpenAsyncSession()) -{ - // Load a user document, include the compare exchange value - // with the key equal to the user's Name field - var user = await session.LoadAsync("users/1-A", - includes => includes.IncludeCompareExchangeValue( - x => x.Name)); - - // Getting the compare exchange value does not require - // another call to the server - var value = await session.Advanced.ClusterTransaction - .GetCompareExchangeValueAsync(user.Name); -} -`} - - - - -{`var users = session.Query() - .Include(builder => builder.IncludeCompareExchangeValue(x => x.Name)) - .ToList(); - -List> compareExchangeValues = null; - -// Getting the compare exchange values does not require -// additional calls to the server -foreach (User u in users){ - compareExchangeValues.Add(session.Advanced.ClusterTransaction - .GetCompareExchangeValue(u.Name)); -} -`} - - - - -{`// First method: from body of query -var users1 = session.Advanced - .RawQuery(@" - from Users as u - select u - include cmpxchg(u.Name)" - ) - .ToList(); - -List> compareExchangeValues1 = null; - -// Getting the compare exchange values does not require -// additional calls to the server -foreach (User u in users1){ - compareExchangeValues1.Add(session.Advanced.ClusterTransaction - .GetCompareExchangeValue(u.Name)); -} - - -// Second method: from a JavaScript function -var users2 = session.Advanced - .RawQuery(@" - declare function includeCEV(user) { - includes.cmpxchg(user.Name); - return user; - } - - from Users as u - select includeCEV(u)" - ) - .ToList(); -// Note that includeCEV() returns the same User -// entity it received, without modifying it - -List> compareExchangeValues2 = null; - -// Does not require calls to the server -foreach (User u in users2){ - compareExchangeValues2.Add(session.Advanced.ClusterTransaction - .GetCompareExchangeValue(u.Name)); -} -`} - - - - - - - diff --git a/docs/client-api/operations/compare-exchange/_include-compare-exchange-nodejs.mdx b/docs/client-api/operations/compare-exchange/_include-compare-exchange-nodejs.mdx deleted file mode 100644 index f16621338b..0000000000 --- a/docs/client-api/operations/compare-exchange/_include-compare-exchange-nodejs.mdx +++ /dev/null @@ -1,460 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare-Exchange items can be included when [loading entities](../../../client-api/session/loading-entities.mdx) - and when making [queries](../../../client-api/session/querying/how-to-query.mdx). - -* The Session [tracks](../../../client-api/session/what-is-a-session-and-how-does-it-work.mdx#tracking-changes) - the included Compare Exchange items which means their value can be accessed - in that Session without making an additional call to the server. - -* In this page: - * [Sample data](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#sample-data) - * [Include CmpXchg items when loading](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#include-cmpxchg-items-when-loading) - * [Include CmpXchg items when querying](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#include-cmpxchg-items-when-querying) - * [Syntax](../../../client-api/operations/compare-exchange/include-compare-exchange.mdx#syntax) - - -## Sample data - -* The examples in this article are based on the following __sample data__: - - - - -{`{ - // Create some company documents: - // ============================== - - const session = documentStore.openSession(); - - const company1 = new Company(); - company1.id = "companies/1"; - company1.name = "Apple"; - company1.supplier = "suppliers/1"; - company1.workers = ["employees/1", "employees/2"]; - - const company2 = new Company("companies/2", "Google", "suppliers/2", ["employees/3", "employees/4"]); - const company3 = new Company("companies/3", "Microsoft", "suppliers/3", ["employees/6", "employees/5"]); - - await session.store(company1); - await session.store(company2); - await session.store(company3); - - await session.saveChanges(); -} -{ - // Create some CmpXchg items: - // ========================== - - // Open a session with cluster-wide mode so that we can call 'createCompareExchangeValue' - const session = documentStore.openSession({ - transactionMode: "ClusterWide" - }); - - session.advanced.clusterTransaction.createCompareExchangeValue("employee/1", "content for employee 1 .."); - session.advanced.clusterTransaction.createCompareExchangeValue("employee/2", "content for employee 2 .."); - session.advanced.clusterTransaction.createCompareExchangeValue("employee/3", "content for employee 3 .."); - - session.advanced.clusterTransaction.createCompareExchangeValue("suppliers/1", "content for supplier 1 .."); - session.advanced.clusterTransaction.createCompareExchangeValue("suppliers/2", "content for supplier 2 .."); - session.advanced.clusterTransaction.createCompareExchangeValue("suppliers/3", "content for supplier 3 .."); - - await session.saveChanges(); -} -`} - - - - -{`class Company { - constructor( - id = null, - name = "", - supplier = "", - workers = [] - - ) { - Object.assign(this, { - id, - name, - supplier, - workers - }); - } -} -`} - - - - - - -## Include CmpXchg items when loading - - - -__Include single item__: - - -{`// Open a session with cluster-wide mode to enable calling 'includeCompareExchangeValue' -const session = documentStore.openSession(\{ - transactionMode: "ClusterWide" -\}); - -// Load a company document + include a CmpXchg item: -// ================================================= - -// Call 'includeCompareExchangeValue' within the 'load' options, -// pass the PATH of the document property that contains the key of the CmpXchg item to include -const company1 = await session.load("companies/1", \{ - documentType: Company, - // "supplier" is the document property that holds the cmpXchg key - includes: i => i.includeCompareExchangeValue("supplier") -\}); - -// Calling 'load' has triggered a server call -const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); - -// Access the included CmpXchg item: -// ================================= - -// Call 'getCompareExchangeValue' to access the content of the included CmpXchg item, -// pass the cmpXchg item KEY. This will NOT trigger another server call. -const item = await session.advanced.clusterTransaction - .getCompareExchangeValue(company1.supplier); - -// You can assert that no further server calls were made -assert.equal(session.advanced.numberOfRequests, numberOfRequests); - -// The cmpXchg item value is available -const value = item.value; -`} - - - - - - - -__Include multiple items__: - - -{`const session = documentStore.openSession(\{ - transactionMode: "ClusterWide" -\}); - -// Load a company document + include multiple CmpXchg items: -// ========================================================= - -// Call 'includeCompareExchangeValue' within the 'load' options, -// pass the PATH of the document property that contains the list keys of the CmpXchg items to include -const company1 = await session.load("companies/1", \{ - documentType: Company, - // "workers" is the document property that holds the list of keys - includes: i => i.includeCompareExchangeValue("workers") -\}); - -const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); - -// Access the included CmpXchg items: -// ================================== - -// Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, -// pass the list of KEYS. This will NOT trigger another server call. -const items = await session.advanced.clusterTransaction - .getCompareExchangeValues(company1.workers); - -assert.equal(session.advanced.numberOfRequests, numberOfRequests); - -// The value of each item is available -const value1 = items["employees/1"].value; -const value2 = items["employees/2"].value; -`} - - - - - - - -## Include CmpXchg items when querying - - - -__dynamic query__: - - - -{`// Open a session with cluster-wide mode to enable calling 'includeCompareExchangeValue' -const session = documentStore.openSession({ - transactionMode: "ClusterWide" -}); - -// Make a dynamic query + include CmpXchg items: -// ============================================= - -const companies = await session.query({ collection: "companies" }) - // Call 'include' with 'includeCompareExchangeValue' - // pass the PATH of the document property that contains the key of the CmpXchg item to include - .include(x => x.includeCompareExchangeValue("supplier")) - .all(); - -// Making the query has triggered a server call -const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); - -// Access the included CmpXchg items: -// ================================== - -const cmpXchgItems = []; - -for (let i = 0; i < companies.length; i++) { - // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, - // pass the KEY. This will NOT trigger another server call. - const item = await session.advanced.clusterTransaction - .getCompareExchangeValue(companies[i].supplier); - - cmpXchgItems.push(item); -} - -// You can assert that no further server calls were made -assert.equal(session.advanced.numberOfRequests, numberOfRequests); -`} - - - - -{`// Open a session with cluster-wide mode to enable calling 'include cmpxchg' -const session = documentStore.openSession({ - transactionMode: "ClusterWide" -}); - -// Make a raw query + include CmpXchg items: -// ========================================= - -// In the provided RQL: -// * Call 'include' with 'cmpxchg' -// * Pass the PATH of the document property that contains the key of the CmpXchg item to include -const companies = await session.advanced - .rawQuery(\`from companies as c - select c - include cmpxchg(c.supplier)\`) - .all(); - -const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); - -// Access the included CmpXchg items: -// ================================== - -const cmpXchgItems = []; - -for (let i = 0; i < companies.length; i++) { - // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, pass the KEY, - // this will NOT trigger another server call - const item = await session.advanced.clusterTransaction - .getCompareExchangeValue(companies[i].supplier); - - cmpXchgItems.push(item); -} - -assert.equal(session.advanced.numberOfRequests, numberOfRequests); -`} - - - - -{`// Open a session with cluster-wide mode to enable calling 'includes.cmpxchg' -const session = documentStore.openSession({ - transactionMode: "ClusterWide" -}); - -// Make a raw query + include CmpXchg items using Javascript method: -// ================================================================= - -// In the provided RQL: -// * Call 'includes.cmpxchg' -// * Pass the PATH of the document property that contains the key of the CmpXchg item to include -const companies = await session.advanced - .rawQuery(\`declare function includeCmpXchg(company) { - includes.cmpxchg(company.supplier); - return company; - } - - from companies as c - select includeCmpXchg(c)\`) - .all(); - -const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); - -// Access the included CmpXchg items: -// ================================== - -const cmpXchgItems = []; - -for (let i = 0; i < companies.length; i++) { - // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, - // pass the KEY. This will NOT trigger another server call - const item = await session.advanced.clusterTransaction - .getCompareExchangeValue(companies[i].supplier); - - cmpXchgItems.push(item); -} - -assert.equal(session.advanced.numberOfRequests, numberOfRequests); -`} - - - - - - - - -__Index query__: - - - -{`const session = documentStore.openSession({ - transactionMode: "ClusterWide" -}); - -// Make an index query + include CmpXchg items: -// ============================================ - -// Call 'include' with 'includeCompareExchangeValue' -// pass the PATH of the document property that contains the key of the CmpXchg item to include -const companies = await session.query({ indexName: "Companies/ByName" }) - .include(x => x.includeCompareExchangeValue("supplier")) - .all(); - -const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); - -// Access the included CmpXchg items: -// ================================== - -const cmpXchgItems = []; - -for (let i = 0; i < companies.length; i++) { - // Call 'getCompareExchangeValues' to access the content of the included CmpXchg items, - // pass the KEY. This will NOT trigger another server call - const item = await session.advanced.clusterTransaction - .getCompareExchangeValue(companies[i].supplier); - - cmpXchgItems.push(item); -} - -assert.equal(session.advanced.numberOfRequests, numberOfRequests); -`} - - - - -{`class Companies_ByName extends AbstractJavaScriptIndexCreationTask { - constructor() { - super(); - - this.map('companies', company => { - return { - name: company.name - }; - }); - } -} -`} - - - - -{`// RQL that can be used with a Raw Query: -// ====================================== - -from index "Companies/ByName" -include cmpxchg("supplier") - -// Using JS method: -// ================ - -declare function includeCmpXchg(company) { - includes.cmpxchg(company.supplier); - return company; -} - -from index "Companies/ByName" as c -select includeCmpXchg(c) -`} - - - - -* Note: - Similar to the above dynamic query example, you can query the index with a [raw query](../../../indexes/querying/query-index.mdx#sessionadvancedrawquery) using the provided RQL. - - - - - -## Syntax - - - -__When loading entities or making queries__: - -* Use method `includeCompareExchangeValue()` to include compare-exchange items along with `session.load()` or with queries. - - - -{`includeCompareExchangeValue(path); -`} - - - -| Parameter | Type | Description | -|-----------|-----------|------------------------------------------------------------------------------------------------------------| -| __path__ | `string` | The path of the document property that contains the key (or list of keys) of the CmpXchg items to include | - - - - -__When querying with RQL__: - -* Use the [include](../../../client-api/session/querying/what-is-rql.mdx#include) keyword followed by `cmpxchg()` to include a compare-exchange item. - - - -{`include cmpxchg(key) -`} - - - - - - -__When using javascript functions within RQL__: - -* Use `includes.cmpxchg()` In [javascript functions](../../../client-api/session/querying/what-is-rql.mdx#declare) within RQL queries. - - - -{`includes.cmpxchg(key); -`} - - - -| Parameter | Type | Description | -|-----------|-----------|----------------------------------------------------------------------------------| -| __key__ | `string` | The key of the compare exchange value you want to include, or a path to the key. | - - - - - diff --git a/docs/client-api/operations/compare-exchange/_overview-csharp.mdx b/docs/client-api/operations/compare-exchange/_overview-csharp.mdx deleted file mode 100644 index fd2c75702b..0000000000 --- a/docs/client-api/operations/compare-exchange/_overview-csharp.mdx +++ /dev/null @@ -1,326 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare Exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../../../client-api/operations/compare-exchange/overview.mdx#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. - -* In this page: -* [What Compare Exchange Items Are](../../../client-api/operations/compare-exchange/overview.mdx#what-compare-exchange-items-are) -* [Creating and Managing Compare-Exchange Items](../../../client-api/operations/compare-exchange/overview.mdx#creating-and-managing-compare-exchange-items) -* [Why Compare-Exchange Items are Not Replicated to External Databases](../../../client-api/operations/compare-exchange/overview.mdx#why-compare-exchange-items-are-not-replicated-to-external-databases) -* [Example I - Email Address Reservation](../../../client-api/operations/compare-exchange/overview.mdx#example-i---email-address-reservation) -* [Example II - Reserve a Shared Resource](../../../client-api/operations/compare-exchange/overview.mdx#example-ii---reserve-a-shared-resource) -* [Example III - Ensuring Unique Values without Using Compare Exchange](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange) - - -## What Compare Exchange Items Are - -Compare Exchange items are key/value pairs where the key servers a unique value across your database. - -* Each compare-exchange item contains: - * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). - * **Metadata** - Data that is associated with the compare-exchange item. - Must be a valid JSON object. - * For example, the metadata can be used to set expiration time for the compare-exchange item. - Learn more in [compare-exchange expiration](../../../client-api/operations/compare-exchange/compare-exchange-expiration.mdx). - * **Raft index** - The compare-exchange item's version. - Any change to the value or metadata will increase this number. - -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) interlocked - compare-exchange operation. - - - -## Creating and Managing Compare-Exchange Items - -Compare exchange items are created and managed with any of the following approaches: - -* **Document Store Operations** - You can manage a compare-exchange item as an [Operation on the document store](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx). - This can be done within or outside of a session (cluster-wide or single-node session). - * When inside a session: - If the session fails, the compare-exchange operation can still succeed - because store Operations do not rely on the success of the session. - You will need to delete the compare-exchange item explicitly upon session failure if you don't want the compare-exchange item to persist. - -* **Cluster-Wide Sessions** - You can manage a compare-exchange item from inside a [Cluster-Wide session](../../../client-api/session/cluster-transaction/compare-exchange.mdx). - If the session fails, the compare-exchange item creation also fails. - None of the nodes in the group will have the new compare-exchange item. - - -* **Atomic Guards** - When creating documents using a cluster-wide session RavenDB automatically creates [Atomic Guards](../../../client-api/session/cluster-transaction/atomic-guards.mdx), - which are compare-exchange items that guarantee ACID transactions. - See [Cluster-wide vs. Single-node](../../../client-api/session/cluster-transaction/overview.mdx#cluster-wide-transaction-vs-single-node-transaction) for a session comparision overview. - -* **Studio** - Compare-exchange items can be created from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx#the-compare-exchange-view) as well. - - - -## Why Compare-Exchange Items are Not Replicated to External Databases - -* Each cluster defines its policies and configurations, and should ideally have sole responsibility for managing its own documents. - Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) - to learn more about why global database modeling is more efficient this way. - -* When creating a compare-exchange item a Raft consensus is required from the nodes in the database group. - Externally replicating such data is problematic as the target database may reside within a cluster that is in an - unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. - -* Conflicts between documents that occur between two databases are solved with the help of the documents - Change-Vector. Compare-exchange conflicts cannot be handled properly as they do not have a similar - mechanism to resolve conflicts. - -* To ensure unique values between two databases without using compare-exchange items see [Example III](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange). - - - -## Example I - Email Address Reservation - -The following example shows how to use compare-exchange to create documents with unique values. -The scope is within the database group on a single cluster. - -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange). - - - -{`string email = "user@example.com"; - -User user = new User -\{ - Email = email -\}; - -using (IDocumentSession session = store.OpenSession()) -\{ - session.Store(user); - // At this point, the user document has an Id assigned - - // Try to reserve a new user email - // Note: This operation takes place outside of the session transaction, - // It is a cluster-wide reservation - CompareExchangeResult cmpXchgResult - = store.Operations.Send( - new PutCompareExchangeValueOperation("emails/" + email, user.Id, 0)); - - if (cmpXchgResult.Successful == false) - throw new Exception("Email is already in use"); - - // At this point we managed to reserve/save the user email - - // The document can be saved in SaveChanges - session.SaveChanges(); -\} -`} - - - -**Implications**: - -* The `User` object is saved as a document, hence it can be indexed, queried, etc. - -* This compare-exchange item was [created as an operation](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) - rather than with a [cluster-wide session](../../../client-api/session/cluster-transaction/overview.mdx). - Thus, if `session.SaveChanges` fails, then the email reservation is _not_ rolled back automatically. - It is your responsibility to do so. - -* The compare-exchange value that was saved can be accessed in a query using `CmpXchg`: - - - -{`var query = from u in session.Query() - where u.Id == RavenQuery.CmpXchg("emails/ayende@ayende.com") - select u; -`} - - - - -{`var q = session.Advanced - .DocumentQuery() - .WhereEquals("Id", CmpXchg.Value("emails/ayende@ayende.com")); -`} - - - - -{`from Users as s where id() == cmpxchg("emails/ayende@ayende.com") -`} - - - - - -## Example II - Reserve a Shared Resource - -In the following example, we use compare-exchange to reserve a shared resource. -The scope is within the database group on a single cluster. - -The code also checks for clients which never release resources (i.e. due to failure) by using timeout. - - - -{`private class SharedResource -\{ - public DateTime? ReservedUntil \{ get; set; \} -\} - -public void PrintWork() -\{ - // Try to get hold of the printer resource - long reservationIndex = LockResource(store, "Printer/First-Floor", TimeSpan.FromMinutes(20)); - - try - \{ - // Do some work for the duration that was set. - // Don't exceed the duration, otherwise resource is available for someone else. - \} - finally - \{ - ReleaseResource(store, "Printer/First-Floor", reservationIndex); - \} -\} - -public long LockResource(IDocumentStore store, string resourceName, TimeSpan duration) -\{ - while (true) - \{ - DateTime now = DateTime.UtcNow; - - SharedResource resource = new SharedResource - \{ - ReservedUntil = now.Add(duration) - \}; - - CompareExchangeResult saveResult = store.Operations.Send( - new PutCompareExchangeValueOperation(resourceName, resource, 0)); - - if (saveResult.Successful) - \{ - // resourceName wasn't present - we managed to reserve - return saveResult.Index; - \} - - // At this point, Put operation failed - someone else owns the lock or lock time expired - if (saveResult.Value.ReservedUntil < now) - \{ - // Time expired - Update the existing key with the new value - CompareExchangeResult takeLockWithTimeoutResult = store.Operations.Send( - new PutCompareExchangeValueOperation(resourceName, resource, saveResult.Index)); - - if (takeLockWithTimeoutResult.Successful) - \{ - return takeLockWithTimeoutResult.Index; - \} - \} - - // Wait a little bit and retry - Thread.Sleep(20); - \} -\} - -public void ReleaseResource(IDocumentStore store, string resourceName, long index) -\{ - CompareExchangeResult deleteResult - = store.Operations.Send(new DeleteCompareExchangeValueOperation(resourceName, index)); - - // We have 2 options here: - // deleteResult.Successful is true - we managed to release resource - // deleteResult.Successful is false - someone else took the lock due to timeout -\} -`} - - - - - -## Example III - Ensuring Unique Values without Using Compare Exchange - -Unique values can also be ensured without using compare-exchange. - -The below example shows how to achieve that by using **reference documents**. -The reference documents' IDs will contain the unique values instead of the compare-exchange items. - -Using reference documents is especially useful when [External Replication](../../../server/ongoing-tasks/external-replication.mdx) -is defined between two databases that need to be synced with unique values. -The reference documents will replicate to the destination database, -as opposed to compare-exchange items, which are not externally replicated. - - -Sessions which process fields that must be unique should be set to [TransactionMode.ClusterWide](../../../client-api/session/cluster-transaction/overview.mdx). - - - - -{`// When you create documents that must contain a unique value such as a phone or email, etc., -// you can create reference documents that will have that unique value in their IDs. -// To know if a value already exists, all you need to do is check whether a reference document with such ID exists. - -// The reference document class -class UniquePhoneReference -\{ - public class PhoneReference - \{ - public string Id; - public string CompanyId; - \} - - static void Main(string[] args) - \{ - // A company document class that must be created with a unique 'Phone' field - Company newCompany = new Company - \{ - Name = "companyName", - Phone = "phoneNumber", - Contact = new Contact - \{ - Name = "contactName", - Title = "contactTitle" - \}, - \}; - - void CreateCompanyWithUniquePhone(Company newCompany) - \{ - // Open a cluster-wide session in your document store - using var session = DocumentStoreHolder.Store.OpenSession( - new SessionOptions \{ TransactionMode = TransactionMode.ClusterWide \} - ); - - // Check whether the new company phone already exists - // by checking if there is already a reference document that has the new phone in its ID. - var phoneRefDocument = session.Load("phones/" + newCompany.Phone); - if (phoneRefDocument != null) - \{ - var msg = $"Phone '\{newCompany.Phone\}' already exists in ID: \{phoneRefDocument.CompanyId\}"; - throw new ConcurrencyException(msg); - \} - - // If the new phone number doesn't already exist, store the new entity - session.Store(newCompany); - // Store a new reference document with the new phone value in its ID for future checks. - session.Store(new PhoneReference \{ CompanyId = newCompany.Id \}, "phones/" + newCompany.Phone); - - // May fail if called concurrently with the same phone number - session.SaveChanges(); - \} - \} -\} -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_overview-java.mdx b/docs/client-api/operations/compare-exchange/_overview-java.mdx deleted file mode 100644 index c3f98188d2..0000000000 --- a/docs/client-api/operations/compare-exchange/_overview-java.mdx +++ /dev/null @@ -1,219 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* The **Compare Exchange** feature allows you to perform cluster-wide _interlocked_ distributed operations. - -* Unique **Keys** can be reserved in the [Database Group](../../../studio/database/settings/manage-database-group.mdx) accross the cluster. - Each key has an associated **Value**. - -* Modifying these values is an ***interlocked compare exchange*** operation. - -* Once defined, the Compare Exchange Values can be accessed via [GetCompareExchangeValuesOperation](../../../client-api/operations/compare-exchange/get-compare-exchange-values.mdx), - or by using RQL in a query (see example-I below) - - -Compare exchange key/value pairs can be created and managed explicitly in your code. -Starting from RavenDB 5.2, they can also be created and managed automatically by RavenDB. -Compare exchange entries that are automatically administered by RavenDB are called -**Atomic Guards**, read more about them [here](../../../client-api/session/cluster-transaction/atomic-guards.mdx). - - - -* In this page: - * [Compare Exchange Transaction Scope](../../../client-api/operations/compare-exchange/overview.mdx#compare-exchange-transaction-scope) - * [Creating a Key](../../../client-api/operations/compare-exchange/overview.mdx#creating-a-key) - * [Updating a Key](../../../client-api/operations/compare-exchange/overview.mdx#updating-a-key) - * [Example I - Email Address Reservation](../../../client-api/operations/compare-exchange/overview.mdx#example-i---email-address-reservation) - * [Example II- Reserve a Shared Resource](../../../client-api/operations/compare-exchange/overview.mdx#example-ii---reserve-a-shared-resource) - -## Compare Exchange Transaction Scope - -* Since the compare-exchange operations guarantee atomicity across the entire cluster, - the feature is **not** using the transaction associated with a session object, as a session transaction spans only a single node. - -* So if a compare-exchange operation has failed when used inside a session block, it will **not** be rolled back automatically upon a session transaction failure. - - -## Creating a Key - -* Provide the following when saving a **key**: - -| Parameter | Description | -|-----------|---------------------------------------------------------------------------------------------------------------------------------------------| -| **Key** | A string under which _Value_ is saved, unique in the database scope across the cluster. This string can be up to 512 bytes. | -| **Value** | The Value that is associated with the _Key_.
Can be a number, string, boolean, array or any JSON formatted object. | -| **Index** | The _Index_ number is indicating the version of _Value_.
The _Index_ is used for the concurrency control, similar to documents Etags. | - -* When creating a _new_ 'Compare Exchange Key', the index should be set to `0`. - -* The [Put](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) operation will succeed only if this key doesn't exist yet. - -* Note: Two different keys _can_ have the same values as long as the keys are unique. - - -## Updating a Key - -* Updating a 'Compare Exchange' key can be divided into 2 phases: - - 1. [Get](../../../client-api/operations/compare-exchange/get-compare-exchange-value.mdx) the existing _Key_. The associated _Value_ and _Index_ are received. - - 2. The _Index_ obtained from the read operation is provided to the [Put](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) operation along with the new _Value_ to be saved. - This save will succeed only if the index that is provided to the 'Put' operation is the **same** as the index that was received from the server in the previous 'Get', - which means that the _Value_ was not modified by someone else between the read and write operations. - - -## Example I - Email Address Reservation - -* Compare Exchange can be used to maintain uniqueness across users emails accounts. - -* First try to reserve a new user email. - If the email is successfully reserved then save the user account document. - - - -{`String email = "user@example.com"; - -User user = new User(); -user.setEmail(email); - -try (IDocumentSession session = store.openSession()) \{ - session.store(user); - - // At this point, the user document has an Id assigned - - // Try to reserve a new user email - // Note: This operation takes place outside of the session transaction, - // It is a cluster-wide reservation - CompareExchangeResult cmpXchgResult = store - .operations().send( - new PutCompareExchangeValueOperation<>( - "emails/" + email, user.getId(), 0)); - - if (!cmpXchgResult.isSuccessful()) \{ - throw new RuntimeException("Email is already in use"); - \} - - // At this point we managed to reserve/save the user email - - // The document can be saved in SaveChanges - session.saveChanges(); -\} -`} - - - -**Implications**: - -* The `User` object is saved as a document, hence it can be indexed, queried, etc. - -* If `session.saveChanges` fails, the email reservation is _not_ rolled back automatically. It is your responsibility to do so. - -* The compare exchange value that was saved can be accessed from `RQL` in a query: - - - - -{`try (IDocumentSession session = store.openSession()) { - List query = session.advanced().rawQuery(User.class, - "from Users as s where id() == cmpxchg(\\"emails/ayende@ayende.com\\")") - .toList(); - - IDocumentQuery q = session.advanced() - .documentQuery(User.class) - .whereEquals("id", CmpXchg.value("emails/ayende@ayende.com")); -} -`} - - - - -{`from Users as s where id() == cmpxchg("emails/ayende@ayende.com") -`} - - - - - -## Example II - Reserve a Shared Resource - -* Use compare exchange for a shared resource reservation. - -* The code also checks for clients which never release resources (i.e. due to failure) by using timeout. - - - -{`private class SharedResource \{ - private LocalDateTime reservedUntil; - - public LocalDateTime getReservedUntil() \{ - return reservedUntil; - \} - - public void setReservedUntil(LocalDateTime reservedUntil) \{ - this.reservedUntil = reservedUntil; - \} -\} - -public void printWork() throws InterruptedException \{ - // Try to get hold of the printer resource - long reservationIndex = lockResource(store, "Printer/First-Floor", Duration.ofMinutes(20)); - - try \{ - // Do some work for the duration that was set. - // Don't exceed the duration, otherwise resource is available for someone else. - \} finally \{ - releaseResource(store, "Printer/First-Floor", reservationIndex); - \} -\} - -public long lockResource(IDocumentStore store, String resourceName, Duration duration) throws InterruptedException \{ - while (true) \{ - LocalDateTime now = LocalDateTime.now(); - - SharedResource resource = new SharedResource(); - resource.setReservedUntil(now.plus(duration)); - - CompareExchangeResult saveResult = - store.operations().send( - new PutCompareExchangeValueOperation(resourceName, resource, 0)); - - if (saveResult.isSuccessful()) \{ - // resourceName wasn't present - we managed to reserve - return saveResult.getIndex(); - \} - - // At this point, Put operation failed - someone else owns the lock or lock time expired - if (saveResult.getValue().reservedUntil.isBefore(now)) \{ - // Time expired - Update the existing key with the new value - CompareExchangeResult takeLockWithTimeoutResult = - store.operations().send( - new PutCompareExchangeValueOperation<>(resourceName, resource, saveResult.getIndex())); - - if (takeLockWithTimeoutResult.isSuccessful()) \{ - return takeLockWithTimeoutResult.getIndex(); - \} - \} - - // Wait a little bit and retry - Thread.sleep(20); - \} -\} - -public void releaseResource(IDocumentStore store, String resourceName, long index) \{ - CompareExchangeResult deleteResult = store - .operations().send( - new DeleteCompareExchangeValueOperation<>(SharedResource.class, resourceName, index)); - - // We have 2 options here: - // deleteResult.Successful is true - we managed to release resource - // deleteResult.Successful is false - someone else took the lock due to timeout -\} -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_overview-php.mdx b/docs/client-api/operations/compare-exchange/_overview-php.mdx deleted file mode 100644 index 4afb502392..0000000000 --- a/docs/client-api/operations/compare-exchange/_overview-php.mdx +++ /dev/null @@ -1,366 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare Exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../../../client-api/operations/compare-exchange/overview.mdx#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. - -* In this page: -* [What Compare Exchange Items Are](../../../client-api/operations/compare-exchange/overview.mdx#what-compare-exchange-items-are) -* [Creating and Managing Compare-Exchange Items](../../../client-api/operations/compare-exchange/overview.mdx#creating-and-managing-compare-exchange-items) -* [Why Compare-Exchange Items are Not Replicated to External Databases](../../../client-api/operations/compare-exchange/overview.mdx#why-compare-exchange-items-are-not-replicated-to-external-databases) -* [Example I - Email Address Reservation](../../../client-api/operations/compare-exchange/overview.mdx#example-i---email-address-reservation) -* [Example II - Reserve a Shared Resource](../../../client-api/operations/compare-exchange/overview.mdx#example-ii---reserve-a-shared-resource) -* [Example III - Ensuring Unique Values without Using Compare Exchange](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange) - - -## What Compare Exchange Items Are - -Compare Exchange items are key/value pairs where the key servers a unique value across your database. - -* Each compare-exchange item contains: - * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). - * **Metadata** - Data that is associated with the compare-exchange item. - Must be a valid JSON object. - * For example, the metadata can be used to set expiration time for the compare-exchange item. - Learn more in [compare-exchange expiration](../../../client-api/operations/compare-exchange/compare-exchange-expiration.mdx). - * **Raft index** - The compare-exchange item's version. - Any change to the value or metadata will increase this number. - -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) interlocked - compare-exchange operation. - - - -## Creating and Managing Compare-Exchange Items - -Compare exchange items are created and managed with any of the following approaches: - -* **Document Store Operations** - You can manage a compare-exchange item as an [Operation on the document store](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx). - This can be done within or outside of a session (cluster-wide or single-node session). - * When inside a session: - If the session fails, the compare-exchange operation can still succeed - because store Operations do not rely on the success of the session. - You will need to delete the compare-exchange item explicitly upon session failure if you don't want the compare-exchange item to persist. - -* **Cluster-Wide Sessions** - You can manage a compare-exchange item from inside a [Cluster-Wide session](../../../client-api/session/cluster-transaction/compare-exchange.mdx). - If the session fails, the compare-exchange item creation also fails. - None of the nodes in the group will have the new compare-exchange item. - - -* **Atomic Guards** - When creating documents using a cluster-wide session RavenDB automatically creates [Atomic Guards](../../../client-api/session/cluster-transaction/atomic-guards.mdx), - which are compare-exchange items that guarantee ACID transactions. - See [Cluster-wide vs. Single-node](../../../client-api/session/cluster-transaction/overview.mdx#cluster-wide-transaction-vs-single-node-transaction) for a session comparision overview. - -* **Studio** - Compare-exchange items can be created from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx#the-compare-exchange-view) as well. - - - -## Why Compare-Exchange Items are Not Replicated to External Databases - -* Each cluster defines its policies and configurations, and should ideally have sole responsibility for managing its own documents. - Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) - to learn more about why global database modeling is more efficient this way. - -* When creating a compare-exchange item a Raft consensus is required from the nodes in the database group. - Externally replicating such data is problematic as the target database may reside within a cluster that is in an - unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. - -* Conflicts between documents that occur between two databases are solved with the help of the documents - Change-Vector. Compare-exchange conflicts cannot be handled properly as they do not have a similar - mechanism to resolve conflicts. - -* To ensure unique values between two databases without using compare-exchange items see [Example III](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange). - - - -## Example I - Email Address Reservation - -The following example shows how to use compare-exchange to create documents with unique values. -The scope is within the database group on a single cluster. - -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange). - - - -{`$email = "user@example.com"; - -$user = new User(); -$user->setEmail($email); - -$session = $store->openSession(); -try \{ - $session->store($user); - - // At this point, the user document has an Id assigned - - // Try to reserve a new user email - // Note: This operation takes place outside of the session transaction, - // It is a cluster-wide reservation - - /** @var CompareExchangeResult $cmpXchgResult */ - $cmpXchgResult = $store->operations()->send(new PutCompareExchangeValueOperation("emails/" . $email, $user->getId(), 0)); - - if (!$cmpXchgResult->isSuccessful()) \{ - throw new RuntimeException("Email is already in use"); - \} - - // At this point we managed to reserve/save the user email - - // The document can be saved in SaveChanges - $session->saveChanges(); -\} finally \{ - $session->close(); -\} -`} - - - -**Implications**: - -* The `User` object is saved as a document, hence it can be indexed, queried, etc. - -* This compare-exchange item was [created as an operation](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) - rather than with a [cluster-wide session](../../../client-api/session/cluster-transaction/overview.mdx). - Thus, if `session.saveChanges` fails, then the email reservation is _not_ rolled back automatically. - It is your responsibility to do so. - -* The compare-exchange value that was saved can be accessed in a query using `CmpXchg`: - - - -{`$query = $session->advanced()->rawQuery(User::class, - "from Users as s where id() == cmpxchg(\\"emails/ayende@ayende.com\\")") - ->toList(); -`} - - - - -{`$q = $session->advanced() - ->documentQuery(User::class) - ->whereEquals("id", CmpXchg::value("emails/ayende@ayende.com")); -`} - - - - -{`from Users as s where id() == cmpxchg("emails/ayende@ayende.com") -`} - - - - - -## Example II - Reserve a Shared Resource - -In the following example, we use compare-exchange to reserve a shared resource. -The scope is within the database group on a single cluster. - -The code also checks for clients which never release resources (i.e. due to failure) by using timeout. - - - -{`class SharedResource -\{ - private ?DateTime $reservedUntil = null; - - public function getReservedUntil(): ?DateTime - \{ - return $this->reservedUntil; - \} - - public function setReservedUntil(?DateTime $reservedUntil): void - \{ - $this->reservedUntil = $reservedUntil; - \} -\} - -class CompareExchangeSharedResource -\{ - private ?DocumentStore $store = null; - - public function printWork(): void - \{ - // Try to get hold of the printer resource - $reservationIndex = $this->lockResource($this->store, "Printer/First-Floor", Duration::ofMinutes(20)); - - try \{ - // Do some work for the duration that was set. - // Don't exceed the duration, otherwise resource is available for someone else. - \} finally \{ - $this->releaseResource($this->store, "Printer/First-Floor", $reservationIndex); - \} - \} - - /** throws InterruptedException */ - public function lockResource(DocumentStoreInterface $store, ?string $resourceName, Duration $duration): int - \{ - while (true) \{ - $now = new DateTime(); - - $resource = new SharedResource(); - $resource->setReservedUntil($now->add($duration->toDateInterval())); - - /** @var CompareExchangeResult $saveResult */ - $saveResult = $store->operations()->send( - new PutCompareExchangeValueOperation($resourceName, $resource, 0)); - - if ($saveResult->isSuccessful()) \{ - // resourceName wasn't present - we managed to reserve - return $saveResult->getIndex(); - \} - - // At this point, Put operation failed - someone else owns the lock or lock time expired - if ($saveResult->getValue()->getReservedUntil() < $now) \{ - // Time expired - Update the existing key with the new value - /** @var CompareExchangeResult takeLockWithTimeoutResult */ - $takeLockWithTimeoutResult = $store->operations()->send( - new PutCompareExchangeValueOperation($resourceName, $resource, $saveResult->getIndex())); - - if ($takeLockWithTimeoutResult->isSuccessful()) \{ - return $takeLockWithTimeoutResult->getIndex(); - \} - \} - - // Wait a little bit and retry - usleep(20000); - \} - \} - - public function releaseResource(DocumentStoreInterface $store, ?string $resourceName, int $index): void - \{ - $deleteResult = $store->operations()->send( - new DeleteCompareExchangeValueOperation(SharedResource::class, $resourceName, $index) - ); - - // We have 2 options here: - // $deleteResult->isSuccessful is true - we managed to release resource - // $deleteResult->isSuccessful is false - someone else took the lock due to timeout - \} -\} -`} - - - - - -## Example III - Ensuring Unique Values without Using Compare Exchange - -Unique values can also be ensured without using compare-exchange. - -The below example shows how to achieve that by using **reference documents**. -The reference documents' IDs will contain the unique values instead of the compare-exchange items. - -Using reference documents is especially useful when [External Replication](../../../server/ongoing-tasks/external-replication.mdx) -is defined between two databases that need to be synced with unique values. -The reference documents will replicate to the destination database, -as opposed to compare-exchange items, which are not externally replicated. - - -Sessions which process fields that must be unique should be set to [TransactionMode::clusterWide()](../../../client-api/session/cluster-transaction/overview.mdx). - - - - -{`// When you create documents that must contain a unique value such as a phone or email, etc., -// you can create reference documents that will have that unique value in their IDs. -// To know if a value already exists, all you need to do is check whether a reference document with such ID exists. - -public - -class PhoneReference -\{ - public ?string $id = null; - public ?string $companyId = null; - - public function getId(): ?string - \{ - return $this->id; - \} - - public function setId(?string $id): void - \{ - $this->id = $id; - \} - - public function getCompanyId(): ?string - \{ - return $this->companyId; - \} - - public function setCompanyId(?string $companyId): void - \{ - $this->companyId = $companyId; - \} -\} - -// The reference document class -class UniquePhoneReference -\{ - public function sample(): void - \{ - // A company document class that must be created with a unique 'Phone' field - $newCompany = new Company(); - $newCompany->setName("companyName"); - $newCompany->setPhone("phoneNumber"); - - $newContact = new Contact(); - $newContact->setName("contactName"); - $newContact->setTitle("contactTitle"); - - $newCompany->setContact($newContact); - - $this->createCompanyWithUniquePhone($newCompany); - \} - - public function createCompanyWithUniquePhone(Company $newCompany): void - \{ - // Open a cluster-wide session in your document store - $sessionOptions = new SessionOptions(); - $sessionOptions->setTransactionMode(TransactionMode::clusterWide()); - $session = DocumentStoreHolder::getStore()->openSession($sessionOptions); - - try \{ - // Check whether the new company phone already exists - // by checking if there is already a reference document that has the new phone in its ID. - $phoneRefDocument = $session->load(PhoneReference::class, "phones/" . $newCompany->getPhone()); - if ($phoneRefDocument != null) \{ - $msg = "Phone '" . $newCompany->getPhone() . "' already exists in ID: " . $phoneRefDocument->getCompanyId(); - throw new ConcurrencyException($msg); - \} - - // If the new phone number doesn't already exist, store the new entity - $session->store($newCompany); - // Store a new reference document with the new phone value in its ID for future checks. - $newPhoneReference = new PhoneReference(); - $newPhoneReference->setCompanyId($newCompany->getId()); - $session->store($newPhoneReference, "phones/" . $newCompany->getPhone()); - - // May fail if called concurrently with the same phone number - $session->saveChanges(); - \} finally \{ - $session->close(); - \} - \} -\} -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_overview-python.mdx b/docs/client-api/operations/compare-exchange/_overview-python.mdx deleted file mode 100644 index 71178dc7e5..0000000000 --- a/docs/client-api/operations/compare-exchange/_overview-python.mdx +++ /dev/null @@ -1,274 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare Exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../../../client-api/operations/compare-exchange/overview.mdx#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. - -* In this page: -* [What Compare Exchange Items Are](../../../client-api/operations/compare-exchange/overview.mdx#what-compare-exchange-items-are) -* [Creating and Managing Compare-Exchange Items](../../../client-api/operations/compare-exchange/overview.mdx#creating-and-managing-compare-exchange-items) -* [Why Compare-Exchange Items are Not Replicated to External Databases](../../../client-api/operations/compare-exchange/overview.mdx#why-compare-exchange-items-are-not-replicated-to-external-databases) -* [Example I - Email Address Reservation](../../../client-api/operations/compare-exchange/overview.mdx#example-i---email-address-reservation) -* [Example II - Reserve a Shared Resource](../../../client-api/operations/compare-exchange/overview.mdx#example-ii---reserve-a-shared-resource) -* [Example III - Ensuring Unique Values without Using Compare Exchange](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange) - - -## What Compare Exchange Items Are - -Compare Exchange items are key/value pairs where the key servers a unique value across your database. - -* Each compare-exchange item contains: - * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). - * **Metadata** - Data that is associated with the compare-exchange item. - Must be a valid JSON object. - * For example, the metadata can be used to set expiration time for the compare-exchange item. - Learn more in [compare-exchange expiration](../../../client-api/operations/compare-exchange/compare-exchange-expiration.mdx). - * **Raft index** - The compare-exchange item's version. - Any change to the value or metadata will increase this number. - -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) interlocked - compare-exchange operation. - - - -## Creating and Managing Compare-Exchange Items - -Compare exchange items are created and managed with any of the following approaches: - -* **Document Store Operations** - You can manage a compare-exchange item as an [Operation on the document store](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx). - This can be done within or outside of a session (cluster-wide or single-node session). - * When inside a session: - If the session fails, the compare-exchange operation can still succeed - because store Operations do not rely on the success of the session. - You will need to delete the compare-exchange item explicitly upon session failure if you don't want the compare-exchange item to persist. - -* **Cluster-Wide Sessions** - You can manage a compare-exchange item from inside a [Cluster-Wide session](../../../client-api/session/cluster-transaction/compare-exchange.mdx). - If the session fails, the compare-exchange item creation also fails. - None of the nodes in the group will have the new compare-exchange item. - - -* **Atomic Guards** - When creating documents using a cluster-wide session RavenDB automatically creates [Atomic Guards](../../../client-api/session/cluster-transaction/atomic-guards.mdx), - which are compare-exchange items that guarantee ACID transactions. - See [Cluster-wide vs. Single-node](../../../client-api/session/cluster-transaction/overview.mdx#cluster-wide-transaction-vs-single-node-transaction) for a session comparision overview. - -* **Studio** - Compare-exchange items can be created from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx#the-compare-exchange-view) as well. - - - -## Why Compare-Exchange Items are Not Replicated to External Databases - -* Each cluster defines its policies and configurations, and should ideally have sole responsibility for managing its own documents. - Read [Consistency in a Globally Distributed System](https://ayende.com/blog/196769-B/data-ownership-in-a-distributed-system) - to learn more about why global database modeling is more efficient this way. - -* When creating a compare-exchange item a Raft consensus is required from the nodes in the database group. - Externally replicating such data is problematic as the target database may reside within a cluster that is in an - unstable state where Raft decisions cannot be made. In such a state, the compare-exchange item will not be persisted in the target database. - -* Conflicts between documents that occur between two databases are solved with the help of the documents - Change-Vector. Compare-exchange conflicts cannot be handled properly as they do not have a similar - mechanism to resolve conflicts. - -* To ensure unique values between two databases without using compare-exchange items see [Example III](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange). - - - -## Example I - Email Address Reservation - -The following example shows how to use compare-exchange to create documents with unique values. -The scope is within the database group on a single cluster. - -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../../../client-api/operations/compare-exchange/overview.mdx#example-iii---ensuring-unique-values-without-using-compare-exchange). - - - -{`email = "user@example.com" - -user = User(email=email) - -with store.open_session() as sesion: - sesion.store(user) - # At this point, the user document has an Id assigned - - # Try to reserve a new user email - # Note: This operation takes place outside the session transaction, - # It is a cluster-wide reservation - cmp_xchg_result = store.operations.send(PutCompareExchangeValueOperation(f"emails/\{email\}", user.Id, 0)) - - if cmp_xchg_result.successful is False: - raise RuntimeError("Email is already in use") - - # At this point we managed to reserve/save the user mail - - # The document can be saved in save_changes - sesion.save_changes() -`} - - - -**Implications**: - -* The `User` object is saved as a document, hence it can be indexed, queried, etc. - -* This compare-exchange item was [created as an operation](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx) - rather than with a [cluster-wide session](../../../client-api/session/cluster-transaction/overview.mdx). - Thus, if `session.save_changes` fails, then the email reservation is _not_ rolled back automatically. - It is your responsibility to do so. - -* The compare-exchange value that was saved can be accessed in a query using `CmpXchg`: - - - -{`query = sesion.query(object_type=User).where_equals("Id", CmpXchg.value("emails/ayende@ayende.com")) -`} - - - - -{`from Users as s where id() == cmpxchg("emails/ayende@ayende.com") -`} - - - - - -## Example II - Reserve a Shared Resource - -In the following example, we use compare-exchange to reserve a shared resource. -The scope is within the database group on a single cluster. - -The code also checks for clients which never release resources (i.e. due to failure) by using timeout. - - - -{`class SharedResource: - def __init__(self, reserved_until: datetime = None): - self.reserved_until = reserved_until - -def print_work() -> None: - # Try to get hold of the printer resource - reservation_index = lock_resource(store, "Printer/First-Floor", timedelta(minutes=20)) - - try: - ... - # Do some work for the duration that was set - # Don't exceed the duration, otherwise resource is available for someone else - finally: - release_resource(store, "Printer/First-Floor", reservation_index) - -def lock_resource(document_store: DocumentStore, resource_name: str, duration: timedelta): - while True: - now = datetime.utcnow() - - resource = SharedResource(reserved_until=now + duration) - save_result = document_store.operations.send( - PutCompareExchangeValueOperation(resource_name, resource, 0) - ) - - if save_result.successful: - # resource_name wasn't present - we managed to reserve - return save_result.index - - # At this point, Put operation failed - someone else owns the lock or lock time expired - if save_result.value.reserved_until < now: - # Time expired - Update the existing key with new value - take_lock_with_timeout_result = document_store.operations.send( - PutCompareExchangeValueOperation(resource_name, resource, save_result.index) - ) - - if take_lock_with_timeout_result.successful: - return take_lock_with_timeout_result.index - - # Wait a little bit and retry - time.sleep(0.02) - -def release_resource(store: DocumentStore, resource_name: str, index: int) -> None: - delete_result = store.operations.send(DeleteCompareExchangeValueOperation(resource_name, index)) - - # We have 2 options here: - # delete_result.successful is True - we managed to release resource - # delete_result.successful is False - someone else took the lock due to timeout -`} - - - - - -## Example III - Ensuring Unique Values without Using Compare Exchange - -Unique values can also be ensured without using compare-exchange. - -The below example shows how to achieve that by using **reference documents**. -The reference documents' IDs will contain the unique values instead of the compare-exchange items. - -Using reference documents is especially useful when [External Replication](../../../server/ongoing-tasks/external-replication.mdx) -is defined between two databases that need to be synced with unique values. -The reference documents will replicate to the destination database, -as opposed to compare-exchange items, which are not externally replicated. - - -Sessions which process fields that must be unique should be set to [TransactionMode.CLUSTER_WIDE](../../../client-api/session/cluster-transaction/overview.mdx). - - - - -{`# When you create documents that must contain a unique value such as a phone or email, etc., -# you can create reference documents that will have that unique value in their IDs. -# To know if a value already exists, all you need to do is check whether a reference document with such ID exists. - -# The reference document class -class UniquePhoneReference: - class PhoneReference: - def __init__(self, Id: str = None, company_id: str = None): - self.Id = Id - self.company_id = company_id - - def main(self): - # A company document class that must be created with a unique 'Phone' field - new_company = Company( - name="companyName", phone="phoneNumber", contact=Contact(name="contactName", title="contactTitle") - ) - - def create_company_with_unique_phone(new_company: Company) -> None: - # Open a cluster-wide session in your document store - with store.open_session( - session_options=SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) - ) as session: - # Check whether the new company phone already exists - # by checking if there is already a reference document that has the new phone in its ID. - phone_ref_document = session.load(f"phones/\{new_company.phone\}") - if phone_ref_document is not None: - msg = f"Phone '\{new_company.phone\}' already exists, store the new entity" - raise RuntimeError(msg) - - # If the new phone number doesn't already exist, store the new entity - session.store(new_company) - # Store a new reference document with the new phone value in its ID for future checks - session.store( - UniquePhoneReference.PhoneReference(company_id=new_company.Id), - f"phones/\{new_company.phone\}", - ) - - # May fail if called concurrently with the same phone number - session.save_changes() -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-csharp.mdx b/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-csharp.mdx deleted file mode 100644 index 950c26fbe3..0000000000 --- a/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-csharp.mdx +++ /dev/null @@ -1,121 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `PutCompareExchangeValueOperation` to save a compare-exchange _Value_ for the specified _Key_. - -* Create a new _Key_ or modify an existing one. - -* The _Value_ is saved only if the passed _index_ is equal to the _index_ currently stored in the server for the specified _Key_. - -* Creating a new compare exchange item is possible only when the passed _index_ is `0`. - -* For an overview of the 'Compare Exchange' feature see: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx). - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#syntax) - * [Example I - Create a new key](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#example-i---create-a-new-key) - * [Example II - Update an existing key](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#example-ii---update-an-existing-key) - * [Example III - Try to create an item with a non-zero index](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#example-iii---try-to-create-an-item-with-a-non-zero-index) - - -## Syntax - -**Method**: - - -{`public PutCompareExchangeValueOperation(string key, T value, long index) -`} - - - -| Parameter | Type | Description | -|-----------|----------|--------------------------------------------------------------------------------------------------------------------------------------| -| **key** | `string` | Object identifier under which _value_ is saved, unique in the database scope across the cluster. This string can be up to 512 bytes. | -| **value** | `T` | The value to be saved for the specified _key_. | -| **index** | `long` | * `0` if creating a new key
* The current version of _Value_ when updating a value for an existing key. | - -**Returned object**: - - -{`public class CompareExchangeResult -\{ - public bool Successful; - public T Value; - public long Index; -\} -`} - - - -| Return Value | Type | Description | -|----------------|--------|----------------------------------------------------------------------------------------------------------------------------------------| -| **Successful** | `bool` | * _True_ if the save operation has completed successfully
* _False_ if the save operation failed | -| **Value** | `T` | * The value that was saved if operation was successful
* The currently existing value in the server upon failure | -| **Index** | `long` | * The version number of the value that was saved upon success
* The currently existing version number in the server upon failure | - - -When calling the 'Put' operation, the index from the request is compared to the index that is currently stored in the server (compare stage). -The value is updated only if the two are **equal** (exchange stage). - - - -## Example I - Create a new key - - - -{`CompareExchangeResult compareExchangeResult - = store.Operations.Send( - new PutCompareExchangeValueOperation("Emails/foo@example.org", "users/123", 0)); - -bool successful = compareExchangeResult.Successful; -// If successfull is true: then Key 'foo@example.org' now has the value of "users/123" -`} - - - - -## Example II - Update an existing key - - - -{`// Get existing value -CompareExchangeValue readResult = - store.Operations.Send( - new GetCompareExchangeValueOperation("AdminUser")); - -readResult.Value.Age++; - -// Update value -CompareExchangeResult saveResult - = store.Operations.Send( - new PutCompareExchangeValueOperation("AdminUser", readResult.Value, readResult.Index)); - -// The save result is successful only if 'index' wasn't changed between the read and write operations -bool saveResultSuccessful = saveResult.Successful; -`} - - - - -## Example III - Try to create an item with a non-zero index - - - -{`// Creating the item will fail because the index is not 0 -CompareExchangeResult compareExchangeResult - = store.Operations.Send( - new PutCompareExchangeValueOperation("key", "value", 123)); - -// Creating the item will succeed because the index is 0 -compareExchangeResult = store.Operations.Send( - new PutCompareExchangeValueOperation("key", "value", 0)); -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-java.mdx b/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-java.mdx deleted file mode 100644 index a69f838df6..0000000000 --- a/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-java.mdx +++ /dev/null @@ -1,122 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Use `PutCompareExchangeValueOperation` to save a compare-exchange _Value_ for the specified _Key_. - -* Create a new _Key_ or modify an existing one. - -* The _Value_ is saved only if the _index_ passed is equal to the _index_ currently stored in the server for the specified _Key_. - -* For an overview of the 'Compare Exchange' feature see: [Compare Exchange Overview](../../../client-api/operations/compare-exchange/overview.mdx). - -* In this page: - * [Syntax](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#syntax) - * [Example I - Create a new key](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#example-i---create-a-new-key) - * [Example II - Update an existing key](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#example-ii---update-an-existing-key) - -## Syntax - -**Method**: - - -{`public PutCompareExchangeValueOperation(String key, T value, long index) -`} - - - -| Parameter | Type | Description | -|-----------|--------|--------------------------------------------------------------------------------------------------------------------------------------| -| **key** | String | Object identifier under which _value_ is saved, unique in the database scope across the cluster. This string can be up to 512 bytes. | -| **value** | `T` | The value to be saved for the specified _key_. | -| **index** | long | * `0` if creating a new key
* The current version of _Value_ when updating a value for an existing key. | - -**Returned object**: - - -{`public class CompareExchangeResult \{ - private T value; - private long index; - private boolean successful; - - public T getValue() \{ - return value; - \} - - public void setValue(T value) \{ - this.value = value; - \} - - public long getIndex() \{ - return index; - \} - - public void setIndex(long index) \{ - this.index = index; - \} - - public boolean isSuccessful() \{ - return successful; - \} - - public void setSuccessful(boolean successful) \{ - this.successful = successful; - \} -\} -`} - - - -| Return Value | Type | Description | -|----------------|---------|----------------------------------------------------------------------------------------------------------------------------------------| -| **Successful** | boolean | * _True_ if the save operation has completed successfully
* _False_ if the save operation failed | -| **Value** | `T` | * The value that was saved if operation was successful
* The currently existing value in the server upon failure | -| **Index** | long | * The version number of the value that was saved upon success
* The currently existing version number in the server upon failure | - - -When calling the 'Put' operation, the index from the request is compared to the index that is currently stored in the server (compare stage). -The value is updated only if the two are **equal** (exchange stage). - - - -## Example I - Create a new key - - - -{`CompareExchangeResult compareExchangeResult = store.operations().send( - new PutCompareExchangeValueOperation<>("Emails/foo@example.org", "users/123", 0)); - -boolean successful = compareExchangeResult.isSuccessful(); -// If successful is true: then Key 'foo@example.org' now has the value of "users/123" -`} - - - - -## Example II - Update an existing key - - - -{`// Get existing value -CompareExchangeValue readResult - = store.operations().send( - new GetCompareExchangeValueOperation<>(User.class, "AdminUser")); - -readResult.getValue().setAge(readResult.getValue().getAge() + 1); - -// Update value -CompareExchangeResult saveResult - = store.operations().send( - new PutCompareExchangeValueOperation<>("AdminUser", readResult.getValue(), readResult.getIndex())); - -// The save result is successful only if 'index' wasn't changed between the read and write operations -boolean saveResultSuccessful = saveResult.isSuccessful(); -`} - - - - - diff --git a/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-nodejs.mdx b/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-nodejs.mdx deleted file mode 100644 index 1c8d56eb1f..0000000000 --- a/docs/client-api/operations/compare-exchange/_put-compare-exchange-value-nodejs.mdx +++ /dev/null @@ -1,167 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - - -* Use the `PutCompareExchangeValueOperation` operation to either: - * **Create** a new compare-exchange item - * **Update** the value or metadata of an existing compare-exchange item - -* Compare-exchange items can also be managed via [advanced session](../../../client-api/session/cluster-transaction/compare-exchange.mdx) methods - or from the [Studio](../../../studio/database/documents/compare-exchange-view.mdx). - -* In this page: - * [Create new cmpXchg item](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#create-new-cmpxchg-item) - * [Create new cmpXchg item with metadata](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#create-new-cmpxchg-item-with-metadata) - * [Update existing cmpXchg item](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#update-existing-cmpxchg-item) - * [Syntax](../../../client-api/operations/compare-exchange/put-compare-exchange-value.mdx#syntax) - - -## Create new cmpXchg item - - - -{`// Create a new CmpXchg item: -// ========================== - -// Define the put compare-exchange operation. Pass: -// * KEY: a new unique identifier (e.g. a user's email) -// * VALUE: an associated value (e.g. the user's name) -// * INDEX: pass '0' to indicate that this is a new key -const putCmpXchgOp = new PutCompareExchangeValueOperation("johnDoe@gmail.com", "John Doe", 0); - -// Execute the operation by passing it to operations.send -const result = await documentStore.operations.send(putCmpXchgOp); - -// Check results -const successful = result.successful; // Has operation succeeded -const indexForItem = result.index; // The version number assigned to the new item - -// If successful is true then a new compare-exchange item has been created -// with the unique email key and the associated value. -`} - - - -* Note: - Using `0` with a key that already exists will Not modify existing compare-exchange item. - - - -## Create new cmpXchg item with metadata - - - -{`// Create a new CmpXchg item with metadata: -// ======================================== - -// Define the put compare-exchange operation. -// Pass a 4'th parameter with the metadata object. -const putCmpXchgOp = new PutCompareExchangeValueOperation("+48-123-456-789", "John Doe", 0, - \{ - "Provider": "T-Mobile", - "Network": "5G", - "Work phone": false - \}); - -// Execute the operation by passing it to operations.send -const result = await documentStore.operations.send(putCmpXchgOp); - -// Check results -const successful = result.successful; // Has operation succeeded -const indexForItem = result.index; // The version number assigned to the new item - -// If successful is true then a new compare-exchange item has been created -// with the unique phone number key, value, and metadata. -`} - - - -* Find more examples of adding metadata to a compare-exchange item in [compare-exchange metadata](../../../client-api/operations/compare-exchange/compare-exchange-metadata.mdx). - - - -## Update existing cmpXchg item - -* When calling `PutCompareExchangeValueOperation`, - the index from the request is compared to the index that is currently stored in the server for the specified _key_. -* The compare-exchange item is updated only if the two are equal. - - - -{`// Modify an existing CmpXchg item: -// ================================ - -// Get the existing compare-exchange item -const item = await documentStore.operations.send( - new GetCompareExchangeValueOperation("+48-123-456-789") -); - -// Make some changes -const newValue = "Jane Doe"; -const metadata = item.metadata; -metadata["Work phone"] = true; - -// Update the compare-exchange item: -// The put operation will succeed only if the 'index' of the compare-exchange item -// has not changed between the read and write operations. -const result = await documentStore.operations.send( - new PutCompareExchangeValueOperation("+48-123-456-789", newValue, item.index, metadata) -); - -// Check results -const successful = result.successful; // Has operation succeeded -const newIndex = result.index; // The new version number assigned to the item - -// Version has increased -assert(newIndex > item.index); -`} - - - - - -## Syntax - - - -{`// Available overloads: -// ==================== -const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index); -const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index, metadata); -`} - - - -| Parameter | Type | Description | -|---------------|-------------|---------------------------------------------------------------------------------------------------------------------------------------------| -| **key** | `string` | <ul><li>A unique identifier in the database scope.</li><li>Can be up to 512 bytes.</li><ul> | -| **value** | `object` | <ul><li>A value to be saved for the specified _key_.</li><li>Can be any object (number, string, array, or any valid JSON object).</li></ul> | -| **index** | `number` | <ul><li>Pass `0` to create a new key.</li><li>When updating an existing key, pass the current number for concurrency control.</li><ul> | -| **metadata** | `object` | <ul><li>Metadata to be saved for the specified _key_.</li><li>Must be a valid JSON object.</li></ul> | - - - -{`// Return value of store.operations.send(putCmpXchgOp) -// =================================================== -class CompareExchangeResult \{ - successful; - value; - index; -\} -`} - - - -| Return Value | Type | Description | -|----------------|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **successful** | `boolean` | <ul><li>`true` if the put operation has completed successfully.</li><li>`false` if the put operation has failed.</li></ul> | -| **value** | `object` | <ul><li>Upon success - the value of the compare-exchange item that was saved.</li><li>Upon failure - the existing value on the server.</li></ul> | -| **index** | `number` | <ul><li>The compare-exchange item's version.</li><li>This number increases with each successful modification of the `value` or `metadata`.</li><li>Upon success - the updated version of the compare-exchange item that was saved.</li><li>Upon failure - the existing version number in the server.</li></ul> | - - - - diff --git a/docs/client-api/operations/compare-exchange/compare-exchange-expiration.mdx b/docs/client-api/operations/compare-exchange/compare-exchange-expiration.mdx deleted file mode 100644 index 2f4afa0be7..0000000000 --- a/docs/client-api/operations/compare-exchange/compare-exchange-expiration.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Compare Exchange Expiration" -hide_table_of_contents: true -sidebar_label: Compare Exchange Expiration -sidebar_position: 6 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import CompareExchangeExpirationCsharp from './_compare-exchange-expiration-csharp.mdx'; - -export const supportedLanguages = ["csharp"]; - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/compare-exchange-metadata.mdx b/docs/client-api/operations/compare-exchange/compare-exchange-metadata.mdx deleted file mode 100644 index 9b23cffd6d..0000000000 --- a/docs/client-api/operations/compare-exchange/compare-exchange-metadata.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Compare Exchange Metadata" -hide_table_of_contents: true -sidebar_label: Compare Exchange Metadata -sidebar_position: 7 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import CompareExchangeMetadataCsharp from './_compare-exchange-metadata-csharp.mdx'; - -export const supportedLanguages = ["csharp"]; - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/delete-compare-exchange-value.mdx b/docs/client-api/operations/compare-exchange/delete-compare-exchange-value.mdx deleted file mode 100644 index 893f93c9e5..0000000000 --- a/docs/client-api/operations/compare-exchange/delete-compare-exchange-value.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "Delete Compare Exchange Operation" -hide_table_of_contents: true -sidebar_label: Delete Compare Exchange -sidebar_position: 2 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import DeleteCompareExchangeValueCsharp from './_delete-compare-exchange-value-csharp.mdx'; -import DeleteCompareExchangeValueJava from './_delete-compare-exchange-value-java.mdx'; -import DeleteCompareExchangeValueNodejs from './_delete-compare-exchange-value-nodejs.mdx'; - -export const supportedLanguages = ["csharp", "java", "nodejs"]; - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/get-compare-exchange-value.mdx b/docs/client-api/operations/compare-exchange/get-compare-exchange-value.mdx deleted file mode 100644 index a15fa9137f..0000000000 --- a/docs/client-api/operations/compare-exchange/get-compare-exchange-value.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Get Compare Exchange Value Operation" -hide_table_of_contents: true -sidebar_label: Get Compare Exchange Value -sidebar_position: 3 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import GetCompareExchangeValueCsharp from './_get-compare-exchange-value-csharp.mdx'; -import GetCompareExchangeValueJava from './_get-compare-exchange-value-java.mdx'; -import GetCompareExchangeValueNodejs from './_get-compare-exchange-value-nodejs.mdx'; - -export const supportedLanguages = ["csharp", "java", "nodejs"]; - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/get-compare-exchange-values.mdx b/docs/client-api/operations/compare-exchange/get-compare-exchange-values.mdx deleted file mode 100644 index 198c8c6cb9..0000000000 --- a/docs/client-api/operations/compare-exchange/get-compare-exchange-values.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "Get Compare Exchange Values Operation" -hide_table_of_contents: true -sidebar_label: Get Compare Exchange Values -sidebar_position: 4 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import GetCompareExchangeValuesCsharp from './_get-compare-exchange-values-csharp.mdx'; -import GetCompareExchangeValuesJava from './_get-compare-exchange-values-java.mdx'; -import GetCompareExchangeValuesNodejs from './_get-compare-exchange-values-nodejs.mdx'; - -export const supportedLanguages = ["csharp", "java", "nodejs"]; - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/include-compare-exchange.mdx b/docs/client-api/operations/compare-exchange/include-compare-exchange.mdx deleted file mode 100644 index 8ca2dce563..0000000000 --- a/docs/client-api/operations/compare-exchange/include-compare-exchange.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Include Compare Exchange Values" -hide_table_of_contents: true -sidebar_label: Include Compare Exchange Values -sidebar_position: 5 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import IncludeCompareExchangeCsharp from './_include-compare-exchange-csharp.mdx'; -import IncludeCompareExchangeNodejs from './_include-compare-exchange-nodejs.mdx'; - -export const supportedLanguages = ["csharp", "nodejs"]; - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/overview.mdx b/docs/client-api/operations/compare-exchange/overview.mdx deleted file mode 100644 index 14af6d6f48..0000000000 --- a/docs/client-api/operations/compare-exchange/overview.mdx +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Compare Exchange Overview" -hide_table_of_contents: true -sidebar_label: Overview -sidebar_position: 0 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import OverviewCsharp from './_overview-csharp.mdx'; -import OverviewJava from './_overview-java.mdx'; -import OverviewPython from './_overview-python.mdx'; -import OverviewPhp from './_overview-php.mdx'; - -export const supportedLanguages = ["csharp", "java", "python", "php"]; - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/compare-exchange/put-compare-exchange-value.mdx b/docs/client-api/operations/compare-exchange/put-compare-exchange-value.mdx deleted file mode 100644 index 9419f2b7c7..0000000000 --- a/docs/client-api/operations/compare-exchange/put-compare-exchange-value.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Put Compare Exchange Operation" -hide_table_of_contents: true -sidebar_label: Put Compare Exchange -sidebar_position: 1 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import PutCompareExchangeValueCsharp from './_put-compare-exchange-value-csharp.mdx'; -import PutCompareExchangeValueJava from './_put-compare-exchange-value-java.mdx'; -import PutCompareExchangeValueNodejs from './_put-compare-exchange-value-nodejs.mdx'; - -export const supportedLanguages = ["csharp", "java", "nodejs"]; - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/client-api/operations/patching/_category_.json b/docs/client-api/operations/patching/_category_.json index 0019fb4f20..f0be7deba4 100644 --- a/docs/client-api/operations/patching/_category_.json +++ b/docs/client-api/operations/patching/_category_.json @@ -1,4 +1,4 @@ { - "position": 8, + "position": 7, "label": Patching, -} \ No newline at end of file +} diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index 4422cf9a94..afab7bc887 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -15,14 +15,17 @@ import Admonition from '@theme/Admonition'; * Compare-exchange is a RavenDB feature for storing atomic, cluster-wide **key-value pairs**. - Each item is globally unique within the database, versioned, and managed at the cluster level, - providing a built-in consensus mechanism for coordination and global consistency. - -* Compare-exchange is ideal for safe coordination in distributed environments, allowing you to: + Each item is globally unique within the database, versioned, and managed at the cluster level. + +* Compare-exchange provides a built-in consensus mechanism ideal for safe coordination and global consistency + in distributed environments, allowing you to: * Enforce global uniqueness (e.g., prevent duplicate usernames or emails). * Assign work to a single client or reserve a resource once. * Handle concurrency safely, without external services or custom locking logic. - + +* Compare-exchange items can also serve as a place to store shared data that lives outside of the documents - + useful for values that are reused, referenced globally, or managed independently of any single document. + * Key Characteristics of a compare-exchange item: * Cluster-wide - Visible and consistent across all nodes. * Atomic - Only one client can successfully modify an item at a time (all-or-nothing updates). diff --git a/docs/indexes/_indexing-compare-exchange-values-csharp.mdx b/docs/indexes/_indexing-compare-exchange-values-csharp.mdx deleted file mode 100644 index 7779f31d72..0000000000 --- a/docs/indexes/_indexing-compare-exchange-values-csharp.mdx +++ /dev/null @@ -1,139 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare exchange values can be loaded within an index using the value's key. - -* The index will update when the compare exchange value is updated, as well -as when documents are modified in the indexed collection(s). - -* In this page: - * [Syntax](../indexes/indexing-compare-exchange-values.mdx#syntax) - * [Examples](../indexes/indexing-compare-exchange-values.mdx#examples) - * [Querying the Index](../indexes/indexing-compare-exchange-values.mdx#querying-the-index) - - -## Syntax - -When creating an index using `AbstractIndexCreationTask`, use the method -`LoadCompareExchangeValue()` to load a compare exchange value by its key. - - - -{`//Load one compare exchange value -T LoadCompareExchangeValue(string key); - -//Load multiple compare exchange values -T[] LoadCompareExchangeValue(IEnumerable keys); -`} - - - -For javascript indexes, use the method `cmpxchg()`. - -| Parameter | Type | Description | -| - | - | - | -| **key** | `string` | The key of a particular compare exchange value. | -| **keys** | `IEnumerable` | The keys of multiple compare exchange values. | - - -### Examples - -These indexes map the rooms in a hotel, as well as compare exchange values -representing the guests in those rooms. - - - - -{`private class Compare_Exchange_Index : AbstractIndexCreationTask -{ - public class Result - { - public string Room; - public string Guests; - } - - public Compare_Exchange_Index() - { - Map = HotelRooms => from room in HotelRooms - let guests = LoadCompareExchangeValue(room.RoomID) - select new Result - { - Room = room.RoomID, - Guests = guests - }; - } -} -`} - - - - -{`private class Compare_Exchange_JS_Index : AbstractJavaScriptIndexCreationTask -{ - public Compare_Exchange_JS_Index() - { - Maps = new HashSet - { - @"map('HotelRooms', function (room) { - var guests = cmpxchg(room.RoomID); - return { - RoomID: room.RoomID, - Guests: guests - }; - })", - }; - } -} -`} - - - - - - -## Querying the Index - - - - -{`// Return all vacant hotel rooms -List vacantRooms = session - .Query() - .Where(x => RavenQuery.CmpXchg(x.RoomID) == null) - .OfType() - .ToList(); -`} - - - - -{`// Return all vacant hotel rooms -List vacantRooms = await asyncSession - .Query() - .Where(x => RavenQuery.CmpXchg(x.RoomID) == null) - .OfType() - .ToListAsync(); -`} - - - - -{`// Return the room occupied by VIP guests -List VIPRooms = session - .Advanced.RawQuery( - @"from Hotelrooms as room - where room.Guests == cmpxchg('VIP')" - ) - .ToList(); -`} - - - - - - - diff --git a/docs/indexes/_indexing-compare-exchange-values-java.mdx b/docs/indexes/_indexing-compare-exchange-values-java.mdx deleted file mode 100644 index ddae50fff7..0000000000 --- a/docs/indexes/_indexing-compare-exchange-values-java.mdx +++ /dev/null @@ -1,72 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare exchange values can be loaded within an index using the value's key. - -* The index will update when the compare exchange value is updated, as well -as when documents are modified in the indexed collection(s). - -* In this page: - * [How to use](../indexes/indexing-compare-exchange-values.mdx#how-to-use) - * [Examples](../indexes/indexing-compare-exchange-values.mdx#examples) - * [Querying the Index](../indexes/indexing-compare-exchange-values.mdx#querying-the-index) - - -## How to use - -When creating an index using `AbstractIndexCreationTask`, use javaScript -to load a compare exchange value by its key. - - - -### Examples - -These indexes map the rooms in a hotel, as well as compare exchange values -representing the guests in those rooms. - - - - - -{`private class Compare_Exchange_JS_Index extends AbstractJavaScriptIndexCreationTask{ - public Compare_Exchange_JS_Index() - { - setMaps(Collections.singleton( - "map('HotelRooms', function (room) {\\n"+ - " var guests = cmpxchg(room.RoomID);\\n"+ - " return {\\n"+ - " RoomID: room.RoomID,\\n"+ - " Guests: guests\\n"+ - " }\\n"+ - "});" - ) - ); - }; -} -`} - - - - - - -## Querying the Index - - - - -{`IRawDocumentQuery VIPRooms = session.advanced().rawQuery(Hotelroom.class, - "from Hotelrooms as room\\n" + - "where room.Guests == cmpxchg('VIP')"); -`} - - - - - - - diff --git a/docs/indexes/_indexing-compare-exchange-values-nodejs.mdx b/docs/indexes/_indexing-compare-exchange-values-nodejs.mdx deleted file mode 100644 index 2cf8d90235..0000000000 --- a/docs/indexes/_indexing-compare-exchange-values-nodejs.mdx +++ /dev/null @@ -1,65 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - - - -* Compare exchange values can be loaded within an index using the value's key. - -* The index will update when the compare exchange value is updated, as well -as when documents are modified in the indexed collection(s). - -* In this page: - * [Syntax](../indexes/indexing-compare-exchange-values.mdx#syntax) - * [Examples](../indexes/indexing-compare-exchange-values.mdx#examples) - * [Querying the Index](../indexes/indexing-compare-exchange-values.mdx#querying-the-index) - - -## Syntax -For javascript indexes, use the method `cmpxchg()`. - -| Parameter | Type | Description | -| - | - | - | -| **key** | `string` | The key of a particular compare exchange value. | - - -### Examples - -These indexes map the rooms in a hotel, as well as compare exchange values -representing the guests in those rooms. - - - -{`class Compare_Exchange_Index extends AbstractCsharpIndexCreationTask \{ - constructor() \{ - super(); - - this.map = \`docs.HotelRooms.Select(room => new \{ - RoomID = room.RoomID, - Guests = cmpxchg(room.RoomID) - \})\`; - \} -\} -`} - - - - - -## Querying the Index - - - -{`const VIPRooms = await session - .advanced.rawQuery( - " from Hotelrooms as room\\n"+ - " where room.Guests == cmpxchg('VIP')" -) -`} - - - - - - diff --git a/docs/indexes/additional-assemblies.mdx b/docs/indexes/additional-assemblies.mdx index 74685410c4..519bd01e3f 100644 --- a/docs/indexes/additional-assemblies.mdx +++ b/docs/indexes/additional-assemblies.mdx @@ -2,7 +2,7 @@ title: "Indexes: Additional Assemblies" hide_table_of_contents: true sidebar_label: Additional Assemblies -sidebar_position: 30 +sidebar_position: 29 --- import Admonition from '@theme/Admonition'; diff --git a/docs/indexes/boosting.mdx b/docs/indexes/boosting.mdx index ad3034c70b..385a2cce56 100644 --- a/docs/indexes/boosting.mdx +++ b/docs/indexes/boosting.mdx @@ -2,7 +2,7 @@ title: "Indexes: Boosting" hide_table_of_contents: true sidebar_label: Boosting -sidebar_position: 24 +sidebar_position: 23 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -46,4 +46,4 @@ export const supportedLanguages = ["csharp", "java", "php", "nodejs"]; - [Dynamic Fields](../indexes/using-dynamic-fields) ---> \ No newline at end of file +--> diff --git a/docs/indexes/extending-indexes.mdx b/docs/indexes/extending-indexes.mdx index 37b3b90fba..7091bda617 100644 --- a/docs/indexes/extending-indexes.mdx +++ b/docs/indexes/extending-indexes.mdx @@ -2,7 +2,7 @@ title: "Indexes: Extending Indexes" hide_table_of_contents: true sidebar_label: Extending Indexes -sidebar_position: 29 +sidebar_position: 28 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -34,4 +34,4 @@ export const supportedLanguages = ["csharp", "java", "nodejs"]; - [What are Indexes](../indexes/what-are-indexes) ---> \ No newline at end of file +--> diff --git a/docs/indexes/index-throttling.mdx b/docs/indexes/index-throttling.mdx index 7c1497d8b4..852f480168 100644 --- a/docs/indexes/index-throttling.mdx +++ b/docs/indexes/index-throttling.mdx @@ -2,7 +2,7 @@ title: "Indexes: Index Throttling" hide_table_of_contents: true sidebar_label: Index Throttling -sidebar_position: 23 +sidebar_position: 22 --- import Admonition from '@theme/Admonition'; diff --git a/docs/indexes/indexing-compare-exchange-values.mdx b/docs/indexes/indexing-compare-exchange-values.mdx deleted file mode 100644 index c32c7ca457..0000000000 --- a/docs/indexes/indexing-compare-exchange-values.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Indexes: Indexing Compare Exchange Values" -hide_table_of_contents: true -sidebar_label: Indexing Compare Exchange Values -sidebar_position: 20 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import IndexingCompareExchangeValuesCsharp from './_indexing-compare-exchange-values-csharp.mdx'; -import IndexingCompareExchangeValuesJava from './_indexing-compare-exchange-values-java.mdx'; -import IndexingCompareExchangeValuesNodejs from './_indexing-compare-exchange-values-nodejs.mdx'; - -export const supportedLanguages = ["csharp", "java", "nodejs"]; - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/indexes/indexing-metadata.mdx b/docs/indexes/indexing-metadata.mdx index f0e8a14107..d9cbf3b6f8 100644 --- a/docs/indexes/indexing-metadata.mdx +++ b/docs/indexes/indexing-metadata.mdx @@ -2,7 +2,7 @@ title: "Indexing Metadata" hide_table_of_contents: true sidebar_label: Indexing Metadata -sidebar_position: 21 +sidebar_position: 20 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -47,4 +47,4 @@ export const supportedLanguages = ["csharp", "java", "python", "php", "nodejs"]; - [How to get and modify the metadata](../client-api/session/how-to/get-and-modify-entity-metadata) ---> \ No newline at end of file +--> diff --git a/docs/indexes/number-type-conversion.mdx b/docs/indexes/number-type-conversion.mdx index c1966a034c..7429433e0a 100644 --- a/docs/indexes/number-type-conversion.mdx +++ b/docs/indexes/number-type-conversion.mdx @@ -2,7 +2,7 @@ title: "Indexing: Numerical Type Conversion" hide_table_of_contents: true sidebar_label: Numerical Type Conversion -sidebar_position: 31 +sidebar_position: 30 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -30,4 +30,4 @@ export const supportedLanguages = ["csharp"]; - [Knowledge Base: Numbers in RavenDB](../server/kb/numbers-in-ravendb) ---> \ No newline at end of file +--> diff --git a/docs/indexes/rolling-index-deployment.mdx b/docs/indexes/rolling-index-deployment.mdx index 2f23445205..3cad3805ff 100644 --- a/docs/indexes/rolling-index-deployment.mdx +++ b/docs/indexes/rolling-index-deployment.mdx @@ -2,7 +2,7 @@ title: "Indexes: Rolling Index Deployment" hide_table_of_contents: true sidebar_label: Rolling Index Deployment -sidebar_position: 22 +sidebar_position: 21 --- import Admonition from '@theme/Admonition'; diff --git a/docs/indexes/search-engine/_category_.json b/docs/indexes/search-engine/_category_.json index 4e976a4479..03f3ccc982 100644 --- a/docs/indexes/search-engine/_category_.json +++ b/docs/indexes/search-engine/_category_.json @@ -1,4 +1,4 @@ { - "position": 32, + "position": 31, "label": Search Engine, -} \ No newline at end of file +} diff --git a/docs/indexes/storing-data-in-index.mdx b/docs/indexes/storing-data-in-index.mdx index 5ae7b44b5e..6d61cc64ad 100644 --- a/docs/indexes/storing-data-in-index.mdx +++ b/docs/indexes/storing-data-in-index.mdx @@ -2,7 +2,7 @@ title: "Storing Data in Index" hide_table_of_contents: true sidebar_label: Storing Data in Index -sidebar_position: 26 +sidebar_position: 25 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -51,4 +51,4 @@ export const supportedLanguages = ["java", "python", "php", "nodejs", "csharp"]; - [Projections and Stored Fields](../indexes/querying/projections#projections-and-stored-fields) ---> \ No newline at end of file +--> diff --git a/docs/indexes/troubleshooting/_category_.json b/docs/indexes/troubleshooting/_category_.json index bfc5d7ff0a..ca00d767fb 100644 --- a/docs/indexes/troubleshooting/_category_.json +++ b/docs/indexes/troubleshooting/_category_.json @@ -1,4 +1,4 @@ { - "position": 33, + "position": 32, "label": Troubleshooting, -} \ No newline at end of file +} diff --git a/docs/indexes/using-analyzers.mdx b/docs/indexes/using-analyzers.mdx index 5188320f59..ab3c5b5af6 100644 --- a/docs/indexes/using-analyzers.mdx +++ b/docs/indexes/using-analyzers.mdx @@ -2,7 +2,7 @@ title: "Indexes: Analyzers" hide_table_of_contents: true sidebar_label: Analyzers -sidebar_position: 25 +sidebar_position: 24 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -40,4 +40,4 @@ export const supportedLanguages = ["java", "csharp", "nodejs"]; - [Create Map Index](../studio/database/indexes/create-map-index) ---> \ No newline at end of file +--> diff --git a/docs/indexes/using-dynamic-fields.mdx b/docs/indexes/using-dynamic-fields.mdx index 26634225a2..00e55486dc 100644 --- a/docs/indexes/using-dynamic-fields.mdx +++ b/docs/indexes/using-dynamic-fields.mdx @@ -2,7 +2,7 @@ title: "Indexes: Dynamic Index Fields" hide_table_of_contents: true sidebar_label: Dynamic Fields -sidebar_position: 28 +sidebar_position: 27 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -47,4 +47,4 @@ export const supportedLanguages = ["csharp", "java", "python", "php", "nodejs"]; - [Term Vectors](../indexes/using-term-vectors) ---> \ No newline at end of file +--> diff --git a/docs/indexes/using-term-vectors.mdx b/docs/indexes/using-term-vectors.mdx index f6913820c4..2cf7030d1a 100644 --- a/docs/indexes/using-term-vectors.mdx +++ b/docs/indexes/using-term-vectors.mdx @@ -2,7 +2,7 @@ title: "Indexes: Term Vectors" hide_table_of_contents: true sidebar_label: Term Vectors -sidebar_position: 27 +sidebar_position: 26 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -37,4 +37,4 @@ export const supportedLanguages = ["java", "nodejs", "csharp"]; - [Dynamic Fields](../indexes/using-dynamic-fields) ---> \ No newline at end of file +--> From acbc104dd273a8274a2bdbc8908d6410a1f5acf5 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Sun, 28 Sep 2025 21:15:36 +0300 Subject: [PATCH 05/10] RDoc-2293 Remove 'old' files + other fixes --- .../content/_atomic-guards-csharp.mdx | 12 +-- .../content/_atomic-guards-nodejs.mdx | 12 +-- .../content/_atomic-guards-php.mdx | 12 +-- .../content/_atomic-guards-python.mdx | 12 +-- .../content/_delete-cmpxchg-items-csharp.mdx | 24 +++-- .../content/_delete-cmpxchg-items-java.mdx | 23 +++-- .../content/_delete-cmpxchg-items-nodejs.mdx | 23 +++-- .../content/_delete-cmpxchg-items-php.mdx | 27 +++-- .../content/_delete-cmpxchg-items-python.mdx | 27 +++-- docs/compare-exchange/start.mdx | 97 +++++++++--------- .../assets/compare-exchange-atomic-guard.png | Bin 21012 -> 0 bytes .../assets/compare-exchange-single-pair.png | Bin 42637 -> 0 bytes .../assets/compare-exchange-view.png | Bin 91931 -> 0 bytes .../documents/compare-exchange-view.mdx | 81 --------------- .../database/documents/conflicts-view.mdx | 2 +- 15 files changed, 164 insertions(+), 188 deletions(-) delete mode 100644 docs/studio/database/documents/assets/compare-exchange-atomic-guard.png delete mode 100644 docs/studio/database/documents/assets/compare-exchange-single-pair.png delete mode 100644 docs/studio/database/documents/assets/compare-exchange-view.png delete mode 100644 docs/studio/database/documents/compare-exchange-view.mdx diff --git a/docs/compare-exchange/content/_atomic-guards-csharp.mdx b/docs/compare-exchange/content/_atomic-guards-csharp.mdx index 66ac08484d..cd4d604012 100644 --- a/docs/compare-exchange/content/_atomic-guards-csharp.mdx +++ b/docs/compare-exchange/content/_atomic-guards-csharp.mdx @@ -139,8 +139,9 @@ in the Studio: ![Atomic Guard](../assets/atomic-guard.png) -1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), - for any purpose you needed. They are NOT the automatically created atomic guards. +1. These are **custom compare-exchange items**, created by the user for any purpose, + as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items). + They are NOT the automatically created atomic guards. 2. This is the **atomic guard** that was generated by running the example above. The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: @@ -148,7 +149,7 @@ in the Studio: * The ID of the associated document (`users/johndoe`). - * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Although this Studio view allows editing compare-exchange items, **do NOT delete or modify atomic guard entries**. * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. @@ -232,9 +233,8 @@ Atomic guards are removed **automatically** in the following scenarios: -* **Do not delete or modify atomic guards manually while they are in use by an active session**. - If a session attempts to save a document whose atomic guard has been removed or changed, - it will fail with an error. +* **Do not delete or modify atomic guards manually**. + If a session attempts to save a document whose atomic guard was removed or modified, it will fail with an error. * If you accidentally remove an atomic guard that is associated with an existing document, you can restore it by re-saving the document in a cluster-wide session, diff --git a/docs/compare-exchange/content/_atomic-guards-nodejs.mdx b/docs/compare-exchange/content/_atomic-guards-nodejs.mdx index 684926d700..bd6a036e7e 100644 --- a/docs/compare-exchange/content/_atomic-guards-nodejs.mdx +++ b/docs/compare-exchange/content/_atomic-guards-nodejs.mdx @@ -102,8 +102,9 @@ in the Studio: ![Atomic Guard](../assets/atomic-guard.png) -1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), - for any purpose you needed. They are NOT the automatically created atomic guards. +1. These are **custom compare-exchange items**, created by the user for any purpose, + as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items). + They are NOT the automatically created atomic guards. 2. This is the **atomic guard** that was generated by running the example above. The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: @@ -111,7 +112,7 @@ in the Studio: * The ID of the associated document (`users/johndoe`). - * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Although this Studio view allows editing compare-exchange items, **do NOT delete or modify atomic guard entries**. * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. @@ -177,9 +178,8 @@ Atomic guards are removed **automatically** in the following scenarios: -* **Do not delete or modify atomic guards manually while they are in use by an active session**. - If a session attempts to save a document whose atomic guard has been removed or changed, - it will fail with an error. +* **Do not delete or modify atomic guards manually**. + If a session attempts to save a document whose atomic guard was removed or modified, it will fail with an error. * If you accidentally remove an atomic guard that is associated with an existing document, you can restore it by re-saving the document in a cluster-wide session, diff --git a/docs/compare-exchange/content/_atomic-guards-php.mdx b/docs/compare-exchange/content/_atomic-guards-php.mdx index c880abf738..f4897bb597 100644 --- a/docs/compare-exchange/content/_atomic-guards-php.mdx +++ b/docs/compare-exchange/content/_atomic-guards-php.mdx @@ -113,8 +113,9 @@ in the Studio: ![Atomic Guard](../assets/atomic-guard.png) -1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), - for any purpose you needed. They are NOT the automatically created atomic guards. +1. These are **custom compare-exchange items**, created by the user for any purpose, + as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items). + They are NOT the automatically created atomic guards. 2. This is the **atomic guard** that was generated by running the example above. The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: @@ -122,7 +123,7 @@ in the Studio: * The ID of the associated document (`users/johndoe`). - * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Although this Studio view allows editing compare-exchange items, **do NOT delete or modify atomic guard entries**. * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. @@ -190,9 +191,8 @@ Atomic guards are removed **automatically** in the following scenarios: -* **Do not delete or modify atomic guards manually while they are in use by an active session**. - If a session attempts to save a document whose atomic guard has been removed or changed, - it will fail with an error. +* **Do not delete or modify atomic guards manually**. + If a session attempts to save a document whose atomic guard was removed or modified, it will fail with an error. * If you accidentally remove an atomic guard that is associated with an existing document, you can restore it by re-saving the document in a cluster-wide session, diff --git a/docs/compare-exchange/content/_atomic-guards-python.mdx b/docs/compare-exchange/content/_atomic-guards-python.mdx index 0d7962fd4b..b3c643d568 100644 --- a/docs/compare-exchange/content/_atomic-guards-python.mdx +++ b/docs/compare-exchange/content/_atomic-guards-python.mdx @@ -94,8 +94,9 @@ in the Studio: ![Atomic Guard](../assets/atomic-guard.png) -1. These are **custom compare-exchange items** that you created, as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items), - for any purpose you needed. They are NOT the automatically created atomic guards. +1. These are **custom compare-exchange items**, created by the user for any purpose, + as described in [Create compare-exchange items](../compare-exchange/create-cmpxchg-items). + They are NOT the automatically created atomic guards. 2. This is the **atomic guard** that was generated by running the example above. The generated atomic guard **key** is: `rvn-atomic/users/johndoe`. It is composed of: @@ -103,7 +104,7 @@ in the Studio: * The ID of the associated document (`users/johndoe`). - * Although this Studio view allows editing compare-exchange items, **do not delete or modify atomic guard entries**. + * Although this Studio view allows editing compare-exchange items, **do NOT delete or modify atomic guard entries**. * Doing so will interfere with RavenDB's ability to track document versioning through atomic guards. @@ -169,9 +170,8 @@ Atomic guards are removed **automatically** in the following scenarios: -* **Do not delete or modify atomic guards manually while they are in use by an active session**. - If a session attempts to save a document whose atomic guard has been removed or changed, - it will fail with an error. +* **Do not delete or modify atomic guards manually**. + If a session attempts to save a document whose atomic guard was removed or modified, it will fail with an error. * If you accidentally remove an atomic guard that is associated with an existing document, you can restore it by re-saving the document in a cluster-wide session, diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx index 6c2cd24392..d54f996234 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx @@ -5,19 +5,30 @@ import CodeBlock from '@theme/CodeBlock'; -* Existing compare-exchange items can be deleted. - -* An item is deleted only if the index you provide in the request matches the current index stored on the server - for the specified key. +* **Custom compare-exchange items can be deleted**: + You can delete your own custom compare-exchange items. + An item is deleted only if the index you provide in the request matches the current index stored on the server for the specified key. -* Compare-exchange items can also be deleted by adding an expiration date to them. +* **Delete items by expiration**: + Compare-exchange items can also be deleted by adding an expiration date to them. Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). -* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. +* **Compare-exchange tombstones**: + Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. E.g., indexes referencing the deleted item will update themselves to remove those references. The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). + +* + Do NOT attempt to delete [atomic guards](../compare-exchange/atomic-guards), which RavenDB uses internally to ensure ACID guarantees in cluster-wide transactions. + These compare-exchange items are created automatically and must not be modified or removed. + + If your custom compare-exchange item was set up to protect the consistency of a transaction, deleting it will break the ACID guarantees. + Only delete or modify such items if you truly know what you're doing. + + +--- * In this article: * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) @@ -27,7 +38,6 @@ import CodeBlock from '@theme/CodeBlock'; * [Delete compare-exchange item using a **store operation**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) * [Syntax](../compare-exchange/delete-cmpxchg-items#syntax) - diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx index 417823296f..ce66f46f71 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx @@ -5,20 +5,31 @@ import CodeBlock from '@theme/CodeBlock'; -* Existing compare-exchange items can be deleted. - -* An item is deleted only if the index you provide in the request matches the current index stored on the server - for the specified key. +* **Custom compare-exchange items can be deleted**: + You can delete your own custom compare-exchange items. + An item is deleted only if the index you provide in the request matches the current index stored on the server for the specified key. -* Compare-exchange items can also be deleted by adding an expiration date to them. +* **Delete items by expiration**: + Compare-exchange items can also be deleted by adding an expiration date to them. Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). -* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. +* **Compare-exchange tombstones**: + Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. E.g., indexes referencing the deleted item will update themselves to remove those references. The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). +* + Do not attempt to delete [atomic guards](../compare-exchange/atomic-guards), which RavenDB uses internally to ensure ACID guarantees in cluster-wide transactions. + These items are created automatically and must not be modified or removed. + + If your custom compare-exchange item was set up to protect the consistency of a transaction, deleting it will break the ACID guarantees. + Only delete or modify such items if you truly know what you're doing. + + +--- + * In this article: * [Delete compare-exchange item using a **store operation**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-store-operation) * [Delete compare-exchange items using the **Studio**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-items-using-the-studio) diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx index b329c4cdd3..e9ac5a7f30 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx @@ -5,20 +5,31 @@ import CodeBlock from '@theme/CodeBlock'; -* Existing compare-exchange items can be deleted. - -* An item is deleted only if the index you provide in the request matches the current index stored on the server - for the specified key. +* **Custom compare-exchange items can be deleted**: + You can delete your own custom compare-exchange items. + An item is deleted only if the index you provide in the request matches the current index stored on the server for the specified key. -* Compare-exchange items can also be deleted by adding an expiration date to them. +* **Delete items by expiration**: + Compare-exchange items can also be deleted by adding an expiration date to them. Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). -* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. +* **Compare-exchange tombstones**: + Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. E.g., indexes referencing the deleted item will update themselves to remove those references. The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). +* + Do not attempt to delete [atomic guards](../compare-exchange/atomic-guards), which RavenDB uses internally to ensure ACID guarantees in cluster-wide transactions. + These items are created automatically and must not be modified or removed. + + If your custom compare-exchange item was set up to protect the consistency of a transaction, deleting it will break the ACID guarantees. + Only delete or modify such items if you truly know what you're doing. + + +--- + * In this article: * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx index 4457940539..5ad5d0a266 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx @@ -5,20 +5,31 @@ import CodeBlock from '@theme/CodeBlock'; -* Existing compare-exchange items can be deleted. - -* An item is deleted only if the index you provide in the request matches the current index stored on the server - for the specified key. - -* Compare-exchange items can also be deleted by adding an expiration date to them. - Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). +* **Custom compare-exchange items can be deleted**: + You can delete your own custom compare-exchange items. + An item is deleted only if the index you provide in the request matches the current index stored on the server for the specified key. -* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. +* **Delete items by expiration**: + Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* **Compare-exchange tombstones**: + Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. E.g., indexes referencing the deleted item will update themselves to remove those references. The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). +* + Do not attempt to delete [atomic guards](../compare-exchange/atomic-guards), which RavenDB uses internally to ensure ACID guarantees in cluster-wide transactions. + These items are created automatically and must not be modified or removed. + + If your custom compare-exchange item was set up to protect the consistency of a transaction, deleting it will break the ACID guarantees. + Only delete or modify such items if you truly know what you're doing. + + +--- + * In this article: * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx index 10ce8d7da2..6d2f34601d 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx @@ -5,20 +5,31 @@ import CodeBlock from '@theme/CodeBlock'; -* Existing compare-exchange items can be deleted. - -* An item is deleted only if the index you provide in the request matches the current index stored on the server - for the specified key. - -* Compare-exchange items can also be deleted by adding an expiration date to them. - Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). +* **Custom compare-exchange items can be deleted**: + You can delete your own custom compare-exchange items. + An item is deleted only if the index you provide in the request matches the current index stored on the server for the specified key. -* Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. +* **Delete items by expiration**: + Compare-exchange items can also be deleted by adding an expiration date to them. + Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). + +* **Compare-exchange tombstones**: + Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. E.g., indexes referencing the deleted item will update themselves to remove those references. The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). +* + Do not attempt to delete [atomic guards](../compare-exchange/atomic-guards), which RavenDB uses internally to ensure ACID guarantees in cluster-wide transactions. + These items are created automatically and must not be modified or removed. + + If your custom compare-exchange item was set up to protect the consistency of a transaction, deleting it will break the ACID guarantees. + Only delete or modify such items if you truly know what you're doing. + + +--- + * In this article: * [Delete compare-exchange item using a **cluster-wide session**](../compare-exchange/delete-cmpxchg-items#delete-compare-exchange-item-using-a-cluster-wide-session) * [Delete by item](../compare-exchange/delete-cmpxchg-items#delete-by-item) diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index afab7bc887..78359b15ec 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -14,8 +14,8 @@ import Admonition from '@theme/Admonition'; -* Compare-exchange is a RavenDB feature for storing atomic, cluster-wide **key-value pairs**. - Each item is globally unique within the database, versioned, and managed at the cluster level. +* Compare-exchange is a RavenDB feature for storing atomic, cluster-wide **key-value pairs** where each key is a globally unique identifier in the database. + Items are versioned and managed at the cluster level. * Compare-exchange provides a built-in consensus mechanism ideal for safe coordination and global consistency in distributed environments, allowing you to: @@ -48,9 +48,9 @@ import Admonition from '@theme/Admonition'; ### Enforce unique usernames or emails -* Use Compare-Exchange to enforce global uniqueness in your database even under concurrent operations. +* Use compare-exchange to enforce global uniqueness in your database even under concurrent operations. For example, ensure that no two users can register with the same username or email, even if they do so simultaneously on different servers. - Compare-Exchange guarantees that a specific value can only be claimed once across the cluster reliably and without race conditions. + Compare-exchange guarantees that a specific value can only be claimed once across the cluster reliably and without race conditions. * ✅ Why compare-exchange? It provides a guaranteed, cluster-wide check for uniqueness. @@ -71,20 +71,20 @@ import Admonition from '@theme/Admonition'; ### Claim a job or task once -* Use compare-exchange to safely assign background jobs or tasks in a distributed system, - ensuring each task is picked up only once. +* Use compare-exchange to safely assign client-side jobs or tasks in a distributed system, + ensuring that each task is claimed only once. * ✅ Why compare-exchange? It provides a reliable, cluster-wide locking mechanism for coordination within your database scope. * How it works: - * Each worker tries to create a Compare-Exchange item like (**key**: `"locks/job/1234"`, **value**: `"worker-A"`). + * Each worker attempts to create a compare-exchange item like (**key**: `"locks/job/1234"`, **value**: `"worker-A"`). * The first worker to succeed gets the job. - * Other workers trying to claim the same job will fail — and can back off or retry later. + * Other workers trying to claim the same job will fail - they can back off or retry later. * This ensures: * No two workers process the same job. - * Jobs run exactly once, even with multiple competing workers or nodes. + * Each job runs exactly once, even with multiple competing workers or nodes. * Also useful for: * Implementing mutex-style locks between clients. @@ -94,64 +94,66 @@ import Admonition from '@theme/Admonition'; -### Prevent double processing +### Reserve a resource -* Use compare-exchange to make sure an operation runs only once even in a distributed setup. - This is useful for avoiding things like sending the same email twice, processing the same order multiple times, or executing duplicate actions after retries. +* Need to reserve a table in a restaurant app or a seat at an event? + Use compare-exchange to lock the reservation and prevent double booking, even under concurrent access. * ✅ Why compare-exchange? - It acts as a once-only flag - a lightweight, atomic check to prevent duplicate processing. + It gives you a reliable, cluster-wide way to reserve something exactly once - no race conditions, no conflicts. * How it works: - * Before running the operation, try to create a compare-exchange key like `processed/orders/9876`. - * If the key creation succeeds - run the operation. - * If the key already exists - skip processing. It's already been handled. + * Try to create a Compare-Exchange item for the resource + (e.g., **key**: `"reservations/seat/17"`, **value**: `"user/123"`). + * If the item doesn't exist, the reservation is successful. + * If it already exists, someone else claimed it - you can show an error or let the user pick another. -* This approach is especially useful in retry scenarios, background jobs, or any flow where idempotency matters. +* This pattern is useful for: + * Reserving seats, tables, or event slots. + * Assigning support engineers to incoming tickets. + * Allocating limited resources like promotion codes or serial numbers. + +* Only one client can claim the item so your reservation logic stays safe and simple, even under high load. -### Run business logic only if data didn’t change +### Prevent double processing -* Use compare-exchange as a version guard to make sure no one modified the data while you were working on it. - This is useful when applying business logic that depends on the current state of the data - like approving a request, processing a payment, or updating a workflow step. +* Use compare-exchange to make sure an operation runs only once even in a distributed setup. + This is useful for avoiding things like sending the same email twice, processing the same order multiple times, + or executing duplicate actions after retries. * ✅ Why compare-exchange? - It helps you detect changes and avoid acting on stale or outdated data. + It acts as a once-only flag - a lightweight, atomic check to prevent duplicate processing. * How it works: - * Load the compare-exchange item that tracks the current version or state of the resource. - * After performing your checks and logic, update the item - but only if the version hasn’t changed. - * If the item was modified in the meantime, the update fails and you can safely abort or retry. + * Before running the operation, try to create a compare-exchange key like `processed/orders/9876`. + * If the key creation succeeds - run the operation. + * If the key already exists - skip processing. It's already been handled. -* This pattern helps you maintain correctness and consistency in flows that involve multiple steps, - long-running tasks, or user input. +* This approach is especially useful in retry scenarios, background jobs, or any flow where idempotency matters. -### Reserve a resource +### Run business logic only if data hasn't changed -* Need to reserve a table in a restaurant app or a seat at an event? - Use compare-exchange to lock the reservation and prevent double booking, even when multiple users act at the same time. +* Use compare-exchange as a version guard to ensure the data wasn't modified while you were working on it. + This is useful when applying business logic that depends on the current state of the data - like approving a request, processing a payment, or updating a workflow step. * ✅ Why compare-exchange? - It gives you a reliable, cluster-wide way to reserve something exactly once - no race conditions, no conflicts. + It helps detect changes and prevents acting on stale or outdated data. * How it works: - * Try to create a Compare-Exchange item for the resource (e.g., **key**: `"reservations/seat/17"`, **value**: `"user/123"`). - * If the item doesn't exist, the reservation is successful. - * If it already exists, someone else claimed it - you can show an error or let the user pick another. - -* This pattern is useful for: - * Reserving seats, tables, or event slots. - * Assigning support engineers to incoming tickets. - * Allocating limited resources like promotion codes or serial numbers. + * Load the compare-exchange item that tracks the current version or state of the resource. + * After performing your checks and logic, attempt to update the item - but only if the version is still current. + * If the item was modified in the meantime, the update fails and you can abort or retry your business logic. -* Only one client can claim the item so your reservation logic stays safe and simple, even under high load. +* This pattern helps you maintain correctness and consistency in flows that involve multiple steps, + long-running tasks, or user input. @@ -159,14 +161,14 @@ import Admonition from '@theme/Admonition'; ### Lock a document for editing -* In collaborative systems, it's common to let only one user edit a document at a time. - Use Compare-Exchange to create a lightweight, distributed lock on a document. +* In collaborative systems, it's common to allow only one user edit a document at a time. + Use compare-exchange to create a lightweight, distributed lock on the document. * ✅ Why compare-exchange? It ensures that only one client can acquire the lock - preventing conflicting edits across users or servers. * How it works: - * When a user starts editing a document (e.g., `task 72`), try to create a compare-exchange item: + * When a user starts editing a document (e.g., `task/72`), try to create a compare-exchange item: (**key**: `"editing/task/72"`, **value**: `"user/123"`). * If the item is created successfully, the user holds the lock. * Other users attempting the same key will fail and can be blocked, shown a message, or put into read-only mode. @@ -185,11 +187,12 @@ import Admonition from '@theme/Admonition'; ### Add safety to cluster-wide transactions -* RavenDB uses **compare-exchange items** behind the scenes to protect cluster-wide transactions. +* RavenDB uses **compare-exchange items** behind the scenes to protect cluster-wide transactions. + When using cluster-wide sessions, RavenDB automatically creates internal compare-exchange entries called Atomic Guards + to coordinate concurrent access and prevent conflicting writes. -* ✅ Why Compare-Exchange? - In cluster-wide sessions, RavenDB automatically creates internal compare-exchange entries, - called **atomic guards**, to coordinate concurrent access and prevent conflicting writes. +* ✅ Why compare-exchange? + It provides a Raft-based coordination mechanism that ensures consistency and safety during multi-node transactions. * How it works: * When you store or update a document in a cluster-wide session, @@ -204,7 +207,7 @@ import Admonition from '@theme/Admonition'; * Violating ACID guarantees in multi-node clusters. * You don’t need to manage these guards manually - - RavenDB handles everything automatically when you use `TransactionMode.ClusterWide`. + RavenDB handles everything automatically when you use a session in cluster-wide mode. diff --git a/docs/studio/database/documents/assets/compare-exchange-atomic-guard.png b/docs/studio/database/documents/assets/compare-exchange-atomic-guard.png deleted file mode 100644 index eb51bf72a5ec1def02becc32fdef3631655707c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21012 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 diff --git a/docs/studio/database/documents/assets/compare-exchange-single-pair.png b/docs/studio/database/documents/assets/compare-exchange-single-pair.png deleted file mode 100644 index f3202dc0fd735bb6a646ce7c3a0de77d213c0160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42637 zcmeFZXH=8hw?2v#5fs=KQ0YkTiWDiKN(sG(jwl@hNR{3Mlx`@Y_g)e@(p3Zmq=gbX zDufmw(jk=GY}xyF&Kcw059j~se)zv*5LVu@-nr(Q^I3DvXRW-~)>Nh-rzIyKAfN!M zJl7>4xK2huK=|dxb^Mu?Iu|PBwZz9B)ct1 zQ+0YmK)_4@d@iT|CTnZK*KE>j5rP4>1TDN{D% z(+!$W$0vo&ht!w)&nHDRnqoCj2D281hN-rz5Yv}GX;%ce-aUBx$n6;#lh9qkC3$1* zHSXrfDW9wK8ta<3zl;n9IXJ<)BM-+5^XCXzBD3GQ_MdO7aw`8R=RRWlxBN-#_MLyr zKT2=l8+ )>ASN+zIY7*GnL(R>9C|2_OFzqSUjbA}n$VBmDcGklrtYkP@#gIMd2Od-HbFWqS}hT=%b!FXGBf>eT-C#$VHrgXS@H7E@V~*I)Bio} z-ia7|aA98Iw;D(H{Jg@|UG}@Q{A`cELna^hTSH>W?RNdxp{DLF9qz3Gxa$OY>`#Do z4>~at-HC+OkjY0g*%mGHkapc#y+=`h_cZ~*THAFBGD39@FMB&(>yNZg6P+48_Lpt&T;`d-W}is+|K zFREB7d-R($2IQcc_ue$VtXJzlGm}U~8w``drQZJf^THoe6U;23K;1U&B!OrV^sJ6y z9OKGO(u$XjX~M#b1^K&(Y!Inqw`S=S*oWH}Zt9N!NEm$OBPaNAj^I$)oSUrrDt(Ps ze6-;91x32LLGTFs!9idnCE9N6y&hxr%qF4~ojuz*Qr)f>(D%nKLiW|d-x3G5rF$(? z)0m5Yttfj}!KqR4QV7UOYUH^QL9;#LiJk)suor(!PTu6;!?&zWRE~opPRz+ZEPwF& z!%YST=5DinOp7;|&~r#7Ch{vC)-Og6Q|<1kB>}+Sk3T-07A~@UX1`DC_xpO~_2b4e z*o6~CJ%(&(`aylKrSq5%w`TR?=2Ww3w)@9TNqGVS$391uLQ-R4jM6Ci-%=5ThkBcqk2?TQGJ-)16R0nHMHER?s9h6Mrds z$KItOL>59ws7^aNH@e(B_Z39@r%rp9MoKbu4u>gt6|G2(oF607Xzd-r#TnJ-3=gOV zUfg^3R*obD+CGLc6a0vx(j9Vy8WjnzPE?P}3}5Rq$T0mx;-5B`O+CHnC{S

_%nDCAh}q7Bh%lyI=qL^+%MmFT%dU~ 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

  • ndq+hIk96l2YQ{mza}xbk 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\Xz{n;mP6wgVS*T?q?-R5j+ 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 PcR^5fZAiJQb=bcEZqPS) diff --git a/docs/studio/database/documents/assets/compare-exchange-view.png b/docs/studio/database/documents/assets/compare-exchange-view.png deleted file mode 100644 index 3221aeb309369b6c446ace2e5811fd7be3e628cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91931 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 - -* [Compare-Exchange](../../../client-api/operations/compare-exchange/overview.mdx) are cluster-wide key/value pair items where the key - is a unique identifier in the database. - -* CmpXchg items coordinate work between sessions that are - trying to modify a shared resource (such as a document) at the same time. - -* Compare exchange items are created and managed by either of the following: - * RavenDB [Atomic Guards](../../../client-api/session/cluster-transaction/atomic-guards.mdx) - To guarantee ACIDity across the cluster, - as of RavenDB 5.2, we automatically create and maintain Atomic Guard CmpXchg items in cluster-wide sessions. - * [API Operations](../../../client-api/operations/compare-exchange/overview.mdx) - * [Session - Cluster Transaction](../../../client-api/session/cluster-transaction/overview.mdx) - * Using the [RavenDB Studio](../../../studio/database/documents/compare-exchange-view.mdx#the-compare-exchange-view) - -* In this page: - * [The Compare Exchange View](../../../studio/database/documents/compare-exchange-view.mdx#the-compare-exchange-view) - - -## The Compare Exchange View - -![Compare Exchange View](./assets/compare-exchange-view.png) - -1. **Documents Tab** - Select to see document-related options and the list of documents in this database . -2. **Compare Exchange** - Select to see the Compare Exchange view. -3. **Add new item** - Click to add a new compare exchange key/value pair. -4. **Compare exchange key/value properties** - Click the edit button or key name to edit this item. - ![Compare Exchange Single Pair](./assets/compare-exchange-single-pair.png) - 1. **Key** - A unique identifier that is reserved across the cluster. - Enter any string of your choice. - - If keys start with "rvn-atomic", they are [Atomic Guards](../../../client-api/session/cluster-transaction/atomic-guards.mdx). - They are created and maintained automatically to guarantee ACID cluster-wide transactions. - **Do not remove or edit these** as this will disable ACID guarantees. - - ![Atomic Guard](./assets/compare-exchange-atomic-guard.png) - - - 2. **Value** - Enter a value that will be associated with the key. - Values can be numbers, strings, arrays, or objects. Any value that can be represented as JSON is valid. - 3. **Metadata** - Click to add metadata. - The metadata is associated with the key, similar to document's metadata. - 4. **Raft Index** - The raft index increments automatically each time the value or metadata are changed, indicating the compare-exchange item's - current version. - 5. **Delete** - Click to delete this compare exchange item. - - Deleting a compare exchange item will remove ACID guarantees for transactions if the pair was set up to protect ACIDity. - Only remove or edit these if you _truly_ know what you're doing. - - 6. **Save** - Save will only succeed if the Raft Index version that is currently stored within RavenDB for this key - matches the version that shows in the view. - - - - diff --git a/docs/studio/database/documents/conflicts-view.mdx b/docs/studio/database/documents/conflicts-view.mdx index 326ee3b0fd..6385b5449a 100644 --- a/docs/studio/database/documents/conflicts-view.mdx +++ b/docs/studio/database/documents/conflicts-view.mdx @@ -2,7 +2,7 @@ title: "Documents: Conflicts View" hide_table_of_contents: true sidebar_label: Conflicts View -sidebar_position: 6 +sidebar_position: 5 --- import Admonition from '@theme/Admonition'; From 3fa640ec2eda362639d537a2a7918f7b21c48cd8 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Sun, 28 Sep 2025 22:04:49 +0300 Subject: [PATCH 06/10] RDoc-2293 Remove more 'old' files + fix feature location --- docs/ai-integration/_category_.json | 6 ++--- docs/client-api/_category_.json | 4 ++-- docs/compare-exchange/_category_.json | 2 +- docs/data-archival/_category_.json | 4 ++-- docs/document-extensions/_category_.json | 4 ++-- docs/glossary/_category_.json | 6 ++--- ...e-compare-exchange-command-data-csharp.mdx | 18 -------------- ...t-compare-exchange-command-data-csharp.mdx | 19 --------------- docs/glossary/counters-batch-command-data.mdx | 4 ++-- .../delete-compare-exchange-command-data.mdx | 24 ------------------- .../put-compare-exchange-command-data.mdx | 24 ------------------- docs/indexes/_category_.json | 4 ++-- docs/integrations/_category_.json | 6 ++--- docs/migration/_category_.json | 4 ++++ docs/server/_category_.json | 6 ++--- docs/sharding/_category_.json | 4 ++-- docs/start/_category_.json | 4 ++-- docs/studio/_category_.json | 6 ++--- docs/users-issues/_category_.json | 6 ++--- sidebars.ts | 12 +++++----- 20 files changed, 43 insertions(+), 124 deletions(-) delete mode 100644 docs/glossary/_delete-compare-exchange-command-data-csharp.mdx delete mode 100644 docs/glossary/_put-compare-exchange-command-data-csharp.mdx delete mode 100644 docs/glossary/delete-compare-exchange-command-data.mdx delete mode 100644 docs/glossary/put-compare-exchange-command-data.mdx create mode 100644 docs/migration/_category_.json diff --git a/docs/ai-integration/_category_.json b/docs/ai-integration/_category_.json index 1b43344b4c..dffbdf0935 100644 --- a/docs/ai-integration/_category_.json +++ b/docs/ai-integration/_category_.json @@ -1,4 +1,4 @@ { - "position": 9, - "label": AI Integration, -} \ No newline at end of file + "position": 10, + "label": "AI Integration" +} diff --git a/docs/client-api/_category_.json b/docs/client-api/_category_.json index 2b13474af7..b5b683de90 100644 --- a/docs/client-api/_category_.json +++ b/docs/client-api/_category_.json @@ -1,4 +1,4 @@ { "position": 1, - "label": Client API, -} \ No newline at end of file + "label": "Client API" +} diff --git a/docs/compare-exchange/_category_.json b/docs/compare-exchange/_category_.json index 6037ed5859..3c5a076b2f 100644 --- a/docs/compare-exchange/_category_.json +++ b/docs/compare-exchange/_category_.json @@ -1,4 +1,4 @@ { - "position": 14, + "position": 5, "label": "Compare-Exchange" } diff --git a/docs/data-archival/_category_.json b/docs/data-archival/_category_.json index 20f724236e..f2d5bb4b23 100644 --- a/docs/data-archival/_category_.json +++ b/docs/data-archival/_category_.json @@ -1,4 +1,4 @@ { "position": 4, - "label": Data Archival, -} \ No newline at end of file + "label": "Data Archival" +} diff --git a/docs/document-extensions/_category_.json b/docs/document-extensions/_category_.json index cdf53fd5d0..49bb9c4b28 100644 --- a/docs/document-extensions/_category_.json +++ b/docs/document-extensions/_category_.json @@ -1,4 +1,4 @@ { "position": 3, - "label": Document Extensions, -} \ No newline at end of file + "label": "Document Extensions" +} diff --git a/docs/glossary/_category_.json b/docs/glossary/_category_.json index ff3a75b291..d6a7d964e3 100644 --- a/docs/glossary/_category_.json +++ b/docs/glossary/_category_.json @@ -1,4 +1,4 @@ { - "position": 10, - "label": Glossary, -} \ No newline at end of file + "position": 11, + "label": "Glossary" +} diff --git a/docs/glossary/_delete-compare-exchange-command-data-csharp.mdx b/docs/glossary/_delete-compare-exchange-command-data-csharp.mdx deleted file mode 100644 index 105e0642e5..0000000000 --- a/docs/glossary/_delete-compare-exchange-command-data-csharp.mdx +++ /dev/null @@ -1,18 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - -### Properties - -| Name | Type | Description | -| ------------- | ------------- | ----- | -| **key** | string | The key to be deleted | -| **index** | long | The version number of the value to be deleted | - -### Methods - -| Signature | Description | -| ---------- | ----------- | -| **DynamicJsonValue ToJson(DocumentConventions conventions, JsonOperationContext context)** | Translate this instance to a Json. | - diff --git a/docs/glossary/_put-compare-exchange-command-data-csharp.mdx b/docs/glossary/_put-compare-exchange-command-data-csharp.mdx deleted file mode 100644 index 0634a8390f..0000000000 --- a/docs/glossary/_put-compare-exchange-command-data-csharp.mdx +++ /dev/null @@ -1,19 +0,0 @@ -import Admonition from '@theme/Admonition'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import CodeBlock from '@theme/CodeBlock'; - -### Properties - -| Name | Type | Description | -| ------------- | ------------- | ----- | -| **key** | string | Object identifier under which _value_ is saved, unique in the database scope across the cluster. | -| **value** | BlittableJsonReaderObject | The value to be saved for the specified _key_. | -| **index** | long | The current version of _Value_ when updating a value for an existing key | - -### Methods - -| Signature | Description | -| ---------- | ----------- | -| **DynamicJsonValue ToJson(DocumentConventions conventions, JsonOperationContext context)** | Translate this instance to a Json. | - diff --git a/docs/glossary/counters-batch-command-data.mdx b/docs/glossary/counters-batch-command-data.mdx index d59eba6d03..1a4421b658 100644 --- a/docs/glossary/counters-batch-command-data.mdx +++ b/docs/glossary/counters-batch-command-data.mdx @@ -2,7 +2,7 @@ title: "Glossary: CountersBatchCommandData" hide_table_of_contents: true sidebar_label: CountersBatchCommandData -sidebar_position: 22 +sidebar_position: 20 --- import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; @@ -22,4 +22,4 @@ export const supportedLanguages = ["csharp"]; \ No newline at end of file +--> diff --git a/docs/glossary/delete-compare-exchange-command-data.mdx b/docs/glossary/delete-compare-exchange-command-data.mdx deleted file mode 100644 index a3df7bf751..0000000000 --- a/docs/glossary/delete-compare-exchange-command-data.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Glossary: DeleteCompareExchangeCommandData" -hide_table_of_contents: true -sidebar_label: DeleteCompareExchangeCommandData -sidebar_position: 21 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import DeleteCompareExchangeCommandDataCsharp from './_delete-compare-exchange-command-data-csharp.mdx'; - -export const supportedLanguages = ["csharp"]; - - - - - - - - - \ No newline at end of file diff --git a/docs/glossary/put-compare-exchange-command-data.mdx b/docs/glossary/put-compare-exchange-command-data.mdx deleted file mode 100644 index c78d688496..0000000000 --- a/docs/glossary/put-compare-exchange-command-data.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Glossary: PutCompareExchangeCommandData" -hide_table_of_contents: true -sidebar_label: PutCompareExchangeCommandData -sidebar_position: 20 ---- - -import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; -import LanguageContent from "@site/src/components/LanguageContent"; - -import PutCompareExchangeCommandDataCsharp from './_put-compare-exchange-command-data-csharp.mdx'; - -export const supportedLanguages = ["csharp"]; - - - - - - - - - \ No newline at end of file diff --git a/docs/indexes/_category_.json b/docs/indexes/_category_.json index 8adbf43f8b..13d6071a5f 100644 --- a/docs/indexes/_category_.json +++ b/docs/indexes/_category_.json @@ -1,4 +1,4 @@ { "position": 2, - "label": Indexes, -} \ No newline at end of file + "label": "Indexes" +} diff --git a/docs/integrations/_category_.json b/docs/integrations/_category_.json index eecdb77dcc..b1527a08a3 100644 --- a/docs/integrations/_category_.json +++ b/docs/integrations/_category_.json @@ -1,4 +1,4 @@ { - "position": 8, - "label": Integrations, -} \ No newline at end of file + "position": 9, + "label": "Integrations" +} diff --git a/docs/migration/_category_.json b/docs/migration/_category_.json new file mode 100644 index 0000000000..88231dc12d --- /dev/null +++ b/docs/migration/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 8, + "label": "Migration Guide" +} diff --git a/docs/server/_category_.json b/docs/server/_category_.json index 055cf45bb7..950e45a759 100644 --- a/docs/server/_category_.json +++ b/docs/server/_category_.json @@ -1,4 +1,4 @@ { - "position": 5, - "label": Server, -} \ No newline at end of file + "position": 6, + "label": "Server" +} diff --git a/docs/sharding/_category_.json b/docs/sharding/_category_.json index 74fd38943c..677f1e31cc 100644 --- a/docs/sharding/_category_.json +++ b/docs/sharding/_category_.json @@ -1,4 +1,4 @@ { "position": 13, - "label": Sharding, -} \ No newline at end of file + "label": "Sharding" +} diff --git a/docs/start/_category_.json b/docs/start/_category_.json index 13d42231a4..202cf83040 100644 --- a/docs/start/_category_.json +++ b/docs/start/_category_.json @@ -1,4 +1,4 @@ { "position": 0, - "label": Getting Started, -} \ No newline at end of file + "label": "Getting Started" +} diff --git a/docs/studio/_category_.json b/docs/studio/_category_.json index dde30a4412..090e5b76a7 100644 --- a/docs/studio/_category_.json +++ b/docs/studio/_category_.json @@ -1,4 +1,4 @@ { - "position": 6, - "label": Studio, -} \ No newline at end of file + "position": 7, + "label": "Studio", +} diff --git a/docs/users-issues/_category_.json b/docs/users-issues/_category_.json index f2f1383c32..5d76e25274 100644 --- a/docs/users-issues/_category_.json +++ b/docs/users-issues/_category_.json @@ -1,4 +1,4 @@ { - "position": 11, - "label": Users Issues, -} \ No newline at end of file + "position": 12, + "label": "Users Issues" +} diff --git a/sidebars.ts b/sidebars.ts index 24afb6cc99..576f8c5de0 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -39,6 +39,11 @@ const sidebars: SidebarsConfig = { label: 'Data Archival', items: [{type: 'autogenerated', dirName: 'data-archival'}], }, + { + type: 'category', + label: 'Compare-Exchange', + items: [{type: 'autogenerated', dirName: 'compare-exchange'}], + }, { type: 'category', label: 'Server', @@ -78,12 +83,7 @@ const sidebars: SidebarsConfig = { type: 'category', label: 'Sharding', items: [{type: 'autogenerated', dirName: 'sharding'}], - }, - { - type: 'category', - label: 'Compare-Exchange', - items: [{type: 'autogenerated', dirName: 'compare-exchange'}], - }, + } ] }; From d6fc6b767417f72ff388b28d7b660c1ec7b59225 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Thu, 9 Oct 2025 15:41:56 +0300 Subject: [PATCH 07/10] RDoc-2293 Fix review comments for start.mdx + move "Use cases" to the end to avoid a long initial scroll. --- docs/compare-exchange/start.mdx | 187 ++++++++++++++++---------------- 1 file changed, 94 insertions(+), 93 deletions(-) diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index 78359b15ec..2f7786e27d 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -23,25 +23,109 @@ import Admonition from '@theme/Admonition'; * Assign work to a single client or reserve a resource once. * Handle concurrency safely, without external services or custom locking logic. -* Compare-exchange items can also serve as a place to store shared data that lives outside of the documents - - useful for values that are reused, referenced globally, or managed independently of any single document. +* Compare-exchange items can also store shared or global values that aren't tied to a specific document. + For example: system-wide configuration flags, shared settings, or reusable identifiers. * Key Characteristics of a compare-exchange item: - * Cluster-wide - Visible and consistent across all nodes. + * Cluster-wide - Visible and consistent across all nodes in the [database group](../studio/database/settings/manage-database-group). * Atomic - Only one client can successfully modify an item at a time (all-or-nothing updates). * Versioned - Each update increments the version, enabling conflict detection. * Flexible - Values can be strings, numbers, arrays, or JSON objects. * Internal - Not replicated outside the database. * On this start page, you'll find: - * [Sample use cases](../compare-exchange/start#sample-use-cases) * [Technical documentation links](../compare-exchange/start#technical-documentation-links-) * [RavenDB Demo links](../compare-exchange/start#ravendb-demo-links) * [Related blog posts](../compare-exchange/start#related-blog-posts) * [Related in-depth articles](../compare-exchange/start#related-in-depth-articles) + * [Sample use cases](../compare-exchange/start#sample-use-cases) +--- + +## Technical documentation links ✨ + +* [Overview](../compare-exchange/overview) +* [Create Compare-Exchange Items](../compare-exchange/create-cmpxchg-items) +* [Get Compare-Exchange Item](../compare-exchange/get-cmpxchg-item) +* [Get Compare-Exchange Items](../compare-exchange/get-cmpxchg-items) +* [Delete Compare-Exchange Items](../compare-exchange/delete-cmpxchg-items) +* [Update Compare-Exchange Item](../compare-exchange/update-cmpxchg-item) +* [Include Compare-Exchange Items](../compare-exchange/include-cmpxchg-items) +* [Indexing Compare-Exchange Values](../compare-exchange/indexing-cmpxchg-values) +* [Compare-Exchange in Dynamic Queries](../compare-exchange/cmpxchg-in-dynamic-queries) +* [Compare-Exchange Expiration](../compare-exchange/cmpxchg-expiration) +* [Atomic Guards](../compare-exchange/atomic-guards) + +--- + +## RavenDB Demo links + + + + + + +## Related blog posts + + + + + + + +## Related in-depth articles + + + + + + +--- + ## Sample use cases @@ -187,19 +271,18 @@ import Admonition from '@theme/Admonition'; ### Add safety to cluster-wide transactions -* RavenDB uses **compare-exchange items** behind the scenes to protect cluster-wide transactions. - When using cluster-wide sessions, RavenDB automatically creates internal compare-exchange entries called Atomic Guards - to coordinate concurrent access and prevent conflicting writes. +* When using cluster-wide sessions to handle documents, RavenDB automatically creates internal compare-exchange items, + called [atomic guards](../compare-exchange/atomic-guards), to enforce atomic document modifications. + These items coordinate access and prevent conflicting writes across nodes. * ✅ Why compare-exchange? It provides a Raft-based coordination mechanism that ensures consistency and safety during multi-node transactions. * How it works: * When you store or update a document in a cluster-wide session, - RavenDB generates an atomic guard with a Raft-based version. - * This guard tracks the document’s state across the cluster. - * If another session modifies the document (or its state changes due to replication), - your transaction will fail with a `ConcurrencyException`, ensuring consistency is preserved. + RavenDB creates an atomic guard to track the document’s version across the cluster. + * If another session modifies the document in the meantime, + your transaction fails with a `ConcurrencyException`, ensuring data consistency. * This protects you from: * Writing over documents that were modified by other sessions. @@ -210,85 +293,3 @@ import Admonition from '@theme/Admonition'; RavenDB handles everything automatically when you use a session in cluster-wide mode. - ---- - -## Technical documentation links ✨ - -* [Overview](../compare-exchange/overview) -* [Create Compare-Exchange Items](../compare-exchange/create-cmpxchg-items) -* [Get Compare-Exchange Item](../compare-exchange/get-cmpxchg-item) -* [Get Compare-Exchange Items](../compare-exchange/get-cmpxchg-items) -* [Delete Compare-Exchange Items](../compare-exchange/delete-cmpxchg-items) -* [Update Compare-Exchange Item](../compare-exchange/update-cmpxchg-item) -* [Include Compare-Exchange Items](../compare-exchange/include-cmpxchg-items) -* [Indexing Compare-Exchange Values](../compare-exchange/indexing-cmpxchg-values) -* [Compare-Exchange in Dynamic Queries](../compare-exchange/cmpxchg-in-dynamic-queries) -* [Compare-Exchange Expiration](../compare-exchange/cmpxchg-expiration) -* [Atomic Guards](../compare-exchange/atomic-guards) - ---- - -## RavenDB Demo links - - - - - - -## Related blog posts - - - - - - - -## Related in-depth articles - - - - - From f507e92dad71262061384c8e9bdb721e6d1ddfe5 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Sun, 12 Oct 2025 17:53:41 +0300 Subject: [PATCH 08/10] RDoc-2293 Fix review comments for overview.mdx --- .../content/_overview-csharp.mdx | 157 ++++++--------- .../content/_overview-java.mdx | 71 +++++-- .../content/_overview-php.mdx | 180 ++++++------------ .../content/_overview-python.mdx | 141 ++++++-------- docs/compare-exchange/start.mdx | 3 - 5 files changed, 219 insertions(+), 333 deletions(-) diff --git a/docs/compare-exchange/content/_overview-csharp.mdx b/docs/compare-exchange/content/_overview-csharp.mdx index 721964e401..c81e63543c 100644 --- a/docs/compare-exchange/content/_overview-csharp.mdx +++ b/docs/compare-exchange/content/_overview-csharp.mdx @@ -5,19 +5,30 @@ import CodeBlock from '@theme/CodeBlock'; -* Compare-exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. +* Compare-exchange items are **key/value pairs** where the key is a globally unique identifier in the database. + Items are versioned and managed at the cluster level. + +* Compare-exchange provides a built-in consensus mechanism for safe coordination across sessions and nodes. + It ensures global consistency in the database and prevents conflicts when multiple clients try to modify or reserve + the same resource, allowing you to: + * Enforce global uniqueness (e.g., prevent duplicate usernames or emails). + * Assign work to a single client or reserve a resource once. + * Handle concurrency safely, without external services or custom locking logic. + +* Compare-exchange items are also suitable for storing shared or global values that aren't tied to a specific document - + such as configuration flags, feature toggles, or reusable identifiers stored under a unique key. + However, [unlike regular documents](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness), + compare-exchange provides atomic updates, version-based conflict prevention, and Raft-based consistency for distributed safety. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. * In this article: * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Why not use regular documents to enforce uniqueness](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness) * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) - * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) - * [Example III - Ensuring unique values without using compare-exchange](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) + * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) @@ -29,17 +40,18 @@ Compare-exchange items are key/value pairs where the key serves as a unique valu * Each compare-exchange item contains: * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **A value** - Can be any value (a number, string, array, or any valid JSON object). * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. For example, the metadata can be used to set expiration time for the compare-exchange item. Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Raft index** - The compare-exchange item's version. Any change to the value or metadata will increase this number. -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) - interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. - +* Creating and modifying a compare-exchange item follows the same principle as the [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) operation in multi-threaded systems, + but in RavenDB, this concept is applied to a distributed environment across multiple nodes instead of within a single multi-threaded process. + These operations require cluster consensus to ensure consistency. + Once consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. + --- ## Ways to create and manage compare-exchange items @@ -54,7 +66,8 @@ Compare exchange items can be created and managed using any of the following app You can create and manage compare-exchange items from within a [Cluster-Wide session](../client-api/session/cluster-transaction/overview#cluster-wide-transaction-vs-single-node-transaction). For example, see [Create items using a cluster-wide session](../compare-exchange/create-cmpxchg-items#create-items-using-a-cluster-wide-session). When using a cluster-wide session, the compare-exchange item is created as part of the cluster-wide transaction. - If the session fails, the item creation also fails, and none of the nodes in the database group will store the new compare-exchange item. + Like any transaction, all operations either succeed as a group or are rolled back. + If the transaction is not committed, the new compare-exchange item will not be stored on any node in the database group. * **Atomic Guards** When creating _documents_ using a cluster-wide session, RavenDB automatically creates [Atomic Guards](../compare-exchange/atomic-guards), @@ -92,14 +105,27 @@ Compare exchange items can be created and managed using any of the following app For details about what is and what isn't replicated in [What is Replicated](../server/ongoing-tasks/external-replication#what-is-replicated). --- + +## Why not use regular documents to enforce uniqueness + +* You might consider storing a document with a predictable ID (for example, _phones/123456_) as a way to enforce uniqueness, + and then checking for its existence before allowing another document to use the same value. + +* While this might work in a single-node setup or with external replication, + it does not reliably enforce uniqueness in a clustered environment. + +* If a node was not part of the cluster when the document was created, it might not be aware of its existence when it comes back online. + In such cases, attempting to load the document on this node may return _null_, leading to duplicate values being inserted. + +* To reliably enforce uniqueness across all cluster nodes, you must use compare-exchange items, + which are designed for this purpose and ensure global consistency. +--- + ## Example I - Email address reservation The following example shows how to use compare-exchange to create documents with unique values. The scope is within the database group on a single cluster. - -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). ```csharp @@ -113,20 +139,25 @@ User user = new User using (IDocumentSession session = store.OpenSession()) { session.Store(user); - // At this point, the user document has an Id assigned + // At this point, the user object has a document ID assigned by the session. - // Try to reserve a new user email - // Note: This operation takes place outside of the session transaction, - // It is a cluster-wide reservation + // Try to reserve the user email using a compare-exchange item. + // Note: This 'put compare-exchange operation' is not part of the session transaction, + // It is a separate, cluster-wide reservation. CompareExchangeResult cmpXchgResult = store.Operations.Send( + // parameters passed to the operation: + // email - the unique key of the compare-exchange item + // user.Id - the value associated with the key + // 0 - pass `0` to ensure the item is created only if it doesn't already exist. + // If a compare-exchange item with the given key already exists, the operation will fail. new PutCompareExchangeValueOperation(email, user.Id, 0)); if (cmpXchgResult.Successful == false) throw new Exception("Email is already in use"); - // At this point we managed to reserve/save the user email - - // The document can be saved in SaveChanges + // At this point, the email has been successfully reserved/saved. + // We can now save the user document to the database. session.SaveChanges(); } ``` @@ -235,8 +266,10 @@ public long LockResource(IDocumentStore store, string resourceName, TimeSpan dur // resourceName wasn't present - we managed to reserve return putResult.Index; } - - // At this point, Put operation failed - someone else owns the lock or lock time expired + + // At this point, someone else owns the resource. + // But if their reservation has expired (e.g., the process crashed and never released it), + // we can try to take the lock by overwriting the value using the current index. if (putResult.Value.ReservedUntil < now) { // Time expired - Update the existing key with the new value @@ -267,79 +300,3 @@ public void ReleaseResource(IDocumentStore store, string resourceName, long inde } ``` - ---- - -## Example III - Ensuring unique values without using compare exchange - -Unique values can also be ensured without using compare-exchange. - -The below example shows how to achieve that by using **reference documents**. -The reference documents' IDs will contain the unique values instead of the compare-exchange items. - -Using reference documents is especially useful when [External Replication](../server/ongoing-tasks/external-replication) -is defined between two databases that need to be synced with unique values. -The reference documents will replicate to the destination database, -as opposed to compare-exchange items, which are not externally replicated. - - -Sessions which process fields that must be unique should be set to [TransactionMode.ClusterWide](../client-api/session/cluster-transaction/overview). - - - -```csharp -// When you create documents that must contain a unique value such as a phone or email, etc., -// you can create reference documents that will have that unique value in their IDs. -// To know if a value already exists, all you need to do is check whether a reference document with such ID exists. - -// The reference document class -class UniquePhoneReference -{ - public class PhoneReference - { - public string Id; - public string CompanyId; - } - - static void Main(string[] args) - { - // A company document class that must be created with a unique 'Phone' field - Company newCompany = new Company - { - Name = "companyName", - Phone = "phoneNumber", - Contact = new Contact - { - Name = "contactName", - Title = "contactTitle" - }, - }; - - void CreateCompanyWithUniquePhone(Company newCompany) - { - // Open a cluster-wide session in your document store - using var session = DocumentStoreHolder.Store.OpenSession( - new SessionOptions { TransactionMode = TransactionMode.ClusterWide } - ); - - // Check whether the new company phone already exists - // by checking if there is already a reference document that has the new phone in its ID. - var phoneRefDocument = session.Load("phones/" + newCompany.Phone); - if (phoneRefDocument != null) - { - var msg = $"Phone '{newCompany.Phone}' already exists in ID: {phoneRefDocument.CompanyId}"; - throw new ConcurrencyException(msg); - } - - // If the new phone number doesn't already exist, store the new entity - session.Store(newCompany); - // Store a new reference document with the new phone value in its ID for future checks. - session.Store(new PhoneReference { CompanyId = newCompany.Id }, "phones/" + newCompany.Phone); - - // May fail if called concurrently with the same phone number - session.SaveChanges(); - } - } -} -``` - diff --git a/docs/compare-exchange/content/_overview-java.mdx b/docs/compare-exchange/content/_overview-java.mdx index 217e335710..3c8bca4754 100644 --- a/docs/compare-exchange/content/_overview-java.mdx +++ b/docs/compare-exchange/content/_overview-java.mdx @@ -5,16 +5,28 @@ import CodeBlock from '@theme/CodeBlock'; -* Compare-exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. +* Compare-exchange items are **key/value pairs** where the key is a globally unique identifier in the database. + Items are versioned and managed at the cluster level. + +* Compare-exchange provides a built-in consensus mechanism for safe coordination across sessions and nodes. + It ensures global consistency in the database and prevents conflicts when multiple clients try to modify or reserve + the same resource, allowing you to: + * Enforce global uniqueness (e.g., prevent duplicate usernames or emails). + * Assign work to a single client or reserve a resource once. + * Handle concurrency safely, without external services or custom locking logic. + +* Compare-exchange items are also suitable for storing shared or global values that aren't tied to a specific document - + such as configuration flags, feature toggles, or reusable identifiers stored under a unique key. + However, [unlike regular documents](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness), + compare-exchange provides atomic updates, version-based conflict prevention, and Raft-based consistency for distributed safety. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. * In this article: * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Why not use regular documents to enforce uniqueness](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness) * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) @@ -28,16 +40,17 @@ Compare-exchange items are key/value pairs where the key serves as a unique valu * Each compare-exchange item contains: * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **A value** - Can be any value (a number, string, array, or any valid JSON object). * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. For example, the metadata can be used to set expiration time for the compare-exchange item. Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Raft index** - The compare-exchange item's version. Any change to the value or metadata will increase this number. -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) - interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. +* Creating and modifying a compare-exchange item follows the same principle as the [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) operation in multi-threaded systems, + but in RavenDB, this concept is applied to a distributed environment across multiple nodes instead of within a single multi-threaded process. + These operations require cluster consensus to ensure consistency. + Once consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. --- @@ -90,15 +103,28 @@ Compare exchange items can be created and managed using any of the following app * Learn more about Replication in RavenDB in [Replication overview](../server/clustering/replication/replication-overview). For details about what is and what isn't replicated in [What is Replicated](../server/ongoing-tasks/external-replication#what-is-replicated). + --- + + ## Why not use regular documents to enforce uniqueness + +* You might consider storing a document with a predictable ID (for example, _phones/123456_) as a way to enforce uniqueness, + and then checking for its existence before allowing another document to use the same value. + +* While this might work in a single-node setup or with external replication, + it does not reliably enforce uniqueness in a clustered environment. + +* If a node was not part of the cluster when the document was created, it might not be aware of its existence when it comes back online. + In such cases, attempting to load the document on this node may return _null_, leading to duplicate values being inserted. + +* To reliably enforce uniqueness across all cluster nodes, you must use compare-exchange items, + which are designed for this purpose and ensure global consistency. + --- ## Example I - Email address reservation The following example shows how to use compare-exchange to create documents with unique values. The scope is within the database group on a single cluster. - -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). ```java @@ -110,21 +136,26 @@ user.setEmail(email); try (IDocumentSession session = store.openSession()) { session.store(user); - // At this point, the user document has an Id assigned + // At this point, the user object has a document ID assigned by the session. - // Try to reserve a new user email - // Note: This operation takes place outside of the session transaction, - // It is a cluster-wide reservation + // Try to reserve the user email using a compare-exchange item. + // Note: This 'put compare-exchange operation' is not part of the session transaction, + // It is a separate, cluster-wide reservation. CompareExchangeResult cmpXchgResult = store .operations().send( + // parameters passed to the operation: + // email - the unique key of the compare-exchange item + // user.getId() - the value associated with the key + // 0 - pass `0` to ensure the item is created only if it doesn't already exist. + // If a compare-exchange item with the given key already exists, the operation will fail. new PutCompareExchangeValueOperation<>(email, user.getId(), 0)); if (!cmpXchgResult.isSuccessful()) { throw new RuntimeException("Email is already in use"); } - // At this point we managed to reserve/save the user email - - // The document can be saved in SaveChanges + // At this point, the email has been successfully reserved/saved. + // We can now save the user document to the database. session.saveChanges(); } ``` @@ -215,7 +246,9 @@ public long lockResource(IDocumentStore store, String resourceName, Duration dur return saveResult.getIndex(); \} - // At this point, Put operation failed - someone else owns the lock or lock time expired + // At this point, someone else owns the resource. + // But if their reservation has expired (e.g., the process crashed and never released it), + // we can try to take the lock by overwriting the value using the current index. if (saveResult.getValue().reservedUntil.isBefore(now)) \{ // Time expired - Update the existing key with the new value CompareExchangeResult takeLockWithTimeoutResult = diff --git a/docs/compare-exchange/content/_overview-php.mdx b/docs/compare-exchange/content/_overview-php.mdx index b25eff4de4..7ecae491e7 100644 --- a/docs/compare-exchange/content/_overview-php.mdx +++ b/docs/compare-exchange/content/_overview-php.mdx @@ -5,19 +5,30 @@ import CodeBlock from '@theme/CodeBlock'; -* Compare-exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. +* Compare-exchange items are **key/value pairs** where the key is a globally unique identifier in the database. + Items are versioned and managed at the cluster level. + +* Compare-exchange provides a built-in consensus mechanism for safe coordination across sessions and nodes. + It ensures global consistency in the database and prevents conflicts when multiple clients try to modify or reserve + the same resource, allowing you to: + * Enforce global uniqueness (e.g., prevent duplicate usernames or emails). + * Assign work to a single client or reserve a resource once. + * Handle concurrency safely, without external services or custom locking logic. + +* Compare-exchange items are also suitable for storing shared or global values that aren't tied to a specific document - + such as configuration flags, feature toggles, or reusable identifiers stored under a unique key. + However, [unlike regular documents](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness), + compare-exchange provides atomic updates, version-based conflict prevention, and Raft-based consistency for distributed safety. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. * In this article: * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Why not use regular documents to enforce uniqueness](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness) * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) - * [Example III - Ensuring unique values without using compare-exchange](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) @@ -29,16 +40,17 @@ Compare-exchange items are key/value pairs where the key serves as a unique valu * Each compare-exchange item contains: * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **A value** - Can be any value (a number, string, array, or any valid JSON object). * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. For example, the metadata can be used to set expiration time for the compare-exchange item. Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Raft index** - The compare-exchange item's version. Any change to the value or metadata will increase this number. -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) - interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. +* Creating and modifying a compare-exchange item follows the same principle as the [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) operation in multi-threaded systems, + but in RavenDB, this concept is applied to a distributed environment across multiple nodes instead of within a single multi-threaded process. + These operations require cluster consensus to ensure consistency. + Once consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. --- @@ -93,14 +105,27 @@ Compare exchange items can be created and managed using any of the following app --- +## Why not use regular documents to enforce uniqueness + +* You might consider storing a document with a predictable ID (for example, _phones/123456_) as a way to enforce uniqueness, + and then checking for its existence before allowing another document to use the same value. + +* While this might work in a single-node setup or with external replication, + it does not reliably enforce uniqueness in a clustered environment. + +* If a node was not part of the cluster when the document was created, it might not be aware of its existence when it comes back online. + In such cases, attempting to load the document on this node may return _null_, leading to duplicate values being inserted. + +* To reliably enforce uniqueness across all cluster nodes, you must use compare-exchange items, + which are designed for this purpose and ensure global consistency. + +--- + ## Example I - Email address reservation The following example shows how to use compare-exchange to create documents with unique values. The scope is within the database group on a single cluster. -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). - {`$email = "user@example.com"; @@ -112,21 +137,27 @@ $session = $store->openSession(); try \{ $session->store($user); - // At this point, the user document has an Id assigned + // At this point, the user object has a document ID assigned by the session. - // Try to reserve a new user email - // Note: This operation takes place outside of the session transaction, - // It is a cluster-wide reservation + // Try to reserve the user email using a compare-exchange item. + // Note: This 'put compare-exchange operation' is not part of the session transaction, + // It is a separate, cluster-wide reservation. /** @var CompareExchangeResult $cmpXchgResult */ - $cmpXchgResult = $store->operations()->send(new PutCompareExchangeValueOperation("emails/" . $email, $user->getId(), 0)); + $cmpXchgResult = $store->operations()->send( + // Parameters passed to the operation: + // $email - the unique key of the compare-exchange item + // $user->getId() - the value associated with the key + // 0 - ensures the item is created only if it doesn't already exist + // If a compare-exchange item with the given key already exists, the operation will fail. + new PutCompareExchangeValueOperation($email, $user->getId(), 0)); if (!$cmpXchgResult->isSuccessful()) \{ throw new RuntimeException("Email is already in use"); \} - // At this point we managed to reserve/save the user email - - // The document can be saved in SaveChanges + // At this point, the email has been successfully reserved/saved. + // We can now save the user document to the database. $session->saveChanges(); \} finally \{ $session->close(); @@ -230,7 +261,9 @@ class CompareExchangeSharedResource return $saveResult->getIndex(); \} - // At this point, Put operation failed - someone else owns the lock or lock time expired + // At this point, someone else owns the resource. + // But if their reservation has expired (e.g., the process crashed and never released it), + // we can try to take the lock by overwriting the value using the current index. if ($saveResult->getValue()->getReservedUntil() < $now) \{ // Time expired - Update the existing key with the new value /** @var CompareExchangeResult takeLockWithTimeoutResult */ @@ -261,108 +294,3 @@ class CompareExchangeSharedResource `} - ---- - -## Example III - Ensuring unique values without using compare-exchange - -Unique values can also be ensured without using compare-exchange. - -The below example shows how to achieve that by using **reference documents**. -The reference documents' IDs will contain the unique values instead of the compare-exchange items. - -Using reference documents is especially useful when [External Replication](../server/ongoing-tasks/external-replication) -is defined between two databases that need to be synced with unique values. -The reference documents will replicate to the destination database, -as opposed to compare-exchange items, which are not externally replicated. - - -Sessions which process fields that must be unique should be set to [TransactionMode::clusterWide()](../client-api/session/cluster-transaction/overview). - - - - -{`// When you create documents that must contain a unique value such as a phone or email, etc., -// you can create reference documents that will have that unique value in their IDs. -// To know if a value already exists, all you need to do is check whether a reference document with such ID exists. - -public - -class PhoneReference -\{ - public ?string $id = null; - public ?string $companyId = null; - - public function getId(): ?string - \{ - return $this->id; - \} - - public function setId(?string $id): void - \{ - $this->id = $id; - \} - - public function getCompanyId(): ?string - \{ - return $this->companyId; - \} - - public function setCompanyId(?string $companyId): void - \{ - $this->companyId = $companyId; - \} -\} - -// The reference document class -class UniquePhoneReference -\{ - public function sample(): void - \{ - // A company document class that must be created with a unique 'Phone' field - $newCompany = new Company(); - $newCompany->setName("companyName"); - $newCompany->setPhone("phoneNumber"); - - $newContact = new Contact(); - $newContact->setName("contactName"); - $newContact->setTitle("contactTitle"); - - $newCompany->setContact($newContact); - - $this->createCompanyWithUniquePhone($newCompany); - \} - - public function createCompanyWithUniquePhone(Company $newCompany): void - \{ - // Open a cluster-wide session in your document store - $sessionOptions = new SessionOptions(); - $sessionOptions->setTransactionMode(TransactionMode::clusterWide()); - $session = DocumentStoreHolder::getStore()->openSession($sessionOptions); - - try \{ - // Check whether the new company phone already exists - // by checking if there is already a reference document that has the new phone in its ID. - $phoneRefDocument = $session->load(PhoneReference::class, "phones/" . $newCompany->getPhone()); - if ($phoneRefDocument != null) \{ - $msg = "Phone '" . $newCompany->getPhone() . "' already exists in ID: " . $phoneRefDocument->getCompanyId(); - throw new ConcurrencyException($msg); - \} - - // If the new phone number doesn't already exist, store the new entity - $session->store($newCompany); - // Store a new reference document with the new phone value in its ID for future checks. - $newPhoneReference = new PhoneReference(); - $newPhoneReference->setCompanyId($newCompany->getId()); - $session->store($newPhoneReference, "phones/" . $newCompany->getPhone()); - - // May fail if called concurrently with the same phone number - $session->saveChanges(); - \} finally \{ - $session->close(); - \} - \} -\} -`} - - diff --git a/docs/compare-exchange/content/_overview-python.mdx b/docs/compare-exchange/content/_overview-python.mdx index 33ce33b830..f84ae08dc9 100644 --- a/docs/compare-exchange/content/_overview-python.mdx +++ b/docs/compare-exchange/content/_overview-python.mdx @@ -5,19 +5,30 @@ import CodeBlock from '@theme/CodeBlock'; -* Compare-exchange items are **key/value pairs** where the key is unique across your database. - -* Compare-exchange items can be used to coordinate work between sessions that are trying to modify a shared resource (such as a document) at the same time. - -* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. +* Compare-exchange items are **key/value pairs** where the key is a globally unique identifier in the database. + Items are versioned and managed at the cluster level. + +* Compare-exchange provides a built-in consensus mechanism for safe coordination across sessions and nodes. + It ensures global consistency in the database and prevents conflicts when multiple clients try to modify or reserve + the same resource, allowing you to: + * Enforce global uniqueness (e.g., prevent duplicate usernames or emails). + * Assign work to a single client or reserve a resource once. + * Handle concurrency safely, without external services or custom locking logic. + +* Compare-exchange items are also suitable for storing shared or global values that aren't tied to a specific document - + such as configuration flags, feature toggles, or reusable identifiers stored under a unique key. + However, [unlike regular documents](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness), + compare-exchange provides atomic updates, version-based conflict prevention, and Raft-based consistency for distributed safety. + +* Compare-exchange items are [not replicated externally](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) to other databases. * In this article: * [What compare-exchange items are](../compare-exchange/overview#what-compare-exchange-items-are) * [Ways to create and manage compare-exchange items](../compare-exchange/overview#ways-to-create-and-manage-compare-exchange-items) * [Why compare-exchange items are not replicated to external databases](../compare-exchange/overview#why-compare-exchange-items-are-not-replicated-to-external-databases) + * [Why not use regular documents to enforce uniqueness](../compare-exchange/overview#why-not-use-regular-documents-to-enforce-uniqueness) * [Example I - Email address reservation](../compare-exchange/overview#example-i---email-address-reservation) * [Example II - Reserve a shared resource](../compare-exchange/overview#example-ii---reserve-a-shared-resource) - * [Example III - Ensuring unique values without using compare-exchange](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange) @@ -29,16 +40,17 @@ Compare-exchange items are key/value pairs where the key serves as a unique valu * Each compare-exchange item contains: * **A key** - A unique string identifier in the database scope. - * **A value** - Can be any object (a number, string, array, or any valid JSON object). + * **A value** - Can be any value (a number, string, array, or any valid JSON object). * **Metadata** - Optional data that is associated with the compare-exchange item. Must be a valid JSON object. For example, the metadata can be used to set expiration time for the compare-exchange item. Learn more in [compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Raft index** - The compare-exchange item's version. Any change to the value or metadata will increase this number. -* Creating and modifying a compare-exchange item is an atomic, thread-safe [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) - interlocked compare-exchange operation. These operations require cluster consensus to ensure consistency across all nodes. - Once a consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. +* Creating and modifying a compare-exchange item follows the same principle as the [compare-and-swap](https://en.wikipedia.org/wiki/Compare-and-swap) operation in multi-threaded systems, + but in RavenDB, this concept is applied to a distributed environment across multiple nodes instead of within a single multi-threaded process. + These operations require cluster consensus to ensure consistency. + Once consensus is reached, the compare-exchange items are distributed through the Raft algorithm to all nodes in the database group. --- @@ -93,14 +105,27 @@ Compare exchange items can be created and managed using any of the following app --- +## Why not use regular documents to enforce uniqueness + +* You might consider storing a document with a predictable ID (for example, _phones/123456_) as a way to enforce uniqueness, + and then checking for its existence before allowing another document to use the same value. + +* While this might work in a single-node setup or with external replication, + it does not reliably enforce uniqueness in a clustered environment. + +* If a node was not part of the cluster when the document was created, it might not be aware of its existence when it comes back online. + In such cases, attempting to load the document on this node may return _null_, leading to duplicate values being inserted. + +* To reliably enforce uniqueness across all cluster nodes, you must use compare-exchange items, + which are designed for this purpose and ensure global consistency. + +--- + ## Example I - Email address reservation The following example shows how to use compare-exchange to create documents with unique values. The scope is within the database group on a single cluster. -Compare-exchange items are not externally replicated to other databases. -To establish uniqueness without using compare-exchange see [Example III](../compare-exchange/overview#example-iii---ensuring-unique-values-without-using-compare-exchange). - {`email = "user@example.com" @@ -109,18 +134,25 @@ user = User(email=email) with store.open_session() as session: session.store(user) - # At this point, the user document has an Id assigned - - # Try to reserve a new user email - # Note: This operation takes place outside the session transaction, - # It is a cluster-wide reservation - cmp_xchg_result = store.operations.send(PutCompareExchangeValueOperation(f"emails/\{email\}", user.Id, 0)) + # At this point, the user object has a document ID assigned by the session. + + # Try to reserve the user email using a compare-exchange item. + # Note: This 'put compare-exchange operation' is not part of the session transaction, + # It is a separate, cluster-wide reservation. + cmp_xchg_result = store.operations.send( + # Parameters passed to the operation: + # email - the unique key of the compare-exchange item + # user.Id - the value associated with the key + # 0 - ensures the item is created only if it doesn't already exist + # If a compare-exchange item with the given key already exists, the operation will fail. + PutCompareExchangeValueOperation(email, user.Id, 0) + ) if cmp_xchg_result.successful is False: raise RuntimeError("Email is already in use") - # At this point we managed to reserve/save the user mail - - # The document can be saved in save_changes + # At this point, the email has been successfully reserved/saved. + # We can now save the user document to the database. session.save_changes() `} @@ -189,7 +221,9 @@ def lock_resource(document_store: DocumentStore, resource_name: str, duration: t # resource_name wasn't present - we managed to reserve return save_result.index - # At this point, Put operation failed - someone else owns the lock or lock time expired + # At this point, someone else owns the resource. + # But if their reservation has expired (e.g., the process crashed and never released it), + # we can try to take the lock by overwriting the value using the current index. if save_result.value.reserved_until < now: # Time expired - Update the existing key with new value take_lock_with_timeout_result = document_store.operations.send( @@ -211,66 +245,3 @@ def release_resource(store: DocumentStore, resource_name: str, index: int) -> No `} - ---- - -## Example III - Ensuring unique values without using compare-exchange - -Unique values can also be ensured without using compare-exchange. - -The below example shows how to achieve that by using **reference documents**. -The reference documents' IDs will contain the unique values instead of the compare-exchange items. - -Using reference documents is especially useful when [External Replication](../server/ongoing-tasks/external-replication) -is defined between two databases that need to be synced with unique values. -The reference documents will replicate to the destination database, -as opposed to compare-exchange items, which are not externally replicated. - - -Sessions which process fields that must be unique should be set to [TransactionMode.CLUSTER_WIDE](../client-api/session/cluster-transaction/overview). - - - - -{`# When you create documents that must contain a unique value such as a phone or email, etc., -# you can create reference documents that will have that unique value in their IDs. -# To know if a value already exists, all you need to do is check whether a reference document with such ID exists. - -# The reference document class -class UniquePhoneReference: - class PhoneReference: - def __init__(self, Id: str = None, company_id: str = None): - self.Id = Id - self.company_id = company_id - - def main(self): - # A company document class that must be created with a unique 'Phone' field - new_company = Company( - name="companyName", phone="phoneNumber", contact=Contact(name="contactName", title="contactTitle") - ) - - def create_company_with_unique_phone(new_company: Company) -> None: - # Open a cluster-wide session in your document store - with store.open_session( - session_options=SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) - ) as session: - # Check whether the new company phone already exists - # by checking if there is already a reference document that has the new phone in its ID. - phone_ref_document = session.load(f"phones/\{new_company.phone\}") - if phone_ref_document is not None: - msg = f"Phone '\{new_company.phone\}' already exists, store the new entity" - raise RuntimeError(msg) - - # If the new phone number doesn't already exist, store the new entity - session.store(new_company) - # Store a new reference document with the new phone value in its ID for future checks - session.store( - UniquePhoneReference.PhoneReference(company_id=new_company.Id), - f"phones/\{new_company.phone\}", - ) - - # May fail if called concurrently with the same phone number - session.save_changes() -`} - - diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index 2f7786e27d..f61c1dd6b2 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -23,9 +23,6 @@ import Admonition from '@theme/Admonition'; * Assign work to a single client or reserve a resource once. * Handle concurrency safely, without external services or custom locking logic. -* Compare-exchange items can also store shared or global values that aren't tied to a specific document. - For example: system-wide configuration flags, shared settings, or reusable identifiers. - * Key Characteristics of a compare-exchange item: * Cluster-wide - Visible and consistent across all nodes in the [database group](../studio/database/settings/manage-database-group). * Atomic - Only one client can successfully modify an item at a time (all-or-nothing updates). From 85526f3978857fe3c5256116f5f45ed2e85c8361 Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Wed, 15 Oct 2025 22:34:15 +0300 Subject: [PATCH 09/10] RDoc-2293 Fix review comments for all other files --- .../content/_atomic-guards-csharp.mdx | 12 ++--- .../content/_atomic-guards-nodejs.mdx | 12 ++--- .../content/_atomic-guards-php.mdx | 12 ++--- .../content/_atomic-guards-python.mdx | 12 ++--- .../content/_create-cmpxchg-items-csharp.mdx | 15 ++++-- .../content/_create-cmpxchg-items-java.mdx | 11 +++- .../content/_create-cmpxchg-items-nodejs.mdx | 13 +++-- .../content/_delete-cmpxchg-items-csharp.mdx | 18 +++---- .../content/_delete-cmpxchg-items-java.mdx | 11 ++-- .../content/_delete-cmpxchg-items-nodejs.mdx | 22 ++++---- .../content/_delete-cmpxchg-items-php.mdx | 18 +++---- .../content/_delete-cmpxchg-items-python.mdx | 16 +++--- .../content/_get-cmpxchg-item-csharp.mdx | 22 ++++++-- .../content/_get-cmpxchg-items-csharp.mdx | 20 +++---- .../content/_get-cmpxchg-items-nodejs.mdx | 17 ++++-- ..._include-compare-exchange-items-csharp.mdx | 54 +++++++++---------- ..._include-compare-exchange-items-nodejs.mdx | 32 ++++++----- .../content/_overview-csharp.mdx | 16 ++++-- .../content/_overview-java.mdx | 16 ++++-- .../content/_overview-php.mdx | 16 ++++-- .../content/_overview-python.mdx | 16 ++++-- .../content/_update-cmpxchg-item-csharp.mdx | 4 +- .../content/_update-cmpxchg-item-java.mdx | 4 +- .../content/_update-cmpxchg-item-nodejs.mdx | 4 +- docs/compare-exchange/start.mdx | 4 +- 25 files changed, 237 insertions(+), 160 deletions(-) diff --git a/docs/compare-exchange/content/_atomic-guards-csharp.mdx b/docs/compare-exchange/content/_atomic-guards-csharp.mdx index cd4d604012..c98fe8c8b1 100644 --- a/docs/compare-exchange/content/_atomic-guards-csharp.mdx +++ b/docs/compare-exchange/content/_atomic-guards-csharp.mdx @@ -342,13 +342,13 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: -* **If the document is found**, it is loaded into the session, - and modifications will be saved successfully as long as no other session has modified the document in the meantime. - Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, - the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. - Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + * RavenDB checks whether the Raft index of the atomic guard associated with the document matches the version tracked by the current session. + If another session has already updated the document (and incremented the atomic guard’s Raft index), the save will fail with a _ConcurrencyException_. -* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): +* **If no document is found**, RavenDB will check whether a matching atomic guard exists + (as in the case when the document was deleted outside of a cluster-wide session): * **If an atomic guard exists**, the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. * **If no atomic guard exists**, diff --git a/docs/compare-exchange/content/_atomic-guards-nodejs.mdx b/docs/compare-exchange/content/_atomic-guards-nodejs.mdx index bd6a036e7e..03d044c3b7 100644 --- a/docs/compare-exchange/content/_atomic-guards-nodejs.mdx +++ b/docs/compare-exchange/content/_atomic-guards-nodejs.mdx @@ -244,13 +244,13 @@ await session.saveChanges(); When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: -* **If the document is found**, it is loaded into the session, - and modifications will be saved successfully as long as no other session has modified the document in the meantime. - Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, - the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. - Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + * RavenDB checks whether the Raft index of the atomic guard associated with the document matches the version tracked by the current session. + If another session has already updated the document (and incremented the atomic guard’s Raft index), the save will fail with a _ConcurrencyException_. -* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): +* **If no document is found**, RavenDB will check whether a matching atomic guard exists + (as in the case when the document was deleted outside of a cluster-wide session): * **If an atomic guard exists**, the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. * **If no atomic guard exists**, diff --git a/docs/compare-exchange/content/_atomic-guards-php.mdx b/docs/compare-exchange/content/_atomic-guards-php.mdx index f4897bb597..04ed102fb7 100644 --- a/docs/compare-exchange/content/_atomic-guards-php.mdx +++ b/docs/compare-exchange/content/_atomic-guards-php.mdx @@ -258,13 +258,13 @@ try \{ When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: -* **If the document is found**, it is loaded into the session, - and modifications will be saved successfully as long as no other session has modified the document in the meantime. - Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, - the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. - Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + * RavenDB checks whether the Raft index of the atomic guard associated with the document matches the version tracked by the current session. + If another session has already updated the document (and incremented the atomic guard’s Raft index), the save will fail with a _ConcurrencyException_. -* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): +* **If no document is found**, RavenDB will check whether a matching atomic guard exists + (as in the case when the document was deleted outside of a cluster-wide session): * **If an atomic guard exists**, the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. * **If no atomic guard exists**, diff --git a/docs/compare-exchange/content/_atomic-guards-python.mdx b/docs/compare-exchange/content/_atomic-guards-python.mdx index b3c643d568..9380170379 100644 --- a/docs/compare-exchange/content/_atomic-guards-python.mdx +++ b/docs/compare-exchange/content/_atomic-guards-python.mdx @@ -233,13 +233,13 @@ Atomic guards are removed **automatically** in the following scenarios: When _loading_ a document in a cluster-wide session, RavenDB attempts to retrieve the document from the document store: -* **If the document is found**, it is loaded into the session, - and modifications will be saved successfully as long as no other session has modified the document in the meantime. - Specifically, if the document’s [change vector](../server/clustering/replication/change-vector) matches the one currently stored on the server, - the save will proceed - after which the Raft index of the associated atomic guard will be incremented as expected. - Otherwise, RavenDB will fail the operation with a _ConcurrencyException_. +* **If the document is found**, it is loaded into the session, + and modifications will be saved successfully as long as no other session has modified the document in the meantime. + * RavenDB checks whether the Raft index of the atomic guard associated with the document matches the version tracked by the current session. + If another session has already updated the document (and incremented the atomic guard’s Raft index), the save will fail with a _ConcurrencyException_. -* **If no document is found**, RavenDB will check whether a matching atomic guard exists (as in the case when the document was deleted outside of a cluster-wide session): +* **If no document is found**, RavenDB will check whether a matching atomic guard exists + (as in the case when the document was deleted outside of a cluster-wide session): * **If an atomic guard exists**, the client constructs a change vector for the document using the atomic guard’s Raft index, and the document will be saved with this change vector. * **If no atomic guard exists**, diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx index 33e411c478..f54ee96665 100644 --- a/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx +++ b/docs/compare-exchange/content/_create-cmpxchg-items-csharp.mdx @@ -281,9 +281,16 @@ import CodeBlock from '@theme/CodeBlock'; --- ## Create item using a store operation - -* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, without opening a session. - This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + +* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, + without opening a session. + This is ideal for stand-alone tasks that don't require batching multiple commands into a single transactional session. + +* Note: + _PutCompareExchangeValueOperation_ is used for both **creating** and [modifying](../compare-exchange/update-cmpxchg-item) compare-exchange items. + The intent of the operation is determined by the index you pass: + * An index of `0` indicates a **create** operation. + * A non-zero index indicates a **modify** operation. * Creating a new compare-exchange item will succeed only if: * The passed index is 0, and @@ -511,7 +518,7 @@ public PutCompareExchangeValueOperation( | Parameter | Type | Description | |--------------|-----------------------|-------------| | **key** | `string` |
    • A unique identifier in the database scope.
    • Can be up to 512 bytes.
    | -| **value** | `T` |
    • A value to be saved for the specified _key_.
    • Can be any object (number, string, array, or any valid JSON object).
    | +| **value** | `T` |
    • A value to be saved for the specified _key_.
    • Can be any value (number, string, array, or any valid JSON object).
    | | **index** | `long` |
    • Pass `0` to create a new key.
    • When updating an existing key, pass the current number for concurrency control.
    | | **metadata** | `IMetadataDictionary` |
    • Optional metadata to be saved for the specified _key_.
    • Must be a valid JSON object.
    | diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx index bab1aa9a15..a75225bf1c 100644 --- a/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx +++ b/docs/compare-exchange/content/_create-cmpxchg-items-java.mdx @@ -30,8 +30,15 @@ import CodeBlock from '@theme/CodeBlock'; ## Create item using a store operation -* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, without opening a session. - This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. +* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, + without opening a session. + This is ideal for stand-alone tasks that don't require batching multiple commands into a single transactional session. + +* Note: + _PutCompareExchangeValueOperation_ is used for both **creating** and [modifying](../compare-exchange/update-cmpxchg-item) compare-exchange items. + The intent of the operation is determined by the index you pass: + * An index of `0` indicates a **create** operation. + * A non-zero index indicates a **modify** operation. * Creating a new compare-exchange item will succeed only if: * The passed index is 0, and diff --git a/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx index 83322cbe25..52010ece5f 100644 --- a/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx +++ b/docs/compare-exchange/content/_create-cmpxchg-items-nodejs.mdx @@ -141,8 +141,15 @@ import CodeBlock from '@theme/CodeBlock'; ## Create item using a store operation -* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, without opening a session. - This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. +* Use the `PutCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to create a compare-exchange item independently, + without opening a session. + This is ideal for stand-alone tasks that don't require batching multiple commands into a single transactional session. + +* Note: + _PutCompareExchangeValueOperation_ is used for both **creating** and [modifying](../compare-exchange/update-cmpxchg-item) compare-exchange items. + The intent of the operation is determined by the index you pass: + * An index of `0` indicates a **create** operation. + * A non-zero index indicates a **modify** operation. * Creating a new compare-exchange item will succeed only if: * The passed index is 0, and @@ -254,7 +261,7 @@ const putCmpXchgOp = new PutCompareExchangeValueOperation(key, value, index, met | Parameter | Type | Description | |--------------|----------|-------------| | **key** | `string` |
    • A unique identifier in the database scope.
    • Can be up to 512 bytes.
    | -| **value** | `object` |
    • A value to be saved for the specified _key_.
    • Can be any object (number, string, array, or any valid JSON object).
    | +| **value** | `object` |
    • A value to be saved for the specified _key_.
    • Can be any value (number, string, array, or any valid JSON object).
    | | **index** | `number` |
    • Pass `0` to create a new key.
    • When updating an existing key, pass the current number for concurrency control.
    | | **metadata** | `object` |
    • Optional metadata to be saved for the specified _key_.
    • Must be a valid JSON object.
    | diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx index d54f996234..f699229740 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-csharp.mdx @@ -14,10 +14,11 @@ import CodeBlock from '@theme/CodeBlock'; Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Compare-exchange tombstones**: - Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. - Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. - E.g., indexes referencing the deleted item will update themselves to remove those references. - The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + Whenever a compare-exchange item is deleted, a compare-exchange tombstone is created for it. + These tombstones are used to indicate to other RavenDB processes that the compare-exchange item was deleted, + so they can react accordingly. + For example, indexes referencing the deleted item will update themselves to remove those references. + Compare-exchange tombstones that are eligible for deletion are removed periodically by an internal cleanup task. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). * @@ -46,15 +47,14 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a cluster-wide session * Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `SaveChanges()`. - This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. + This is suitable if you want to include compare-exchange deletions alongside other operations, such as putting or deleting documents and compare-exchange items, in a single transaction. Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). * Use `DeleteCompareExchangeValue()` to register the deletion of an existing compare-exchange item in the session. The item will be deleted as part of the cluster-wide transaction when _SaveChanges()_ is called. -* If the item's index (its version) on the server is different from the index you provide, - _SaveChanges()_ will throw a `ClusterTransactionConcurrencyException`. - This means the item was modified by another operation after it was loaded into the session. +* If the item's index (its version) on the server is different from the index you provide, _SaveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session, and the entire transaction will be rejected. * Examples: @@ -234,7 +234,7 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a store operation * Use the `DeleteCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to delete a compare-exchange item by its key and index, without opening a session. - This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + This is ideal for stand-alone tasks that don't require batching multiple commands into a single transactional session. * The delete operation will only succeed if the item's current index on the server is the same as the one you provide. If the indexes do not match, the item is not deleted and no exception is thrown. diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx index ce66f46f71..6fe2d159e7 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-java.mdx @@ -14,10 +14,11 @@ import CodeBlock from '@theme/CodeBlock'; Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Compare-exchange tombstones**: - Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. - Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. - E.g., indexes referencing the deleted item will update themselves to remove those references. - The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + Whenever a compare-exchange item is deleted, a compare-exchange tombstone is created for it. + These tombstones are used to indicate to other RavenDB processes that the compare-exchange item was deleted, + so they can react accordingly. + For example, indexes referencing the deleted item will update themselves to remove those references. + Compare-exchange tombstones that are eligible for deletion are removed periodically by an internal cleanup task. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). * @@ -42,7 +43,7 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a store operation * Use the `DeleteCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to delete a compare-exchange item by its key and index, without opening a session. - This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + This is ideal for stand-alone tasks that don't require batching multiple commands into a single transactional session. * The delete operation will only succeed if the item's current index on the server is the same as the one you provide. If the indexes do not match, the item is not deleted and no exception is thrown. diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx index e9ac5a7f30..98733ea1b6 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-nodejs.mdx @@ -14,10 +14,11 @@ import CodeBlock from '@theme/CodeBlock'; Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Compare-exchange tombstones**: - Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. - Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. - E.g., indexes referencing the deleted item will update themselves to remove those references. - The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + Whenever a compare-exchange item is deleted, a compare-exchange tombstone is created for it. + These tombstones are used to indicate to other RavenDB processes that the compare-exchange item was deleted, + so they can react accordingly. + For example, indexes referencing the deleted item will update themselves to remove those references. + Compare-exchange tombstones that are eligible for deletion are removed periodically by an internal cleanup task. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). * @@ -45,16 +46,15 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a cluster-wide session -* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `saveChanges()`. - This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. +* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `saveChanges()`. + This is suitable if you want to include compare-exchange deletions alongside other operations, such as putting or deleting documents and compare-exchange items, in a single transaction. Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). * Use `deleteCompareExchangeValue()` to register the deletion of an existing compare-exchange item in the session. The item will be deleted as part of the cluster-wide transaction when _saveChanges()_ is called. - -* If the item's index (its version) on the server is different from the index you provide, - _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. - This means the item was modified by another operation after it was loaded into the session. + +* If the item's index (its version) on the server is different from the index you provide, _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session, and the entire transaction will be rejected. * Examples: @@ -153,7 +153,7 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a store operation * Use the `DeleteCompareExchangeValueOperation` [store operation](../client-api/operations/what-are-operations) to delete a compare-exchange item by its key and index, without opening a session. - This is ideal for stand-alone tasks where you need to perform a direct compare-exchange operation without involving document transactions. + This is ideal for stand-alone tasks that don't require batching multiple commands into a single transactional session. * The delete operation will only succeed if the item's current index on the server is the same as the one you provide. If the indexes do not match, the item is not deleted and no exception is thrown. diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx index 5ad5d0a266..0685a70894 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-php.mdx @@ -14,10 +14,11 @@ import CodeBlock from '@theme/CodeBlock'; Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Compare-exchange tombstones**: - Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. - Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. - E.g., indexes referencing the deleted item will update themselves to remove those references. - The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + Whenever a compare-exchange item is deleted, a compare-exchange tombstone is created for it. + These tombstones are used to indicate to other RavenDB processes that the compare-exchange item was deleted, + so they can react accordingly. + For example, indexes referencing the deleted item will update themselves to remove those references. + Compare-exchange tombstones that are eligible for deletion are removed periodically by an internal cleanup task. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). * @@ -43,16 +44,15 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a cluster-wide session -* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `saveChanges()`. - This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. +* Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `saveChanges()`. + This is suitable if you want to include compare-exchange deletions alongside other operations, such as putting or deleting documents and compare-exchange items, in a single transaction. Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). * Use `deleteCompareExchangeValue()` to register the deletion of an existing compare-exchange item in the session. The item will be deleted as part of the cluster-wide transaction when _saveChanges()_ is called. -* If the item's index (its version) on the server is different from the index you provide, - _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. - This means the item was modified by another operation after it was loaded into the session. +* If the item's index (its version) on the server is different from the index you provide, _saveChanges()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session, and the entire transaction will be rejected. --- diff --git a/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx b/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx index 6d2f34601d..331dc75a23 100644 --- a/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx +++ b/docs/compare-exchange/content/_delete-cmpxchg-items-python.mdx @@ -14,10 +14,11 @@ import CodeBlock from '@theme/CodeBlock'; Learn more in [Compare-exchange expiration](../compare-exchange/cmpxchg-expiration). * **Compare-exchange tombstones**: - Whenever a compare-exchange item is deleted, a compare-exchange tombstone item is created for it. - Tombstones are used to indicate to other RavenDB processes that the item was deleted, so they can react accordingly. - E.g., indexes referencing the deleted item will update themselves to remove those references. - The tombstones themselves are not removed immediately - RavenDB uses an internal cleaner task to periodically remove tombstones that are eligible for deletion. + Whenever a compare-exchange item is deleted, a compare-exchange tombstone is created for it. + These tombstones are used to indicate to other RavenDB processes that the compare-exchange item was deleted, + so they can react accordingly. + For example, indexes referencing the deleted item will update themselves to remove those references. + Compare-exchange tombstones that are eligible for deletion are removed periodically by an internal cleanup task. See: [Cluster.CompareExchangeTombstonesCleanupIntervalInMin](../compare-exchange/configuration#clustercompareexchangetombstonescleanupintervalinmin). * @@ -44,15 +45,14 @@ import CodeBlock from '@theme/CodeBlock'; ## Delete compare-exchange item using a cluster-wide session * Delete compare-exchange items using a cluster-wide session when you want the deletion to be part of a transaction committed via `save_changes()`. - This is suitable if you want to include compare-exchange deletions and document changes in the same transaction. + This is suitable if you want to include compare-exchange deletions alongside other operations, such as putting or deleting documents and compare-exchange items, in a single transaction. Learn more about cluster-wide sessions in [Cluster transactions - overview](../client-api/session/cluster-transaction/overview). * Use `delete_compare_exchange_value()` to register the deletion of an existing compare-exchange item in the session. The item will be deleted as part of the cluster-wide transaction when _save_changes()_ is called. -* If the item's index (its version) on the server is different from the index you provide, - _save_changes()_ will throw a `ClusterTransactionConcurrencyException`. - This means the item was modified by another operation after it was loaded into the session. +* If the item's index (its version) on the server is different from the index you provide, _save_changes()_ will throw a `ClusterTransactionConcurrencyException`. + This means the item was modified by another operation after it was loaded into the session, and the entire transaction will be rejected. --- diff --git a/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx b/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx index a95a99cbbf..ee35aaf78e 100644 --- a/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx +++ b/docs/compare-exchange/content/_get-cmpxchg-item-csharp.mdx @@ -64,7 +64,11 @@ import CodeBlock from '@theme/CodeBlock'; itemToCreate.Metadata["email-type"] = "work email"; session.SaveChanges(); + } + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { // Get the compare-exchange item: // ============================== @@ -106,7 +110,11 @@ import CodeBlock from '@theme/CodeBlock'; itemToCreate.Metadata["email-type"] = "work email"; await asyncSession.SaveChangesAsync(); - + } + + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { // Get the compare-exchange item: // ============================== @@ -148,7 +156,11 @@ import CodeBlock from '@theme/CodeBlock'; value: "users/1" ); session.SaveChanges(); - + } + + using (var session = store.OpenSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { // Get the compare-exchange item lazily: // ===================================== @@ -185,7 +197,11 @@ import CodeBlock from '@theme/CodeBlock'; ); await asyncSession.SaveChangesAsync(); - + } + + using (var asyncSession = store.OpenAsyncSession( + new SessionOptions { TransactionMode = TransactionMode.ClusterWide })) + { // Get the compare-exchange item lazily: // ===================================== diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx index 00333571d5..c6845fc4b3 100644 --- a/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx +++ b/docs/compare-exchange/content/_get-cmpxchg-items-csharp.mdx @@ -84,8 +84,8 @@ store.Operations.Send( Dictionary> items = session.Advanced.ClusterTransaction.GetCompareExchangeValues(keys); - // Check results - Debug.Assert(items.Count == 4); // 4 keys were requested + // Check results + Console.WriteLine($"Number of compare-exchange items retrieved: {items.Count}"); // Expecting 4 // Access a retrieved item - an existing key if (items.TryGetValue("employees/1", out var item)) @@ -117,7 +117,7 @@ store.Operations.Send( await asyncSession.Advanced.ClusterTransaction.GetCompareExchangeValuesAsync(keys); // Check results - Debug.Assert(items.Count == 4); // 4 keys were requested + Console.WriteLine($"Number of compare-exchange items retrieved: {items.Count}"); // Expecting 4 // Access a retrieved item - an existing key if (items.TryGetValue("employees/1", out var item)) @@ -146,7 +146,7 @@ store.Operations.Send( Dictionary> items = store.Operations.Send(getCmpXchgItemsOp); // Check results - Debug.Assert(items.Count == 4); // 4 keys were requested + Console.WriteLine($"Number of compare-exchange items retrieved: {items.Count}"); // Expecting 4 // Access a retrieved item - an existing key if (items.TryGetValue("employees/1", out var item)) @@ -176,7 +176,7 @@ store.Operations.Send( store.Operations.SendAsync(getCmpXchgItemsOp); // Check results - Debug.Assert(items.Count == 4); // 4 keys were requested + Console.WriteLine($"Number of compare-exchange items retrieved: {items.Count}"); // Expecting 4 // Access a retrieved item - an existing key if (items.TryGetValue("employees/1", out var item)) @@ -217,7 +217,7 @@ store.Operations.Send( Dictionary> items = lazyItems.Value; // Check results - Debug.Assert(items.Count == 4); // 4 keys were requested + Console.WriteLine($"Number of compare-exchange items retrieved: {items.Count}"); // Expecting 4 // Access a retrieved item - an existing key if (items.TryGetValue("employees/1", out var item)) @@ -251,7 +251,7 @@ store.Operations.Send( Dictionary> items = await lazyItems.Value; // Check results - Debug.Assert(items.Count == 4); // 4 keys were requested + Console.WriteLine($"Number of compare-exchange items retrieved: {items.Count}"); // Expecting 4 // Access a retrieved item - an existing key if (items.TryGetValue("employees/1", out var item)) @@ -296,7 +296,8 @@ store.Operations.Send( startsWith: "employees", start: 0, pageSize: 10); // Results will include only compare-exchange items with keys that start with "employees" - Debug.Assert(items.Count == 3); // There are 3 keys with the "employees" prefix + Console.WriteLine($"Number of compare-exchange items with prefix 'employees': {items.Count}"); + // Should be 3 } ```
    @@ -316,7 +317,8 @@ store.Operations.Send( startsWith: "employees", start: 0, pageSize: 10); // Results will include only compare-exchange items with keys that start with "employees" - Debug.Assert(items.Count == 3); // There are 3 keys with the "employees" prefix + Console.WriteLine($"Number of compare-exchange items with prefix 'employees': {items.Count}"); + // Should be 3 } ``` diff --git a/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx b/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx index a640881b4a..1d202a7b9c 100644 --- a/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx +++ b/docs/compare-exchange/content/_get-cmpxchg-items-nodejs.mdx @@ -80,7 +80,9 @@ await documentStore.operations.send( const items = await session.advanced.clusterTransaction.getCompareExchangeValues(keys); // Check results - assert.equal(Object.keys(items).length, 4); // 4 keys were requested + console.log( + `Number of compare-exchange items retrieved: ${Object.keys(items).length}` + ); // Expecting 4 // Access the retrieved items const value = items["employees/1"].value; @@ -102,7 +104,9 @@ await documentStore.operations.send( const items = await documentStore.operations.send(getCmpXchgOp); // Check results - assert.equal(Object.keys(items).length, 4); // 4 keys were requested + console.log( + `Number of compare-exchange items retrieved: ${Object.keys(items).length}` + ); // Expecting 4 // Access the retrieved items const value = items["employees/1"].value; @@ -137,7 +141,9 @@ await documentStore.operations.send( const items = await lazyItems.getValue(); // Check results - assert.equal(Object.keys(items).length, 4); // 4 keys were requested + console.log( + `Number of compare-exchange items retrieved: ${Object.keys(items).length}` + ); // Expecting 4 // Access the retrieved items const value = items["employees/1"].value; @@ -174,7 +180,10 @@ await documentStore.operations.send( // Execute the operation by passing it to operations.send const items = await documentStore.operations.send(getCmpXchgOp); - // Results will include only compare-exchange items with keys that start with "employees" + // Results will include only compare-exchange items with keys that start with "employees" + console.log( + `Number of compare-exchange items with prefix 'employees': ${Object.keys(items).length}` + ); // Should be 3 ``` diff --git a/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx b/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx index e0b48bda79..d9dc01bd6f 100644 --- a/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx +++ b/docs/compare-exchange/content/_include-compare-exchange-items-csharp.mdx @@ -144,7 +144,7 @@ using (var session = store.OpenSession(new SessionOptions // Calling 'Load' has triggered a server call var numberOfRequests = session.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg item: // ================================= @@ -154,8 +154,8 @@ using (var session = store.OpenSession(new SessionOptions var item = session.Advanced.ClusterTransaction .GetCompareExchangeValue(company1.Supplier); - // You can assert that no further server calls were made - Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + // You can check that no further server calls were made + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true // The CmpXchg item value is available var value = item.Value; @@ -180,7 +180,7 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions // Calling 'LoadAsync' has triggered a server call var numberOfRequests = asyncSession.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg item: // ================================= @@ -190,8 +190,8 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions var item = await asyncSession.Advanced.ClusterTransaction .GetCompareExchangeValueAsync(company1.Supplier); - // You can assert that no further server calls were made - Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); + // You can check that no further server calls were made + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true // The CmpXchg item value is available var value = item.Value; @@ -223,8 +223,8 @@ using (var session = store.OpenSession(new SessionOptions // "Workers" is the document property that holds the list of keys to include includes.IncludeCompareExchangeValue(c => c.Workers)); - var numberOfRequests = session.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + var numberOfRequests = session.Advanced.NumberOfRequests; + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -234,8 +234,8 @@ using (var session = store.OpenSession(new SessionOptions var items = session.Advanced.ClusterTransaction .GetCompareExchangeValues(company1.Workers); - // You can assert that no further server calls were made - Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + // You can check that no further server calls were made + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true // The value of each item is available var value1 = items["employees/1"].Value; @@ -260,7 +260,7 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions includes.IncludeCompareExchangeValue(c => c.Workers)); var numberOfRequests = asyncSession.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -270,8 +270,8 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions var items = await asyncSession.Advanced.ClusterTransaction .GetCompareExchangeValuesAsync(company1.Workers); - // You can assert that no further server calls were made - Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); + // You can check that no further server calls were made + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true // The value of each item is available var value1 = items["employees/1"].Value; @@ -311,7 +311,7 @@ using (var session = store.OpenSession(new SessionOptions // Making the query has triggered a server call var numberOfRequests = session.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -328,8 +328,8 @@ using (var session = store.OpenSession(new SessionOptions cmpXchgItems.Add(item); } - // You can assert that no further server calls were made - Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + // You can check that no further server calls were made + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true } ``` @@ -352,7 +352,7 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions // Making the query has triggered a server call var numberOfRequests = asyncSession.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 var cmpXchgItems = new List>(); @@ -366,8 +366,8 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions cmpXchgItems.Add(item); } - // You can assert that no further server calls were made - Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); + // You can check that no further server calls were made + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true } ``` @@ -392,7 +392,7 @@ using (var session = store.OpenSession(new SessionOptions .ToList(); var numberOfRequests = session.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -409,7 +409,7 @@ using (var session = store.OpenSession(new SessionOptions cmpXchgItems.Add(item); } - Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true } ``` @@ -439,7 +439,7 @@ using (var session = store.OpenSession(new SessionOptions .ToList(); var numberOfRequests = session.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -456,7 +456,7 @@ using (var session = store.OpenSession(new SessionOptions cmpXchgItems.Add(item); } - Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true } ``` @@ -514,7 +514,7 @@ using (var session = store.OpenSession(new SessionOptions .ToList(); var numberOfRequests = session.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -529,7 +529,7 @@ using (var session = store.OpenSession(new SessionOptions cmpXchgItems.Add(item); } - Debug.Assert(session.Advanced.NumberOfRequests == numberOfRequests); + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true } ``` @@ -552,7 +552,7 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions .ToListAsync(); var numberOfRequests = asyncSession.Advanced.NumberOfRequests; - Debug.Assert(numberOfRequests == 1); + Console.WriteLine($"Number of requests made: {numberOfRequests}"); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -567,7 +567,7 @@ using (var asyncSession = store.OpenAsyncSession(new SessionOptions cmpXchgItems.Add(item); } - Debug.Assert(asyncSession.Advanced.NumberOfRequests == numberOfRequests); + Console.WriteLine(session.Advanced.NumberOfRequests == numberOfRequests); // Should be true } ``` diff --git a/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx b/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx index baa682b881..b17a4b1a9d 100644 --- a/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx +++ b/docs/compare-exchange/content/_include-compare-exchange-items-nodejs.mdx @@ -134,7 +134,7 @@ const company1 = await session.load("companies/1", { // Calling 'load' has triggered a server call const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); +console.log(`Number of requests made: ${numberOfRequests}`); // Should be 1 // Access the included CmpXchg item: // ================================= @@ -144,8 +144,8 @@ assert.equal(numberOfRequests, 1); const item = await session.advanced.clusterTransaction .getCompareExchangeValue(company1.supplier); -// You can assert that no further server calls were made -assert.equal(session.advanced.numberOfRequests, numberOfRequests); +// You can check that no further server calls were made +console.log(session.advanced.numberOfRequests === numberOfRequests); // Should be true // The CmpXchg item value is available const value = item.value; @@ -177,7 +177,7 @@ const company1 = await session.load("companies/1", { }); const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); +console.log(`Number of requests made: ${numberOfRequests}`); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -187,7 +187,8 @@ assert.equal(numberOfRequests, 1); const items = await session.advanced.clusterTransaction .getCompareExchangeValues(company1.workers); -assert.equal(session.advanced.numberOfRequests, numberOfRequests); +// You can check that no further server calls were made +console.log(session.advanced.numberOfRequests === numberOfRequests); // Should be true // The value of each item is available const value1 = items["employees/1"].value; @@ -224,7 +225,7 @@ const companies = await session.query({ collection: "companies" }) // Making the query has triggered a server call const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); +console.log(`Number of requests made: ${numberOfRequests}`); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -240,8 +241,8 @@ for (let i = 0; i < companies.length; i++) { cmpXchgItems.push(item); } -// You can assert that no further server calls were made -assert.equal(session.advanced.numberOfRequests, numberOfRequests); +// You can check that no further server calls were made +console.log(session.advanced.numberOfRequests === numberOfRequests); // Should be true ``` @@ -264,7 +265,7 @@ const companies = await session.advanced .all(); const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); +console.log(`Number of requests made: ${numberOfRequests}`); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -280,7 +281,8 @@ for (let i = 0; i < companies.length; i++) { cmpXchgItems.push(item); } -assert.equal(session.advanced.numberOfRequests, numberOfRequests); +// You can check that no further server calls were made +console.log(session.advanced.numberOfRequests === numberOfRequests); // Should be true ``` @@ -307,7 +309,7 @@ const companies = await session.advanced .all(); const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); +console.log(`Number of requests made: ${numberOfRequests}`); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -323,7 +325,8 @@ for (let i = 0; i < companies.length; i++) { cmpXchgItems.push(item); } -assert.equal(session.advanced.numberOfRequests, numberOfRequests); +// You can check that no further server calls were made +console.log(session.advanced.numberOfRequests === numberOfRequests); // Should be true ``` @@ -352,7 +355,7 @@ const companies = await session.query({ indexName: "Companies/ByName" }) .all(); const numberOfRequests = session.advanced.numberOfRequests; -assert.equal(numberOfRequests, 1); +console.log(`Number of requests made: ${numberOfRequests}`); // Should be 1 // Access the included CmpXchg items: // ================================== @@ -368,7 +371,8 @@ for (let i = 0; i < companies.length; i++) { cmpXchgItems.push(item); } -assert.equal(session.advanced.numberOfRequests, numberOfRequests); +// You can check that no further server calls were made +console.log(session.advanced.numberOfRequests === numberOfRequests); // Should be true ``` diff --git a/docs/compare-exchange/content/_overview-csharp.mdx b/docs/compare-exchange/content/_overview-csharp.mdx index c81e63543c..021ce69516 100644 --- a/docs/compare-exchange/content/_overview-csharp.mdx +++ b/docs/compare-exchange/content/_overview-csharp.mdx @@ -238,8 +238,14 @@ public void PrintWork() try { - // Do some work for the duration that was set. - // Don't exceed the duration, otherwise resource is available for someone else. + // Do some work for the duration that was set (TimeSpan.FromMinutes(20)). + // Don't exceed the duration, otherwise the resource won't be available for someone else. + + // In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly + // before releasing the resource - never reaching the 'finally' block. + + // To prevent the resource from remaining locked indefinitely, + // we use a timeout to expire the reservation. } finally { @@ -267,9 +273,9 @@ public long LockResource(IDocumentStore store, string resourceName, TimeSpan dur return putResult.Index; } - // At this point, someone else owns the resource. - // But if their reservation has expired (e.g., the process crashed and never released it), - // we can try to take the lock by overwriting the value using the current index. + // At this point, another process owns the resource. + // But if that process crashed and never released the resource, the reservation may have expired, + // so we can try to take the lock by overwriting the value using the current index. if (putResult.Value.ReservedUntil < now) { // Time expired - Update the existing key with the new value diff --git a/docs/compare-exchange/content/_overview-java.mdx b/docs/compare-exchange/content/_overview-java.mdx index 3c8bca4754..c8ec56aae9 100644 --- a/docs/compare-exchange/content/_overview-java.mdx +++ b/docs/compare-exchange/content/_overview-java.mdx @@ -223,8 +223,14 @@ public void printWork() throws InterruptedException \{ long reservationIndex = lockResource(store, "Printer/First-Floor", Duration.ofMinutes(20)); try \{ - // Do some work for the duration that was set. - // Don't exceed the duration, otherwise resource is available for someone else. + // Do some work for the duration that was set (Duration.ofMinutes(20)). + // Don't exceed the duration, otherwise the resource won't be available for someone else. + + // In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly + // before releasing the resource - never reaching the 'finally' block. + + // To prevent the resource from remaining locked indefinitely, + // we use a timeout to expire the reservation. \} finally \{ releaseResource(store, "Printer/First-Floor", reservationIndex); \} @@ -246,9 +252,9 @@ public long lockResource(IDocumentStore store, String resourceName, Duration dur return saveResult.getIndex(); \} - // At this point, someone else owns the resource. - // But if their reservation has expired (e.g., the process crashed and never released it), - // we can try to take the lock by overwriting the value using the current index. + // At this point, another process owns the resource. + // But if that process crashed and never released the resource, the reservation may have expired, + // so we can try to take the lock by overwriting the value using the current index. if (saveResult.getValue().reservedUntil.isBefore(now)) \{ // Time expired - Update the existing key with the new value CompareExchangeResult takeLockWithTimeoutResult = diff --git a/docs/compare-exchange/content/_overview-php.mdx b/docs/compare-exchange/content/_overview-php.mdx index 7ecae491e7..a96d2211a5 100644 --- a/docs/compare-exchange/content/_overview-php.mdx +++ b/docs/compare-exchange/content/_overview-php.mdx @@ -236,8 +236,14 @@ class CompareExchangeSharedResource $reservationIndex = $this->lockResource($this->store, "Printer/First-Floor", Duration::ofMinutes(20)); try \{ - // Do some work for the duration that was set. - // Don't exceed the duration, otherwise resource is available for someone else. + // Do some work for the duration that was set (Duration::ofMinutes(20))). + // Don't exceed the duration, otherwise the resource won't be available for someone else. + + // In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly + // before releasing the resource - never reaching the 'finally' block. + + // To prevent the resource from remaining locked indefinitely, + // we use a timeout to expire the reservation. \} finally \{ $this->releaseResource($this->store, "Printer/First-Floor", $reservationIndex); \} @@ -261,9 +267,9 @@ class CompareExchangeSharedResource return $saveResult->getIndex(); \} - // At this point, someone else owns the resource. - // But if their reservation has expired (e.g., the process crashed and never released it), - // we can try to take the lock by overwriting the value using the current index. + // At this point, another process owns the resource. + // But if that process crashed and never released the resource, the reservation may have expired, + // so we can try to take the lock by overwriting the value using the current index. if ($saveResult->getValue()->getReservedUntil() < $now) \{ // Time expired - Update the existing key with the new value /** @var CompareExchangeResult takeLockWithTimeoutResult */ diff --git a/docs/compare-exchange/content/_overview-python.mdx b/docs/compare-exchange/content/_overview-python.mdx index f84ae08dc9..ea407ea031 100644 --- a/docs/compare-exchange/content/_overview-python.mdx +++ b/docs/compare-exchange/content/_overview-python.mdx @@ -203,8 +203,14 @@ def print_work() -> None: try: ... - # Do some work for the duration that was set - # Don't exceed the duration, otherwise resource is available for someone else + # Do some work for the duration that was set (timedelta(minutes=20)). + # Don't exceed the duration, otherwise the resource won't be available for someone else. + + # In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly + # before releasing the resource - never reaching the 'finally' block. + + # To prevent the resource from remaining locked indefinitely, + # we use a timeout to expire the reservation. finally: release_resource(store, "Printer/First-Floor", reservation_index) @@ -221,9 +227,9 @@ def lock_resource(document_store: DocumentStore, resource_name: str, duration: t # resource_name wasn't present - we managed to reserve return save_result.index - # At this point, someone else owns the resource. - # But if their reservation has expired (e.g., the process crashed and never released it), - # we can try to take the lock by overwriting the value using the current index. + # At this point, another process owns the resource. + # But if that process crashed and never released the resource, the reservation may have expired, + # so we can try to take the lock by overwriting the value using the current index. if save_result.value.reserved_until < now: # Time expired - Update the existing key with new value take_lock_with_timeout_result = document_store.operations.send( diff --git a/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx b/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx index 2a11b54bbb..41d46fc4f3 100644 --- a/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx +++ b/docs/compare-exchange/content/_update-cmpxchg-item-csharp.mdx @@ -93,9 +93,9 @@ using (var asyncSession = store.OpenAsyncSession( * To perform an update, provide: * The existing key * A new value and/or metadata - * The latest index (version) of the item as last seen by the client. + * The expected index (version) of the item, which must match the current version stored on the server. -* The update will succeed only if the index you provide exactly matches the current index stored on the server for that key. +* The update will succeed only if the index you provide matches the current index stored on the server for that key. This ensures that the item hasn’t been modified by another client since you last read it. * If the index does not match, or if the specified key does not exist: diff --git a/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx b/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx index bd12e950e5..7647be2255 100644 --- a/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx +++ b/docs/compare-exchange/content/_update-cmpxchg-item-java.mdx @@ -11,9 +11,9 @@ import CodeBlock from '@theme/CodeBlock'; * To perform an update, provide: * The existing key * A new value and/or metadata - * The latest index (version) of the item as last seen by the client. + * The expected index (version) of the item, which must match the current version stored on the server. -* The update will succeed only if the index you provide exactly matches the current index stored on the server for that key. +* The update will succeed only if the index you provide matches the current index stored on the server for that key. This ensures that the item hasn’t been modified by another client since you last read it. * If the index does not match, or if the specified key does not exist: diff --git a/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx b/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx index 3f057dd940..ec114a40cb 100644 --- a/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx +++ b/docs/compare-exchange/content/_update-cmpxchg-item-nodejs.mdx @@ -66,9 +66,9 @@ await session.saveChanges(); * To perform an update, provide: * The existing key * A new value and/or metadata - * The latest index (version) of the item as last seen by the client. + * The expected index (version) of the item, which must match the current version stored on the server. -* The update will succeed only if the index you provide exactly matches the current index stored on the server for that key. +* The update will succeed only if the index you provide matches the current index stored on the server for that key. This ensures that the item hasn’t been modified by another client since you last read it. * If the index does not match, or if the specified key does not exist: diff --git a/docs/compare-exchange/start.mdx b/docs/compare-exchange/start.mdx index f61c1dd6b2..3a0c2d1c4e 100644 --- a/docs/compare-exchange/start.mdx +++ b/docs/compare-exchange/start.mdx @@ -65,14 +65,14 @@ import Admonition from '@theme/Admonition'; description="Interactive demo showing how to create a compare‑exchange item." url="../compare-exchange/create-cmpxchg-items" ctaLabel="View demo" - buttonVariant = "secondary" + buttonVariant = "default" /> From 90b674e4c8f9fa8a05aceb9b8152f91045e6628d Mon Sep 17 00:00:00 2001 From: danielle9897 Date: Thu, 16 Oct 2025 12:27:00 +0300 Subject: [PATCH 10/10] RDoc-2293 Fix comment for PrintWork in overview.mdx --- .../content/_overview-csharp.mdx | 17 ++++++++++------- .../content/_overview-java.mdx | 19 +++++++++++-------- .../content/_overview-php.mdx | 19 +++++++++++-------- .../content/_overview-python.mdx | 19 +++++++++++-------- 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/docs/compare-exchange/content/_overview-csharp.mdx b/docs/compare-exchange/content/_overview-csharp.mdx index 021ce69516..a289b21b09 100644 --- a/docs/compare-exchange/content/_overview-csharp.mdx +++ b/docs/compare-exchange/content/_overview-csharp.mdx @@ -239,13 +239,16 @@ public void PrintWork() try { // Do some work for the duration that was set (TimeSpan.FromMinutes(20)). - // Don't exceed the duration, otherwise the resource won't be available for someone else. - - // In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly - // before releasing the resource - never reaching the 'finally' block. - - // To prevent the resource from remaining locked indefinitely, - // we use a timeout to expire the reservation. + // + // In a distributed system (unlike a multi-threaded app), a process may crash or exit unexpectedly + // without releasing the resource it reserved (i.e. never reaching the 'finally' block). + // This can leave the resource locked indefinitely. + // + // To prevent that, each reservation includes a timeout (TimeSpan.FromMinutes(20)). + // If the process fails or exits, the resource becomes available again once the timeout expires. + // + // Important: Ensure the work completes within the timeout period. + // If it runs longer, another client may acquire the same resource at the same time. } finally { diff --git a/docs/compare-exchange/content/_overview-java.mdx b/docs/compare-exchange/content/_overview-java.mdx index c8ec56aae9..ffb07e4506 100644 --- a/docs/compare-exchange/content/_overview-java.mdx +++ b/docs/compare-exchange/content/_overview-java.mdx @@ -223,14 +223,17 @@ public void printWork() throws InterruptedException \{ long reservationIndex = lockResource(store, "Printer/First-Floor", Duration.ofMinutes(20)); try \{ - // Do some work for the duration that was set (Duration.ofMinutes(20)). - // Don't exceed the duration, otherwise the resource won't be available for someone else. - - // In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly - // before releasing the resource - never reaching the 'finally' block. - - // To prevent the resource from remaining locked indefinitely, - // we use a timeout to expire the reservation. + // Do some work for the duration that was set (TimeSpan.FromMinutes(20)). + // + // In a distributed system (unlike a multi-threaded app), a process may crash or exit unexpectedly + // without releasing the resource it reserved (i.e. never reaching the 'finally' block). + // This can leave the resource locked indefinitely. + // + // To prevent that, each reservation includes a timeout (TimeSpan.FromMinutes(20)). + // If the process fails or exits, the resource becomes available again once the timeout expires. + // + // Important: Ensure the work completes within the timeout period. + // If it runs longer, another client may acquire the same resource at the same time. \} finally \{ releaseResource(store, "Printer/First-Floor", reservationIndex); \} diff --git a/docs/compare-exchange/content/_overview-php.mdx b/docs/compare-exchange/content/_overview-php.mdx index a96d2211a5..03f0abab9f 100644 --- a/docs/compare-exchange/content/_overview-php.mdx +++ b/docs/compare-exchange/content/_overview-php.mdx @@ -236,14 +236,17 @@ class CompareExchangeSharedResource $reservationIndex = $this->lockResource($this->store, "Printer/First-Floor", Duration::ofMinutes(20)); try \{ - // Do some work for the duration that was set (Duration::ofMinutes(20))). - // Don't exceed the duration, otherwise the resource won't be available for someone else. - - // In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly - // before releasing the resource - never reaching the 'finally' block. - - // To prevent the resource from remaining locked indefinitely, - // we use a timeout to expire the reservation. + // Do some work for the duration that was set (TimeSpan.FromMinutes(20)). + // + // In a distributed system (unlike a multi-threaded app), a process may crash or exit unexpectedly + // without releasing the resource it reserved (i.e. never reaching the 'finally' block). + // This can leave the resource locked indefinitely. + // + // To prevent that, each reservation includes a timeout (TimeSpan.FromMinutes(20)). + // If the process fails or exits, the resource becomes available again once the timeout expires. + // + // Important: Ensure the work completes within the timeout period. + // If it runs longer, another client may acquire the same resource at the same time. \} finally \{ $this->releaseResource($this->store, "Printer/First-Floor", $reservationIndex); \} diff --git a/docs/compare-exchange/content/_overview-python.mdx b/docs/compare-exchange/content/_overview-python.mdx index ea407ea031..86c6644d25 100644 --- a/docs/compare-exchange/content/_overview-python.mdx +++ b/docs/compare-exchange/content/_overview-python.mdx @@ -203,14 +203,17 @@ def print_work() -> None: try: ... - # Do some work for the duration that was set (timedelta(minutes=20)). - # Don't exceed the duration, otherwise the resource won't be available for someone else. - - # In a distributed system (unlike a multi-threaded app), a process may fail or exit unexpectedly - # before releasing the resource - never reaching the 'finally' block. - - # To prevent the resource from remaining locked indefinitely, - # we use a timeout to expire the reservation. + # Do some work for the duration that was set (TimeSpan.FromMinutes(20)). + # + # In a distributed system (unlike a multi-threaded app), a process may crash or exit unexpectedly + # without releasing the resource it reserved (i.e. never reaching the 'finally' block). + # This can leave the resource locked indefinitely. + # + # To prevent that, each reservation includes a timeout (TimeSpan.FromMinutes(20)). + # If the process fails or exits, the resource becomes available again once the timeout expires. + # + # Important: Ensure the work completes within the timeout period. + # If it runs longer, another client may acquire the same resource at the same time. finally: release_resource(store, "Printer/First-Floor", reservation_index)
  • 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 Y--flb-tT!k{&0$%w31ZG8>3JE7ZB{_WdHyG literal 0 HcmV?d00001 diff --git a/docs/compare-exchange/assets/set-expiration.png b/docs/compare-exchange/assets/set-expiration.png new file mode 100644 index 0000000000000000000000000000000000000000..aefe36fbfdfa5648a8bebaac016caf2964442b28 GIT binary patch literal 75777 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 Jh_2J?{{j0zl3oA+ literal 0 HcmV?d00001 diff --git a/docs/compare-exchange/assets/update-cmpxchg-1.png b/docs/compare-exchange/assets/update-cmpxchg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..85587c6c1e3c1f05c85cf282611676e4cf455fea GIT binary patch literal 153599 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%0Dw1qQeHqLcO5OT%U7f8@G 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 literal 0 HcmV?d00001 diff --git a/docs/compare-exchange/assets/update-cmpxchg-2.png b/docs/compare-exchange/assets/update-cmpxchg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f848006979ecebb043d0177395092847362a19fa GIT binary patch literal 80850 zcmd43cQjmE_&+Q~3PBp8CqV>3^ym>mhNxpOx@a+@L>Zzd1PMVhTJ&C~=|e_Mh=|^% zL>ZFkGfINd%g_DZdy~7~wSMnk@4MFbEauEU&fe$Q&wifIe%kTMP+yygfs=ubj*bcN z;Jz^(-6<*^-O2N3P90sL7CGAnx_}eGO%#U z&~J*O>FBP~0q(1tJk4Ar`v(JQ2OYos(|uD@hK#$47xkPxEo#4&dKrvH$EfU&cdvzKh# zb#G}S!?Q`6Dd(zD(R4zR?_QVj9{>BsXU5_9zvT7r^83HNd0U^upI#k=_2J;lU?rR>#xKQj$AtVe8d8} zH(YQTJThFrz=8ZyY48AdTnTE(j^NyA6Y(cD8I%Zr|IUIP1Z$i{7O}-~A;C>{MOouT zrAYyc1y1)KT|u_0@)vn&%P zni^nt%;vdF8W63=hkZS$wu&?9Mk&T=T@Q5=aTSNh3yZpqr<*lq1{KYc+7 z{2IBUP;6&sHw7YDTfG=yz5GGk-%tpkqf$bfl<+q;G}817FDqCZ3L7Obv5sa{!>a1vPf zL|mbLKRpSF7OR2EIfnB>*ilY(YN!M&*$LwXxIShNtUA-^^TL_F+t4DoD&|0xfroYL zp+vy+C=?J2-1%(lyFIBkd6$nU7ssVaOiPuwI&`Heid?<^fCJhL`tk9e|6iNXUx&Vt zUu!+5tPI2>4!$B^k)p`LlpHoBs41pcSXz2txFVA>K4gedGBJzxO4E54a=+)t&31Hp zxr?Am7|2c@ls3bHn)v2nMh`==&!~W$zsut1Q+bKc0(tAbzq#~U?!|_V`fDKr6HlGv z&izOZT*ym>iY^wV?L02OR38C72^+?-J~<=@ ziGB3cXGMzAsvPd>YGmU5ai0doQ$mlat!aVt1kaj}a@LP~-cHhfp@r7BTC-wUJW%%j zSifHnyu?yIk#!~>?I*rp^wCt?gXgE_yg}BOZJ%yn&;P;l_Y%={)m8z)snI>6zZ7{` zOH5kmK<=jc6Yam2%1SJoU(I$J)GicG#eX=DQ4|ipGth8wvf!&Uta}5!rRl=25vUAsF!1i-r zI@PoAI{QjQct<pWp^=X2j39jB_U|WkIU1C@?eT3DM(YZ`qec#goDubZpx>tkCLmNWS8MH5YJ|_ zrfpZu+DB33aIVgKX_xtCsL{Nz6Y=&*6OSk>`=Mrqirb z@(#2{8yY%ME78Ow2%Q{~&%A;MAjhoiS&PgVY7ciIyjp$*LX1&pzlcD6 zqNo8AsN;j^Xp=q0)bne}`wvgZJKu%_>%-{B)XD2xXawg-UU+`p(a@7}u3-=+^4_