From d2a0ac9e7097d76c82f0444c5bfbb93b17cfdbf4 Mon Sep 17 00:00:00 2001 From: yzfly Date: Mon, 10 Apr 2023 20:57:23 +0800 Subject: [PATCH] add vector database --- README.md | 76 +++++++++++++++++++++++++++++++-------- imgs/vectordb_chroma.jpg | Bin 0 -> 36730 bytes 2 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 imgs/vectordb_chroma.jpg diff --git a/README.md b/README.md index de8a549..5fb17f3 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,10 @@ ChatGPT 中文指南项目旨在帮助中文用户了解和使用ChatGPT。我 - [将代码从一个语言翻译为另一个语言:ai-code-translator](#将代码从一个语言翻译为另一个语言ai-code-translator) - [LLMs 驱动的操作系统的 Shell: engshell](#llms-驱动的操作系统的-shell-engshell) - [使用 LLMs 通过自然语言生成任意函数:AI Functions](#使用-llms-通过自然语言生成任意函数ai-functions) + - [向量数据库](#向量数据库) + - [嵌入式数据库:chroma](#嵌入式数据库chroma) + - [向量数据库:weaviate](#向量数据库weaviate) + - [PineCone](#pinecone) - [ChatGPT 浏览器插件和小程序](#chatgpt-浏览器插件和小程序) - [ChatGPT 插件功能](#chatgpt-插件功能) - [现有插件](#现有插件) @@ -227,6 +231,21 @@ ChatGPT 中文指南项目旨在帮助中文用户了解和使用ChatGPT。我 +
  • +
    + 💻 Claude + +> https://www.anthropic.com/product + +脱胎于 OpenAI 的初创公司 Anthropic 产品 Claude 模型,需申请使用 + +更新:Claude 模型现已经可以通过 slack 免费使用,地址: https://www.anthropic.com/claude-in-slack + +![claude](imgs/claude.jpg) + +
    +
  • +
  • 💻 YouChat @@ -263,21 +282,6 @@ ChatGPT 中文指南项目旨在帮助中文用户了解和使用ChatGPT。我 ![chatSonic](imgs/writesonic.jpg) -
    -
  • - -
  • -
    - 💻 Claude - -> https://www.anthropic.com/product - -脱胎于 OpenAI 的初创公司 Anthropic 产品 Claude 模型,需申请使用 - -更新:Claude 模型现已经可以通过 slack 免费使用,地址: https://www.anthropic.com/claude-in-slack - -![claude](imgs/claude.jpg) -
  • @@ -610,6 +614,48 @@ def ai_function(function, args, description, model = "gpt-4"): return response.choices[0].message["content"] ``` +### 向量数据库 + +如果说 ChatGPT 是 LLM 的处理核心,prompts 是 code,那么向量数据库就是 LLM 需要的存储。 + +#### [嵌入式数据库:chroma](https://github.com/chroma-core/chroma) + +Chroma 是一个用于 Python / JavaScript LLM 应用程序的嵌入式数据库,它具有内存快速访问的优势。它只有 4 个核心函数: + +``` +import chromadb +# setup Chroma in-memory, for easy prototyping. Can add persistence easily! +client = chromadb.Client() + +# Create collection. get_collection, get_or_create_collection, delete_collection also available! +collection = client.create_collection("all-my-documents") + +# Add docs to the collection. Can also update and delete. Row-based API coming soon! +collection.add( + documents=["This is document1", "This is document2"], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well + metadatas=[{"source": "notion"}, {"source": "google-docs"}], # filter on these! + ids=["doc1", "doc2"], # unique for each doc +) + +# Query/search 2 most similar results. You can also .get by id +results = collection.query( + query_texts=["This is a query document"], + n_results=2, + # where={"metadata_field": "is_equal_to_this"}, # optional filter + # where_document={"$contains":"search_string"} # optional filter +) +``` + +![imgs](imgs/vectordb_chroma.jpg) + +#### [向量数据库:weaviate](https://github.com/weaviate/weaviate) + +开源的向量数据库,可以存储对象和向量,允许将向量搜索与结构化过滤相结合,并具有云原生数据库的容错性和可扩展性,可通过 GraphQL、REST 和各种语言客户端进行访问。 + +#### [PineCone](https://www.pinecone.io/) + +Pinecone为向量数据提供了数据存储解决方案。 + ### ChatGPT 浏览器插件和小程序 * [ChatGPT Sidebar](https://www.chatgpt-sidebar.com/) diff --git a/imgs/vectordb_chroma.jpg b/imgs/vectordb_chroma.jpg new file mode 100644 index 0000000000000000000000000000000000000000..78898ef3640ed6e1640a7e499726361e6d3c7f14 GIT binary patch literal 36730 zcmd?R2|U&7_CNk?+dL23JY`myDKpzl2$f8!Oxegxresru3?W3tHWd}6WJ-gKk<4Vs zJd4aC!~apIb2|6l@44sRbHBgW@BaRJop#6G`?IF^v!3;=wVt*6VRr~nAJNp&1PBBG z2>1u=?f^zDI~O|-D=$0Seb#>aj=MOxS$TTd?e>8yfRu=cn23;+n3$N1l$4B;iJFpv zf|8w{frg2PlaH61lbehGptLCeeyROj++r%?QnK<&N=kep>N;u)+R}h;KjOmmdTk5}$yOh?s}q&KWPHMn#H8e#DXE!R**SOb<>uXg^0eq#aY<=e`J1Zhn%cVhw+(IW9i3g> zA9{L+M@GlSCnl$+XBL;1S60{7ziezG0P?#y@bB*e{Ui?*9D#?AkHjb1lLvw41OG$P z;1h6(6Vj>}5m~v@aZ3afqg3NE3M)x?B#$l7TYI#UGVn?b^DXX)^i85aCs4@0CDE?} z{VLCHFCa%EpuvzdKpCt#0zrVo!;=0#_rkKo>uA}3AZBdH5P8fuJE}hZ;J%sH3xXiV z_bz@Nw+#D*+ap-wd9K9Bx&yN8s>SYT;u7kLutSN=b;jh9Xrf*&+KtnWe(4|kB{vMg zI(6-cbRvE8LK0}fd#fOJoiC9(?ba=39G=cdIFdIPyCUSC3Rp1l;yl_JRGI>p(M0Jq z*P50Y8+X=xx2AwjW*k{|WP{ve1yaD1wm(?>NNmjWqwZ*YAL@5CHi>L88Kx{iqcn6( z{9*1XZ^J4n5SU3LnmBPUW&0!iAH{0%QmsV#ShOh;O~zOKgFFi8NErz_@SY&bu!(8` z?dpXQEE>fA;tGa{Npe|BM&oIDAIxqBQe{(7J^%W*q2OaQKlW?S=rRt$AE_?N233FE zg8AKt)w z?D7NqNI>hGee5l_L`?QK#aDe-ypuf&@KsBcX^(4Kbr8Nq0kUxOGlEA#cR@MRIV{qh z^zAsaq3jNAe+$H2b*1euhR08+qEzTHl5F?1kpc>fn!y7a#)>2|gjl4Ms;E?b2Gt@Y zh`%Ux$+13%Xc1WhXqr&>&1LC3ybpLrLew!o9p6J8)HOncE3Sbz_njQ}o8efAVhoJ?ImPJ7}U zJNm3Xz#F0aMeY5PXyhr?C&axcDE;?ar2;b%u85Gg2e=fGVi4vEhFH5eIz?%=Z&q)S zufKmUiw?VIb?#-oUtun^sBlgrj+F8t6&{v&GSXO>Eqv&^@TFna>JaALzo=eTJ(2mU zF*ykiIY*sx@zEiL=J|Q%tz6&~eoTe+NHARHaAoU;Tc3S$B-{Yq6txHXH;DKXXnz+O zxEd6UaB*YCYON7NEr>~tale<=8$kojoOb}3lmT;`?Mao+VCY-EF%bC^1IK=4K$I(* zPt(0qjl2afFq2cdVfpyGo%vztKt@p4HQO@FrgFkC2;0&yTKp%ObS;tyG=4%2F`*ef zV!Cux3P`o`T5H7_e|Ix?7!xNpe$znfo(9Z_P7-}v=wkf)>0i$lO~Q5OPF@|Jqs5bZ zk`PPd!sSQqa6mG4_`9Q9h8mFmzR)S$NwsEPs0KfzEnJtes@On`)ad~7?t1+um8!>#SmHUAwWLd&bqK6 zM$2$-={<}qt7G5ZYN1W3q@;%y?R({fHgjS7h${A_w%d}m*l z6z~)GOS8XmYZtsIvWLDPBcflvI;yJ7P#+wuLS-}aXz|<~C&Us($^t5u$LvT!862o# z-KQCSgfdbK4@-4GoHKd6pm}~YwgF2JDW!Ui<$fBDoD|Rsj^Jyt-1VO`6hzQ6W%1V0 zaw#6kMFAn2J<_tjkY-k>qIKO_YfXQTB@7dA`%EiIc_o)0OFtZW$}cW!^ao{H%>p8H z)pyF#S;sDC#?=6h6V}Q?n$MM=$0#2F41%qsLXP+Sv0@Z^lG-;$(oH83&B-kM zKa_6$mUjO)r4w`0`i1aPZ4YHB-vNY7QE65YWU(W?k{c~xp@xUhH}0kvp9(~?8me@e zN2^Z1f#Mg*&9u;(XlQWeSSY!{d>kYQMQ4uE%%EBb{#)wW*4LCyVN$-qjav%3mZ59eQ6cyic}m=T+5ToXfj?S-B<~!i(dV>mObJ$za#GS^at^b zXdA<;_k(Ky3CcZ$_K=}}C{q)lsY02F*G8m0hi29Y;e}d1$T5tDD~pCip?N=a8v&T+ zNi-si-(FT^+^lGpY|w|2ezS5* z^?UYA)v7O%Q7w2C;@T?lydH84hVBq!C>+T*i&F{$OqLgM>jS~5Y+F*Gkh}Ftw9)bh zz#T&w4w3rjLd(QyF>%XuB4$uFQh--nT_;9L6~gVC&SNaCHEcRVAP$$Tmw%ERsYds5 zErN_{J5Ib1I28o*>@9w#E!H;-Sjtz4A+5V6=^kE3PP`2`jO?^k(jmx~+V|zBnt1zku@rT^x z2$^dD1?qe-%b^31HdMOS_{JskPdoE__%h8>7c9J=H-kG1<<|HcUmE@0mm(S3dITi1 zX&&Bta38A=B-%!FQZeJPHq~PRVl%{Bf_P0o+&8*-*p;{RWBe2&$Ia$1E%+m+h$DM8C!x6hKaNSk`|MuCdsI1P=5p%of@olXCe}s@Uz=|Ri4#Ai}av;$>LKz}bj z*pq|4m5;Gap7SHhFiUZx37F!@&oDU#eb}Mvc%|?>$!I(fjK6hd=n*f-9^udM}9gYnmXKe9-y2 zn9|9bzST+PHmm@SPzUA7rDJ1qywlVcZr;&0OCf@KHW)UWX*8Q_%od4gB;n0s+P+@l z8xtl3VyyS{0tJzeV%i4w>%DcQZ5Z_H1U9Quh_?=D#HB@FLhpZx@f%9&+CCh9I9>~Q zrpX%;ogt_0tK|vdjUdv{AXVl<)BZQZI+OER{fV7*Ouu4T-71bG_m|uY9)6Nq0Ix>S zh1_g5AK518PJRLWfBB1QVXes6^~1Jypuit-+YrCw7iWaPJ8Hh9eRv@}KmFA2{OW&q zG71kLD?FAk|9;iDZ#wGxw(yGqsUJ3Ud#Ex_XpmcU%kBbFkow>28-ABB4CeBF5pTV> z5wh1xqUl<`9p!)_{((i-GHTJ!sv&jkWi`J!@c(i=qay@gB=&6^X^=Hv^88s^uCJ#; z4L%n~4<2>j#{A|j{|TH4pB~`4AY;tTyM{v4YK^4R&baC4P4ynC=skb_jq+jZC+|^9 zCv4bDag@ngT@P3DS^7?t1U~N1JyyVwe}rb%`u7Fmtl~1Y_O+NqUumTO~Xf; zF+}Vzn&A%xMl$Mmr+uy7d>Lb9Y$JtHx&zJ0!DLIh2;%#CID9u+-Umo&f< z()UhFuSv;Q^MI+~`s?NqL1Z3|P?uYcu91g8{n$H$vvMs&tc;Nr2Dzr}PWmkw$$H~i z(c|2H*Mq2;>J&qPcUOsnrwx6NR;X>1tXWu>UewU#mKG$gyrleC*K(c2_C-@*vJVC6%Qt=T! z&Wipr<>Vt^V41FQS-Rkz{RQ8;E-W)a=Zm(alC=F;8GdPU#FijpmRnNdL7v^$*Blx^ zs+sijyWGQppB`^qdU*p8diP7gz%HoneII`s|Ju=|3;GkW1Fn{JOA3ZW=!XRvH^PWA zh~QZd&D6{AV*3FHu07LYJ7&k?v_%-H8b4GI?=H$n^7GFaX&j(isaskmbQNO4@=hgc!Mc8 z%8YZ-IJ5O&R>8B?L)KWPlHy0oJzWzFx0sizvBiq+U0B{E3@+-eR0Ip zbZ!9|)f+5>Mfkpbx>D{5?E#2Xa7KxJCe6{sD$%k^VEP}#EYw`L=AMK#Cl+4Vw7VU7Nf@z*7YbHeKT4z@=xy+cm=r+dyRYV4TzO;o?-!&UoK6X=mb>2~R@$eYqV7;rDi!^v+ZoHOW;HbNujY#2OR*7WeYLU zyMT;?U1^|6`20k>hnnGNN_M`Yn=6g(XXncD*S4-~jxOLR11eJk z(~?I;>CHY^XgRyG_BqFhhcd?stl~(`yHoCOX_OU}x85=-eq0niT+TGT%d1@Hwq5YlD{oXQrmu;dC*jLuA~Xhxn$o{}Xcw$aUZFchXTW>UFzP|Q z;qBNL4MXmAIlxDWy{z#0!fI5nmFGDtJW;Xu*OX#9lRPNIy*~)Nh&YFL!Nz{21G~VZ zdl#Uk5G_uFOQJKJt8)T7AsD1Ie0wY0UwJ!#Y8K7RvA>!Op>J^eTR4haQ8DdX%fFD6&xTH6d2fjG7I46k z?vSU^4LNfd&hS_Wt{-+IMA>h!fTqO+{+wLjpd)@H?Vsm$ZrNOXDtIcC*PCe5kigmG z$m4~&$SpB~44y0T^hp;5t>KMfvz5kxp+XCtW$rw~KJ-enBY5Acz&>2IYdu z&J=fwE_5vl8CGW)q0S1fpb)~qkMP;K&HSCG!$tKDtFj_)_ihubQFWsbtzWnoy_ctazh_n*M1Rg|BNf=yhUQ>ip%fIiQ>+N?-EsA@T}oiBCyUxShZWvZEsk0GTy?T- zerdeZ=+r@K?aKQ4F++Uma?SMNK@N;)R~$?LcP$%H0g~6LJdS#zX)t=d{C7r83j3QJe7LUAl}4$HDU$-Og|rCK zs?j{f?4Vu>+iuNWuwy}TA?f3*N9G{R@|=@zh3tq^<<}mmyekiV8_!cxjmCCiCB0?| z+l9|AJWmo9-p*+y_c%I6z6-u=if>_%T^N8PWeM*r5m<95B8$D%{4u=>h0x_Vu(OuD z3u0RkvGhR!y1Srm3gJHT=(9u6mumJ*mMqQs?E68zH5}!A=-`(6^3k(Oe2WT?a?YHw zxcTboz5w6#19Rh>Y0sm|4wQ+ZNuJT%o} z=46}2krJat9@+*jw9wTT{s6$2vuv zEB23UU#h&RulPobF0b;$2KDv8%XDa(L0|uIFHF$miv8Q^d1#}dmu4-p=cDGW8j}EMhl5^_={d^Xr7DBl4reDy-S-$+2Qf$O%9-T}nTx**x}A^%n1CDvJ8Li{Y6xW_j8#NT6(50X{dR%1!EvR`B;6+5$pk05QTVpKS; zuz)P8;L6gcr5)Z)T1H8=R=k843>iVxSwz|k{}zHdrz+~1?#D9>>m_n78Kg{IGacA> zSHGB2t5I&XAXm;%-i;}dP|ENL@bQj4JTYGBA_to&5K{!erUc99tnDaJAs7o;ZaTsD2ddB={WbtU>WWR*eSVho_ zUNOXmq705gagT|TILAFEF8q!O^5rI2d-uJd$kwkbygHEK?HPM`WW17>5(@xw8qFL# z6mh&MtggEJS>lcC`Da?1q*R6v8_cvu(d>lDcYCKc?Oxuo<7f=>i};-D zG*RRTG}GE8ywdhL?xLbamuKYE1s&0+6$Dql-ar(UlPmXj`QJ{a({Xn=f0iJ8qq5el zbhZZQ1ZJrO-T&YyA^$Lm;GJV>Wxtpwnnem+A;hP-?z^vrXx|{^kdbhHaY7|Vu+cOkkb&9NX`tRL#M>8H0rR;OuR6or4 zw3+9%aaK7wgROgOB@*nQ5GHyHS>}%JGt!#_8TSpqK~QQ(!r{w%083KGEQRn8#_KuM zvl@{dKQdxkt<76$dc4#qMsfg4L4__}*zB*d;|=Nc)5~-D&_klA>QBA~-CXSD_*t{k z&WF#U)$~fs)h%M5JP8)54CR$bLyusk^R1i$Oo#o(?!=)b-bOdiyANRbapbJ7#2@;6 zizlnE2{n1Tb5ya?6#9be;K# zj~6LI^KX3SrS2`YrM@nMWc6bw9>Fq9zUlHgE%2LT3mv^|*X{%uy$I!5Y9mWhjg+SeB~maXT>ViT`Ifte zsgM6L?e$wZf#Zt(7Us7)!;ekjCnxh?)T)I?pJG0*tvVd1B0PJ$<)`c)Z|0hoz`6!X z@ONpHUvfwP^aXJ`pfAAbnvcIL;&EIPLcL&NJX85CDBI5i; zq8X~pFKd;(jFIn)Eo0u6fPSP2IQ>X%{Zsb-=BYo@F3}oI}2E5zw&4q$8U$(#+B*XDOV5d zgkUB37bemPpWmHc)>_LcD=Cu}6&03bPvPAKqDR0h2OrPj+1!8|9eZ2@Ns`O;Q{ShEhD(sHXZ2GDG}=nlxcE8U(?9*vHtwT6KLto-QsXY8!=JU@k21M|qp!&DN zv76hlD@7*HoB^Bt8a8JPcm(b%^wP)dtnV zxZsyQS>ls+PGwwVVd{Iy{NIW=e{z{gcnh0b@^1<}j}Cfz?hSLdZ0Pb<(5Lj%A7KU9 z(k*O}F^qWMWxvD3pLe2#fobQV6z-STj?PE_h-{IR2kqlW?n3Z4BV83G3D{RD=yIzh$>f!avpr2l=BIWafUZEB-m-5$cos zP*+HDSGbTqd0fwpm0@?RGjCm;BW%>)@9yG~^OZ-h|Fs@1-n|Z>!>MOTWR-q_ zL8G*-30P$P0X#&otM+?=ILTOJA_)8ce=I}N#gwL%z9(Fy&lQ_xVOxXs4=>D})Vn_? z(uC+D?~SwWQBg26&-3*}=I6IgvKQ!r1uM_g-HwD^q*0#4H5Kn=Haahv1A#KJQX^NX z6y^pIG>#x`=nX2IFTux_8Rp_iM9AG9hLD(+EaZ*_V!&6GuVT0Ala-g7U7I!x5$u(| zEXVQhn|xuqSc@eVA#bRz6bcBCsl_1nl}Q#74qysDcEgTQ`MdEp%*837`F&#z;B<5? z@;h_x7IW?PD`7xu$uzN4Q?$p3FAgst0ZG8HtQ*(KxX%!;+0DwBo5c2G42cUCPB831PMddT$ZjJVP@iH>j0iDZTXTnfPbwbv z9(M;Yk0p~&A>rrrc?ZmjQ;3x1MNuFy?`7+FVCs2$*0rr7pzCFGQ&V`tEhxeya!(;* zcmoa|a+$D2^l3knv37`=^aYjMPy+!W*M(lHKeYIQy7&f5RmAypV?e!ZXF|yl@RUlZ zwlVRkzIxO6cGD0+PG`pVTcU=a!k$#;k!X=aUOyQ z7ZE*jP?B_NJsS2+^OuTcKK`bacvwVHthDe>u1}2E0ZLYAP|E+IY3vB`E=aPyIG6}% zPBC*s^V}UAwj0~yW2_1C@l7#k5`uPpE;UyvUrxVn*fW@{x4d!YT#BZ_dy{b-_(%ge zN&ATtV&RF4yMR_i0|?i=#pW_BHO6g`eN#xpPYNj@?Tfe=p`-ko=$#<22yuS*QXLmN z#4{lUG~DbWZdV>~-eF*Z#Rq&w{=l9P)8bta=$@Vfc%}IrNLl@|UVnXGN{GcTKX;iYF6~0n&&4PW2 z>p`Ri+M6w)o4~pHrFwSy5E9x(xYEf}I!=)13-LxS2pei-m4zUMb%7{4h!6Q|mzASd zuAfa3vgi+7t-Ul3oU6RrwGI39Ig}&1@vsEt=h7R#O1=KUkI;zdQ@yHvu6z6_wuYfI z2OK0nGIC=XMuuLSQ0s~WO{PNV>bhA+oKiVBzeCT=GYk93=}YMRXyb#hRH;~kQehXn zB|iKh1gAI-kM*+9`3aKat_!7=%0~cPyh(%urjM1Q-62$5Qq7LAI%L%?$_*KU61{E? zlb*XsnE_}a#C(c9O<>wN{NM_R9QLFp!V0kPqH++uQ2Gch73G zesiql7$(7z)Kf9JWhhX>NJvo{V&=JB2_ef@8AE?vLR180(a5iL;uP$DU+1UJRuQ`O-7c(d-L5XL zY)|NLGE3SME4s<0JA%|hwh=V9>l<*4=j~$iYJk#@jpfh9pT7(DUU$D5vt6j$zSOh} zvfEk+xBqfD^}ifq{Mo?$Z$p!B-}`Tj=6?yH{=F9@@-#eaBvf&(ewE%y&_%QU%V){I zJ8lwkWWZy3Qrs>$z0UcS54ilbi1Z)Y>EHk5e>{l*aO8?VpKkkq#I*mOL4LRR{@mH& zj|h=d1ng)UkOy^t8r;+u2CjcS*Tdw0bt}ePYdfGn=+g~E*&mdZ|I$kQw=B%Wvc46S z#sp6gJ+D?$&B5Sbw}sfF=B<NPw~RynZ+)|>>*FpM=2{qh=Ub8dYFoY$%^G6D&bH%)kn$0b33`te3L%Dp?_V-O zC35bP%sJ*hEBm7KwcC>$5W)XPya{!`PNA4wD!7McmU|VR@AV*j?qXg+!8mLD073tU zRizNDpoQ;eZKo7x*T(5?8jsfg1$S7$@)9$ke|J!dRw%Bt;mPd~LA)b>oD4!zSwQc5 zxhj2iLv$wrD)0s{B)Dcqc>xBLWGDVKWVrTu%lw_9N&WBMbItznqO($l^8k0$)50m7 z4?p(c)Zyd3JyPB2i|bw!4$tQVGGoueI^#d#^FQO1@b0v}D}~((5hIpIoDZs{O?=pY zJ5hVxi@X{bOrqJOB78E7i<@%$n|#~MRl7|o_L*3f?wjiv!SY`@=Z6z)6X0Mx{9899U|tvU30uCnj@FJ zPunqTII<^BhSL`w?*bP~^Gc5y9U9sbqovI% z)<%AxqjVKk0nN{Z4=XV}?esPqxzbOmJwz7|@UV<}i}*ez<_}V`4qrGY$rh=6Y2IV#o@(B!Jt}2O9Srq?4sbPj>Z~ z50iX7^n|VMJk`#XF>lw`zkAI8rduJ9&-gm{1}nC8+)-ppGKk^L+}Kk=b{|SjWfm|z za_z+P!lKfOqWF28lhR?kz@V~!w&7u}fwf!0u54GrEO#fVu3p<(?fh?q<{V(^SV(D;WliZnhA4quHWcciwd$@+}y7N$q(0)MI@I z*1~?&{!@=W$|4`-gLC2DI#SVeh80dL3<*t>Bcc+v_}8OMh-7LdKc|9}If|~}5wcr$ z9Rg0dooc64#y6^cj9)AD@T7vCif7k-)2o*1$o$+jFI04WPI-ksG=d9E_)E9kt{P?@*%XnH~ev%)%-*S50#^9y; z(;Eqy7Mdtczq1wxA*Lyi;+@atXb;M>=0=A+?{5^MV5uc_CW)8jje89b+BZLqG0Q0wJW-#1$v{4&DWN*5 z+=bR8fFPoEnHw^w`iG}D32#L|XAzCi=;wnoLeE1h zY{BKP??0jf{SD#GZeifd zm1A`~mt1$jg77Y=#Zvvn_YuSFyv24g4%<0*K5%wnr9OQUTKQ7(KpulLn6Jed5=8#- z*8HE@^7fvxuUx-@=>m@Q3LY^J>|qfN8geqrDAOgIZ6qjtD_*sqq;$Q`^$qrb`4{Qq zJMZ=RM>f0Im1AXvtqv?xX<7%Y<0xMea~FqNg&c~JVlpM5CN<+KF`J04)C1ddy4o&zo;%NGu;(g$c2D{5j8haatLjiU)`cBbGh+Yhfk!b|k5j9;^s za7gQ2;C1N)IDcjy&J&=xw%rO#3xz@D@QVLo(f{Cg$f;-rubo&}ecxKFsO7{_b@AA~ zZBuwl07Z#4#QVdeEgl`#AO~3cO4+>WiaM(M*(0#AaHr`1vg7MNH4CAA_(M*kmdP;D z)#+l4!M2np<*WOVApJ;(b*I+{QEPk>6QO(erM;Dg7SW7)^~Oaqkg{Bg2w zyJ{C?u>4I^)PK$c{`oNQU;HHHg_(n~l#aABhg)@&ZpnW1!M7163u@M2ughhF;b)`8 zgMeAgyz@Doj6@&a@E&qSl|L?OJ8jo)8WKuhel=!XxC`8N!IUQU@YH{SB7UC&B0m^Q zanmJjS>w60oR55Vl*p8=(!;cuqbLwETf;EJV0rlcLhNXyCr1#TAY!n$e0`hj)yCmh z!)T(l0@z}s`guqH(HBF!AjjFk6_H&q*1HQrf#}-AJt}D>j&f4Do3=X2dJuL7i~K3M z25Yt{xbj_)9&kmx{t|X|OAvYT?;@4|M-=;$n(yT~9A+uv&|iIW1kq49e0}o)rOG-A zkw`E;5$waBlqX*LB(d0H;MKtK9^Um8m+cK4W!T@Sg#}ie;QgoQq0bxi=Y#r{H)(Jb zf7FEgFD{OsnEgXn@Dsf0aBp#h55p&kXFjaR;(#ve;ZARX77h$p<{5nIKflr}1(u4`X-p?Z?vJ`iD6Sbs*lW}ycA5Hf7M{0*7?2U=; z9u>qR>kF`$-7h@f$y<_g;jv963XwAWpyyJP(yaio_)&u(p$3a>+o0Ez{V`OfQi!4_ zJp1ju_j&JY0Z(`)Z64SZP{IKs+Wo_D=FsasRoWF_JvM+{MiZql1>WlRx$B2RP z@)R5lq#d#T(L@OfDHV=o@HX_P#ULJW6JKLA%=T_ZA!3KtjfUkJ`VW6nn2fE!ARTNq zk2TDoXH;+qTdl7#`LSxLKqFpS#^fZ=<2`UNJ7;v1Kmy37D5W>wt=3k1m3)ROLken9 zV9@*2=50d&p<&jkGNn@k2-Qg{%0pM1QNSV`oOO1 zZx1K$6o!4URNMO(i+0QKofB!*EqF!YHwR|QR^iaEY<2K7mnefDi{vI4uvGnyITK&+ zgWpM19+-Lkk2Tf;_@atm|AM%v!*6C-_ptX(ihC_^np06YM1?0rI8r+jDfx{Al{lWO z$S+tpSRt3VCy!A0P@?x)x$B;Ls90yW;J7LUt_iug6+8???5XD`5^cYb(1eQmI}#Zw z9msx&&uS6~>AeS&P!}xBm~<-`LTiT@cVcH$ngAKM(gnFhsHa zM*VQGnHkMDRaNd0k>z5yV0ZIG6F<>xdSc-^nGYnJ>prs?8URwQTX<8nUp_vmtL~t0Ny4w-C$G<%LZ(I$W zfb;9(6j}XP;`VVm4TI?TH4a8v$n2wLT4~M)Do&0q)s0e3@~=di+NX%D(6ky(`1m)i zwBODc!$J2)>skH;F@&2|uKJ z>|nJw)CW!tOzI_hObn>eX>vEEMG=+x@j3fS^u5hVY9 z>G-?%K68_BWY?VY*o`9#Su#7^6)kv;PWYc#OpWTN%=UT^ibLG+3wc7PnCwwNu|h(f z+cz%Ge{aT)QZrS;n4ivgkS7}qxA`i>tF5);jJ|VG5(dRR}YFCRmhDOWJ20;NXRNxy+3ekt#_p?TJd zm+E=rQTFUi1#p&Dam!JaRMhpDTgh;^ngxd6`1f3>M>Fji1WDef;ylV5!KK3fF^;m7 ziH|i#nGVew;Yx0Fb2NgU^?ooMXcXB?j3lGaf;_TdZ{J@)Q zTzfhJy?rSaqomAodn%zd?`zx_uWi)tWnBhmYxSx8P{|0EL>QN1Y#YIDvIh@59al1o z4Sias*TdRFhJ?zOhr_?9Ht?|A5cDV={mcS-Vg{J9#Or7eNbe1GL(msd+rN$AX|~LQ zsgPd%seoNbHyP;m!HMfzpC24Bib7@h@|obb?6Dwy`!^Pf2HZo*@A%M9KswG7ZcC~$RT*}0nj=((lETz6 z{TI^Y-<3hn`%M|w1;Js+0v#<=ojOk>AgDO_odtLeg?Mf_lvInByTmZ-yAoWMthLv_ z*+YBIdDvs|O?X|NaitUx&M$v=&eTxb?_&vc@?9VAE~la-y!%a30pGKdl&VHjdCJga zek_9%MxgEvtxn9XFxXR;w9pV4uO9Q@+rY73S*U}ZI*^4>YZc}hEd11kg*Tzx5i}OL zMi3HVy<{GGV%dJP&-OZFeqsR!%=;b=xP{{1@tK>z5Y4RjbT)j0L={0>356d)`~#NNaubUThpfw_gH#8YPCPW?KIpwScMbY1JUzo~+tuE^ZkP+ji`up^ zC=*3f5t2PUL{tou{<=0li>5AQ>1>Zc4xq* zCw~IJ{9fG$ekE4c{YN(A#doA&OQpo2S2R5stWfn^N%DtI-5mGY$`?M!-Hg5JGC}Y3 zCh6-qZuy%J{L}Qpf1qHmA~Yg@)4DG~WIj;rr>Q9fe%5jGb7RM^==X*BkGZ4i z5`t5~;@rt4-R)x|6UTJr(_UP)I^%HlZeClI(emoK$-^Jaaz8W;$~;OKInuUvJ*%yI zo2qa)l4i{_ziVw<-;!rX^?IPe(xJuD^kK>A!l25yt`L>_nS(Xg+#T|p)BF2$f?Cy^ zdZalUUT$95&Jk=b*GlAbkn-&czI$ftc;{;Vv32u`qOdL__G~e2^wHAMKIClbhXk#f zB#wRUO5`&qFL9Mym<~<1n`;w%?hma6V5*!z3DY8EEk|Cv22uZEL<1gO<-Y&!$74A zOZVoI!qY{KxvtyJ0)-vIgww*4Y@;#)aJ3xD^L@IBuKr1R`Osupua7M*RfeHlE-n&nK^A}IEU0XRMB)7aQ(g){r?JZstLvA zR|_^KU;HF99sKj~wF$bwC;fLX7CwJhcl7pNX<%s(g-LMmzx@QCf52XpHRiHnbl_ zWJx9d{CS$_FvTU&F!Q7r*-jUd547n|^eMO}(T?(P#QQN2UxCA)dEyDP8tvZ;&^ko!whNj141w7N_k{t>fnIklM7zg?rxoN7*97W zD|v;@dDhuWyX?{j>&`I3UYq%Y1p2Q~eH3WpoM-md!G}7DnUL9Fnd9mJR%ZIsma$WT zd2e5Bi7v{3O)e_?V)%#gx(iHm-Ld{)X5|k5p!TyRD`DOkpC+lRq6gC+)?!6}PWtnZ z=W%o(l80}ZeY&XV;Ox#EW7-jRye|RGQuOPwY$rd3mm z=)*lc`U5fC`<VuXO#AT+DN~nr*=TSoBC-n z@2OABvvpF4Lq95NCP^1!<_D+|wDWIQUgOCAub1P`F^Dhm22R%Af1YVMcsA}geB#r- z=P3_kFI)EUoDTliulD?+P=xu+oNzMxDcC@Ci*LK?_U8kN1VD1mhjY1S7svsnZuecF zm=62h{?V^Y{?w=b+_V0*PbCR!`ZmAwfxf0A#H%#cpEGv_NBqd;WfN0hV~K$yc=y%0 zc5cAQknm1ocdudCaQCAZKqc_vG*=`~2y8%mz`pwC@WnS(F!%Qe)hNVm^t#sI8L;bj zq^+N9w7%Ad0>!;oa)<4l8w@UWAadMgLg=_A+Xt``9BadUN>*?VhscN1MNQ+njThi0 zkFT>&UGM}3UEpP-+oCQ=mt|8}sXy5^cB-ayp$fLE-5LKHLGI3ubJGWE^jnLMg~qSC zVUVVJVN~+UB9drk$urG7@dZW!2sEA9;H#TFH|B}3P=@C|?rWG58zEmjtc3a6@GYNI zt;aYDGO{Z78$mA#;Q$emApe$h5hYf(^dlg%q=d9*nPg20k?$;1dPQ4Ck$6Q4k?x(V z-9{f#oIA?%0!UD(V)|XJXZu;ehm+(PSNBCl{$UCA*B#&==D9;m$&)+@zl5XE8Rc@ONE)4y`90}$^Ek}jLhHbuKe|~jWd_gw2p(b3ERCO1I@VdXtjA~ z4xEG)me{n^}X!WKpra|4|qQjj6K35PrRwjc$OhC%h5J4k4I5iDE!EaQwIQtRY2=O~)_2EtVz z5~|#p#t{y}F*&0x1dgD+U3s+k%p=%()85g72XFsB+VZd4nfl{W+CMbKk6+?dv}&)P zT-yJJf38Z=L*_RJh#(K6@gxpfz32109qw=USJa^=nsG`bY>2uJLqg+sPqaLyl4&*X zyV0NSM{E?p@eZ07l67C$C+3LPy&#j)a$pNNj6kys15d_omd?p*E>ca($8}|fp6GNO zDz9g66q{5S4Q|8owpW<3`udY?Yw|OSN?I^Ew>;N55Kj!FJcIz8&i3I;NbMR~3e~Oi z=WAVf$_#`vnc&UuI)4zWzsOgR=N6~o>_?p_UB$bA(lP1aT&w|#3R?GGCLX?x&&Y>fAQi zz<=_({Q<`A5ZErm&Ka??R`{|!(f;yRMe=0oCK@wp#O={n$Y+4>QN$+~Z&cxuOGf+& zQ8IlJYUPwvRlJ0-PW84eM=KJm1wj zKQmU#hshu5HzKLEh>KBKAHj)0bE+gP%ND0`McmZ36flO-|M zgzQ@~g_M1lB2$*MsK`!f(O}4ys5BxZWr)gddatSbzU#f8r{lTr-*Y_2d;E^~{lgzP zzTdg#yw2;q&h7I#9X8T#gz(;ozqz$~yTYUA(ccJhE$M(9iK+(c!XpptSv%iF(dI6z@=qJkQUkzA)!G(6DWPVD{21VQFyv0yU3y{(9-7M*!cXqJm^^%#pz?*pT zF8i=MG6Ij>P<>T*gV}s`-uzti^}3o2pBL zIyL6+5L<{!lTEXW`lpG)pao1k1uFn(@c;#Qisy-@UgB1(Jy=8 zyU55Yvo7-5_gHJSmc;h%x0n--=98(5%`cane!g`e`PbGMe!3dvx$fjUgL5Qgq`XUB zhr5FHa^nXiW|0f~pIp(u z>Y;Qg9w(4{tjNc^C>i$!P&0`w983eax1J51S_G70m(G@QggC}}mp%#4qW^M#19Mub zhw7w~LVM)K<^#@wyyu1-7BTsQr_IT#GuZVrm7Eq{cTLTQncVMH^1|YBq#t z_Ep_VdAFSfWj&;inG3a%ICUVGruU9(Pq89^5e89kBei{I?K9z6OVrYo_!2whIJFa3W$sg)Ex#U>fpMm#$M7cA-p7cOi70Wd zC!S$qGs@gj%G{^?{2KSW zkUc=drT~=45I@Xo|5wPqVEQZYo<fp=dBVZ*Ubj6*5Ma1 zMsMJP?7?!7I1Rr-n5aj~-OLV5B{A07CZfwm;;9FQlQ#hLzLI}YE8EMm}t+ArUn>ct(4f$a^-t{}g3_XyYTgxG)mq{ z>CRzsdsRuI^6!b}Kl>xBriNmbuxLNt({9E924eEBB2-ww&X_j+IsLt0u*#aY0m|w@iIE_jefPK8&Zt$szE8Wbl zkR5RCrhqq~2_8>rA+h(tu9hI?zgv9nAp={mSFfvts#4Z^uzbJz^8Yfej9j;?hib@! z{vPc9F!^lW9XZE#u>RRG|110clcEUtrZXpO72)kpu7q`U46wIQOr*+Xh?1XtqbAY; z2nygEyEcN>642Om(GtsYA>u2fn+(*@_LVS6ayeI=|1TYf`9lHB>6#Qu_$IC!dMf@K^u^hQMvt%iA~ zltI3e&Z;nl69Ef%OW`Fq;ce%Rxk|kiEk)=E)_Ou&{K{b47W6@F$3aDEsZcaU*9 zaw!8G9)n%&olQqzrlBnXSm6*abhWR_2%!Ddt`i%>#UxpP9(o6i{KkT_e!awv&rXFM zc|G@Z(X0$|-bBrLkQCg_VshooqcZV`OM=!!p} zl*UyXNcoB#dfiLZZYasxC`mPz36(8_Yj&bhW+{Stk;-e7iSr z$0liXGxw*iBdC6b>|TYlLvAV$TpJ-0Ez1GtY_Hv{HnOM;x#FwTGq!?~pLTjnAV1Nk6m`gVkLCPQt9B-xzh=k^aE{6MObfS;tay(QF zVn5tAS8)sIlB$fm>W{5VmSpQwi5jh6`_K6~_SsBcf$|GG&ZVF2hFQgy#VhO3Vu*U)zIvim8; z;q%Mdt`Vm<@vEH7NWO9rLi58Eyn+u&e>{4=_$+~=I~zaBQ51#uK#)jWd+>egxJJ8x z61xv7lih}1B8A5l#&dH|j;%344h4>JMpab_yK8gswfWMn5guC`G402+gqVr)j*Aap zE)_2ASv&g!#l#C^ab z?`5|l zxSQE03AECo!yjx&;XtXwH$|xJ%Deq#?(5O;G^WE55aKnUB;#WJ5zyL46cJMJ?|19&>Aa7~Qz!jyD zgoO$VD=d6rcr5qwtppvQfbAu6@gul^A*hOoK2tM{FZ zHx@R35T42mTHkKeKe>DJqOWhd<@TuxqRkpS<2+P{Z1Y0~H2bH^xoVLO0qwBh%cOf3 z%a_L6Ed~kZqsr5M8L`mCOqhCAhvqTGkNTf|;#NPC*yP|@^S3;&n3s3DD(U;ec2gbX~$@>Zyr> z1+Hnu`?+}9#x=8rK3gx6!$eoQnU3k-TW7Qh~!7YXNm(lACs371nB5s~^{7?WAJ7q!O?zRRP zUdA2YR|Rz0rN9`A4ulHJAkX)XvlHTd4Bl}PYQ6aEig@2wNCC>&1Fq<%MOG4fAgs9P zbIwN+JE#PfMS-J=XC{F+7_74Vdw$qoXJr2;=Q;DCvIIB%_C)(?-H*f&yz!P?L(O(1 zd9Wrga5Nq&|CM8eAK1E<;x`2Y4kUioEJiH~ebAVzDDk1pYyLD1A@`fymq<*J3hmgB ziRWEoPT2D{TdQ|ku3H5FmIkcI{yQa_t1<@!7xXto9(rk~RhX1%8m!_bJHz`P5GRr^ z_=Wft?er>E&*ZVAN@0Uj6f1~@(aGjCEV|{<%Ukn$Q}FJk^w8tBm{;046HDPM@ldag z`cA98J=u{;0HY<;Cfy~OI^l#DWYGhpyM&gJhCxfu&u1&!KQyP0Q`$v`ZEQ9CUpVER z+S>XU^1k3;Y&NS->)Q~R15&d*mn(fp&8@7DT#{7`TS*)r^n~|6t)#LqOmV6$2YyoP zFa1z^{WRKo7aOov*NYyPn%wxHb7MI$O>x%LDIq-D|61q=q6fSrR{z>X`De;E)ljXN zK3mcBZDgaPJ4B!Rg1A@tY^mlcbtPT9g32c$x@RuLb(E8Y3?13_fE-;G;T58!i!E>;DWLE`Q$}L z1d=!lgXnom$8*CH+uqWabVkttq{tODb-u!De-7UZ)2RV2mn_##K_SEyA@MRO@H31f zMBnvQKYhpbaVCAj=GLXpdb2}BR-fY^&W_BvT1lV0JHWn#UIIBfO#M1bovk}BUXZS)y1K!6|k1|YWk3Qc!2 zdEHuE&RP3}<>_WFzO@=H4MMJV5|gM0!V1`z6fJroAT4%)Y{2HEJf~k-!XwWYtVVu? z?wde+NSsQtMNI%_o3rM%28Q4f)mc_geuahs<`JZp+ZG1CCx%5KH$2l_O}YUK7#afb zd84!M;8l?4WWg+L^8jc=@qF(AlS70L(DeXdF!2v8l|?*aq&INT6M5USzuf#TT4JBn zES#wPPkb^r$HfSXzMHYno{>Bs(mwIN5K1xHn+TkAyNdFvr)AkMJCUb1zAIJjx>d(W zSSM=Aixu+2x>`?bqq*@Oa7~jmG$WK0kiw)`Ku7V$J{Kg;N*-$1jTJA37P5f-xrbat;Dk-U|L0^m}argg_7$b7~9Yy;|NQHP*L{MJ#rigDGJa zP=gaXebUNx41k0GR;Cc7ZvT3wa2d=9fR1o4A%LO)XsBy9B4g$j$h9Yz_3A(!BviQX z>Iqu41#|%5eY9IPpw^g z8VAm+>)pzpJT-4nGtsS~kARNWxz{Uk0MphUH7!mdaw~m>YQbInpZg!&=EmD|A7i-p zU^mS7w|R>_8@qU=pD59%WE;p)5EcO}7G=(*Q@6USm#7}Nvi~HQCZy?Wh!vQbdi`Vz z8O8jbg@6^1s>wEeSqj$q;uK7v_RJ?xY|hXtx~(mYJJgJa4<2k&i&oeN15nJq`sl72 z)#So7tWX!Sbnu`M(9T0oX`+susRRU=7%biAZF>|a)VBK+NTM3cdtcUIeC`eJq(-xl zAsMFtc9X)hCpOPCA-xpJH692^eRCb2|o4-Ino^sL^AD+1<^7N0k1f zQ}Wls5jfl7E%p!Ojywx93C-?$SB@Q@h2VL&ZPBxL+kM0EYDB zB$gSBDi9LOgbs)Q{a;bv{H9E(5(0o!IH8gFK%dKD_y>7*_6guuYCD0>H` zd(goYDU?0w6zi(m`k+C9&uj#+PwuN;x8yHi@Q`Pkfet8+2vAAJvV6>xXi|VA z>JRqh6Vi<412N!mZ@l}`ek)V*zQMK6o3KdDvub1sk!xnbMl2IpsL|MOEX;pG>lL2H zKx{N8`>`d1+REXWTN8i)&(jxUn!I1yT`ndbvP&qgVYk(`3t8Z)1}zSjf#pUO=f)0G zv)H6Q0tQMs#%jC`9^L-FnsjOjZ!73|V>1$-Bf(L{`RHtIL0@+xHWIR?!Sb{OAxrh! zY7U%LWUR(C%mo8@l~B!^VrDtY0ZD^guRDosoB6a?GenAJKPm7T=s>cKmLcptl;*^7 zp4))ubJF`^cCsmTtyu<8uV%~b-y@PJEW{p@wupz#7q1_R%8_|JJ+%!8L#qBD#xuqr zs#~()d7TCEI4HjFC~s|ux)SBq@(a$M5-7~NL;bOs17I;q@qpOShIDX;KhJl`AZV8Jz6R|% z;?(CM07_yOSb^<5GY*T2O+5vA1u*q?v2Hfw4tI?&p_lP+!{8h)N;xHlW4yZ*^s+Z+ z6L{kHN$FPbfUmFryuf2l_i8|%&+}lA&bACq+aak+!L=yFqySM(_fj8L`rkA4KVt*< zU;}R}+%enaGg;2YV3btO)>=;xDboCSjiER!FLS1Vbd(JmzHL?Vr0dDzZ(D_uU;$e- zH0gs7NZ$TUSJ-?*b2#=9vQ!L`*t=n(Z*baYOjIxhxv3|C0Op$of0m9fpL~p|{JA{; zQgfh4wGEcRV6TAl%~J&_E?B}hsrgq=x5lJl5md!viezn8-w{?zAP-cr#?Xm24N!=6 zqB3Z5d)rYKQmIUx#u7-7A>wgRy6;?0xe#?P77*n&TE@whQ;L9a06AmGS!ud?GCpi6 zm({V8hzLD3+B!Gh>DS-{=I6nb-WaQ#dAw;Im9bUuR}N(javtN6uU{GUK~{mcCGVI? zF;AVr0nATtaeW6N^)#I)rUr~|uitajeQx|dT{JEPP~{%5R8+zwo1k9&zEi|OLRK)~ z0b_ql`~re1DQNZp!a#00U0rtfm%rLcB&;A6p;_iDCFk)q^ilZWGc!6_Oz%W-+D z$PKF?BeMxC)8m(RS)3xbYTd`cV(vI7@?JkTewYfEV32)A6kGafCmV5pjM)hEmZ`U@ zyr4Y;v1lO*)Rxylu}AHcHveXPt06e=HT8D+U^zf=k?h@Y!_bV@-GnUj>33KXY%}jP zhorV4GU+ixGR%!8wR1c6tjqIZWvI>0&{PX4k7DPD%ZwvsmrzxWQS-kS#jr2uCl4pt zxBMm<_1?1DycP+TMI*+CqXNs0y1$SC)`fAPBkj|)U7E;kQ96)JqxnYOO8;`b9yZXHss!Xh zql(;WSUF?I5A6)RO|B67W?UqR%=P+0@Yabzx5L#a*xO{&XaNA9n;Qo z%B6@cJXXC#R76!RwOadt??U%Y512$FZd~<-|5Z^cEBFLdXwosKxp9_1Or2$lbc?+1 z@ds=`N^CQHY)EgB8|Iz6+4uqfsHbmDpnvtuw8Rl;W4(>@K@NWvA4*Kx7k&r`=5|4Q z>Qy=qLrLJ&O@q13{*Xb;C5HNP_I3&Dv`EHIy)#r}$ffOYIprLES%8E*Ju8z*mi)Fu zKtt@By`ouiRTH@p2!>(jSb?2e*e;C+x~o(TZh$5FoAm&s zReV|?ld(gkIPqABdD5h&pkikem6aig0#8pRTMwt;!(7jwdrJdend-}9#urLVQ`3({ g$BJEK6eoXKo%{d$hW($t-~aE^|5s}d;_Hk50^uMpSO5S3 literal 0 HcmV?d00001