From fad2c670907e59a089d3e1e4ead038aaa9e33fba Mon Sep 17 00:00:00 2001 From: Jerry Liu <jerryjliu98@gmail.com> Date: Mon, 12 Dec 2022 22:53:15 -0800 Subject: [PATCH] Revert "Add documentation (#96)" (#102) This reverts commit 3b913aa47baa8a0c74c733f2d2bed113da1c2b04. Co-authored-by: Jerry Liu <jerry@robustintelligence.com> --- README.md | 62 +++++++++------ docs/Makefile | 20 ----- docs/_static/composability/diagram.png | Bin 31056 -> 0 bytes docs/_static/composability/diagram_b0.png | Bin 14133 -> 0 bytes docs/_static/composability/diagram_b1.png | Bin 30486 -> 0 bytes docs/_static/composability/diagram_q1.png | Bin 40713 -> 0 bytes docs/_static/composability/diagram_q2.png | Bin 55410 -> 0 bytes docs/conf.py | 50 ------------ docs/getting_started/installation.md | 20 ----- docs/getting_started/overview.rst | 4 - docs/getting_started/starter_example.md | 69 ---------------- docs/how_to/composability.md | 53 ------------- docs/how_to/cost_analysis.md | 39 --------- docs/how_to/custom_llms.md | 43 ---------- docs/how_to/custom_prompts.md | 54 ------------- docs/how_to/data_connectors.md | 13 --- docs/how_to/embeddings.md | 27 ------- docs/how_to/insert.md | 5 -- docs/how_to/overview.rst | 4 - docs/index.rst | 75 ------------------ docs/make.bat | 35 -------- docs/reference/example_notebooks.rst | 8 -- docs/reference/indices.rst | 15 ---- docs/reference/indices/list.rst | 9 --- docs/reference/indices/list_query.rst | 7 -- docs/reference/indices/table.rst | 8 -- docs/reference/indices/table_query.rst | 7 -- docs/reference/indices/tree.rst | 8 -- docs/reference/indices/tree_query.rst | 7 -- docs/reference/llm_predictor.rst | 10 --- docs/reference/overview.rst | 4 - docs/reference/prompts.rst | 70 ---------------- docs/reference/query.rst | 14 ---- docs/reference/readers.rst | 6 -- docs/requirements.txt | 3 - gpt_index/__init__.py | 13 ++- gpt_index/indices/__init__.py | 17 +--- gpt_index/indices/base.py | 36 +-------- gpt_index/indices/keyword_table/__init__.py | 13 +-- gpt_index/indices/keyword_table/base.py | 23 +----- gpt_index/indices/keyword_table/rake_base.py | 6 +- .../indices/keyword_table/simple_base.py | 6 +- gpt_index/indices/list/__init__.py | 8 +- gpt_index/indices/list/base.py | 25 +----- .../indices/query/keyword_table/__init__.py | 14 +--- .../indices/query/keyword_table/query.py | 43 +--------- gpt_index/indices/query/list/__init__.py | 7 +- .../indices/query/list/embedding_query.py | 15 +--- gpt_index/indices/query/list/query.py | 29 +------ gpt_index/indices/query/tree/__init__.py | 12 +-- .../indices/query/tree/embedding_query.py | 20 ----- gpt_index/indices/query/tree/leaf_query.py | 18 ----- .../indices/query/tree/retrieve_query.py | 8 -- gpt_index/indices/tree/__init__.py | 9 +-- gpt_index/indices/tree/base.py | 18 +---- gpt_index/langchain_helpers/chain_wrapper.py | 24 +----- gpt_index/prompts/__init__.py | 6 +- gpt_index/readers/__init__.py | 26 +----- gpt_index/readers/file.py | 13 +-- gpt_index/readers/mongo.py | 16 +--- gpt_index/readers/notion.py | 13 +-- gpt_index/readers/slack.py | 14 +--- gpt_index/readers/wikipedia.py | 7 +- tests/indices/list/__init__.py | 8 +- 64 files changed, 75 insertions(+), 1141 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/_static/composability/diagram.png delete mode 100644 docs/_static/composability/diagram_b0.png delete mode 100644 docs/_static/composability/diagram_b1.png delete mode 100644 docs/_static/composability/diagram_q1.png delete mode 100644 docs/_static/composability/diagram_q2.png delete mode 100644 docs/conf.py delete mode 100644 docs/getting_started/installation.md delete mode 100644 docs/getting_started/overview.rst delete mode 100644 docs/getting_started/starter_example.md delete mode 100644 docs/how_to/composability.md delete mode 100644 docs/how_to/cost_analysis.md delete mode 100644 docs/how_to/custom_llms.md delete mode 100644 docs/how_to/custom_prompts.md delete mode 100644 docs/how_to/data_connectors.md delete mode 100644 docs/how_to/embeddings.md delete mode 100644 docs/how_to/insert.md delete mode 100644 docs/how_to/overview.rst delete mode 100644 docs/index.rst delete mode 100644 docs/make.bat delete mode 100644 docs/reference/example_notebooks.rst delete mode 100644 docs/reference/indices.rst delete mode 100644 docs/reference/indices/list.rst delete mode 100644 docs/reference/indices/list_query.rst delete mode 100644 docs/reference/indices/table.rst delete mode 100644 docs/reference/indices/table_query.rst delete mode 100644 docs/reference/indices/tree.rst delete mode 100644 docs/reference/indices/tree_query.rst delete mode 100644 docs/reference/llm_predictor.rst delete mode 100644 docs/reference/overview.rst delete mode 100644 docs/reference/prompts.rst delete mode 100644 docs/reference/query.rst delete mode 100644 docs/reference/readers.rst delete mode 100644 docs/requirements.txt diff --git a/README.md b/README.md index 657f7fcf2..b00595a63 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,22 @@ # ðŸ—‚ï¸ ï¸GPT Index -GPT Index is a project consisting of a set of *data structures* that are created using LLMs and can be traversed using LLMs in order to answer queries. - -PyPi: https://pypi.org/project/gpt-index/. - -Documentation: https://gpt-index.readthedocs.io/en/latest/. +GPT Index is a project consisting of a set of *data structures* that are created using GPT-3 and can be traversed using GPT-3 in order to answer queries. ## 🚀 Overview #### Context -- LLMs are a phenomenonal piece of technology for knowledge generation and reasoning. -- A big limitation of LLMs is context size (e.g. OpenAI's `davinci` model for GPT-3 has a [limit](https://openai.com/api/pricing/) of 4096 tokens. Large, but not infinite). -- The ability to feed "knowledge" to LLMs is restricted to this limited prompt size and model weights. -- **Thought**: What if LLMs can have access to potentially a much larger database of knowledge without retraining/finetuning? +- GPT-3 is a phenomenonal piece of technology for knowledge generation and reasoning. +- A big limitation of GPT-3 is context size (e.g. Davinci's limit is 4096 tokens. Large, but not infinite). +- The ability to feed "knowledge" to GPT-3 is restricted to this limited prompt size and model weights. +- **Thought**: What if GPT-3 can have access to potentially a much larger database of knowledge without retraining/finetuning? #### Proposed Solution -That's where the **GPT Index** comes in. GPT Index is a simple, flexible interface between your external data and LLMs. It resolves the following pain points: - -- Provides simple data structures to resolve prompt size limitations. -- Offers data connectors to your external data sources. -- Offers you a comprehensive toolset trading off cost and performance. - -At the core of GPT Index is a **data structure**. Instead of relying on world knowledge encoded in the model weights, a GPT Index data structure does the following: - -- Uses a pre-trained LLM primarily for *reasoning*/*summarization* instead of prior knowledge. -- Takes as input a large corpus of text data and build a structured index over it (using an LLM or heuristics). -- Allow users to *query* the index in order to synthesize an answer to the question - this requires both *traversal* of the index as well as a synthesis of the answer. - -## 📄 Documentation - -Full documentation can be found here: https://gpt-index.readthedocs.io/en/latest/. - -Please check it out for the most up-to-date tutorials, how-to guides, references, and other resources! +That's where the **GPT Index** data structures come in. Instead of relying on world knowledge encoded in the model weights, a GPT Index data structure does the following: +- Uses a pre-trained GPT-3 model primarily for *reasoning*/*summarization* instead of prior knowledge. +- Takes as input a large corpus of text data and build a structured index over it (using GPT-3 or heuristics). +- Allow users to _query_ the index in order to synthesize an answer to the question - this requires both _traversal_ of the index as well as a synthesis of the answer. +The high-level design exercise of this project is to test the capability of GPT-3 as a general-purpose processor to organize and retrieve data. From our current understanding, related works have used GPT-3 to reason with external db sources (see below); this work links reasoning with knowledge building. ## 💻 Example Usage @@ -69,6 +53,32 @@ The main third-party package requirements are `transformers`, `openai`, and `lan All requirements should be contained within the `setup.py` file. To run the package locally without building the wheel, simply do `pip install -r requirements.txt`. +## Index Data Structures + +- [`Tree Index`](gpt_index/indices/tree/README.md): Tree data structures + - **Creation**: with GPT hierarchical summarization over sub-documents + - **Query**: with GPT recursive querying over multiple choice problems +- [`Keyword Table Index`](gpt_index/indices/keyword_table/README.md): a keyword-based table + - **Creation**: with GPT keyword extraction over each sub-document + - **Query**: with GPT keyword extraction over question, match to sub-documents. *Create and refine* an answer over candidate sub-documents. +- [`List Index`](gpt_index/indices/list/README.md): a simple list-based data structure + - **Creation**: by splitting documents into a list of text chunks + - **Query**: use GPT with a create and refine prompt iterately over the list of sub-documents + + +## Data Connectors + +We currently offer connectors into the following data sources. External data sources are retrieved through their APIs + corresponding authentication token. +- Notion (`NotionPageReader`) +- Google Drive (`GoogleDocsReader`) +- Slack (`SlackReader`) +- MongoDB (local) (`SimpleMongoReader`) +- Wikipedia (`WikipediaReader`) +- local file directory (`SimpleDirectoryReader`) + +Example notebooks of how to use data connectors are found in the [Data Connector Example Notebooks](examples/data_connectors). + + ## 🔬 Related Work [WIP] [Measuring and Narrowing the Compositionality Gap in Language Models, by Press et al.](https://arxiv.org/abs/2210.03350) diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d4bb2cbb9..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/composability/diagram.png b/docs/_static/composability/diagram.png deleted file mode 100644 index 9734b399757d0e7d5aae85768423cd59b51873b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31056 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 diff --git a/docs/_static/composability/diagram_b0.png b/docs/_static/composability/diagram_b0.png deleted file mode 100644 index 0e080daaac368b2f8497d5815637cc9f0d4a85f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14133 zcmeHtcT`hNwC_m}TSP#Vpdwho0tpCGq{N1bg4jS11O(|d(h_M=KNO4*5tR<gr=X$~ zF`)$rLX1iXAW{Pf21!6l2rWPec?W!Vy+7Xl`@MDV^{jQ)>`cy?GqY#!nLYdWi#vbr zl+4;KYXJa|F+Y9cA^@y(1^}t;t5<?Gx|#1EfW?}?({@1sptxu0hL~U6Jq}hvf-asq z1{5%qhrk~zJdRo(1%P4#Y~i{z0O)-)KXLRj1~Ss?^f1#SvQMyzcCYhmx4En5!!6;j zUWR;M7}7hsagTv!c_)r|VDYql>=s);8)Ep;{bi>SrxAXL$FTEt(t20-@3rnM*m$Jv zFb0W>hZG-BzWmsiqgP&($QkLzjqXOouj!gJN=l+<Op<wI-Yjo(6FHlp3tbt`5;%}+ zuq?jFlyC1iybtUlc)hf<{v({;L-`}@R&f3!JYJ*qNBFuzX<5MCfUa8>jvRz6X#xPY zrvg&T!XpbDWLY?^Mp-U_zs>yB&0o9u>kNMvia+b&-$hjIuQU90hW}U2(DfU7Uhq4= z@R@@8xhJi8R>?XZj42fGtOSNAdrltp3pfCGia<+T8`BQOlz2D-2ja14{}edojH@Hy zM;;(%LB}g>S67XHf{A0~DQ8I6>+ap`a!a<`+xUeHRD2>E7;&YWH*uxU@1g(!vjfOz zyQsy<Y$5-g)ZiWKe4D57TlJrvMOJ-m&cZ^1<FVRXC!vE|CZS586GYMos(fSuP_b9h z99_C4DHVPsITb$or=U>YLW5a-3|(Bo1N;dz;)XH!;^E1hZOa8zNzVCszl)VSeiyFX z>@ggwuY&}*De(SOI1ogKZC|a`jGno%GG#KIy^t$;?EIS!!x?g^7_Kx$c@nxBx-QtZ zCk{RF>noI!0V<`^^YV2^K;wqv5Ac0hDjWw$ZJYUi7P$#fJdEa?xV~c&>ih(&{f!JL zxj7ywU8B`}9a%l=0&#v(b~Zi+Z2JP2x_9{*NUs{@$o;B`ZwI7tG332LPp}ZJZ)ET- z;Nd~!bLI-AK`qfE=)(_3w*09&34ZWjI&4tyzg!?`e+^(rA*<%|C&FqL*aPZFRm3SL z!wZfEK_7qvOe);LHcI%3jVLW(UnO0e3Lls#b-d`jVG>$FBReZ{rGp7rNCts5an%ZP zc&Pcsakn>Bf!q^a;sv%4e)34EU(GMsZ`Zb#X2M~w-rJWdvTis6JcUWl0;o2ygc_(~ zpet<;Mho#0>*|P+Ba$&)T%`Kq3*#Bii<=!r{+iLZhALs}Ktqn;N?X!l&ZbN6tk$AD zo<-6YJ?4g4oYl_NWzG{<PDxHlQ2cI;4`dShS{te4?g$*>N*DdG*@QDw49m4shV)0w zNle<=rJ4RZNSrwxb_WZwaB&3An&BXd)+1jR-0-`e$Jp+!8vhn|Odqsfd#+jOav@!` zafOoeg|4K{o(CA4DhZ2`FVg9-=bDo_%;f@VyB4~x$dfbn5wk|+h&>8B7l>^!d&<y8 z;=EGfz2J~r4<d0?&{go<;!F3}Qa&y+kt1zAVE?pWlR4qwus}@~rGOu4QN|3Z!YCi3 zZq5h3uwVYeObCu%0~EE_Xi;+J@|?tMsMdS9qoLiP;v_UB2HRq?+z!;%VyPEoWrY-K zi;nu*UT|zBT1ar70C&(U@aBI{G=EQff3~atRwrR_0Rw>3LB01H2Ofk3Ah))^8<y~s zJkBL&XPVk%8Dn1p6w0Pyy&3n<&!i_gzfzM$lbp-^8mXcMFdxwHgOTr#G%AdUPHj(Q zNk5;ZF5ahQBdjtEdPGegYg@~CX|l;idhEj!a|FrY<iMMx`!LEyQ9DUA4-d%|d^XEg zIQ1<lZ+)_=a(J$)j3@6|{FP*aUpdj29el}7G9UBtI$GP0-Ew!}c3#a-512;zHT|A0 zl!v9y;w{c9T9#sR-o{CeR65Igtn<TrwBtXjQ&H7UsGH9t#N)T2lnF42p>b*WN@4mu z=c>{|X06MxM;<{KT^^?G`Jv2c^hJ8;6yLX?tH|9CVxU@I9@V`WO&ykC8$SE6W;5`p zBx({uws(pLi}JVR9Anb-0*0gOo7zUCpMAgA=F{4)AZt7s8;Gjao!nWUjVFW`E}ow2 zyWKS31=YC3f=D%^i*XNNN7+?=S0rE8pQK8c%y!i`z1~+1ygPyZ$$POi><KME;!sY4 zzp&f;X`z%9nLADWIOj6+nH>+i2{hQfQ+KhcHym}fCv7@OZ5jx#BGzk6?u@D~UOz`! zXLSHlGzA{1=Uv!8%PN0YmX3yMduDa+><h2THec`sD)u85BdlIKZFe8I!k&DSI;Ijm z>Ek=%RMey84%>noaFKK2#G!daeKUi&?1uT0+0^=`pfU3Z{o{a!K54s@?NOJ2IrDHW znu2nF6gYh-#L5t{ws3ZHFSD}QpdmaIV4Ny8vxv~Ot8w@1>cOw=cdy@m5;Z%ef2O0+ zr0U=nr+Fr6n`yJ8skX_;eONP~CKq+-p5)vDzi{dp<NmE6xbqvgcj}xqHLImn4;NKR z3Q`bwTS<(g!JD|v#k}%><j5w~5lIHeLlwoG?dlD0Jav+5b|Pi9M1M>Y3~`>5a|Uc4 zsh?Bv4}qvhrSkde4s+C~aY-~WTKjc6KG$~YVP!tHsYKMUWTQaCS1Bvh_h|l?-P)=g zj@^p8-PrU0q*j*MioiLUt@St=jX-Pbm~wV9$F`0scb!y=;_3&GD;CCQb)=p5iG}~7 z5YgE2vkH=)vh!NA66!!os%pXKx8{>Oxgm7sPjxF1^He|=x7QbFh}HZ89Ns%ddf@cC zf9y@A?AUvj{5E`Uc)<{tWUty8>>9FTGb+#a1WQuiv6gaXla+suc$PI$>-bMV1w{cK zvr{R!ZJWLSwmAoSTlbPdB<MEwj)F!GJi{N|9XoyE(j!6{x&PZ3>*GeNnjfsV){Ral z7khLFm+K;WRsfWV9TXtgK_i2+(|**YnZdgArUBl`#pgLL{xT9yBQ2o8M^TDX$1GZ7 zh`ss|<lqawkW1<D=%erBF&}hy(u+p<Q#ak5u@BCVSF`wEiRwIF)}tY=Xip)#2>UBY z+n!mUe7oCMprV8upeo(~rr^-**%sb6{nB3jiBEJ}-NuR#igSL6Ou)4(?S)yQioB@E z3S%@UP*PBS=_@l`CP7~^^t8mpaiI#-O==lj57Ys?-9>Lisr#08))V7&zw;}Z9dwij ztz3_V3Pmu=OQ&+o9ab1K``Zu^jgguCuimR$si@33w33p6hNBs)B>e<aw!Kw^do53& zyy!^1it%^t;R|^#%+K`xYxZlj1R=Q>(%}M~cz!@yxfJEQyfZL}H)~~i2ni!P#-r6! z#WXZo)lHO}uExqF@&{`_@VWxB+c;in{nS=dSz~ehB9)}aDd3lluWk+znh1zDCz*vR zhE1RK_O`A_S-o8lJg}`QP-je<fxfUW%OHcB5lNzj&wg>Oif$09s}w4pIhTbkx7and zf#AA6S`+>QH=w~_7H27~pAoR~V^{jIH4SIQi^zfqNoP=4%8XD{V(8dI-!z;|qA@3X z78An?Ek#j{h-!j@^DD6Tn7S-pb+40_3`$x-KG$-0TqRz$!pmd060<9<p7suw=S6_S z*Y@vHJT7Z0KHYyu&E@il$LLNaO8S^&h@H^WWn6Z)ta0uj!hf`4k@5YcWKUhyWQfB@ z{OFaL83wcUK|i(9TkRTot1@zNWLtW`=zSqLFof26)aF|^?!lrh`CFuH864%q%FZr+ zf)<uxRb#m^L*!KEbt)h1zeFS!qcRsw;#<M@>3tXh-?uv_X#1VUE>l6xi=U!{NZ^?) z9|!4^k>6b%HCvq6)ZwUStbquoD!P~WzSw|I37AIwwk$yf`-bZb3poCR-Jw2G1Qip{ z3sPFUKONU}pi%SDoI7nxOIy3Zt=hnfU;UGjn5UzTeI2H)nb0u<WgVeEx$objJ%hQM z7sQRWFw*h1@=Y_MoRJI43GKH@7dlYeY1+tKld$`s=E3#Te?e?2!pM)hwrBVdH~aY9 zzzu-Gt@G_u1XI(A^0MuR{IwNechT^6PR>P*dd|N?h$4fNCsOqAxdx67+qZ_1JCWEP z0jF2WX-KmS@GMju>fe`w-uYbDEY0AQETe-MIkt*(><V*r$?!eY@O`n`-BjHnj8Or( zD&s)$p6;U6hQNW^x~F#9Uip2oJA@7<rcqW`t?K#0e*X_?0~qZCX$kNW_YRp>wnMW` zPlh6!SJX)aa07Lq6KZIc)nPF|Hy{(=^)@QP?jm)2#6(_~SWKI|57$H&BgT~SM<XRy zs+wpp<Met#sJ=$9%4p3ccgYvCcect@j@v9o5LquxvLlfogE`&TN;{msM_kZkR1uXn zz)3EqBjJmEcQ(t1?Vz<kK_B(OtT)>@S6iG%^N-t1>&6a<PMNCGV&}%GEVKMM8opeP znb5{L7r~cIf4My+7P=<1-MKt^XAkA(W!SfVM`cwWHCJf^GeRc2@^~v>D1UuyC^D)i z^hQ58!ktjsxUegjjG1s}Pohlo!>;N@5(L4FaREn^#_jb1G)$~0fL2auatHU`Xzkdj zrlU7ulpPruP%eopw63wy_{Q0GfJi;=fT_gxx4kk~E+mcGl6UnfR0UqLAEz3*vxJ$V zw_!#dWBa9^7brTXk?uUipE5dNl~_;xS5~F7Hycu?vvX0{mvOD~v@j+;RFBow6Py<q zk%=0Ltm>A5+?Cr%+p0)2gj?1A;CA+%^T9pc&hR2)dUcW2ho+*6<#@xwLm8EIWo*9d z%)@X_?hv=QcK(%KGzX(y=`C?;zqPadvLK<MY+qk^>F96T%Q+5Djx7Z=-~lO0tonXf zYWJOeh|tJ)AL7r{KeByk@%<yk>uUW&Bi7xfhtX@?HK4ni*CAK-Lz!iLQk3+im1Tae z`=RIBDNA?}7Y}aL|Fk7cw%i+~k^(A<=OaHFI{x#jyWt6wEakUFtbS*I(1?O-*1`(g zgl<;zCaaenj9%e%`<f(H$cCDZ=s}7{esP``^P7R=XqZG4JzuKOfwU~ySIyPsXJPxp zM;gDnsxGGMn`Vi^!sqQ@Qx&r7CW8WXZVO`|8YmDG+I6mK;$}W7EMTBTY`f9o!49cn zTkos&KNMYz3KvQ}LdfN(X7bocTX2T04zuM0qyO^n#W}NPeCieAMF}d(a}llhj4;PT z71Op37CzzR&YSMDJ6SKoo?GrBZOiw=Dxi|k{C^=}=d;3nn3q4#)r{)dqggD`$YAIv z%L^~P?CB)FbsYcwOub8MC4*t3%pao(XToIVoPcNQ;G*N~-r@8C+{v6GLMxJwea_jb zs8CnCM^U?u?~V-^aAAF<F<V7x1eM5$T3$kisSWU@b>nxY@is#zhs#XU;0r#17yP0$ z;vTU+nz-2qg<a&2MULW6nnsg2BCvZpjg~8b11+oeUx@6slNa2eS(hSLBLr+$6YT|} zHx2K{$Q69O8-6m2Yj|ZiF2!71m_Ux8+dKsto`AD&;c_9!Z{Ta9D!oW67Jg+tyIdI- zKL=48#-NKEdR+lt`*`*Ab-A8A`Dk_Mm+@<KL2zR=j~#KC`|Mlj!4l<w@1go7O61e! zq|Ap^3%3zIx6TZ-@MNEP)n~*8Ed~~4hkp}O?npAxWU7Nzy>UDNb2Cq(ORq&vCya8n zaRVnn_0)6mENwy457OuZYSSeh-+wPw_JxS|*fY8WK#C=Ew9FgA{i;wxjqf%ivh6Cz zy^_0IktHg~OZCZ^@~Ls5J|^+QRw(YNcU>A$bCEu15f@UcVWqM--Z}VA$yDfH(D-08 zA$dm@BUN(w?1FJYnWrntf=UZ4BQ#Mh;)M6QDmE-fcS;xRwPc)jztv1}uX=PDrd0<^ zp!Y+x(sRSyWwHrAJEGf1?Y#MWD*ZiS^kL*&$DUz~T^i@CoD=TpSlB(%;MzLgfX{*A z#b2qR{2XO*_`mXQv-b+R=P>R4Zl1RuyMwWzh&>E$Zkj@elJVZ_f;r6FiAZ*Nz}HXm zKr4uZI-mB-FZ?OpI)6qkHL_NBUU={BS?-b!T6@3wWuys?wIpsnPJOe7taS)c-4hwe zH|+Yot}jBKN0Dh`_e!uFcIKh1(ztHobp6~s;>)bCzS7IZeI35*L;p7>3~0CuPB>KH z8Qypap$G|Pt<sCHCL1`eqo=D;lf9e}GDSTOPLUs|?X@Mbsl~!B@vdxw(1X;gxDodX zJlPZ-A@`wenN^AUS4dktU5h0uKuKIOTNWSoah=fx>@l?XA^d?iJO%W|Cf*3f<9Gz* zHEo{6*XSym&pC*nSI~!bAc^X`JWN<Fx4=kcS2jL6zz?PmFqWJcb{Sc)ZEICoJGV;H zkJ$BHZ4v`mAfb_(8pgM#`o8eI`F^Q~(mGiDgJfwpuE2eh&YOMJ#^Y1FII!k5@;NAy z+Z3p4!y=Mj=Xkh%w`$mg=vp^fog48ZSSKUB1$ed!vJ$7?14i|4@yRAlk>S6BQ28Ut z$~#`o2-VBMb$eI#R!6Nv+xXowJW0+P=RL8TwKWiH+Yry&a^^yk>7jZ4qwCpu=PVPZ zh+Ee(o|ezvbaIWrj;97}#39Orzh$qW*faME3<!)5#P-IgL5oT1YE2L92>M^=J37qj zR7<XY6Q)4|Lv7%|-k`Aj-b;2`)b@i!ybl^~6A^{kAs=?yD*T0)$cTMtq8vPl_=b>2 z)BQ8NQA4)tuIUGBBOO<JTY2N$TUX4Vm)W_saLDP`VMD6f%Ubs4nfkao1p=Hm55{28 z9<xK=^3;6m3}cZU*2fZOp}}7@w-)+G%)e3@mK8P?*74?657znI{z_Ak(LycEwZ2af zwy@^i_(7tx_Qn1cF1>CrQ(;Lf$|<nU);M#bml+zr(7RO_T`^yxlsBYSdZ|Xy4R|I6 zZi(Zcv!)LfdqgHhHc2qQg2H^ui59yQ&-#^qoSXmI@*b8O2^kn0=8rh-O_!k04y;iI zxF;gsNY9tyE*l~5#|nv_#h_g_=%%sG>O~0l4`bNMX|e+CgjuK-uR_ND8yIU1{g%La zb!t}D(0PrL9LsmI1e<mwlWjQ9NJCc#wk9Onp~cOYvWR)YRqWx9-uxeH?mJ~6egQ?g zE0k~vc&EXdFlNDgW@FQsYWV&3e^05Z&N)P6dMR4UPAh8FrDaugg#`!KZp6P2-_PXy z&>b}wzsz$2PM&b+45`bu?ms(QPcTKz@cEIUQ~sP-?v;-{CDlV2y;DCdM=|n*0-thg zw}q~sFpSkX%={k2r#R%1j#2XOnZ-s2qEP4aTwu?w97PY#%J;d0S{m+Vet3Fro_}@J zFHu`R@mfv2z?-QqOUp{xhB98Hf5}dFU%x)#ibzPUX;fHP_SWX3#Rd;zzUzm>UKLjJ zF11lFE?ksQbO;Z{hvm<B!|=WOJ$6-|dK#RwnhUyBuMH6YSi=uiNw=DG{6NaBU+0)$ ztg)C$EL_uUEx(bIF`vXlbr{uD*UWox?sUDxY<qFTz|j}eZ#LbJG(BXJYB=^Ly<2dM zUT#jqtMBl6G4!*JaA+|z<vJ1e4|?*>Ec9LQ-Rb)ND!bz0d87Q{INJjjhgJ37tE>E8 zHKwUhbH6+&LM*m#RW59tf90ijsMpvgeaBrxOb}ju+*Pl!k=_!`hG&aIA<o$G^-8!+ zyA}5l)z7SSNxT`!Z?d=rxuLP$6yqG0pKKB}(U-Mkc!Zuq3(fIH^I=IQ<5T)4RcZ;; z`hu;dj#WMeoU^S|BAQky{7sk=US+k~Kcq*)DLpmVAU^LyNwq<`Tq<DmpsYxDj5?)# zTu;bI8dmom?wlD)h}|JOvp7<~GJ8MAaZrXo;Vc+MRI55Pi|~%KZ&>Cg+zgX3OtEZq z1Y7WnyO64D;7EUTT^r`ZynZi*XvzGNVLW-W|I+cK`UUU9Y7`d?|1;al&Z>US_j}S~ zDRk5#_k3q8ds@UBTYNVg6=KpdB?4_~)`teO98R9qXSbxk00Zl+i8pZ}mh_aLk974{ z@rUoH&+1rZ88{@67sa1zjH>T1(pk3IU4npgZss9C<9#W){Sxln;o!mZb{2dws&Xxs z!(miuma@`5_qYrNU8+((h&UE+|GLrd=fur`qv)1SeE8jQouSU81o+RvxTO2)Do8~W z)x+am2k}d>RALiVIOdfW)Gw-uj<&O~FZI_Xe<j;SaT0!+!)fl?4eeLKn7ij16^&Sr zW)#HCc@egS9Vaj=+_jSQgibj<3py1dK~>vUC`nj7bLAGz0Ip&>VLR7w*J(eULAJfh zrA|yV$49e_P*%dl&w4v|M^E&zZ1jU<>J>)oAd%Ii;kel#zKAg^3?mw{oK56QcIKRJ z73`ep0do{vY8cx|HyVGDhWDs}xqm8W%~IAWQ63g+m$f?1sMH1h{i9508O&R%RYOf} zTYz{tEFoS2Us4$kI}WJfgMu=2Ru$jag1+uuXWwz?WTH85SgVobD2V)wf1XYX^U_J$ zIiqV5Z#cAO2MBXbpD;H0K2=bFo-r=1QN6-&H_<Lj)ab|fwJT^V(5T5;w*5CwC<&yU zu^XI$!~SxP)t&ZxErXK5^OJt@YOh;`4F)AWd*C#@P_{nPr&T3DE{(xu!<wb<j$Zie zCu3;tE2GG4u5Z^&Vs#wyeTK)P$z?}~wlt~13i@<?Vk>RlY7Y6CFZ2i}n+x2W<<7Yv zh*&H4R>8Za@DZ}|`Ed?>rc7(oPtKQypm1i>P5q#x*{e%Asc3wW9xQbcZx{}*a2Ko0 zR4s~W*V^!CW86~>gdBASfnJ5C$ANo^MOA|yLYb;)kA`@Qi~_cZcAI~ulBuRDN8ofP z@WA&2w7tjkl_4i2v$u+S`x*Hx6qpd0b*yHKO2Wf=e7l<awE{3T82+8nCYZN+Y+7B4 zO7B+o2_)Z_RUKq+?0W;p4Kx@zKd&2Up_eP-A7IRR#7WXRgX!T`am>|`HyM$M2S{qM z@4wz72umD&A5b6Ty&IBE(vqKHYs=;AD;>hVaz8{(r(fTV(4v}E#U5!8V>DzYT|hkM zhR?h>s<=ae$H5faY#|eT<y>75GAz`tiVS-Yg|Rh;NKp(G@b_k8)vXoldaf}~DUM<Q zI$})4k*>Z0F2VpARn$dslr}-%7R+FNc)$NoQvD@3o6FaKtL*w;^4$M8Mj*~CXfEw6 zh*Bb|`#v2jT}B`AV<4Dm2Z}BmoN;C)L+`hO|3?Y^YOejKAmn0WccZlPRc3pDW-uNL zp?@L|sw`ub5DhiRN?Tpksu2R%0O{I7c#Qv_mU}^>0ti>)sJlU!RBgsiT!$xZ#F0o& z6RX@>?ML~nCA1WTTtVd3`6}qAolB5xBsWvSg7I-SU|0PHP<}l&gKCpd&j#|K-f{sv zy8}pRytVW}><gQVS>^e&AU=9z?BjZH6Cly?OE@qIY;GTjC+CP-8x~&+@lEfgpMQ;x z5~&IqoA`*}^ks}#4txlNylwaA!zdfdhPRc@s7k~W0;z#lSE8+fV;OJ`Ll?hmB?tz8 zCOfBKAwNJxT~u(!?NJDO>t|m>T$nDFa%0Cu?>$l~{#l_Zj_mP+QM5pXG?Aajf$9PI z8oayzXG=D8QZ@<7QN{?)8wUPXZ9s_|VBnV|uRuJ0z(;RN=tqcYi7p%I9dOD#g>3Gv z2=V!832NjC9Y0V<2A(}$LgYb)LeZqx?G=Hh#Ye7!6pz<BNJTJb2@)s<3#>u*E_mTC z|JR|v-d=BC;%*5NHLUX&Zt2pO2^=630|0p!&3+7^`Fj49LIj`@{4)lwxHL|%9;9P{ zd=Ba0bdUr>^6#yHQjRTAWd1V}NX@i;jWuBV1?u&G^E`?=?+1@|6Qyy6!ySdC(UCD& zNYNwg1#rqho(TXlP<nDL)4xf>9nJ$42u93SeSeK5_DK*OFIXn4NXvm!QC6l<X9EFV zIfQn(jh)*H&Qgl2<3q3wI%xdcDS%k|;(`m%Y>oElewFNaRjCQ&<S@vdAaoBFz{+KM z#o!zj8Py`eOt)Qu9f8-A0QBuI9M8ibZRZe|>I>SQ4``(+pt%Qf>8UptW(7BY|9Ar} zdJNJo3LK*521wE=i6D0;28#{_A3gxyCvlLsE-$7)g3MD;GsR?(?J{;%>RFZTYAUUp z=pzbyi9H&)9<+NeIz9;Ovkgf2@jU(?Gy>AwWh(+6o%xR%HOilwzf|eJRO!D|>A%kK zmmT_NJ^Y_Zm6p_)7%46(K<QV2NnGYDc>tiV_`|@WSp0A2_*=1TA%FF;tcL$@_5qEH W%I;zWv|L~6hPm0f69vbd@BA-!0)|ik diff --git a/docs/_static/composability/diagram_b1.png b/docs/_static/composability/diagram_b1.png deleted file mode 100644 index 31a6d3055ff6259c6bf46c4cd8b23f1fa9f32ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30486 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 OuUP8#<<&2|kNh8p=A@ti diff --git a/docs/_static/composability/diagram_q1.png b/docs/_static/composability/diagram_q1.png deleted file mode 100644 index feb6cbb723f8c537a029e36f2863288ecf9616ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40713 zcmeFZc{tVE`#-!587fl>nYIX(L?JS58B3-TB2$#H44KD`Br_#4kFm`Xl36m7aU%+u zXEJPT_VBE|ozMB4@ALhf&-FadKhO2MuJgXGbJ^|pTKBrwJ-qIF-S^rjL`y@3<~Zwd z2n0fN`<CK82!!f91VUaxMFGC?_!NHu{GoQZrSAlRF!2)pBe{L={BQ6jiPJq5c}Q^& z`x5vEx#dmun-EB8)CtU^V-QGc>TSiF_uWZW$7!OI-F*1>8<a(OA|Bt_<(}sCtFtV7 zMe|+nrPG&q2%9eHj3g7!{WEf^X6rW3?wz<7eLUuPbj@+sOCN1WI^GAU896-YaPa!| z?t|si*;*FLr-oOn+D#L_ZpB4>p=wZFY)R}7FNR0`v=H6iS-~K@at^oi5}TG2mJkTb zfrg#!L)nJOfSEJYfJef^mE})<^a&E3AV>PIk179rB#0vVA2|>$;vYF2ImSP7_(u-^ zfWnat{3C~d<nT{~{3l}qUhsc%SR6Mc&7Io+Lbmi>W-=d*&d{+vb>!D_3CG$5PBor3 zulyMux&A#d5-O>+ZL5KupZFtT)@ltT|8<`6kW;f4KA$gIf9Ul`Qk`x@O5GTy>}Gc- zOB|lJe*cg0eiq;$VeP$Fw}kHXu8oiU7ks>sBi$*Tp`?4?&!(xS^vAdDx4B3TzHk44 zr9_T<X#Zhl?a#PKkirf<9{*a111u!UpvW>>D?-z7xTR=5Q?sFd#LeCp@*)Y$Cf$4U zJ#PULBGnyk0X9Dq{p!nt29>fjCc9sz)68q?<8lQ9s8rnS3NRacp>Vol!|~2a=1KT! zs?^|jnVNf&?pz!&XD-293@tbPweqbxYpWqI&4U9f8RW;sP|ciUh|5ywm4@Gl*vP#v z10~RW>EV~mhHsZ|7<;Ixlr&Uln-ABNlp2|6GU9zSC7F6hPQdJg)5Lw(zl7;#e+kpe z_7^ekNBU?;Z<(^z%>@ngw#<aK>79XhnY&HA<=b8N*!1A6Uft@PJPZ=mt%}-Iv3Yfy z$-efwSi!`G)fC!3epf1@A%!P4YCqxCNO9V(2XU)@Xf-a93zutu(J0MSj9NG}<X<0d zv#UF&zUn1i!IL<tQfY!Ui=KLaSR&drv%AkSUL`1qLz?8gT&T_2H)OAjvnoVfobucB z!hf1K51-#}x^E&KryF%+O?DccFRcgky3_(`y3cUx0;m0)Wh6vVbS~@0<f47)LCpom zNjCq${Y0KLTwnQuBxl#A31+7m7MFT&Zy`Lr!}P`P){r*1{rF+XLT%i>j8gnL--S(h z*f$L3NcB!Bu{3=faaZo}z_;F6cg(Yi$*lypx{8L;8R3RAttaeQ&K0-9FliGytjh71 zA{}R=hI@YK(D$bcrIv6!v<+hDRMdvm3#D!(c;d?R#Jr0sC--;F%;W{XVT$F|Omlhp zu8WFbxqKIf(i$F+-SeP5GLCrx##8B0N-vx@W7BLrSAAiL)p3vbBFDFjb}+k|l{+#F zf$q3LcyydMj?G&3hOTuF6x|EGBf@Yqh<=cCjKP*Q(#K8jYe`rG{(%WYL)x_&I?=tF zl0ETj`>i^8IxXiTJ5|)wE<Bt%T26R``n(*}*5ag3gXHeGeRlst`}R|cRE~3p{c9ud zU7PnJCnUD5Nm5P;T(n?S&b=g0eMeLM>pLIeiu{S@fV`k9huAUyz|KiIa)sq%Zqsh} z?QN6`eXK@i&u}vI1p5V8^AV-l=*<-k`5j;-88z;yz*>jCBUr>@r7Rkgq`&<keZb0C z%eoN?+v#%l9vEpePZUbU55jWs$L_q#&QN_(KlUqaf5U58<67{-6~2?@1A#)RD@?;S zm!%KITE>D58usGfUUlF6Ve1R88#=xz^^E}+l6G-eqIrhB)?J4|gI?`Oq4U@L$<sHK zvfNhV*g`k=1t}RaZ?N;AglcLn2CF{fJAFn(fJ<BVpGlKmk`2u}K4LPC9P_Wry!+d% zKQ`@hiYxu3)2t@!Eg$Eo$eI(w>5xOC+RZU!F_q|L@0rfb1e2c&^=YZ1n_M_AhoR-^ zjr8u)@yP<VTN19llf$yEa~oN4+2TKS)cjfCzv^R1FQA$ytz1$R3LS$T+T;f{j{N1u zEiRJ9hmJaj{i<0tDHSIfxL9hfbovcT#5-Z(6I<Cqdlj?2_Q|d=N7P|EqF$>ICNbP} z;BS}DT$_7FnQF7_%BZ)w<j#~^?DhGm@v?%cvA}C5LJ!ABk>~xX1d%7tW1h{S@qGvz zU;8?0YSggU>4q8ghoN}RAE*kmZ;Ar&s3BANpPFiF!G1?z*JyY(8gg)}G%jOcUk2dV zec9npOv=I5RIxdzTiIXgcDC_?0LL=&DA3L8hs(aQ@|37`OJKa7o1M6-%X~MGiIE?E z2Z$q2^4xE6`rtk@51?g3P@cNTiZ`6zOj4<6;YK8^9$;3l5=+ML;|Sehv6Dpx+JV>1 zY~%x3n94tAau45Nuf`O$jJ*zF8rC^dW;YX1rhW6!M*jyNoCwtZVlX}9$?4^7?Mo5U zuVHBUL7MseO%={Ubk$4dqNm@5ONtreS0ZJ!yi^<eI_Hajnz--U+W6XG{D=AUPnx)T z3_c3X_w02lnu!{sRz0cf+fbCRp&r~&No94pux#s5K6m`@mzoW~-F$V9#Inc-FueY% zYj35Eafflv=Y06uK^z%X%uscHz0KluCBg#vkY89&P5L8ZePN|YEdFxN>9^QaR+)F& zg3=9WWnZ1~3YxvuODS7g_N1+9dKa3Jf&0PfU-~&74(^lf#TJ)eU@TxK0PK;UI)}-T zHa?EEa5vP4Ml4tiUlm1iL9RONdgPr&@lkf4Vf3=4JoVAA2)_7E(8r@-kU`$%nSwqS zHz{*z^`osxCGul7>W#sZYfVmDn2CICM)^Yavo+f}!^06r@^to(rGW?q7j$T1$6yGh zmFu(AJntE4Ry-**j8YR{uWWYb=;mman`d@(Ky=n*EfwAw8GCvKGUNo&Evx&)FF6N} z?bYxJ0^>8-VxGKpMAQjXvKmiJU&8Ug4>FurQ|+@g^ncq5+2d^A^<cH+g@ScBD%cO# zi(~LUz(p`)5Aecl+~khVheJ#4I<|~NB8`R?Pske2x2=!rcsB=QJ~#O|%q@RX#*44) z3;B*YUwHJ1pWZ>f@L8~y{HSW+rq_nrl0w?SP=l@7t>BGbv>W5#*;ZE{8IBsacRDmj z6l>2#Lv|uwE;M8;S=bd)N>rQMZZhaq(*ZNc?(n{AGZc`G(z~XHc@8)DuE=$cb->9; z%^~+p;)8O>?LrEv=LM+BQ*h=X`rCmFHrQGPf$c)uU~~4Gg&ywkJ{zv=iT9Mmb^J8w zZ$S=PGhNt1^C%gv5xm~HcEHfCbvBRstL;doGwQJM#=;O5)6C;F(Bxzs!<yhe`vqzJ zO%|rJnH)aio_wO$S6v&nV8{UH&yuQ)^|f2AnN%f!Zv^n{`MuurCxr*CsT^1Lr8u7Q z$dM6OjgFBc?bFM&mi=gbr+-HV80bKM%81ywdsM+p8opbn1+Mbd(`s%xNSo2jMoz}u z&A0AziE`_D?Zr7!;DteL9FsNt6=q*X7jo|NL<{2@_vUrD&fzp{ik<~KsFI)JbDh*X zs9P(xjqeZ*ypNU&yU4lunJM|><s&=oK1NC{H*)_4<V3Y_CoJ)kLc#E9D9CPfMKKSn zSY;AhH~Xz@<k=Cr=2FdT49>YDjgh@=rOzdIE5);CR<0wT8Z+xHO?oQWw3yB<NbB-Q z+<i7J&f^OmTHqn&*kq~M6u;))pTAW>6SaDg?<O*lqQA2`C_zIZc!4+IY5>(ACUZU- z;%s;|!Sql}DNE+GI#vMoI%r~l7fA!aO*-|#f<xg;Yw{Qb-(@sLTonPiERCmeN&2QD zi_Itp=vp|cCF_YD%HtrjY?yCZaL>02Y{OoeaDTS65Q*uh1kfq?B6e~zAbaGk@i-KQ zUlcU4VNnehZrV;myDu$pe=mK!9g(LUisIz$^^t~E4BrU+B3`WeP0|_t@L^g|bm0>s zn~?ce{^Wf(8I&cq5O9ZkWi?jIdUjHu4kwW6LoT#;>^}?87`b|M>CKJUTo$)!(p(*n zp@r`o#o}eqp@%F}@ckL+t+x6afeLdj-3v$ty?GS{@11#}x(`==Jp|jfvvo02xR9f9 zKef^z(ypPJiWhm0CLcM_IqT1!KPcFVJV;Rt&WOEzOz<T`+!cX!_~Y#!?)Y=zN4#~r z@STTnh*i&2kEIoe7E<D;8?x=fOq-?!V6pe+c#6Nns<*3|NA8sKup(bDm*lfu4%TYT zpleuZ4h?`~x12G*ge;xA>GhUJYTh(>{`6#IncgfP5RLlX@?B6IiAkm6ZC;ou)gfbK zjFNUXJ0_oU@l=aVfKCd{`9K3(HXAs$^R3aGo3Quj-0-y{j<zF#VPCzvEX&$k5f1yv z&w+2z91Jk=@<<fOUtu@%{QA8}yj-Tp6vS_}8T?jV&^PQpX0vXvfv*^8pMBNXyZ1(k z^~zyBH-vujhbnOE`BL8*tB8sd=j7>8e7tY<%UykzgWPGkk^S9H4&3f<?ALB#*175X zmyw`x03N@prcMe|JN@T2iD72aIAZj5Vlk|ethkhOMKP<M<0^;g=Wjun>4*^~ZCXi> z?kOGHG2Fz!VZl#5@f@B&D$<k5PR80MY}(N0!Cdk#f?t1o{p*}DF9gDwd1fi=w_yW{ z9$EVyaTA^g!oY<Y)E?A2I`x0H*A-o6HbQqG^Cf!ZPP8Qyy4Q}ZKNWndg&yOL4RWt( zI~g|o%xc9l#T6EN7<{;#Gv#J7fgGt|yzg;$?gliU-Lhk$;VwA?H{=K=geR$ie$UX% z56rvIeIi86M4?Q5XaT#1$GLd=N1+xc!MTLHyH73pTs>d$+caw@&#BRp+jnr&Z0Z~$ zq&#;7Or&Cj<#kY&&k%P_q$4}`T78^<G<9xIUg%@!efF>c(TQy(51!swR7krt{PakL zJE4T5oLmS9%xb`L3+5Mo)IIkxo19r%MCl>SfzqZYPXIMN5RA^Eo=|V2<FvAF`dT`^ zmqR?bM6KpY^TX7a`usCXWgJ?&27f6Pgo+&-It*J_?VGbN@-RVQP?bcR7;KZqg{7rR zShNIWBfx2*;T(-|t&M@U4{(s|nb<ZRz9!OdxZ2JA8T+O0bv2<goFy2qkNZ_K8>Uk$ z6AlBt<BPI0mU+Ajk6-fO(dJ9vQ^bcb-qQ2?Y=rI;1oBId{1jx~-_W0YjPXl2RX_5L z`I{pvkt-?vNCIJHsX+xLrrCNK9f?~mit!f2PqNjnDkEO&Zr3j*furaK8KmKZqziAh zzp&nkV;gA1I~W@{bmm!O{0|4d7nh7+Q>XU4h5ty^2~Ch%Q|FNpHVS$^HUrdzs6(s3 zAE)F&{ZR-+DE_;T$)HKiuW-HhQxz+JEHMXIO*aElw#K}sOgfy-?iy%M!(=ZVfhEKR zoQCCE_Se0V4yxnBKg^D$SQ9jTq%q|6c!-~9y_@EEuL}Jm5H>`;M=1vbwBvY>-Y-9N zsO2URMsUE~xgx+BB{2=^IrBrTLnNevh7ksr21nNPeYe6VxxPo^`=tMDb8*%D`SJg2 z#|zX9Ab!^)qM{HBsa{t&WW6OKA|lQ}A;?b-Q%&Vo{h7|47ZInS3JMA#OGswF;ank) zTo|P2F5J)JvV`$#2qgWOquKfb4DaEXN$a;OXi_g-H_I#JIK6&s`Gg$j@*P_w)K3}- zO%Eru;RHQ)M=b{jHDN}EGUScjG$&8KKO>;~9(*B#5<wl~5<+F)Sf-ORUZxX{C5%`1 zTFyg+#<)OcnfceIZ8Ck|*F(BfeT#)6025^@Sdx4SpghqG&pCQX8BZejroj(;z~$&r z2`ZZbMQQ4q2a_WbqG{34;a`DRm?W2njr{b@sE0T!Hw?W~2F&$n!TrF=3L>ZAnosK7 z+T5&ofbNB-9=tpt?K_LrHDSFAhe#@5NdgEAxhTEy!Q-&hemxT2`wk|ex4~*X%kK^b zf)B|0^q1*~gp4TZIMpD|!%n?2?>tig84s-15gARaKaP*EmQe#{PKXhbaz>8<C5bwg zzI~8UFPe#iIHw+vVb!@vAb!=#Dk_8lGw;3rhQuz0#Mu~@{6X6UBB`lx3rn&{fucM} zBCtt({{Jgw5sWJ5?4*yqq-$@A^=hio(tdqg*bj=H8$yEM#A)rmcJLR!s{k+xvQs+F zTUp}7I+OL-0;rZ;lqDpcG)0~zfEwYE<IuehX*|Il?l2oAt3{|7$Wy<%0=H!a6_3BV zHy0mI_{R9)z#jW}X$2LZqTJC-KNALkAE6;WQQ~4}GlutM@d*W?rt%nZB5?>QHAJhu z)bm^u6@zN9L%<(v_H7V7KeI)L2Gx8JM8!8tb>nD!w;o}}Rb2avi<MbYpP0S`QW4te z;Mqy~LJsLpd@xQgz;0&H)IOhL4bbE~SK5o2UIhMN)n_S<P9`yx#pepv`zf5%^T)*# z%m{eRe)vw@lM)Sk;{#X@T*liVKtmgzj?aa4A6ur|fublEkDZ9rI}cfOy4u0jL{|0; z)UF19kD&sny9Hne{ZRvk+uNlJ17fg4Wk+t>Mf-QDyRdA$OG}d1R`bsS6YMgwYu?Pq zS`qlnyc2c_MKsxNOW<ixK@9BDDacM06_1+q4nAk}`eu8osB0IE^_PHS)>FsqZwW)C zu{(p-SI{NB-a^<7SRJp7tFxWVm2@dz45r@s2X5Tjeah5xt-VWINWaufY59p$5z(Au zzAYRKt`L1Oz848Km1VsJkz@6q$w%H+aeFG5b1i)Bz>_p_4=(GWH@3TN)RKG8FW+7L z`)+gPfQbxhjlAq8mZTHN;5v%(LKY6P9U(^wxqs5w;VvsEq#<u#jh#aG8V;4ZFbGe! z#NIUV+*&8s>N3Gj|7bCO(taCD0-QIVW|^)JxMw#rP}uJPC0p_L{$;&)QkWhEQt>KE z+!QA1Z0SKZJikV3C7=BE5WVO`{Tx7oMILPSJr45i9^4Nt2OQG)!>_kb2sJDz*^3#M zhQ$?yA2~04B2T`o(Rx<<xG0aYK(WU(+kc$O7otT>`r;-W^bA0}xhMXoWlA`@^gZjv z-XXObhCw|=u>-fgEr2H*WaFY=9FUc(VoByD0mfgr3Z@NQ6#p5^WdHMLtf_pVUGN!N z2DJ~Z{=R!_WH41o(LqC6>7CdF0L-pHUT?u<fLVlk4J6mxYABIAUbvQ!oKf*8UO3l8 z9YDQPP(z1<Q>W|Tz4!acMKW-ZH7$7jMHHpgD<G>UKvsQ$;0$}(mYqVcSYw=ig$<CX zc6u1#yFIh8$Lpty^>&5_BmhbM-`BIcSLnzxTAoeC=WHIKKsXvQ5K19CVJ~*MNT0cz ztycZ#<ua-Gnpt19u!+0z#?u$DnY~mXXDoC)@~QbtU?Wz8efeTa!jAxaAZZws!ErT^ zk^Cq^`&B6e9a&iQSJSkxzWNedpe;^x*YNe9aeq)a4k)y94NHVS9lJ-)SY6tB?oTZc zN2LD%uFjS9Uzn%{g=~n$m%nGi4xCo~^vkWrgUlkn{^}gcV>9ysn;?|WkC;dSrz%L< z<^RG2BLQy|xZ~+<LFM9qs`?1V;-3*z^N4UL{1ON<6m4-umUHsd|E|$lfHDWfxr1<K z7NdP3pog#vM$s^+5$eK66lMt#$OtG_`TDbq0o3CUX6Qjvz<`{QJN<~uXaa?95}-9P z+AwjubyeYWy5h~pUs3Trm^m6TONet$?SC(c1cD@P{1<hMfdT@=>HdGT6yh3k0zeX` zkzv5r9SQlnUI2Az^*LP$Md2^3N5z43eIN;8O+uxMoH1ymSaY2IPnRZ=uu=s2nosyo zR(upua+L@JG9Jtv9TOH?SzkFgw+#d7ll*aB$s;hq`CphYC3x5($=|DkkT&c@|2+@H zfV~s{_dKM-Kzx*o0-@^f1hEJsn8ZwwZV^x?D2o7%3(E(d;!fs@KT;P~0qpaj`R`4l zPLnX;*57NRuZCckbV|bKh9xdfe6AAs5=e}1-0`LnN9p+vA3+f2e=7*T32vbA_kS-4 zPtZJqXaSSsN%{m#+pf?Nv~r#b22e9-9qnRX9IWu`{C_da?RNwcHvb9kh$MvZg!^wU zgjy?*_vhy>%Rvt&>AwW_r~EiN0|>(j0|*fE8dP*m<;9030{>@lcS-|G^p*cTO88X~ z(l@Kozx54MyHlXHH}>goQKIoDK~mlSMH|B61UB^*|6Uu;1U93G{+5Y!FQ899{nG!$ z1a=i<YXZG3BcV~C;dbX1QNMnXXF(63>^u>=-tY}SyY&iI|H&%SZ48uK!yM$*p0a?` z6jCT(;Bu=Q+<t6<$@q6rx%*5-%f^wnT7*$kLmCUiTHTJ!*r4wvpL@j(C?n&+BY8PY z_$&Nijp|pbb9OMyROiB;?2+l3ej@CYL!{hB9q8Tq*f@Q}0U>H<yn8{dV#eB%LFUph zPiT3fHSsrzPVF~Jke>5TVC(|}Z0o8=2uKK)1O!ASf@83)<WmL{W&uH>O_*LMtYF0O zS2)Z(3nip;I{{QI;p?@<*&AoUQPj-f2sDWB>8wM}2rzy+BB|z-S}>n)p+m4~leftX zJtNcrdlsaqI|l_vk%>6GoBFSQ!2=`Ub$ry9K=<x74bR{WLdA-l$juGl>ky~Tzk2Gt zH&|+{(fit9o7AMQF>%<uEN}(Wo{<0TENdDZi|@f6lQw7AC$V)Nn`K0<j||&M_pe-w zQI$5G3!rxLi1@nLvvQ9Xv^XURhfrdakfQ~d(wHnx6g-P@jjW48AOrVX`l-MwCbi%t zswz(HKn7)d^t~gYvlGn8!~Cz|SM>!IA0hnC2T*a(CPr$Vf&DN{r63Y-#1PQGTcEV{ z(c{55?)bh4G1{rc$RYqQq{qiaA5QtllOM$@5njSTP{R3lC<=h|e~tpK$#=Z@s-*z^ zRnV+n`o8XUB<=1%VE4i$G=GT+U;Ky$6Z0i-)R@h2M+B;QgawRXgL0Y=%Iy>Y8=xSL zq`6we6+m6aaazK$u;kl8bug7)vkl?yECgaj0G2)xpz-z`K_%e~Hd}Ui(M_Is;Us^5 zP#VtGAk->A!47DJ@T`I82l3SStFV_yiNdZLk!W@f)F=u9rOy79lB14QA1#=dZuvi$ z_9rlXP9>OYJxhC#A>VA^>+dKxej;@%!ilzTo2lrB765EeJabVHMFCzwa+VmfkJC_B ziGMoEA%4^~JQ~dWSI(OV9&0L3e%j#7%|O?Bp;uF{+z`Bb;|WCS>1POXF$wugxM8?V zOg62ajD1l<2y`PqCRHN*c_@!0E_w$T%;KHD+V@dDVs%=L1$4xU)m3s?C7xdptXr`^ z0@<S(wxHN{VOZj1v0+N}xc~|VwOnx$kWsr>Uy(rVa#&A^9R4wy5W5z={<o<-T0S2b zAKBMw^J>)fAR<kj$bH{QAWA>xzak?QCoy$thPSmDCPZq9VScZRVrIsV?j5j#Ga)42 z?5`1nTk*nFd)r7)-V&7#0^aiWNTsZx_yoy)^cMr~ZV{G$u-{$pyu9{@taDWWtLc${ z4dqofOGe`V78a6#O?`p?iXJEU?w@48@iuM}({i**1p$l7P5;e~8_(XF>Q~rA%8_me zMHD%<e`_99_QdVy5mFKhEOJSID%xa3;v}qAO0a69=ZLm80b07X{$-Sh*Wy2{&aYYj zYX5TdK8EoA@wGo49u?!y^J-wA2FFLz_>>h26_SOd#~`5)zXXEJ+MoVg6b=8@*zEP| z*W)<hn9ZGbo~YAMO&QdEQoqq090W2;aCzYq|K@L4BH4Gwk`Xe?M3c^=5?Q;yVVUN0 zeeDN7Ic4MOJvaoiMew3{r9XWiZQAtvYt10h589uYnQ?PSyE}}nQPQ&aohCIM1{EO) znjk;t#(#&sE)9I>MQVt1P!2t0JRPu6ZUIVxeOH0;-BKu+NFv^b0k=|?#ZIJ+zSF3~ zw(fM@k&T9!=1@>j3@jnijKe#wFsf%bw4Sv*|LbwdLthKexi{}}<`nLP!Z)B&$-d9` zJ9b`Rqj=M0QIunQoxB2<#1;!<mV0rf3QE`;T4;O7K@>r2ua1(6f$bAa1bo)4vmjW8 zf<2bb+HCf1^G~O_f{E9~(hF~p`E8eI!X;ksj3aj6Q>J>AZ#B^I8f=$tPsB{X=O5;b z<7)PNuV5YUS=1LQ&00c5Wo2<@+m@HqGpbgG#o?J&s^!xyIW106*-&<OQJ;m5SD}28 z-#i9GodyqkJnvNRJYmjxA|x7+6Kc`-O!H@2@wijj0@Jb<d>&CC^gyqc;*-tRVakSd zm5O_T(p~rj`s3uS4cN*zu@%jIjX5-S+1w3LBJ1f!nodlXoWC^Jw|QL)r>BTySM9RL znR)J#LDjoux+vb2|71Ttw2_zk^RQzIRPk;no{eZ3x;bLxuH=|)lQ5^iL!DbPw%UI> z(InHg+`!2g-Gr~VZt)PB$nofZpeFx$y$SC=u&sMXG<3pkJ}E59-FWDEt~xdW9!D4X z*sH;5O+lQxRjf}HOTFo`={QtXFj%vJ6X_L{OJf0+<NR~6=ULvnh@X`LG<bKnOt%*5 z8mq?`?2qCr#Td(KtNmst#@@R{!lZq*R=bxUekz<_Sld}Q>i_(C9i{hvqhY3OsiLb_ zHTiOYePum5D#?yQovA{)UYu1`?gk10YdK8GmDyxP*OyHs$6rZ(2hXh?u}0vUx7jvg zCPrIDPeA6O1T3Ou10a~15-B|TQOZtjr~dm1R=r9B7yaGw=au7d3UfC?7AV?Pv~wGj zwx^-wQyQl#_PUs{j~?og;g@A~Pt#P+xhOwXXwZfq=!wPCGxpYM;8e+}r#<wqzgRe* z+RGR-8%RUq39j0JMCm$cDIw{Cpc5%^Kiw=PF-Zc9P7hb#*p>5$75^@A`*=|n`YqfS zT64CyUnf?1G<L!8jo;`a?_CTN&xe_;xF-rcOWmq5b;jTFg6cl4R^33=Fb>k>ykZCy zV~(0I!q}tGkp|eDcd2^F+`LIfJZ>cnCv2pfHv>dsiR;|-<>%{EoWXpoDY<<pus71n zeR2<dqT~YB5ShH@Wv^L@UByj%gf7UY{%~I}mb6EeA24PFQVrMPXa%4oo`fH5$WgX9 z2Z9<M!nYKl(-L}HNR^QXaels-au+sspNw0B^UR^_9gXukF#KF*LVp_n()9U<bp`h; zVcsg$TRI!J8oRBJe=`|bue#`iDy?DjH9{s?;S|a0R$X*1Oes1Qu2zLCxOXWGroFRj zZBY>oDXuadFTXmvnQT%!{S){cCqccIz6bEseMC79Cv+WC?HRGXyzsIzlcE73THBwC zQ^ZCc$hZvLEv5ZkD9(IS65<&{6#l83fxd(Y<1njb;5jmR-c!MF?G*p(>E+m{pKzb0 zGsTW?*3B1C3yA@4^{c3C{wp&cp)ql3-li&~TUTXkDqCW)P&5v;H11}iU3QZ}J;Ew| zuV60?6=z+klyb!u*q=+DE=R-8lZMxR2S{*h>RDpjVTyr&C6&FAqXs@G++0#VkTNI# zjB@<03*GpAR`0NA4oDp#K&LB!BE(7oA*4;z^9XvkQdb!>@-JuJzCYak`Q!6|;xsnJ zn3ns2@IAM*3#_(szKQa6C040${6S(whV7O8ab%QPvx|OFM39z<*_*q8r*f)yMugPl z%$GGc!dlVxdN}<4#}0dbz6-UYsI2XGX*bqB<qmxdWXSKd(NW8Rq`MKCD}5y3g5M7m z3R$Ajuvxa0M~C;wtZWWJOxEm`EyWSAD_o6<e`$>4iGdMKski%WgX`|ozI5zT$(-)% z{nPo`WC<fT??;JyRDV&6VxHW4eOL)@1D)tj-W<iAV^z3oTO9xKfRAsx`*F9Ei}c<s zD}Bj0>;`7Gur{c{x}{2q(Ke?|!1ibI=QPB<GT#sQe(TC111WMf1a7C^-3W{Ig6VlQ zY`5``bD|dWw<ok&S8bH*_Ml~@*ZCJVjUS%66?|x|q>l|*5al!xa5?FRCgdjRWM-1` zFg9OzH&)!{y6Azu(5;;~iQ8`2uWo8T$i|jAm%rcie3ISaywr8&sk=)z0dqgWybr@Q zhAW=e##1=1r6z@0+!dL=G+~uYl9F{136<S!jC9_-)0?te&0(JUkovqL7gr9t7GEg- zZoRQMH0PGuXX|W=?j3g%kJTTsX>(9E&XUU#AK<H6HcEylwzgzX6IS^?X%u2li6eMV zN}J4aqp&tAnC}3`_qA(i4+@oBcvD@$Repdo=W7f5?NZxdv+Mq2Z{n_WeaCJk%dd&F z8>Y04Klup}y9-p|i%JkY_fv4Oy*WPct!%}O(fYmJY4UO8MQR3BD?U+ry)a|9saSQB z*t6#X_O135jSAYrl=ZxuJ1Pae?D9QG1)I*6+Uqh>Rx4=d!n~jF^;qlW>y{imokxi$ zis+>^ToL107cs_XEuEgpE-69!>$YqbOS-vyo!3UWZ&qx;wgr_w6dAX3vp&}5XOJ0I zp2;s{$~W(01siO!-9pOA*Y2THR3of%t}Ak&F)#H*bxt(R?m^Rj*6~#2$Ii5j+>c_0 zSr(nSt;1j%ztmhkC&u{>^lNGe&7(3KkaUK;Ws)ruO7T352$^7{IVh1mShKEdz!z4E zVkWGR&7H4Yl@;4=mpv3v&(qzlY<;ld8pW(v8CQhJJ(y?QlM10QvOu_PgeiOL3tvtY zLMeWoBOo}q5Y;j5f=@g#te!-HY<G#Z&|)tcrMRzy%v~{tD~-?SAjH*hRuvSn>QwjI z(q)!4?Zc|Inab;dYdzhsEA70ptXWXO)qEJ$0RJH-HVL1VH4dE4bp7_}W8$+R4mo>5 zP8zRtmE#fUOolMVO}IFLOk23$s~+9FhZtv~iS^{~omRYG*QzC|G~I0CjjTS-AIXpr zXrVFCvYGisd&9l7w|rvLY-Ha=PvbX<)4Lq44S^G1THXeFa%*V`l+%}>heq%p>xOmu zbFHtxbwC}n4f|y%IK(=#=&qN%9Vz<I>}B(PhNqCREZokglDEiI<$_6W_TQyWE3dj( z>n20?peXtNHFhBz&7v8lwd#X_;jdobLWMn~d-BYdIU#jjofM!7aq1@dAcMwr0&Mzj zGY^(Q_pLH3@0UDC@yuMUh-I{TqQ}@0lG{7-`M~1vtJ~=rc|_{@Fbi$NQteMGo)71C zCmZ&h^5P^W#KbfTTOPlVm`C!dC5MN_JkgF~j^bfeTnk^Pko>y8I-%=&W)6)QvOC^l z>!B~f#VT^w-tKS|%RiL-IbT$lOi97Q#waYh(Jl3-wj1wV_LWYjD+#V%>^#fgm@lcn z>u3v;WVB`NY@*%#jxT9j@2R(!S~k;{%PO3r5Y@yk89nhY%4Mj~rD$1sTI3*Cs1$E- zLcVAZ%AmUcU~boQg>9Jw2tpKtknJ&O3+p%uqG4L1LBmL>d-&D5N6VYjjzbT%$r~|5 zx4Q%IT7)B`x!tE`AOnw{MD)YGZe~`pU!Xpptbb!^XIvDkIII&J^W=%SBJ4RHwNwxl zn-(4#<5$u!lhyL}#h!Xqz6h%dbBRRd{OvLc<I%*R@6`2k8Cx=Wn-biG^fjFbW9(`E zb@Eg5C6=ikd@_4KovgjRrN2Fa;Wncf%T%<jaF<S;M;f#+ev1;glXFsWdxj8~#uP(6 znZ&r3dy05%eP!WOu}hWsb;j&-{swx!!%`DrUxN8@c`V;#^pQhUUxxB^)-Dx<4GCB# z$T(%=a)rjTaow7mtolri#b<5>U$oO!@(D4}vX!|BQ1)(DrnQOfM~$KnZgqQlC>tZ> z$F6l;nW*+=>IP=cGAGQ$)A*q8#yd4Hx(7ZQki}=98wlwJ#RWnSDf1^WyGo^0)rgE0 z3(nNvu77j2pMf^l<>S+jnzA3VcHW!lljZhrvWmG+zn|F{KdiD=M@TT7C83&6L!^3M zk^v1aC)sd0OGWJqtbyG^hi$a66UMquHphP1yd>ib>s8@FtV%R!n{#~47V`30nz5R9 z?@tdcut0d?_3dxpIK#-J3NEY;C5Se6=fTu+z&@YY(sKLB=&0QnC^(juTN{;kMmaZh zkAs2y!il;e1Gdv`0$%o89ph4L^$qztE7P(``ixiCuIetY$84a5gnU=ACZCuE_|2O7 zke=*qI5+rSNDzv_4^1f5nld#zliLttj=}TEl#q$%raM~NCT=<%7y2crhgOHu9G@2t z-!A*e2-i#9-aX5)(M;7p?ACfsd~LD;_T_P}?BP>0U+ZkgO_0iouYIC=FXjbxoLdB; z3AVO-2aatTC~4Tz8PpR~6v-W(X}PtQr=FYpY)$lKXLDlE$JY~^$;j&EIMCM5xd)$5 zvoPuE8YWkgv33=_iS%EArpiVX>E22oHptAq_$|0i_xd@+(+W*m$J!`w{DIj)iZH1h z`~$e*!BqwhLcqwWyX+=XQ(^c_(W}o@GaHiOV+n(HhfQC<rCcrujd|d>Wn%+5r;(^` zl>Pf5@3&mtsLHzMX_Ma5hy3Ha->3K)Ax?Tl=>{T$?tEc6ec9TH*M@TXW`E0(57`t^ z+6;#Xn3v@J+#9g2?7c5t5120s+<{oFrtoG|=-O%qQWv`qNogGC0`-Bzl)OD1*V+fi zkfC&w4L)P#uSPu^7{#tEFPgtfEx$ySu1PpvJ|^VYisoc0wAtBiSoMQBUg)izD2b5W zu{Ry0lh!ke$Y-!agtcB~Ye-Rtf1qJom_<Z^o99<+M2dytHGch1PxUj!>+H}w5JR!P z;n4lmk9AX5eWpI8VQoB{l2lutR65lv&(!{4SP855?uW)jc73X;5h04&Q@iLQ#Uy4F zn|J1}TV{|NO>;{8fa~6Ee2-(TM*U>S0Xy{SXhwXT1D;u+jcJ!+k<iA2oIT2@`4gR% z*Q5rfCNX=~7?YIO@%SFY16!JgoTuMzCO<uV#Acq^#d>`q&2_ktBWmLJn|HP6IbgoE zEGaTqufATi??36ebjKty-Xzh;M2qRx{uie;vBR!J`4W~J9<1`C&VjB`??6e=&Sx8{ z>E&H|LZ*p|)GZ|gC!BB~0uzL?T2I^NjO4mc4)nZF+K|0bx2xtO2rDbxE%&G;+&r7j zqulhaeZCaRoy!2#e&Oi&5Sa_oLML5Hk{w~fIZBN?*i=$}<<G>?3@0FUQ@o<%u4_Q? zxbiK1u1Cw%#mQ}1ZiNp@Gxy_HjIqml2;<!>DE7j)9G}D8Y%)q(B*t6xMUR96m!0gT z6G<=gN;aO{ta5GBgtEwpu6-I&*T3nEv&QqyNg7|NXrj8wlCeFn`bVo=p~krMv1jn( z<rR$WohFCFww#e@i?=V2=TLm;GM@Y)V@zAYC-@Y;A30rGkMFL0AC<C~8Y9bG*>*Z@ z5?7<?EO?8gaTRpGA&;+CJ0&eqJ!APJVQj|eePRW?S3lt;@!!?#Q^(imkpw2Uk<HV6 zOP|nPSst`tw<_!3e2^4zNM`i35P5>fdlt81`9zF-M+${-Yq4G48rWk}VfD4InJTxC zH-EC>R?QJq!0Vf83$4z}y{WBKR6U*Sb{?Ek2<Iz`qZC}xO9S6&$+-P6eC+bJ!Z+IV zuc9wJC#4YKCA3i-AH6(3DnANj$)lOg27!J14nOq4v60B!n<Fsqw(=h(-b1|VB~M6A zeTkJIt{k4e`j@?{cMuc4=4Lq0$prgU*N0^_cX|y6CU8GB;85W`YYNmW@j7Qus&y&N zwFK86PP~kcaTTMB7i^>1S!Ax+wk1(NB3~qAtg$breES}=JVO5(Kt^tboaAq4xRlg9 zxV|a5BoO7}HTG<CJFch}Vu~XsKN*|jdx??JUj}OIG=N9)%_9cp`(g%@6rRjvI9-30 zGXd|JA#qBw(1Hg;4E3|HNd$!ZM3yy3M!FU>&;whWRI7Qmd^|n5%~lWj+2B#2?cUGx z;gB*p?2-?|j_0KQAldgPC3#P5nR;N)4s2@XBc-qv-ZpC&Pxw`O)oSFQF=pnZTvR8x znTV+Cf_g{-8>n^C$l`99;i{HvhqC#*K5f+bj6H*09JOTq67X@ues=oIf(BTWy4s-4 zYi+9v{)W~n)j|s&oG79rD%Qy=_aviyBxQIa_T3Y`r?}s8GxUb~ruLtbsd&6IEm$6P zDTwofdr}CPq073Ls=fVnKaP^FwL<RCpWg>zepR(rAjW6JKCZspd!`K=b4d@e_Jr&N zff8S1xElDu(CfBeWevBoLeS@nnGPOwP*=007!9+B7MM=&=J6L#hmPp7@xH?y*sIm7 zeM%djL~dU38C`iew#UjpX)K<7wgSEyoKh-GX+?pG(j|4s5as$XU7LBktl=f!EtFS| z=dUUiHclZM6_EdLBuIW+cttbJrSp}lM1Wd@il=c^3x4o5NjLeSlcc-{3pmiBJZ;8< z{l<`cmm;EMWTJnMBQ$AmA|)p_?oXH)HS9$q3*AjXNloa+(x)_b--GvlZfZjNhm}S$ zYhEVsHkCVRVV*WG2k6)t??D!oz-3#AuqC?`cI4Eyii?U%!uPvIT|_9ZtOJ?+d)?-a zDhm}?II4ds>psDR1&zd<zoAz`m3wES#ADU0Ad+`Pa^Z?B8J8i<G|?YN(DYNEKl0(u zEY$K;aLYSs$ErVRcd31tgG}1bRbe5K1SuaKC<y8vY$-tnv4*wv!&_h9_!&r5AQFTP z_boaO3kZ=E8QN>&-cmm1gnOGO|736>KdM4!!&@Ic<F%t@`-K8BPf0+xv#b&|PFe0= z<E47ZDe=&0@&Q=w+VYlw4zxaN{meB&up6`sJG7oVKkgFCXrVon*y-?taZt0brK2t? zHXM6J+tzZGPEEzHc;MtRUH{XDgMf<cM}fb+_I!)i_e}7=cM24E-tKntx!oVhC#lG} z_Lf7a>2!(ha~&=3H6#U+j#W)1nD31+sdMDPAhg(fNGkL<>f;+NIj}3Q25lzYU^$l} zKFs~QUY)w9!Q#J%+Hj>i?%(PgLT6%&z9zBy1{)BHCyBc*MaZG$%}(F?{ZX}avVXY- z_~BGYg49-$z+iLx#gHlijn<Zss)v{O=ZPUMH90Ki)`+aL_V{7QFS*f>Lfb13^u~4) zE;Ug-xfv{RQ;(1JMmB%XCH_TOS7VPC1<TDkh(Uy0bFaQ@nw%vt#(Jv{ZMHiwP_v62 zS-GRyz{e^Z(e#LcJ$|g)1lMHil{J66=(Ze+xNXJpr_QzUwc1Rz`<+>n#b}wkj9sjT z478_}{V<@YqU+PJja6N%I>5MOZ@5j@sb!6f7;Lx|3y?mx6!SjGZ_~Q7Cj|u9J&V;T zGSCxPHPVgAcR@|_@wF=zN!@*cz<Zmx@9&b!*|UO%X?OdtW6aqvnQPBQY~YMDWoGcp z;m*I_RD`St$Cy1~q|Bdw{~aA$a#6}!R6qHH=id0pdouOa4%~0-kHN`?wM1(@f8)Ia zfzSdEP^R53f1U2QwY+@7w{quF9~BSMhIUA5LT91)ife{lNirs}_VBQ|*V|&wqv|8( zvFVGxW5QmdFXk()!kanQ3^Msr^gYInhE0n!%JlFm5~g?NY)gtopYVl^>{<mkub`0! zcc0zzSxmmuSrT5PO$JUYyLN3ek+*Ng*czhT@5bbWjv0K4yr8&NEXL=B|DKVk&C43% z`Cui!uNRqyUa8cr<?A|3arb#Dnt-@uykVa(uo$(+tt5ECrWY1hKbeQZW%Zw~{y6i} zV54N((ifi1r?QqOb}Un^b|W-VOzeSUX0dN3)wSjk0AnhH=0egF;4<;m(|A~8=oTKz z<@;%6Z{js%QJr`V4q`D&X#4iPnv9Ly@RIINq~ejrHuzlP@bW-c2TgkZURIRt2gkY& zonu83j?dT2Tr}UPpHYA7$xopfo-2F*hJQu5ol`z*pq2Bga$6Wz3)vy`nR~57hwJD# zJZ@}r)(h8F{$si{>65S&Zc{8xZF}_S5}of(7BpMe<>T4+xNbwkM`O8FgORSf42lXl z6FQljW1N{3Z;wqH$haDg8`z7wRkSKyD4uZIdA(s`!uq+U{P`r@=tk?){Z8{qjg<|& zS*DLu9d5^ya4&D^*+?A@rfa-0`Q~|8`tYlbhWfnUE;?$DlUTKq3P<;(HeDL9ZfUnf zWQ<W*4P+`6HB!<z5Gspqj7;3qrh(4pZ+@#!%eso9j4x0FiAKBWmy2Bk1HEt_nFj12 zxPD!nY^PjkDX~9{kEU%vT`K^$_a*Yq@E49Hu+Z!EG<SS3uw`5p3(PmT;W4!6-evsx zIU-f!?EdS{kXz~7h6$>*!)>+>V$yw~R)v?L#`i?d_bsAe<sT`|aW1?QI<We-IrI(r znF@wX#0^>nkVi)y3{FmCHPo1cW2KA6>h~hKp9;t9Ne%sSi<}YL_T{&ES|==@TTj`= zph~X{S)?Px&;-Q`gpROishtAr<e{mg@1oqDNf_bE9HQCW=!3Jqw#gxAEWKwpJ4ITT z#j3b3Ki6z1phvBK=4Oz@(wUeO1~LglJvyq6wco`#^=K<RYi)j;@xg@pIKQRibUE;b z_F|emrK;yzpSD>o8$=`;j9DuaDj@@TGbCjS*d>!2lN-{m`yFPgM*I_SP+*H_qS6`S zx{0jvWDI8I=sgth!x64NMeCEFkUV=O{@F|~hw4tH#Ld$Yu~xG%*Tv>5E3U;FMZD`P zC^zr&2YG$nA!Yjqg0af#HBnQam^tBwygx!_NJO@g+L|CIdTr&<yubXJTXebS8LS4j zq7&1<9~?{GFINRhK!sA)Tq+{@gKcD6ci{(Zv%muI+xTBqZ69%X97BHCVVH}QUj6c$ z>J8X*DaIUla|!Z=D^vmas@KHMz_!Jjd&_JlFg#?nMWl|*gdS&I4b^x;D5MX@#9jg{ zL`y+RO4sS5LIuA0b|I+Q#u`gm2QK-WzY1e~QMxVa7Q?5U-FoR&UfW?u2I${7CCYD) z7*1x4-7495@GPfZO-=26o!8zl2J`g#3uGFOKC8gQZ7jih^jAp$X+Kv;&iz2{`NPdc zTB+KF>!??D1pojBH{2{{+&7J{M4rJvq~TXg2{Ugl4WzdK<+yGgLIj66sV2V<jf#KV zN6lZ{<Wp!4cJJ`y(v9Y!^ps@3!KE1zbRMkxK4KE?yyZT$_Z%WT3bI;I275th*tNH} zm;VrZ0f|>%rh~}I5=;tQVmK3#rmb;ft_7avI%b`C6Vfe-qJ(hK39x~;em88btS;28 zJ`uVzGc(iDz<k9p9%A|_4>S`!2&X;3P^$7Dy~FNsLYbfV$hi_}6F&bR`4JEEa$`1M zaG7}J8^Z2;67~xE@z!gb^GTxSjrVNMs{|Om*S*62gHl4txzCCA*L&vMo>SULahm8b zr~W8IibbWV7fmDsPFlzg9b3w};QK6A@5w(s;(e*f%R|l6$*p?rJTEQmRdR;J`<}wl ziFt?5mKGZ_whbFK!v|QuFVP}N3J<oWF_x*)wsn8V^EuN|yB}y|_A*iKgclw9z)X*x zH)X)@j-K<D=Z<cNKp?kz<d1IU0G~{LN&d$Gt{W!^nkPJR{}BF16i24;|IjMZ2P2;* zQA4uE%3Lh{zD2_tC1&Z8c;SAI?a=ftf@$_yt5j~#L9!&PX7V6O=ZJ5v-@!p<qG59H z2nL%zh+E&81SAexd=R8hgD@nm=iuKjqshV*a1bL4V7z`BhcMc@(-37;n3wEXQ;}IZ zVOsQ8iw>wM`xfQmHG=gz8+g-BTe{-aAS}ap>20T}Mb};v3nwu05?bN-79~q8hNPNk z{V98J8EnI4x_QX;kCrQuzgJ$tugVcd#9_|yqRCDI)^2<N&Lg+LF@BxV_bc7^Mta|w z-wP?U+-Hfequ*dig1`>h9{}dLPT&tS-o^R$;SNbm1sl+_3-546?pNhhw<x~{V;-HF zrTf5uCYv?81PJo^&X~jDXvrr0LTB2`s>2f`T%q_Y%`rEF9MwWGBowb<YKg=@a&`p4 zMaR0|TV&o#Iga0;gfrpx58!li<FaKdmT_ritBLpc)Nv4j4rn4b+%I;PE;@@})&O9F zDGfq1jn>Fza{~3-vQpy}tOhMUl~VJr=_j^^<id~F&ko<E6|hq};(uf?f1N0jQpnRt zkvyY1Jm)<cjPXBs`xchH(4`FMF`~)dHWJWcrPITdGFk)(SuNltIhw4G;smu;$sd=a zfdH=l10F{X1Nq+`<41TCo%sI-Y1P41YQIQ>&((rI>pzHeo1`2+QTC&0x+zY$VMo?i z+8}wddS`b(71i@%kJAI@vp6wO0u*WP_7%DF;=|#0%$65~MG*(-qd=3%g%CqS3jM36 zBfYD%P79T<Y%N^{@xFZ@o_#N=*utVjq8j*US9UMcEbekPu+b*Ri@zt!eTyMUr`e+P zGa%SE#DL+|Grft4O3}+d&dR#mZhZe*>Dcnf$h&51H}&^~rtEd6X$=X7=d#l1Cd2R8 z9eGH)G?;t69SX5QHLKhK22?n;vouI@FGQj8j{Uj`YvY<eYxCN1BPLDymKX&Ulj^g( zX`eaLtq~e2$9ZFfL~r976^?9B{SEB5)*6~j%t--|5q1=x80YZCv{6dI0v}#X<*eSf z@cvOLogDU}ibrT-f5}OoWKkCEnr)U2B0U=fqTBEsIm1jS!oR1%Q8?KPD>pOpT4SJ} z*<Mmik>_VLWac&OgRJ=Zb|{|$uJHhTfqG6@DEfZhi_i7$X1Q>i#VVoRD`~8x={|q# z=|LJBaIy#Q7!^+z?A-imaB@EWwD|c(@DnS{BT>6s(XjXD;InjDjtZp6E~4{X`(Vyf zK|8GrnC$glOSUY06aJF?K^kW1H7vYSJ^=Fw{0~0B-1|(Y(v1l*{lPnbj+F!-FZ=x@ zdzrIL#darlnk@@u59b6ZoSp(hdXR+iNX9&Rzyy$GCI%K213L*8LfQg+frMY6{e@em ziws<`bUns-CauJCt-IV-jf77QR|vpDEfS-jgds8IA*|!~I@!yIFWG0UBfo@y{1)8Q zW0Uf*3E_)+Gbj(CZcmHofcovs_O=39uDnhMX`$A1^wKL6IA1b)S3Ag2A(THChjB}z zc{lMB3So)DoK3-ye3wRxNTSIax$FprbKQAne0)l%0sYo8JMtW@(2R9P)wa~vGLr)? zwKY$A2umd9Y#N4yC5`yUREz*4jnxxgC@qP@v8l%SWG{0*@87%YzY|JQoL*jRq@UGf z-J&!V-QuSKN>1|%0-Nxk?ucu^ea#ATq(+ta)a~{-LrjIyF{yx;c+7209E6^j5pfQ( zv13ylzz#{RTkxOolX$FK6Iz^>0>a4)=TpH!fOvp(NQij%I~aE{uIhvoY0P#{WvcVR zanoby!INmR-xr8~w1kL^YNB2_Zpy?gpvxgLTL}Fv%5)W+C<q<M4uaZ0bPE@A1U;8q zo7I$>rPGo^57MH^w4j8Uevb^hPR{umbfmd<K+|=%5Jq6`6@p6Ap9eXPn_i$qD&w4A zU`T9u;MF$)!LI~@_W{9&glX+*cCTS_g0q^H?NC2Sf`|I43ijAj+v9OpzkZGkQK$-o zeP@QK^1`cc;~?2Fu<`S7NGCA^ymUr0v)kx9!(yt)r0=Dlk{e!RZ*SwA-(g5p`QX)n z_qX4OOI=8nzp;1VFDKqI_z-sBreRMq_Zl|N2lu<zk!BYIgFGRoma$cv>vp|M-E!=$ z*dZu8H6%M4<^e*w^{gi6ES+2x0ea+=rlS{t1>EPN0|0bQ`dBCzd<(>@d+lkpfc<L( z<@klxZWl#WQHY3adXCy|s8RYQccfuJ@<6`D4+El+CW_|Nf^ix(fFZ{AUK9LO{|EQB zD0{ioS<QM7sYK8*LO{Aq_)Id0+_CAr^s*9}v+Xe(&}ad?@7%XNy7pLj!`A#Er4|!G z0b2fLC7iTj+qhnQa*CIE>rl3w>#QaY5aL0{zyKlIkdqL|%bJ~eoWtffAAd{=uy_(K z<}CzBHrhil7hhpWF1#Q>`h}lfC7j3KK3Z>zbihTtAmO6?4`Uv%x3(<U-;3OrF{+(W zxsm>3R?`ElMTXYqM3Y6s@S%X|jA^bO>o;4?mQ$&C?Mc1#npw?+S-L)#Eri+@B^R71 z0WC`tnOf=E4Cw`9*sr(refnDnLqhU{*1iJhh~onQ9slX2^f3GN6K^{%o=Y#7)f@#x zbhZ#r0TFv55xGrg`X^4RREykbZ2*<duQ3;a3%0+5*MW;U!WxuAU%*7$SxpWwQEUrA z3nrQnCkg}o9Y+%0-kH^u0dIM?5S-wxCT<Q~NocCwTh5T<n7){C2QJG9sg}bb38@=5 zeEA$4vh|p7{5bx6ZcV03FYaCx-NYCNWQ-5K%meqk5)DJWhC$G!gu}|Qs{I#O|LSG| zo02*aFy#FI9`Z7n|HU-*xn+^VtU8i(!7YUG7Nu1TCJ)$fdl*qAiqaS5Q<6`T5oUuN z?RrO=CqS}VqNB(gdOMk<YlLk-G<<lxTp5Q1HvjAm4D|*E@i^ijm@HvsL*m?hk&!sk zXVEZVg&+_D@zN0u$4|hXtrfZcqEZ^hY?X=u&Pg2O=S`$eD#6j*H1zC|?-EV=ZNjYb zn>a48{YS*@JFJB-Se|Msj4_k@I!pH&Lz2h`4+eh1N%WI>JEQNV-jd|=aW*9B7q?yk z-GDgQ#}B5P5~g2sJ8bHK^jEkgpC(J>fiK3u<YH#&Kv3eMBdCYVN#kW7vu3E^#HKlC z-$}FrP-^0N!Z3)(Zy_<zMO%;aXBRM(DieT+-o$+X2`oq(9{_-GP9sRI{U^%pq^bMj zdc_(^I`!5okWcoVMt=o4Z2BRQzt&`0GcmpIr0UVILI4DO?ND7ndz=U>*Ie;E!w`XS zNqa6zwN%U_F~B=m17xy`vIMb3mp)`R)a=M2#4<<>AN&CbMMrcX)x8A3dEC8yP5+sr z@0|z0L1aun&e9bCWCUys0r~6^@*%E=+hyov3Xg-A6F-W&&L!h|#!9?!vGlI1>veqf z*DJJ5s2*)-pG(I2Qt3_5C{<T}5F>^dJ|$eZ1`hHxl^CAVpAltc9(DqqOdj&}v&nwN zL<ubU#8lk|o$vUGh5@#C?ApT^wssWdi)`9iCJRK<&KEBd(|fbMi?ei%^BrmZ9Z<;F zJSQlGw11yYDLSVjgxB3TO&>FL>7nVsEZvKC=pTRl?1&h7HmtX+yFXIqocE>)Ipi8I z9AX84-4Emb82m`+@l!|H21fa^ji3(;w>HN57T~;rm3XVqFlNouEdrV_bQhf_bBnDy zembdcuK-nYD`MjizG2%?h8v0MwO@mMt-zyZ$_z)m=53h;4ZkgnRs%o;ffyuzK+3bd zTtIt2KvDxb+FhH0ed9mQVcx-q4qe#eTNbkI&ezXFaX<dA_P#wFs<r)pWS5RZwJU{2 zM=D|Oa;Pv<DmtN5bYR%+ogyUX<6_Gx6{S*<p%OZvgPe_WP9le<D3dcoVVIaPYpvhC zmU`d)w%_l&-{0^1*YCRaTwPZS&wAE#yzkHbxj)aE=5&=afsfwNMuP3}kM7=q`IqCy zPV~184h{B)r*R9CMjm>sKc1oOAI|Efw`mmU6_n8N9c;lUM=JS-7&b1fe*i|}EMkow zJ1p;(FZd*5>5-^4AgX5PW4&X6xgIZ+3N)$jM6`Z3TIIgbPwdS6lpmqwjkPoB;`M|5 z>jgn&Y^+)hg+=Qj?xl}q%M=V(({K@`9hN7FVynnbJXvh1;nmA8y0?QfOUemdbTIFf zONYsQ#NxP)ppLHlBimBE#=UEyLg^MRTKX}e(U~PD7F7GCjm%|ZN>bDLl=6sgxHg+? zZb?X{x8!4wecjwK+sX5|)Rq^y5$w-3W#0X1;w-JgL!a{dM}kj=&|i=F;@46JduNC? zw5^E8>~0p(5beT4!oh-wxbA$eR&m2!*hb&#Ch^9>q4I`A{KP;*B5D)or>!*#$(91& zky|u&ZfUQXwBTvK=jcfBs$HB%zQ&YznQwTRG?YI-9r~D`e$w?&`MVK6wbMuF9Pi+s zYW!9PGt>Rt?De;(FZLrhFoqhH_s085??K6Ds@Jdk$xxPW!^&A3A>2LAH^8PZMkqO? zGq1_PMN#*5Fl7f+8a&P@p9y@TkV``*@g8=0_uC++J{-q?sCmqqA*moLzQtyHW{+sJ zaU%3HH&&ZhRn-rpl)}<><AZ>@wE0S_A@s99MBw8GdyIZBwr)hmqyy>mq)wm-?|HK~ zJ7s<8>+)jz^+tI0bH^+lljo)>qVLUUzNnh`pks389z6T*YaXYJgYnqXEgZb=W7j>m zhVzoNN&ed|()l(rLP>~zFVJBV`8$w+|5p{u1MA(b4U{*^CzrG|#y{h@BmFH?Zg%N4 z$<>tH+s+!RSP{=2?JSDg=u|j2#M>!rE)!l+lwVykn=!Z=d)I)JvBd4CYg5#Q_1wRB z=SRR>6}|PdFY9llz&?>U79#HPwZtfqv$Y7QQu_4M%H9LloYXbDU(|T~-bKfvnoU%w z4XqzlsBNuw?6Gsr42MMR_hZdkUV%@vt-{kHlEN&<ZiEEpUKUjw>!LTBIS6*S`H*~R z{s<~yJ!ssrL3;JS>zsG%t!1!Z-kcN-_b}XV_<lO+(chq-u-wUTZit;zsOGV(rw3uh zIY$S3>)GPHWgP05O-^StcCKLcvlP>$O%?4sngN-oMblmO^#~u$6h>(Y9}o6+NL%dl z#u!yPAQhtgJU30{!7lm8bEkZd;lku7k;uaI$Sz7%6kQGscTWX@?<qN@OTd&V9?6YZ z{e$`Ou8o|_6QY#<jeS1RcwA=xJMZ_AbFb<Mi)_K=LfisozQ%Xlpqkc6AKqQDBvxj^ zb;W;kyF>NETnUjIU6)27{tnxE*9H20fTdr}ze8v7CyK9>(SmY`D)28$5&t{jU%)AU z^)FqgWqj8tO>gt>ET@UUGc6_kTR92A%HKD)O*%E)r&}OH0hjh?#|UkE{<30&1l3ox zpK|PsI01qJh%1Ky6zGh*?Uz2!8PsayiPx0~hg`E(s1HpWce_*7ou4yO-QrkNNncJx zwcwKUNS7$lS`q2tx<as?-zuQMU0~Q76_H2)GX!}=3DOqTo@3-6Hk<ln3sw&<&;A14 z6^8!XUx#}R1*|XW-R{0HZyp71{4-d|diumNb=Abie*<KGm&e5o42xEoFBM%~6Bse= z#=g+<iTorzKm>FWuqjsO`K&gHR$^YAW|~Xjp=EzYQxn6Iwj4ETo>JfTPR(Kp#XgDv zV~ly_ED`KMF*!QVb;h<xUO)IU_Nw#->E>w^3uq}&c&ZoZ0_dveBeJXOPM&IBk+5Cf zbI^;@JymEb4ahP~oB}wxJc<Nmk*1qE!j%Hg7r3mUz+VW=nPZ4uf~jaHqvRjUS0wN~ z-B#9Y;V1b3s2xYAkz}N0qMUU4MTd(_&2Rq-cu7R|pZ=x}_c@OStxF2@e-%ZC5Qae| zp*I5~=kHnTibX{+k79i~Pzr&xfwd?P5U&8kP)=eZ<@aG`sv#*oQUPM!k&bsAT}cz# z8Q3Mjwd*d>JD~Hwjn8v<QI-vRc%!1DlZ?A~$V`%<+HO1_0KS~i6et)I>UhXuV_C3} z80z+38}_N!+td^{@RbmF;sr4TI}*wv#4sfnCl#EkU?`cw)Y%I?vncB>(uEi4j8|ls z!#F@Tds*w{=v37z<Nh(XWt8^q7~v(eqv)QnT{=h%J15L6y0mV2`=YpR(M!&&b?+wr z3c<}5hy@`&1DE|9IcJx{l6JMG%+9GEnW`Ly)bU%qCtfOM9~TbfPf#Z3EcvXdlBdV# z%Ev~|5?e0(IkF3CO^GtbJB19bPwU(`&ZYs2$>5NY0+A`~tw&^Nw_QPd9nC23)ViA0 zPUa#p9X9E|4NSkhtmNF-+!LvNHk?!8<*?FZy|8XIUn)6B+%p%(P>LMG?9uy1`q^LR zmr7(nII4*FH$p57^B^GSLH0$)OLc1UW$|%{1#Figu-+-WUkFEUepH!5Ez*v6<0mOV zoj1hCVPPgm5F`FEX?n-?-(;m~mLS)myjQ#NW7yv}h=Ha=s9&-Rww5ov)ou)Y^Vk0v z`FFqp7Or$so+q`%rU2b*9-CPf+xW6VI3RY6lLlimfg)YOs({%D9RJUi1cK9Dh7)62 z3Tr=h6BLTd;SX~S+pa~Y1<g*&1NLMmwi8HiAcd|0&EUTea%on(P&*A9ST84xbY}c0 z<rM5h0lVD;+p?vC<pP`xX?gu!S4($bJ?pCXeK_50HH4_Js1v|b+YCW_yW6Wf!Nl+9 zm&5DBtds|{?}mUWpo`EWsp<+F<)4>W-|0%6aMl2Wf0PqI#lXV1(jYt`MZd|r&ta71 zH+DZtRX;T8ckDAArB#|;T2LxM6a;d`5FiF@-t@U-`6WH{X~UykX+bnUbbeCMq)?^b zTWe|+sfr51$3H>v6eoUn6)M*?_IU!;7cMYj=_y$05&?Y|SNoWH=C7UYKBM(!s;VsN z?^Wwvd3%+w`B*=0uh!>>?7kGICU=2;;)>YQ5K}+XI3#7;Nf3Khrg5G^FAsiDQ%j#+ zNKpx`Z<@xLK-h?*8@1Di7y2J9rx8T8a0x<@J@<{VJG(e;*4^XkHZo;P0RaXpAyytF zW4DC7@b@B?td+$ix3jnCS95_%x?px~LGkM!rcF@?QcLb}q#|Nyj1`uuEM?@AKGslG zPk$J;vy+fB_@qWi*Ol#j)jxS%48Sq4bW7w#!>a?e{m;W%0PjI5Y$TV}Y*$zbm5!OJ zeUs-kYhV44lHjqRdmzahmuoel`s)B~3eJG?aW`Sa{kQh%x{V|y1-F`f=Ci6@PHE2z zaqvFR)i^Dwe0m&kQoP7o&xM=$eMv*lN@i<c&E?<9ujE|U)Q#_z{`h6#A@hRsF8#G> zGg>Gwz_AelNc>T<_WdPY4;K3NH1m(gDpT7#ZIYg!b9Yx`Ixj%j>ba{`fK-af82Z>+ zJ7B+Pry6=Amt|?bu(*UNS13^rYlej8_T<xV%#v~$e1QC(tOnIY2RnzmKUKlKoc!#v zyzR#d(;m8ZwelnFZAE@>J&!pF(cxNkD&-A8RI)8DWLs2<B@X#eAv*mA`d4ToUDB`^ ziBI85q73=@zsq(y5Ul90yf+UHwKV5@NBH{mH|JY7J++shEQc8(dvKoY!Mhx%wyjrL zETpe(gZt;Tk&;%wz$Sy}hSFY6U?l$&zQeB#B<X(eGBXM#>TBB-4al~i@EvUlk)%5) zN);|80z{a<@(YA{QQYC)-#kNlp^o{GGev#MSD1h5H^M5F*Lo%SPtrA;L)imQAr?sF zD#FY$t~h+i$>{9*{2@0}Jc*L>t-{OW70TV1aM008iqiIVRein5tu@{L)@(+mBbQ1c z(o-aVA4|p}kJfD1klSK6ckbNhH#WFWpxpk}cpI|u_oq9rPwsEbu#@;_LpG2N*&n=4 zp?;q6WDB;RE~OBXZR0(=K{iCrNmi?`C%#HNpF#jSaww;eLwO+7?6PIPm+Qx_J9q9p zFVp+-Fo5Mf@Nr|7$KWqn2<}Jm-~F{J<shP}_@U3u`Eq)r9|JY$$iT;E=?IRg>+0rr zve>6OwnOQ!TS7UEEM3>C{^@zpG`qNgchFnDx~dnyLaFG=>OkaWw&&2%EFa-1pjf}% zbB?^{vBUeUho99|E%z-jmJ)n=`>^c-H*IdnsX@`6>b(=KbiYo_b~66zj)id7>}&y! zjoAV4-xl9i77=3K^i-EW2$E<O)`EkT@87@YM^?jj1%iTHB$rMQ3(ckc`SVR#E<Lru zl8+;N`;J7+XcM(IBo5xK8`U%vH`-LkSuA{CGJA`iuL6Z2#{RJU-;|g#oIKnFyashT zo!!#grtSbs)y}T~@#+=}hwP{wH$8%m`>eStnH=?XcCQoo46-xEJ;ikl_s{RAz;IX& z+16fejsG;zQe+J)RX<;o+M&uU$n)9N<0T5rw#ao0()Ipw`cqS;8r%Lujt0d9+$)(c z$skd|>al?$>1gAJ#S;5`V9uWL52c83xsdsV57ugE%!%_8^`svuJD-5>lz*Y1>$Udf zt5>Qly+%WMYH23qOO!`U^#|D-#f}`>&kNR0@a5ZpF9KL)9xk3g?qIqX5-Y1FT|4v) zMEkbOEUVY?tnO|dtT)QL<MMuEZGwKtm5@D7%9&YN+QY0~>1{h^hg`3#tE*Ic(CSZ3 z4kTzCcp)g`2EoV>acR5-v54ar4gP47H+Km3dGJa7Gx|^9e7uTugyt$LtM&42@YQT- zjqnUvZYq;q;4@(*RfXfde08K2k*ruVpD)E*jBHgxAO}Qw(i;|W1=gf_QBPfxWXx>i ztFjZ$Ew_BUZq1s<V$HB#4PWDhHtHPRuc@l2E^f~23KkGUotH^J^@m?H#L-QNoGImg zWub#}YmHLe^OK8@X%8+nk)N8VJ#+0@?W^HjmWOYjve~sOD%8&N3LCDVkB{uIS`+|5 z(5(yfPf_%$hv0J{us^#Mdt!{OErUGIx1^GsvHbAi0v}J|{FLc)jU`GFjO7bTY`kDA zc`r^12%eKRaJKrXg}J#ohLvzRD%7oDg=CKb=z-L_Cb0dG?}&qB?wToln<M<BruORg z1BU)yB-fUrT_bE_qfH6M6HA`$l{XY{TTNE_-QPQyoxGc46hDlQrTr-7oXwK=f)!%S zy0*a1`7N&d`0?XP<O?i3iSj`40hajq6>)%9IZIH%0?Xn5nS`cOK4dv9$%Bn0SD;FL z@Aj!NLwvRd7GtK@&%qfb3D#50+)L}se4WZ=jW?C_x@awU1uNEGm@zojRAVY6AYLqn z+*<o4?9vttkkB>~_k~Sgb2dCMOZ#-V<0Sbfi>R_A{am(quASShXNPqTxU@W<sK2gT zU8qlOm%e0x0qrhXGtNpf<PV-$dp5j!sxR@*Ol_x4^Me&$mWT>q|ME?!-E)Qd=iy<- z7-R(`YtEmdy@Yi!Bg~9pndjm3fm7UNvXJigUj4k$8U1W?7TVQBot37VPgtxReJpZ= zP!bS%J8+L{$r(GbC-2oy)Q(AEW|vAgmIX*kO>j9NKbH=N$gH^qzIFx6^-NtI98@U) zYn21U0g(RK4qoK?5yDewTD!Tq6<Ht7yZhs*nQ09cj>_&re#c3|6Fu31nJj=uMba;A zh5R1OD1{<xDqmdEWt7?hZ)2ctaO;~K8KZsakX@ws<Fmkys7(y-cIm{6^cs79$R3!O z3Uc2cIp`?s-d(duDX{#YymFdgXM=X+A#?M|3`kxri=x+9@Ix*Vg~?ew5}Fj~(44n! zz!@SQSOS!F;bxx~t~>Q>RdrdfR{)^S?Mg^|3_J$H-6*mPrRmK*@g5(RTvDV)OUrAk z4>*It8dTYLEI^zvi7%C7fSJI=sLv-hv(@Io`4{bOP#ZHHnQx!kAM)Q*T;~AzN>R(< z{bYu7yR^mydW`}<<T@;YVZ!4ShB|Ny@;kc@@7sR7Ro&s}(W4)`-YnQD8MO#W4ig7_ zj-=NEC3>6Ws<*Dy($X4eGm_eU7YyNav4_u<0WjK>>rnQbH~_*4NWM{SlOB5Ok1U0C z<=}@UFC8m8uTWWSs!+_J0{i~wk|#$#f9SADrapSJVyg19gOb@op%A7+oUorS1%U`e zB@%|Pdm%&n5kto$=>>M2RLZhL_e$F$7XYQA|Dau(n95ZEmd}%O`0OBO4fINvQPG-_ z7+BnuoT`yLsrCZBemlm<ZI{jf@83hl=QE32iWC9SOfz}38s5oppv%spZQ5;U<7IIG z<QE|jqSTVJw#3{{5r`Cxw>hr8g%KMT{Qyi)@-=b5mvWlzawtS@rb3fAkJhjNn){~7 z1Sv<tlG{Jc0sNByXPa~w59;Yp4Dj7+1k#^gBlSB`$=fXi8Ye%07C#Wb{(r!0^b8<B zvwW>>uCmw9nR_%ds3d4LBvpLH9#6E{u05Xy^P6u-_3QHeL^b(|Ots+rvd_T~rdy9Z z6n2c%{Klg--olfwi9)_~({1ly64#0Ri@$Bjq9VbX+@klwPc4ntEGpTwwI^i1*gfz; z(3fp#VMS+jcSxSeFY6DMRO+0u;@IVHw<qX|BCe+({$F$kUtfg&*lGKUT$H!SYaaIW z=GLZL*^GXCkbgv)w&(gfCnb4^cH?}kRr~zB78Tx3#>KJgT~}VZe;cGV*sY^Hw)ghx z=yT;n-uL=VEH~+kIN<tt%#khK*ILt38#5L?Nyhuiq?x&!qDyA~IM`nNI@%!^RdSGe zt0G`&O`GCbM~u3A3|Q{EIsB0NdL)xD+g~f8_BrI`ZV-<~NW1w>et1PYHZ(A7To|#! z+MLIpK6e)XHZd~Qz?=!|w(vu$OmI(_cL8Ao3Uf{^cw15@10k90t9-xs*_@y5oEk2P zF`Dskk$?$)TUbLpyQ>T|3q9+FMe6m49}x)=J1{*}ev(@vb@BdirDbtr{62ollx|bJ z<56UdFEM(!&jAodWJl7c-^7MsYw?Kf<?rh1X=PTa_=`s1y2S#fA9~2JTNPD8V9JKl zkZDu+N?QC7L$s1Mo`5trn<wR#K|CTbY+OgNe=9mtZ-URAm1BSl%314E@VHq#F0`)V zvN$D5)DL{mtMSIA&geVJZI;724;cps-D{elJ2*e8+D~}q+2M)xc-!_=c-n`X_(COw zmw?ftouMVrTHwM=a8Oq;$N(WdHFbJlE2T9J`)HWuchu~oQ|eEvV?<15iokJEg4{4y z1j*KVTy*LI(e$JrAm_?MAU#)30?;=NK>;7KIX2JVapLZayh^RBVzXxJ3GPM5&RrQQ zqFEj%D)ALLdH@T>Lp-t@*f2q+vmiq(pzDBm>^WgNdTpJpy7m@(+_^(L9fkLf8BP1m z2#rX(Ey|3nS%_*a1iDE;kBcRTV8uD{ia-$!Li$tb0;VdUko4ep@7~n}%k_Vzf>NLk zQr52uk1bTuo0*!Iuk@b9nmXopRPV&Qqf+a%c!<xk2E3&xM8Bf(MfACD_8?GHDfnQ= zUYwNWK>FGktH(!)BsLNMr>ANf$>c)<_~aK2dh#8aGzT&8PT9}bF5%H{yzk}Cm{L`T z^uYVSlW~_EOPmO~!KVm!<3MM`-_toQMe%<XS{(|xA01oS3nqDA_yk9C*xP1(jXe)u zbX}c3%=8ke(Z0WycDZZ-N1D@9@1(9hN7u$j9Cc==Vhx`e2O+^*l&CclVxOxwbu8|N zv`d7D6&u^jT_Sfq0SCE<3k!Z$<**Gj%UQJ*tk0%+6p@Q2#Xk>v9S5sHByly?y+Clg zPD$Z57L$O@-;8VM<E~L6$6%3-49b~~a(409^Le!HSp>#=a+iKKwEvn;bywe90ary( zy<L=cK$Lc<9(i0(U)94t+QW9(jaTi#8D@mlj@JmD`APi}ynmWY6&T;f8x!!HjcBGm zI=hGM*3EV>!9SVcjCo|yIZ*WHOUI%`j?tpD82B0!`1k#_R3j;pES<mAB`{(0hI&LR z8D9^NtU;h2c#Tu<ZKxm5&_~?^MN*AKl;gh@%7!Owehd~Q8P9=dzDA&VA8um3H}RY; zxW*3DJsips1e$*-K?RWdl2Fi>gc16Zt11F63;-3HG|XHB4@|+=LnXBcn3NB<u>ei7 z?LRrqMnD_E7$G!6EpI%zG27r7iCAS4p0fkr6({Of6)^Qsj)lmPUyrz_Ao0fu1aNHg z`{(qp0u*>xv%68+&NHHZO#xFA<=BfHA3>W_@JG<UIwUF)%iV=a?jlIG!r~7e?wMUb z9#y0+AyiO5)b7DOP4M4p5ziVVDghgc$0~2*{CIr1KH9YrZX(Uz<`UW|oF8L6k$)0> zsakaFbUk8Oj~p0gS`IT0^5|+jwu(qiO{BJ3z?vtJURy$J#o2;anR=ZI3SSoYY7kO| zw>knAO~9n0(KIyryr?=tq!xlzMqoP(&@Kab5aC-3iwV6IcnxDkI)a866tybQRZj$q zs-s2KEUYpbYl2GD1S~olt%hcL^5{$+?dn?mIq2SI4(=@m%Q3yZV#Lu|JW?6c&usR= zLC})94jTh~i<)Br;yHvi$>S)Ya@k4B4VSm}-3uvd&BLA7*mN~tb#iUHT907$NWm}@ z8|IFFe@$24HVfWt->#aUO(#?miU`4OTCL@=<#}|vC{14E=<@wF?dp%j;$J$_d@p3e zZ&!2Em&77%R#qP0m;2-W-|m?cGILNEcxj2B@x1=g*VeK;whoU@6Q${Z75x61cJ&AR zE~FiI%5Q#qN6px0Znuyw@cj@fQi}p#hOLUi<j#M8Ew%g^F;f+>zJdY1blRn^_q|fF z7vK7e)S^ZGdZ?Kyn)wr0MgiAXly+F;c!bA3%%d4rv6Z1eGmQ;Mp~z07ZTF4Q=w0A& zu~jkHA(luj2G${Jrio_i!D<vp-zN9n($=2IFFG$3H`XIUSjIhUeh)h%1?Q*WpKFnh zI>Ziqp()PTj%mP~2<l?bCkL9&3WN=ljKhX;twH{DjVLZ72KGcFAeITPC%3mc@z@Ii zJ`6K;hq-O_h;BVH(#`hjW|yVlUdf2!92}rY`tkmJFJ+SukL|6stm+>Y?!m!<eYl15 z67YpdSZ@NBYk)WC<GMyDM<10;AvUO$DOi6S;ft-j!DokZC3SghJsx|*Fw=LKtN;Bq z&5#_>m{TC4lXML;bFl;i4cYM9Sgt<aV1Vo1#(Ho4%XPqyg!@&0>hbg9xX5_D$Mi-y zTWClk)|7<v67hPZsva2|X66sGL}}MVQkrC-bR;~6UtdunD`2h>aABU*&?L<6&L3`} zryn3}gltoZ*2qL2Ai_kEom>Nw|Hrx<S=ha3%oNu!#S4#;;7Daqs+JJ;?0$Sb&3-Qq zsWn}ZwD1;Yw;Tbq7)j@`kAhx%Ix*^JJ6<&T$v*fX<=8MLHW3(C3AmbQh&bUWKZ&?U zzX}xHWS}A&UN@6q@;jrOZEs^K*;vyZsHuJ@1`rv-iECmBO;WmdB-^cYNOFqx)7q$? zd936&BF7kP$wjiDK0XsLItXf<$X5Oetgw0W`H<|ygURPaNol1-(Obrt$r@pu4r;(6 z8X+YcO+*M=-M$KfcpFyS!g}sKB%Ti0Pk8)VWBfIV?IlV{pmpKhnIyHiO9%2yIT3Ss ztbzr-Y<p3J9?=uyp<$XYgi;`+Ka6$2g7`Ia`ciWOASW#6u`b)*!=LuhArni~x&wcB zal8R!vTCavszCSW*L<*R(%%J6u3<lJUxz^Q7CL_X3U*`}Ia2Cm`s-|Q&*c60dZro+ zs%=x#?ayOJG{~nr57R*DL-wCsj!Q@SPs~WKeJ~`LzO<fxuVF7)<#MvhZ#RMRpPZ%k zHxoHSgUNvBHm&}vvc*FazUqri%Od9TSPiy!$&QT=mjV9p`gq66_Cmli^JR7C;~Dty zwEWCN(fZoxjSS|9c-5l5w;#NB`Pkbg705hqPTHhBhRUSo$(?a=w6?q2C{VlvSj-5G zI)lmGz*dEbXg5Skb5O1Is2Np2UoVgz&?X!GtJ5OZu2Jo?qe0AGR8*8L(>#WK<m3;m z$`5$PEzrmg*o>&};W2)(c3ZiVmN##E5@wKuZQFvMGr}+HfByg}k67=0uoEi&sYLoA zYIo(nI38=`;oq93qh*S~?9}7G0tM4ehr<OQ?qEuwc)LaVJ;T<a3C>TB7*A%3=SgU8 zLG`_dX|P`aN*Ywv(<v)RiPDk-vDN*ji~DjH^{uPT)f^Nur?h;cFZc`!i#dZY%8W67 zQQe%ugJtZ|qy4BYx@vLT7{(oI?7t7nq@h(~)#-f*I;v7Bi1U26Wt!QL=hN<^$%ue% zxSH5gNjTA_L`(^&Eq%O)y|LZcJq53bq8BC;f}cXeQ#y;BM%*Uj9ZZ3rg4Coz&kJ&4 zX~Gcvsg_D;YrNH$vV7|z`sjydt0RdZ2^sSc`-sO{do%lcd{yFJnXjfQwswiCv(BbP z0HVWd9d+SVagzjT*zpMXGE3+xj|CATYPJS`C9&ruA^hGKO7CNjE0{(kaRmD$U~*}P zi%qG68BXOjxCj2pv0!MRjWuT5@2m4}KnWMMaKaEyikc24K>T{DX`<pbCjPEEXdn^6 zMma=$^>sYIM$I*=31xKrg2B5bhoWhgAF{4!hjvTPY`q-5Dr5rMyPz#41nUVK6|}Ol zH;i<vFBW~)nj}3ZZtVTXGz0`JnWF;wI;%*Dwmsk1t1w<Kt@-ne>8<<1kp6p%4*P64 zy{cai%h9Lx=d<~3&6Fb<BL!T!P4d|0{t?t>YiXKRcmLTWMNwK96%n^kj&zib>3Q88 z@#D&v?RcL4eW>q3Zu`6Z@`iJSvgsUZqxWZJlg3wNlLDb^^1uD3I!MjN)<=I<IJNyl z;WYIYbt<WFT0&h33a5^Pk{3vYlWjcKfGcLyBTd6BOl~vQu8$@uApq!yxr%%xB07Kr zLoW!YzfY7#&(0YPlBm9THc9!Ww&B}{V}mw~h28}teqWS0x?hYLI%DtDYZ8ogL}M}0 z-pn<AsJ4sj@Y#y@J9lxViHZ}k`9au@9eBr<@2>-P+k=x(|9y{UOPhKN8x48J3YQGV zOnwneIir2p<BM}XlPxgFAL;i^)7l$qrtbIoUPJ*l&+ma&y?F|LxZ;?gx6KX_a6<-q z@#6zS%W`eY0;Kh4)U!pj+gAvCUxx&iv+|PhCy;mk+EZx6GQ@v3AzSmmP`pa63zCP+ zLM4N=56cb*;-n}FUJ}_PXHtA`0U?SCB}Gv)oeE__<eai(zKNn_{ve7f{Z~;`*k%2h zIr`{`9&C?5tk>5PZ`k&4ev;5En?bn9Uz<`N#m$kGk_=4Uc~(glYoqtfnAmEvh)Qi$ zUtI7dm)kvK>HafC=lXqbX&Ht}29Jt7uD51zJ+-r748-Mi+#X-Fi`kQ3VqNUbg&lLz z;>l3WFUbKSGd!?<4`KC1jxxe1B>^i~d^~u3NOV&0wIFZ1`-fvre(fVR%nkCyk%8oG z^0SItHpwrZzCiW<8{}yF`^1(w>36tjFrx^&mMTm{oY&VgP)D(sfc1(LQSFCgPQ%>N zG!D|S2bW`8qS9%@#2Kh}SFxt6;uX;%E+nnDc3glXtY?>6zB7-}R+Q}!6=Oq-lmvp@ zJ9n;|;Buz;&NEONTSb%>+3bP(hMC#*cxgSou$0IV`(NnOdn#j<ctff;J9Rhu_~0(W z@|D>VK9|+mO$QY%_*P0A86g<nu`hc3qPa~lJ>{=F+OM{vfK?)o&AXHcN4aiMz5M@F zY55oVT)BA1k-DM3cIj}G$IZV$QmJ==VKTD+?gIi-Kz5ISA1Y|s_Hm#fPr|Qjvu6!g z#U?w-Cj15X_@wKgxUssqZCZln|BOAzD&N5YCUs}Nk-t8xV2<ryfSQMdYU_6|7A*w} zgYP?35Jec0?WCdxBn0`2eICAyRgX-zsH%?Gi+lLlf{!Cd9t=P5$lz&?lDI>~X^o!c z2gCgHc^<m;+fh?zG;<d~I6$cF#>6cKC<i7fh9nXnD){znjknBTa+0y$&YW7e9(GOz z1b;9_s;HUPIHvTkA}91MAv%jU8q6sL!ZHYmFs~H+OAp(thyESB4X7f0^4r5r=4u>` zyEqj6Pv!1>lYj9D`4^A9^)FF79|SfNTs`?g+3FdU6;};WjsfZ(g58V2y#I79xnevv zXniUM;aq^1&RF8AfQ14kO~6$kUiH`yeBi%cOW!6$>i)aDzl8fS9+bQc6Q+ZOFN7H4 zKSnL%F-}0#kkPiit>xhy$%y|VW>K7ywDiS1<E`?(Jx4!6T;#)J=MFQ4!`webUtgoB zr7f2>3w1V}vj1<&wq4qs9ee)m)xQW6$<R`J*>2UOC7O4zN+2PO@yk1K`<-Ys5GO3K z2VfP5I;8dx%mibP(Y8xn1Jj(145n{Gqk$FB$1fY;Ga$J9*K5frav*QFu9!m4yVB9V zs$VMj7FKx+8%n@m+`@yCzP}D2lVFTfN|xF3Kn(uCA9){b6V0Mk4Adj*fT0~`t{did ze}7F^UqS3RLsjaMIJ8zOAg^R&@nAJ`#@VfC^hUI68-95se$L?gYsn~*ISTXW?C7=b zY`?)M@cXiA-VK-e5QVdV$G|GVFT=&ZUP~<}4@Au#N=ZA+m$bhFx}8S;5Mw@3>OV0b z#NybwGml^0a8B6c%T4`36NU-~ZzJBZ4Nn9%=QdUuj{~7y3nVrWYqQB<bN3*xG|S$2 zVQbhGf+dbx9hQuPFMZU_&g*7B`JURL9XmtBQp;5xn#vw{gBEV3F1~B1#e3gEZk^Al zWnvfmxSmhii#G4;(%gH)Vy&u>{y8-y=dm;P!I+NDNXLPs1Irl%n-skb@7Rd%0zM}Y zs0gew5Q~{EU`YXEM0WpN=%Eo7Ry7ph(CFNk+O^dv^1mRo7)PkFvC_oUc3;s}@xo}# z$vdxz`j-osQb0e7(&qEnG4+VTFjET{Mj#Vl6y%6es7VI3p~GypJ~(5`q@L^x1S$8g z%wAeJ);kyF0E@SpM>|HIoLMlBweOhnYrUdSH>k@5cdbP}!~->n<!(ed+i=%F%q~RK zKS?0{gzV7+bs#0JH|N$P@bAMg6E@+WuIV+J#56uBHMyw}JQIk>rUWc(m<bF65R`7o z$YPX3ML9EgYy}`vCy+&7nA|)7MQ>s;iP(W{z(eA$;UdQ?BAaE<T9mVz$36gMr;=q~ zncSQYW&eVpy_f=N8wHt=S%Xp?#JM+>S4}ay>_KwofoWBf`p(b0ao`aTL|`%S1bZIx zsGi>Y8mL7)XBTRGMI@Ee`3F^ieiU(zg)SDYsqEkO4-H?po`7ZfN`Ua{Q%oM+8TxIB zNKIE5B@Mrf?q!p(0yM7`AtGZ?%~|{^m<}h}dzh=V!P{9mw;m7G4pl!}34b*}*Q^8v z5xB$euO%&>{*lOkG8#Ax=U7#7k?5L5!0VD{uc}d2S5cJO%ZdD(m{!^)5gop7QTc!z z$isn6<SQ|G$k3@2ycU{994aG!2FbANLU_$|VNPQ~?eLo*g%$%g@^a4kC81_(^}y)I z%{xF5&~q;GfH-eV#6ctRA^|gqHbuRE4HOe81|rUd6a#6qTwSfLGPT*u;6&+3Z6I$8 z8(ULCS?G(BlONlC;^ldW_OdtZpwr;iTFO~Jr{FE^=8(H-H(mip-Rkj^kW83OOzQo6 zJ0x>~!h#e)>G3d$*04~IpP#41L(?-ZA0(1J`uKxgpd3ciR&yZpp@=}9{6!MR0S@Io z>9#B^<lo*PPPQU#@z07cUW*!PF=b|F`K<pP__mPkL~030v4wEzYd0?4VM(?D1h&5Q zxIUz7NR`!_hK2wO`K`rv@@kkBGkLfCW}UGT>BGhcR|uE}M4oE-c%G^<nMn318Ss-F zcub7qNs`bxIeO{$?A5Jh%C_^^C!oQ*h<quLyyGh=!O5z6r1_s|v%{0z&}YRN?svlT zUc6R3FG$AWNMv~+ku0Pe6QcvFh2GsbA+!FLq?3mv-K;Kr*y`#A_LBA!wxW%M(EMa~ zUFP&w+3P?&2b~s^iO(VHMH?}f%VKLFaB2TIU2OJBGWXCtx6{)c<zIfT->fskX|zr& zI(Vj5bjU1qD$vi6=&MDDBqNBRg>@SIkRO3;{AZFe5z=5Lt>a?EnITkCjCkaidL&L| z>7|WCPr18@b~m+4N8Q14!BTuxtgLjhnkO~ON!_W#z&kq4^@JDWHI31y`!wB0p{+TQ zDfj&Kj{+8)vg;u8%I*+r3L%RdCh7;aXZ*zN{d>VMD~2ztje;PHWm(Yq6Xs{_cE~)I zJ4@59>sd)+OVOsQdLC+!e6{wJnTgm_49t@8&yONa^ax4=@m7I@-rugi<t?vExj8BR z#9kX~p7;1SA%{pD0ih*T;MV)9q+<~rsYla?YFhbYJ&D#ov~Nc<t2b@RCwY=68yMaD zTZkUhJ&DmZ1*L|pGFA4=LV(*_zfVFhw;6J;A@bqG=RPS*CNKY2?_;sDAQJzSwRV+P z_{iaCHA>aJMNCbQ_rXbqcn1v5%~@HPnwm=ZAN}+`d(9=I0?OL7U?RkkfWwOcIpbO5 zT(?hCp^EA_-2@l@#CT7QcH-?143H4llLv@;*Lw_DQQ{A1Oz&%-#uyUQPs3m3{_)o{ z)xwy#I4WiB5zw*h)8QV3hupg|{*WtT2{HkjaLXVf_`#vfNtETQutVOX11%=ggcEAc zHuAw3NyUQ#D|EbER>fyqQ~!z$F5M>kl0x8dYiuhaVNN6Dyow}3Hfb$X#T2I${#qQR z4_{<5IpcyFC2F5t!3j`!?1blu;zo~c0}^kM1t<`OpFnIO;a?Tbxmt>c7=9{RFPsp0 z#Rs%#5{AHo-5cjzLAo)`EcNgdEyw2Rl(UYUREw7K3rkXeLZ?9KV4wNtpfpIs0!iy~ z!s#RkNale=bB>;PKtJgWMN>w~dC=a=%S%{nqN7{f);_K9So@9z<Uw^Q*<b=+kRQcw zUndB%(7)f9@sCmY`^`gt55@Qf`Cq?}Y5>o)D+BtELJ1T<P<r@SdjiFc2-L_=`fLbz z$dCUGh{(o2eW$+-zLnC_Z@=6Cq3rnQEqnvt_@~eaXxs76-&Ion9!tvKi-<z`d-qWO lHX9Vm-}aL7|FffzcrKfv93Q@_lW=d_wis<r-DLIq{{a(V9vuJx diff --git a/docs/_static/composability/diagram_q2.png b/docs/_static/composability/diagram_q2.png deleted file mode 100644 index f89af4216df9e549bb5a6105709667c2bd9151de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55410 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 aAR!X8B}|<t;U3UfXsPR|<z2n^$A17B)xUNC diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index e82983c97..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Configuration for sphinx.""" -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import sphinx_rtd_theme # noqa: F401 - -sys.path.insert(0, os.path.abspath("../")) - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information - - -project = "GPT Index" -copyright = "2022, Jerry Liu" -author = "Jerry Liu" - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.coverage", - "sphinx.ext.autodoc.typehints", - "sphinx.ext.autosummary", - "sphinx.ext.napoleon", - "sphinx_rtd_theme", - "sphinx.ext.mathjax", - "myst_parser", -] - -templates_path = ["_templates"] -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - - -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output - -html_theme = "sphinx_rtd_theme" -html_static_path = ["_static"] diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md deleted file mode 100644 index 676e9d36b..000000000 --- a/docs/getting_started/installation.md +++ /dev/null @@ -1,20 +0,0 @@ -# Installation and Setup - -### Installation from Pip - -You can simply do: -``` -pip install gpt-index -``` - -### Installation from Source -Git clone this repository: `git clone git@github.com:jerryjliu/gpt_index.git`. Then do: - -- `pip install -e .` if you want to do an editable install (you can modify source files) of just the package itself. -- `pip install -r requirements.txt` if you want to install optional dependencies + dependencies used for development (e.g. unit testing). - - -### Environment Setup - -By default, we use the OpenAI GPT-3 `text-davinci-002` model. In order to use this, you must have an OPENAI_API_KEY setup. -You can register an API key by logging into [OpenAI's page and creating a new API token](https://beta.openai.com/account/api-keys) diff --git a/docs/getting_started/overview.rst b/docs/getting_started/overview.rst deleted file mode 100644 index 25a789daf..000000000 --- a/docs/getting_started/overview.rst +++ /dev/null @@ -1,4 +0,0 @@ -Overview -===================================== - -This section shows you how to quickly get up and running with GPT Index. diff --git a/docs/getting_started/starter_example.md b/docs/getting_started/starter_example.md deleted file mode 100644 index d75a8532a..000000000 --- a/docs/getting_started/starter_example.md +++ /dev/null @@ -1,69 +0,0 @@ -# Starter Tutorial - -Here is a starter example for using GPT Index. Make sure you've followed the [installation](installation.md) steps first. - - -### Download -GPT Index examples can be found in the `examples` folder of the GPT Index repository. -We first want to download this `examples` folder. An easy way to do this is to just clone the repo: - -```bash -$ git clone git@github.com:jerryjliu/gpt_index.git -``` - -Next, navigate to your newly-cloned repository, and verify the contents: - -```bash -$ cd gpt_index -$ ls -LICENSE data_requirements.txt tests/ -MANIFEST.in examples/ pyproject.toml -Makefile experimental/ requirements.txt -README.md gpt_index/ setup.py -``` - - -We now want to navigate to the following folder: -```bash -$ cd examples/paul_graham_essay -``` - -This contains GPT Index examples around Paul Graham's essay, ["What I Worked On"](http://paulgraham.com/worked.html). A comprehensive set of examples are already provided in `TestEssay.ipynb`. For the purposes of this tutorial, we can focus on a simple example of getting GPT Index up and running. - - -### Build and Query Index -Create a new `.py` file with the following: - -```python -from gpt_index import GPTTreeIndex, SimpleDirectoryReader -from IPython.display import Markdown, display - -documents = SimpleDirectoryReader('data').load_data() -index = GPTTreeIndex(documents) -``` - -This builds an index over the documents in the `data` folder (which in this case just consists of the essay text). We then run the following -```python -response = index.query("What did the author do growing up?") -print(response) -``` - -You should get back a response similar to the following: `The author wrote short stories and tried to program on an IBM 1401.` - -### Saving and Loading - -To save to disk and load from disk, do - -```python -# save to disk -index.save_to_disk('index.json') -# load from disk -index = GPTTreeIndex.load_from_disk('index.json') -``` - - -### Next Steps - -That's it! For more information on GPT Index features, please check out the numerous "How-To Guides" to the left. -Additionally, if you would like to play around with Example Notebooks, check out [this link](/reference/example_notebooks.rst). - diff --git a/docs/how_to/composability.md b/docs/how_to/composability.md deleted file mode 100644 index 6b46516f3..000000000 --- a/docs/how_to/composability.md +++ /dev/null @@ -1,53 +0,0 @@ -# Composability - - -GPT Index offers **composability** of your indices, meaning that you can build indices on top of other indices. This allows you to more effectively index your entire document tree in order to feed custom knowledge to GPT. - -Composability allows you to to define lower-level indices for each document, and higher-order indices over a collection of documents. To see how this works, imagine defining 1) a tree index for the text within each document, and 2) a list index over each tree index (one document) within your collection. - -To see how this works, imagine you have 3 documents: `doc1`, `doc2`, and `doc3`. - -```python -doc1 = SimpleDirectoryReader('data1').load_data() -doc2 = SimpleDirectoryReader('data2').load_data() -doc3 = SimpleDirectoryReader('data3').load_data() -``` - - - -Now let's define a tree index for each document. In Python, we have: - -```python -index1 = GPTTreeIndex(doc1) -index2 = GPTTreeIndex(doc2) -index2 = GPTTreeIndex(doc2) -``` - - - -We can then create a list index on these 3 tree indices: - -```python -list_index = GPTListIndex([index1, index2, index3]) -``` - - - -During a query, we would start with the top-level list index. Each node in the list corresponds to an underlying tree index. - -```python -response = list_index.query("Where did the author grow up?") -``` - - - -So within a node, instead of fetching the text, we would recursively query the stored tree index to retrieve our answer. - - - -NOTE: You can stack indices as many times as you want, depending on the hierarchies of your knowledge base! - - -We can take a look at a code example below as well. We first build two tree indices, one over the Wikipedia NYC page, and the other over Paul Graham's essay. We then define a keyword extractor index over the two tree indices. - -[Here is an example notebook](https://github.com/jerryjliu/gpt_index/blob/main/examples/composable_indices/ComposableIndices.ipynb). diff --git a/docs/how_to/cost_analysis.md b/docs/how_to/cost_analysis.md deleted file mode 100644 index 891060b24..000000000 --- a/docs/how_to/cost_analysis.md +++ /dev/null @@ -1,39 +0,0 @@ -# Cost Analysis - -Each call to an LLM will cost some amount of money - for instance, OpenAI's Davinci costs $0.02 / 1k tokens. The cost of building an index and querying depends on -1. the type of LLM used -2. the type of data structure used -3. parameters used during building -4. parameters used during querying - -The cost of building and querying each index is a TODO in the reference documentation. In the meantime, here is a high-level overview of the cost structure of the indices. - -### Index Building - - -#### Indices with no LLM calls -The following indices don't require LLM calls at all during building (0 cost): -- `GPTListIndex` -- `GPTSimpleKeywordTableIndex` - uses a regex keyword extractor to extract keywords from each document -- `GPTRAKEKeywordTableIndex` - uses a RAKE keyword extractor to extract keywords from each document - -#### Indices with LLM calls -The following indices do require LLM calls during build time: -- `GPTTreeIndex` - use LLM to hierarchically summarize the text to build the tree -- `GPTKeywordTableIndex` - use LLM to extract keywords from each document - - -### Query Time - -There will always be >= 1 LLM call during query time, in order to synthesize the final answer. -Some indices contain cost tradeoffs between index building and querying. `GPTListIndex`, for instance, -is free to build, but running a query over a list index (without filtering or embedding lookups), will -call the LLM {math}`N` times. - -Here are some notes regarding each of the indices: -- `GPTListIndex`: by default requires {math}`N` LLM calls, where N is the number of nodes. - - However, can do `index.query(..., keyword="<keyword>")` to filter out nodes that don't contain the keyword -- `GPTTreeIndex`: by default requires {math}`\log (N)` LLM calls, where N is the number of leaf nodes. - - Setting `child_branch_factor=2` will be more expensive than the default `child_branch_factor=1` (polynomial vs logarithmic), because we traverse 2 children instead of just 1 for each parent node. -- `GPTKeywordTableIndex`: by default requires an LLM call to extract query keywords. - - Can do `index.query(..., mode="simple")` or `index.query(..., mode="rake")` to also use regex/RAKE keyword extractors on your query text. \ No newline at end of file diff --git a/docs/how_to/custom_llms.md b/docs/how_to/custom_llms.md deleted file mode 100644 index 99581ef4b..000000000 --- a/docs/how_to/custom_llms.md +++ /dev/null @@ -1,43 +0,0 @@ -# Defining LLMs - -The goal of GPT Index is to provide a toolkit of data structures that can organize external information in a manner that -is easily compatible with the prompt limitations of an LLM. Therefore LLMs are always used to construct the final -answer. -Depending on the [type of index](/reference/indices.rst) being used, -LLMs may also be used during index construction, insertion, and query traversal. - -GPT Index uses Langchain's [LLM](https://langchain.readthedocs.io/en/latest/modules/llms.html) -and [LLMChain](https://langchain.readthedocs.io/en/latest/modules/chains.html) module to define -the underlying abstraction. We introduce a wrapper class, -[`LLMPredictor`](/reference/llm_predictor.rst), for integration into GPT Index. - -By default, we use OpenAI's `text-davinci-002` model. But you may choose to customize -the underlying LLM being used. - - -## Example - -An example snippet of customizing the LLM being used is shown below. -In this example, we use `text-davinci-003` instead of `text-davinci-002`. Note that -you may plug in any LLM shown on Langchain's -[LLM](https://langchain.readthedocs.io/en/latest/modules/llms.html) page. - - -```python - -from gpt_index import GPTKeywordTableIndex, SimpleDirectoryReader, LLMPredictor -from langchain import OpenAI - -# define LLM -llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-002")) - -# load index from disk -index = GPTKeywordTableIndex.load_from_disk('index_table.json', llm_predictor=llm_predictor) - -# get response from query -response = index.query("What did the author do after his time at Y Combinator?") - -``` - -In this snipet, the index has already been created and saved to disk. We load -the existing index, and swap in a new `LLMPredictor` that is used during query time. \ No newline at end of file diff --git a/docs/how_to/custom_prompts.md b/docs/how_to/custom_prompts.md deleted file mode 100644 index f1cf36c14..000000000 --- a/docs/how_to/custom_prompts.md +++ /dev/null @@ -1,54 +0,0 @@ -# Defining Prompts - -Prompting is the fundamental input that gives LLMs their expressive power. GPT Index uses prompts to build the index, do insertion, -perform traversal during querying, and to synthesize the final answer. - -GPT Index uses a finite set of *prompt types*, described [here](/reference/prompts.rst). -All index classes, along with their associated queries, utilize a subset of these prompts. The user may provide their own prompt. -If the user does not provide their own prompt, default prompts are used. - -An API reference of all index classes and query classes are found below. The definition of each index class and query -contains optional prompts that the user may pass in. -- [Indices](/reference/indices.rst) -- [Queries](/reference/query.rst) - - -### Example - -An example can be found in [this notebook](https://github.com/jerryjliu/gpt_index/blob/main/examples/paul_graham_essay/TestEssay.ipynb). - -The corresponding snippet is below. We show how to define a custom Summarization Prompt that not only -contains a `text` field, but also `query_str` field during construction of `GPTTreeIndex`, so that -the answer to the query can be simply synthesized from the root nodes. - -```python - -from gpt_index import Prompt, GPTTreeIndex, SimpleDirectoryReader - -# load documents -documents = SimpleDirectoryReader('data').load_data() -# define custom prompt -query_str = "What did the author do growing up?" -summary_prompt_tmpl = ( - "Context information is below. \n" - "---------------------\n" - "{text}" - "\n---------------------\n" - "Given the context information and not prior knowledge, " - "answer the question: {query_str}\n" -) - -summary_prompt = Prompt( - input_variables=["query_str", "text"], - template=DEFAULT_TEXT_QA_PROMPT_TMPL -) -# Build GPTTreeIndex: pass in custom prompt, also pass in query_str -index_with_query = GPTTreeIndex(documents, summary_template=summary_prompt, query_str=query_str) - -``` - -Once the index is built, we can retrieve our answer: -```python -# directly retrieve response from root nodes instead of traversing tree -response = index_with_query.query(query_str, mode="retrieve") -``` diff --git a/docs/how_to/data_connectors.md b/docs/how_to/data_connectors.md deleted file mode 100644 index d9b39b3ba..000000000 --- a/docs/how_to/data_connectors.md +++ /dev/null @@ -1,13 +0,0 @@ -# Data Connectors - -We currently offer connectors into the following data sources. External data sources are retrieved through their APIs + corresponding authentication token. -The API reference documentation can be found [here](/reference/readers.rst). - -- [Notion](https://developers.notion.com/) (`NotionPageReader`) -- [Google Docs](https://developers.google.com/docs/api) (`GoogleDocsReader`) -- [Slack](https://api.slack.com/) (`SlackReader`) -- MongoDB (`SimpleMongoReader`) -- Wikipedia (`WikipediaReader`) -- local file directory (`SimpleDirectoryReader`) - -We offer [example notebooks of connecting to different data sources](https://github.com/jerryjliu/gpt_index/tree/main/examples/data_connectors). Please check them out! \ No newline at end of file diff --git a/docs/how_to/embeddings.md b/docs/how_to/embeddings.md deleted file mode 100644 index cc713330d..000000000 --- a/docs/how_to/embeddings.md +++ /dev/null @@ -1,27 +0,0 @@ -# Embedding support - -GPT Index provides embedding support to our tree and list indices. In addition to each node storing text, each node can optionally store an embedding. -During query-time, we can use embeddings to do max-similarity retrieval of nodes before calling the LLM to synthesize an answer. -Since similarity lookup using embeddings (e.g. using cosine similarity) does not require a LLM call, embeddings serve as a cheaper lookup mechanism instead -of using LLMs to traverse nodes. - -NOTE: we currently support OpenAI embeddings. External embeddings are coming soon! - -**How are Embeddings Generated?** - -Embeddings are lazily generated and then cached at query time (if mode="embedding" is specified during `index.query`), and not during index construction. -This design choice prevents the need to generate embeddings for all text chunks during index construction. - -**Embedding Lookups** -For the list index: -- We iterate through every node in the list, and identify the top k nodes through embedding similarity. We use these nodes to synthesize an answer. -- See the [List Query API](/reference/indices/list_query.rst) for more details. - -For the tree index: -- We start with the root nodes, and traverse down the tree by picking the child node through embedding similarity. -- See the [Tree Query API](/reference/indices/tree_query.rst) for more details. - -**Example Notebook** - -An example notebook is given [here](https://github.com/jerryjliu/gpt_index/blob/main/examples/test_wiki/TestNYC_Embeddings.ipynb). - diff --git a/docs/how_to/insert.md b/docs/how_to/insert.md deleted file mode 100644 index 3b28eb8f7..000000000 --- a/docs/how_to/insert.md +++ /dev/null @@ -1,5 +0,0 @@ -# Insert Capabilities - -Every GPT Index data structure allows insertion. - -An example notebook showcasing our insert capabilities is given [here](https://github.com/jerryjliu/gpt_index/blob/main/examples/paul_graham_essay/InsertDemo.ipynb). \ No newline at end of file diff --git a/docs/how_to/overview.rst b/docs/how_to/overview.rst deleted file mode 100644 index 1c6cc0c6d..000000000 --- a/docs/how_to/overview.rst +++ /dev/null @@ -1,4 +0,0 @@ -Overview -===================================== - -The how-to section contains guides on some of the core features of GPT Index: diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 081304af6..000000000 --- a/docs/index.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. GPT Index documentation master file, created by - sphinx-quickstart on Sun Dec 11 14:30:34 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to GPT Index! -===================================== - -GPT Index is a project consisting of a set of data structures that are created using LLMs and can be traversed using LLMs in order to answer queries. - -The Github project page is here: https://github.com/jerryjliu/gpt_index. - -The pypi package is here: https://pypi.org/project/gpt-index/. - - -🚀 Overview ------------ - -Context -^^^^^^^ -- LLMs are a phenomenonal piece of technology for knowledge generation and reasoning. -- A big limitation of LLMs is context size (e.g. Davinci's limit is 4096 tokens. Large, but not infinite). -- The ability to feed "knowledge" to LLMs is restricted to this limited prompt size and model weights. -- **Thought**: What if LLMs can have access to potentially a much larger database of knowledge without retraining/finetuning? - -Proposed Solution -^^^^^^^^^^^^^^^^^ -That's where the **GPT Index** comes in. GPT Index is a simple, flexible interface between your external data and LLMs. It resolves the following pain points: - -- Provides simple data structures to resolve prompt size limitations. -- Offers data connectors to your external data sources. -- Offers you a comprehensive toolset trading off cost and performance. - -At the core of GPT Index is a **data structure**. Instead of relying on world knowledge encoded in the model weights, a GPT Index data structure does the following: - -- Uses a pre-trained LLM primarily for *reasoning*/*summarization* instead of prior knowledge. -- Takes as input a large corpus of text data and build a structured index over it (using an LLM or heuristics). -- Allow users to *query* the index in order to synthesize an answer to the question - this requires both *traversal* of the index as well as a synthesis of the answer. - - -.. toctree:: - :maxdepth: 1 - :caption: Getting Started - - getting_started/overview.rst - getting_started/installation.md - getting_started/starter_example.md - - -.. toctree:: - :maxdepth: 1 - :caption: How To - - how_to/overview.rst - how_to/data_connectors.md - how_to/composability.md - how_to/insert.md - how_to/cost_analysis.md - how_to/embeddings.md - how_to/custom_prompts.md - how_to/custom_llms.md - - -.. toctree:: - :maxdepth: 1 - :caption: Reference - - reference/overview.rst - reference/indices.rst - reference/query.rst - reference/readers.rst - reference/prompts.rst - reference/example_notebooks.rst - reference/llm_predictor.rst - diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 32bb24529..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/reference/example_notebooks.rst b/docs/reference/example_notebooks.rst deleted file mode 100644 index df5e3e58b..000000000 --- a/docs/reference/example_notebooks.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _Ref-Example-Notebooks: - -Example Notebooks -================= - -We offer a wide variety of example notebooks. They are referenced throughout the documentation. - -Example notebooks are found `here <https://github.com/jerryjliu/gpt_index/tree/main/examples>`_. \ No newline at end of file diff --git a/docs/reference/indices.rst b/docs/reference/indices.rst deleted file mode 100644 index 89a8b7fcd..000000000 --- a/docs/reference/indices.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. _Ref-Indices: - -Indices -======= - -This doc shows both the overarching class used to represent an index. These -classes allow for index creation, insertion, and also querying. - -.. toctree:: - :maxdepth: 1 - :caption: Index Data Structures - - indices/list.rst - indices/table.rst - indices/tree.rst diff --git a/docs/reference/indices/list.rst b/docs/reference/indices/list.rst deleted file mode 100644 index 65c0ea734..000000000 --- a/docs/reference/indices/list.rst +++ /dev/null @@ -1,9 +0,0 @@ -List Index -========== - -Building the List Index - -.. automodule:: gpt_index.indices.list - :members: - :inherited-members: - :exclude-members: delete, docstore, index_struct, index_struct_cls \ No newline at end of file diff --git a/docs/reference/indices/list_query.rst b/docs/reference/indices/list_query.rst deleted file mode 100644 index fa65e4498..000000000 --- a/docs/reference/indices/list_query.rst +++ /dev/null @@ -1,7 +0,0 @@ -Querying a List Index -===================== - -.. automodule:: gpt_index.indices.query.list - :members: - :inherited-members: - :exclude-members: index_struct, query, set_llm_predictor, set_prompt_helper \ No newline at end of file diff --git a/docs/reference/indices/table.rst b/docs/reference/indices/table.rst deleted file mode 100644 index bdda65a5d..000000000 --- a/docs/reference/indices/table.rst +++ /dev/null @@ -1,8 +0,0 @@ -Table Index -=========== - -Building the Keyword Table Index - -.. automodule:: gpt_index.indices.keyword_table - :members: - :inherited-members: \ No newline at end of file diff --git a/docs/reference/indices/table_query.rst b/docs/reference/indices/table_query.rst deleted file mode 100644 index abcb62a70..000000000 --- a/docs/reference/indices/table_query.rst +++ /dev/null @@ -1,7 +0,0 @@ -Querying a Keyword Table Index -============================== - -.. automodule:: gpt_index.indices.query.keyword_table - :members: - :inherited-members: - :exclude-members: index_struct, query, set_llm_predictor, set_prompt_helper \ No newline at end of file diff --git a/docs/reference/indices/tree.rst b/docs/reference/indices/tree.rst deleted file mode 100644 index 5e582f92a..000000000 --- a/docs/reference/indices/tree.rst +++ /dev/null @@ -1,8 +0,0 @@ -Tree Index -========== - -Building the Tree Index - -.. automodule:: gpt_index.indices.tree - :members: - :inherited-members: \ No newline at end of file diff --git a/docs/reference/indices/tree_query.rst b/docs/reference/indices/tree_query.rst deleted file mode 100644 index 46f5e67f5..000000000 --- a/docs/reference/indices/tree_query.rst +++ /dev/null @@ -1,7 +0,0 @@ -Querying a Tree Index -===================== - -.. automodule:: gpt_index.indices.query.tree - :members: - :inherited-members: - :exclude-members: index_struct, query, set_llm_predictor, set_prompt_helper \ No newline at end of file diff --git a/docs/reference/llm_predictor.rst b/docs/reference/llm_predictor.rst deleted file mode 100644 index ffc096c78..000000000 --- a/docs/reference/llm_predictor.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _Ref-LLM-Predictor: - -LLMPredictor -================= - -Our LLMPredictor is a wrapper around Langchain's `LLMChain` that allows easy integration into GPT Index. - -.. automodule:: gpt_index.langchain_helpers.chain_wrapper - :members: - :inherited-members: diff --git a/docs/reference/overview.rst b/docs/reference/overview.rst deleted file mode 100644 index b5ef28e5b..000000000 --- a/docs/reference/overview.rst +++ /dev/null @@ -1,4 +0,0 @@ -Overview -===================================== - -The reference section contains comprehensive API documentation over all index data structures, and query modes. diff --git a/docs/reference/prompts.rst b/docs/reference/prompts.rst deleted file mode 100644 index eb8c0cfda..000000000 --- a/docs/reference/prompts.rst +++ /dev/null @@ -1,70 +0,0 @@ -.. _Prompt-Templates: - -Prompt Templates -================= - -These are the reference prompt templates. -We then document all prompts, with their required variables. - -We then show the base prompt class, -derived from `Langchain <https://langchain.readthedocs.io/en/latest/modules/prompt.html>`_. - - -**Summarization Prompt** - -- Prompt to summarize the provided `text`. -- input variables: `["text"]` - -**Tree Insert Prompt** - -- Prompt to insert a new chunk of text `new_chunk_text` into the tree index. More specifically, - this prompt has the LLM select the relevant candidate child node to continue tree traversal. -- input variables: `["num_chunks", "context_list", "new_chunk_text"]` - -**Question-Answer Prompt** - -- Prompt to answer a question `query_str` given a context `context_str`. -- input variables: `["context_str", "query_str"]` - -**Refinement Prompt** - -- Prompt to refine an existing answer `existing_answer` given a context `context_msg`, - and a query `query_str`. -- input variables: `["query_str", "existing_answer", "context_msg"]` - -**Keyword Extraction Prompt** - -- Prompt to extract keywords from a text `text` with a maximum of `max_keywords` keywords. -- input variables: `["text", "max_keywords"]` - -**Query Keyword Extraction Prompt** - -- Prompt to extract keywords from a query `query_str` with a maximum of `max_keywords` keywords. -- input variables: `["question", "max_keywords"]` - - -**Tree Select Query Prompt** - -- Prompt to select a candidate child node out of all child nodes provided in `context_list`, - given a query `query_str`. `num_chunks` is the number of child nodes in `context_list`. - -- input variables: `["num_chunks", "context_list", "query_str"]` - - -**Tree Select Query Prompt (Multiple)** - -- Prompt to select multiple candidate child nodes out of all child nodes provided in `context_list`, - given a query `query_str`. `branching_factor` refers to the number of child nodes to select, and - `num_chunks` is the number of child nodes in `context_list`. - -- input variables: `["num_chunks", "context_list", "query_str", "branching_factor"]` - - -**Base Prompt Class** - -.. automodule:: gpt_index.prompts - :members: - :inherited-members: - :exclude-members: Config, construct, copy, dict, from_examples, from_file, get_full_format_args, output_parser, save, template, template_format, update_forward_refs, validate_variable_names, json, template_is_valid - - diff --git a/docs/reference/query.rst b/docs/reference/query.rst deleted file mode 100644 index 84525694f..000000000 --- a/docs/reference/query.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. _Ref-Query: - -Querying an Index -================= - -This doc specifically shows the classes that are used to query indices. - -.. toctree:: - :maxdepth: 1 - :caption: Query classes - - indices/list_query.rst - indices/table_query.rst - indices/tree_query.rst diff --git a/docs/reference/readers.rst b/docs/reference/readers.rst deleted file mode 100644 index 8fc062f54..000000000 --- a/docs/reference/readers.rst +++ /dev/null @@ -1,6 +0,0 @@ -Data Connectors -=============== - -.. automodule:: gpt_index.readers - :members: - :inherited-members: \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 0d0e6022f..000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -sphinx -sphinx_rtd_theme -myst-parser \ No newline at end of file diff --git a/gpt_index/__init__.py b/gpt_index/__init__.py index d024cd75d..53553541b 100644 --- a/gpt_index/__init__.py +++ b/gpt_index/__init__.py @@ -6,14 +6,13 @@ with open(Path(__file__).absolute().parents[0] / "VERSION") as _f: __version__ = _f.read().strip() +from gpt_index.indices.keyword_table.base import GPTKeywordTableIndex +from gpt_index.indices.keyword_table.rake_base import GPTRAKEKeywordTableIndex +from gpt_index.indices.keyword_table.simple_base import GPTSimpleKeywordTableIndex +from gpt_index.indices.list.base import GPTListIndex + # indices -from gpt_index.indices.keyword_table import ( - GPTKeywordTableIndex, - GPTRAKEKeywordTableIndex, - GPTSimpleKeywordTableIndex, -) -from gpt_index.indices.list import GPTListIndex -from gpt_index.indices.tree import GPTTreeIndex +from gpt_index.indices.tree.base import GPTTreeIndex # langchain helper from gpt_index.langchain_helpers.chain_wrapper import LLMPredictor diff --git a/gpt_index/indices/__init__.py b/gpt_index/indices/__init__.py index 10f6e05ee..0eee67e42 100644 --- a/gpt_index/indices/__init__.py +++ b/gpt_index/indices/__init__.py @@ -1,16 +1 @@ -"""GPT Index data structures.""" - -# indices -from gpt_index.indices.keyword_table.base import GPTKeywordTableIndex -from gpt_index.indices.keyword_table.rake_base import GPTRAKEKeywordTableIndex -from gpt_index.indices.keyword_table.simple_base import GPTSimpleKeywordTableIndex -from gpt_index.indices.list.base import GPTListIndex -from gpt_index.indices.tree.base import GPTTreeIndex - -__all__ = [ - "GPTKeywordTableIndex", - "GPTSimpleKeywordTableIndex", - "GPTRAKEKeywordTableIndex", - "GPTListIndex", - "GPTTreeIndex", -] +"""Init file for indices.""" diff --git a/gpt_index/indices/base.py b/gpt_index/indices/base.py index 915fddbd1..43c7eab83 100644 --- a/gpt_index/indices/base.py +++ b/gpt_index/indices/base.py @@ -152,17 +152,7 @@ class BaseGPTIndex(Generic[IS]): mode: str = DEFAULT_MODE, **query_kwargs: Any ) -> str: - """Answer a query. - - When `query` is called, we query the index with the given `mode` and - `query_kwargs`. The `mode` determines the type of query to run, and - `query_kwargs` are parameters that are specific to the query type. - - For a comprehensive documentation of available `mode` and `query_kwargs` to - query a given index, please visit :ref:`Ref-Query`. - - - """ + """Answer a query.""" # TODO: remove _mode_to_query and consolidate with query_runner if mode == "recursive": if "query_configs" not in query_kwargs: @@ -185,20 +175,7 @@ class BaseGPTIndex(Generic[IS]): @classmethod def load_from_disk(cls, save_path: str, **kwargs: Any) -> "BaseGPTIndex": - """Load index from disk. - - This method loads the index from a JSON file stored on disk. The index data - structure itself is preserved completely. If the index is defined over - subindices, those subindices will also be preserved (and subindices of - those subindices, etc.). - - Args: - save_path (str): The save_path of the file. - - Returns: - BaseGPTIndex: The loaded index. - - """ + """Load from disk.""" with open(save_path, "r") as f: result_dict = json.load(f) index_struct = cls.index_struct_cls.from_dict(result_dict["index_struct"]) @@ -206,14 +183,7 @@ class BaseGPTIndex(Generic[IS]): return cls(index_struct=index_struct, docstore=docstore, **kwargs) def save_to_disk(self, save_path: str) -> None: - """Save to file. - - This method stores the index into a JSON file stored on disk. - - Args: - save_path (str): The save_path of the file. - - """ + """Safe to file.""" out_dict: Dict[str, dict] = { "index_struct": self.index_struct.to_dict(), "docstore": self.docstore.to_dict(), diff --git a/gpt_index/indices/keyword_table/__init__.py b/gpt_index/indices/keyword_table/__init__.py index 43a973b9b..1d4640565 100644 --- a/gpt_index/indices/keyword_table/__init__.py +++ b/gpt_index/indices/keyword_table/__init__.py @@ -1,12 +1 @@ -"""Keyword Table Index Data Structures.""" - -# indices -from gpt_index.indices.keyword_table.base import GPTKeywordTableIndex -from gpt_index.indices.keyword_table.rake_base import GPTRAKEKeywordTableIndex -from gpt_index.indices.keyword_table.simple_base import GPTSimpleKeywordTableIndex - -__all__ = [ - "GPTKeywordTableIndex", - "GPTSimpleKeywordTableIndex", - "GPTRAKEKeywordTableIndex", -] +"""Init file.""" diff --git a/gpt_index/indices/keyword_table/base.py b/gpt_index/indices/keyword_table/base.py index 70f1556dc..640f40217 100644 --- a/gpt_index/indices/keyword_table/base.py +++ b/gpt_index/indices/keyword_table/base.py @@ -39,26 +39,7 @@ DQKET = DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE class BaseGPTKeywordTableIndex(BaseGPTIndex[KeywordTable]): - """GPT Keyword Table Index. - - This index extracts keywords from the text, and maps each - keyword to the node(s) that it corresponds to. In this sense it mimicks a - "hash table". During index construction, the keyword table is constructed - by extracting keywords from each node and creating an internal mapping. - - During query time, the keywords are extracted from the query text, and these - keywords are used to index into the keyword table. The retrieved nodes - are then used to answer the query. - - Args: - keyword_extract_template (Optional[Prompt]): A Keyword Extraction Prompt - (see :ref:`Prompt-Templates`). - max_keywords_per_query (int): The maximum number of keywords to extract - per query. - max_keywords_per_query (int): The maximum number of keywords to extract - per chunk. - - """ + """Base GPT Index.""" index_struct_cls = KeywordTable @@ -170,7 +151,7 @@ class BaseGPTKeywordTableIndex(BaseGPTIndex[KeywordTable]): class GPTKeywordTableIndex(BaseGPTKeywordTableIndex): """GPT Keyword Table Index. - This index uses a GPT model to extract keywords from the text. + Uses GPT to build keyword table. """ diff --git a/gpt_index/indices/keyword_table/rake_base.py b/gpt_index/indices/keyword_table/rake_base.py index 61b26ce6d..b610e3a54 100644 --- a/gpt_index/indices/keyword_table/rake_base.py +++ b/gpt_index/indices/keyword_table/rake_base.py @@ -11,11 +11,7 @@ from gpt_index.indices.keyword_table.utils import rake_extract_keywords class GPTRAKEKeywordTableIndex(BaseGPTKeywordTableIndex): - """GPT RAKE Keyword Table Index. - - This index uses a RAKE keyword extractor to extract keywords from the text. - - """ + """GPT Index.""" def _extract_keywords(self, text: str) -> Set[str]: """Extract keywords from text.""" diff --git a/gpt_index/indices/keyword_table/simple_base.py b/gpt_index/indices/keyword_table/simple_base.py index 4d542c38d..e8f506884 100644 --- a/gpt_index/indices/keyword_table/simple_base.py +++ b/gpt_index/indices/keyword_table/simple_base.py @@ -15,11 +15,7 @@ DQKET = DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE class GPTSimpleKeywordTableIndex(BaseGPTKeywordTableIndex): - """GPT Simple Keyword Table Index. - - This index uses a simple regex extractor to extract keywords from the text. - - """ + """GPT Index.""" def _extract_keywords(self, text: str) -> Set[str]: """Extract keywords from text.""" diff --git a/gpt_index/indices/list/__init__.py b/gpt_index/indices/list/__init__.py index b24c607f3..1d4640565 100644 --- a/gpt_index/indices/list/__init__.py +++ b/gpt_index/indices/list/__init__.py @@ -1,7 +1 @@ -"""List-based data structures.""" - -from gpt_index.indices.list.base import GPTListIndex - -__all__ = [ - "GPTListIndex", -] +"""Init file.""" diff --git a/gpt_index/indices/list/base.py b/gpt_index/indices/list/base.py index 5eaeb598d..e93f8a827 100644 --- a/gpt_index/indices/list/base.py +++ b/gpt_index/indices/list/base.py @@ -29,21 +29,7 @@ GENERATE_TEXT_QUERY = "What is a concise summary of this document?" class GPTListIndex(BaseGPTIndex[IndexList]): - """GPT List Index. - - The list index is a simple data structure where nodes are stored in - a sequence. During index construction, the document texts are - chunked up, converted to nodes, and stored in a list. - - During query time, the list index iterates through the nodes - with some optional filter parameters, and synthesizes an - answer from all the nodes. - - Args: - text_qa_template (Optional[Prompt]): A Question-Answer Prompt - (see :ref:`Prompt-Templates`). - - """ + """GPT List Index.""" index_struct_cls = IndexList @@ -83,14 +69,7 @@ class GPTListIndex(BaseGPTIndex[IndexList]): def build_index_from_documents( self, documents: Sequence[BaseDocument] ) -> IndexList: - """Build the index from documents. - - Args: - documents (List[BaseDocument]): A list of documents. - - Returns: - IndexList: The created list index. - """ + """Build the index from documents.""" text_splitter = self._prompt_helper.get_text_splitter_given_prompt( self.text_qa_template, 1 ) diff --git a/gpt_index/indices/query/keyword_table/__init__.py b/gpt_index/indices/query/keyword_table/__init__.py index 9b0b308e6..1d4640565 100644 --- a/gpt_index/indices/query/keyword_table/__init__.py +++ b/gpt_index/indices/query/keyword_table/__init__.py @@ -1,13 +1 @@ -"""Query classes for keyword table indices.""" - -from gpt_index.indices.query.keyword_table.query import ( - GPTKeywordTableGPTQuery, - GPTKeywordTableRAKEQuery, - GPTKeywordTableSimpleQuery, -) - -__all__ = [ - "GPTKeywordTableGPTQuery", - "GPTKeywordTableRAKEQuery", - "GPTKeywordTableSimpleQuery", -] +"""Init file.""" diff --git a/gpt_index/indices/query/keyword_table/query.py b/gpt_index/indices/query/keyword_table/query.py index 52b00270b..98b3a5235 100644 --- a/gpt_index/indices/query/keyword_table/query.py +++ b/gpt_index/indices/query/keyword_table/query.py @@ -23,23 +23,7 @@ DQKET = DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE class BaseGPTKeywordTableQuery(BaseGPTIndexQuery[KeywordTable]): - """Base GPT Keyword Table Index Query. - - Arguments are shared among subclasses. - - Args: - keyword_extract_template (Optional[Prompt]): A Keyword Extraction Prompt - (see :ref:`Prompt-Templates`). - query_keyword_extract_template (Optional[Prompt]): A Query Keyword Extraction - Prompt (see :ref:`Prompt-Templates`). - refine_template (Optional[Prompt]): A Refinement Prompt - (see :ref:`Prompt-Templates`). - text_qa_template (Optional[Prompt]): A Question Answering Prompt - (see :ref:`Prompt-Templates`). - max_keywords_per_query (int): Maximum number of keywords to extract from query. - num_chunks_per_query (int): Maximum number of text chunks to query. - - """ + """Base GPT Keyword Table Index Query.""" def __init__( self, @@ -105,14 +89,7 @@ class BaseGPTKeywordTableQuery(BaseGPTIndexQuery[KeywordTable]): class GPTKeywordTableGPTQuery(BaseGPTKeywordTableQuery): """GPT Keyword Table Index Query. - Extracts keywords using GPT. Set when `mode="default"` in `query` method of - `GPTKeywordTableIndex`. - - .. code-block:: python - - response = index.query("<query_str>", mode="default") - - See BaseGPTKeywordTableQuery for arguments. + Extracts keywords using GPT. """ @@ -130,14 +107,7 @@ class GPTKeywordTableGPTQuery(BaseGPTKeywordTableQuery): class GPTKeywordTableSimpleQuery(BaseGPTKeywordTableQuery): """GPT Keyword Table Index Simple Query. - Extracts keywords using simple regex-based keyword extractor. - Set when `mode="simple"` in `query` method of `GPTKeywordTableIndex`. - - .. code-block:: python - - response = index.query("<query_str>", mode="simple") - - See BaseGPTKeywordTableQuery for arguments. + Extracts keywords using Simple keyword extractor. """ @@ -152,13 +122,6 @@ class GPTKeywordTableRAKEQuery(BaseGPTKeywordTableQuery): """GPT Keyword Table Index RAKE Query. Extracts keywords using RAKE keyword extractor. - Set when `mode="rake"` in `query` method of `GPTKeywordTableIndex`. - - .. code-block:: python - - response = index.query("<query_str>", mode="rake") - - See BaseGPTKeywordTableQuery for arguments. """ diff --git a/gpt_index/indices/query/list/__init__.py b/gpt_index/indices/query/list/__init__.py index 795cc1c5d..1d4640565 100644 --- a/gpt_index/indices/query/list/__init__.py +++ b/gpt_index/indices/query/list/__init__.py @@ -1,6 +1 @@ -"""Query classes for list indices.""" - -from gpt_index.indices.query.list.embedding_query import GPTListIndexEmbeddingQuery -from gpt_index.indices.query.list.query import GPTListIndexQuery - -__all__ = ["GPTListIndexEmbeddingQuery", "GPTListIndexQuery"] +"""Init file.""" diff --git a/gpt_index/indices/query/list/embedding_query.py b/gpt_index/indices/query/list/embedding_query.py index 4accc8620..fd2fe99e1 100644 --- a/gpt_index/indices/query/list/embedding_query.py +++ b/gpt_index/indices/query/list/embedding_query.py @@ -8,20 +8,7 @@ from gpt_index.prompts.base import Prompt class GPTListIndexEmbeddingQuery(BaseGPTListIndexQuery): - """GPTListIndex query. - - An embedding-based for GPTListIndex, which traverses - each node in sequence and retrieves top-k nodes by - embedding similarity to the query. - Set when `mode="embedding"` in `query` method of `GPTListIndex`. - - .. code-block:: python - - response = index.query("<query_str>", mode="embedding") - - See BaseGPTListIndexQuery for arguments. - - """ + """GPTListIndex query.""" def __init__( self, diff --git a/gpt_index/indices/query/list/query.py b/gpt_index/indices/query/list/query.py index bf0b18f41..b51746b02 100644 --- a/gpt_index/indices/query/list/query.py +++ b/gpt_index/indices/query/list/query.py @@ -12,19 +12,7 @@ from gpt_index.prompts.default_prompts import ( class BaseGPTListIndexQuery(BaseGPTIndexQuery[IndexList]): - """GPTListIndex query. - - Arguments are shared among subclasses. - - Args: - text_qa_template (Optional[Prompt]): A Question Answering Prompt - (see :ref:`Prompt-Templates`). - refine_template (Optional[Prompt]): A Refinement Prompt - (see :ref:`Prompt-Templates`). - keyword (Optional[str]): If specified, keyword to filter nodes. - Simulates Ctrl+F lookup in a document. - - """ + """GPTListIndex query.""" def __init__( self, @@ -74,20 +62,7 @@ class BaseGPTListIndexQuery(BaseGPTIndexQuery[IndexList]): class GPTListIndexQuery(BaseGPTListIndexQuery): - """GPTListIndex query. - - The default query mode for GPTListIndex, which traverses - each node in sequence and synthesizes a response across all nodes - (with an optional keyword filter). - Set when `mode="default"` in `query` method of `GPTListIndex`. - - .. code-block:: python - - response = index.query("<query_str>", mode="default") - - See BaseGPTListIndexQuery for arguments. - - """ + """GPTListIndex query.""" def _get_nodes_for_response( self, query_str: str, verbose: bool = False diff --git a/gpt_index/indices/query/tree/__init__.py b/gpt_index/indices/query/tree/__init__.py index f269b72b0..1d4640565 100644 --- a/gpt_index/indices/query/tree/__init__.py +++ b/gpt_index/indices/query/tree/__init__.py @@ -1,11 +1 @@ -"""Query classes for tree indices.""" - -from gpt_index.indices.query.tree.embedding_query import GPTTreeIndexEmbeddingQuery -from gpt_index.indices.query.tree.leaf_query import GPTTreeIndexLeafQuery -from gpt_index.indices.query.tree.retrieve_query import GPTTreeIndexRetQuery - -__all__ = [ - "GPTTreeIndexLeafQuery", - "GPTTreeIndexRetQuery", - "GPTTreeIndexEmbeddingQuery", -] +"""Init file.""" diff --git a/gpt_index/indices/query/tree/embedding_query.py b/gpt_index/indices/query/tree/embedding_query.py index ba78dcbe3..7d474e044 100644 --- a/gpt_index/indices/query/tree/embedding_query.py +++ b/gpt_index/indices/query/tree/embedding_query.py @@ -16,26 +16,6 @@ class GPTTreeIndexEmbeddingQuery(GPTTreeIndexLeafQuery): This class traverses the index graph using the embedding similarity between the query and the node text. - .. code-block:: python - - response = index.query("<query_str>", mode="embedding") - - Args: - query_template (Optional[Prompt]): Tree Select Query Prompt - (see :ref:`Prompt-Templates`). - query_template_multiple (Optional[Prompt]): Tree Select Query Prompt (Multiple) - (see :ref:`Prompt-Templates`). - text_qa_template (Optional[Prompt]): Question-Answer Prompt - (see :ref:`Prompt-Templates`). - refine_template (Optional[Prompt]): Refinement Prompt - (see :ref:`Prompt-Templates`). - child_branch_factor (int): Number of child nodes to consider at each level. - If child_branch_factor is 1, then the query will only choose one child node - to traverse for any given parent node. - If child_branch_factor is 2, then the query will choose two child nodes. - embed_model (Optional[OpenAIEmbedding]): Embedding model to use for - embedding similarity. - """ def __init__( diff --git a/gpt_index/indices/query/tree/leaf_query.py b/gpt_index/indices/query/tree/leaf_query.py index 80531d38a..b76d38898 100644 --- a/gpt_index/indices/query/tree/leaf_query.py +++ b/gpt_index/indices/query/tree/leaf_query.py @@ -20,24 +20,6 @@ class GPTTreeIndexLeafQuery(BaseGPTIndexQuery[IndexGraph]): This class traverses the index graph and searches for a leaf node that can best answer the query. - .. code-block:: python - - response = index.query("<query_str>", mode="default") - - Args: - query_template (Optional[Prompt]): Tree Select Query Prompt - (see :ref:`Prompt-Templates`). - query_template_multiple (Optional[Prompt]): Tree Select Query Prompt (Multiple) - (see :ref:`Prompt-Templates`). - text_qa_template (Optional[Prompt]): Question-Answer Prompt - (see :ref:`Prompt-Templates`). - refine_template (Optional[Prompt]): Refinement Prompt - (see :ref:`Prompt-Templates`). - child_branch_factor (int): Number of child nodes to consider at each level. - If child_branch_factor is 1, then the query will only choose one child node - to traverse for any given parent node. - If child_branch_factor is 2, then the query will choose two child nodes. - """ def __init__( diff --git a/gpt_index/indices/query/tree/retrieve_query.py b/gpt_index/indices/query/tree/retrieve_query.py index bc22bebf5..f7f9cad53 100644 --- a/gpt_index/indices/query/tree/retrieve_query.py +++ b/gpt_index/indices/query/tree/retrieve_query.py @@ -19,14 +19,6 @@ class GPTTreeIndexRetQuery(BaseGPTIndexQuery[IndexGraph]): the answer (because it was constructed with a query_str), so it does not attempt to parse information down the graph in order to synthesize an answer. - .. code-block:: python - - response = index.query("<query_str>", mode="retrieve") - - Args: - text_qa_template (Optional[Prompt]): Question-Answer Prompt - (see :ref:`Prompt-Templates`). - """ def __init__( diff --git a/gpt_index/indices/tree/__init__.py b/gpt_index/indices/tree/__init__.py index c13b792b0..1d4640565 100644 --- a/gpt_index/indices/tree/__init__.py +++ b/gpt_index/indices/tree/__init__.py @@ -1,8 +1 @@ -"""Tree-structured Index Data Structures.""" - -# indices -from gpt_index.indices.tree.base import GPTTreeIndex - -__all__ = [ - "GPTTreeIndex", -] +"""Init file.""" diff --git a/gpt_index/indices/tree/base.py b/gpt_index/indices/tree/base.py index a946c4e83..18b7c99bf 100644 --- a/gpt_index/indices/tree/base.py +++ b/gpt_index/indices/tree/base.py @@ -119,23 +119,7 @@ class GPTTreeIndexBuilder: class GPTTreeIndex(BaseGPTIndex[IndexGraph]): - """GPT Tree Index. - - The tree index is a tree-structured index, where each node is a summary of - the children nodes. During index construction, the tree is constructed - in a bottoms-up fashion until we end up with a set of root_nodes. - - There are a few different options during query time (see :ref:`Ref-Query`). - The main option is to traverse down the tree from the root nodes. - A secondary answer is to directly synthesize the answer from the root nodes. - - Args: - summary_template (Optional[Prompt]): A Summarization Prompt - (see :ref:`Prompt-Templates`). - insert_prompt (Optional[Prompt]): An Tree Insertion Prompt - (see :ref:`Prompt-Templates`). - - """ + """GPT Index.""" index_struct_cls = IndexGraph diff --git a/gpt_index/langchain_helpers/chain_wrapper.py b/gpt_index/langchain_helpers/chain_wrapper.py index 390dff4c6..23a7c9957 100644 --- a/gpt_index/langchain_helpers/chain_wrapper.py +++ b/gpt_index/langchain_helpers/chain_wrapper.py @@ -9,34 +9,14 @@ from gpt_index.prompts.base import Prompt class LLMPredictor: - """LLM predictor class. - - Wrapper around an LLMChain from Langchain. - - Args: - llm (Optional[LLM]): LLM from Langchain to use for predictions. - Defaults to OpenAI's text-davinci-002 model. - Please see - `Langchain's LLM Page - <https://langchain.readthedocs.io/en/latest/modules/llms.html>`_ - for more details. - - """ + """LLM predictor class.""" def __init__(self, llm: Optional[LLM] = None) -> None: """Initialize params.""" self._llm = llm or OpenAI(temperature=0, model_name="text-davinci-002") def predict(self, prompt: Prompt, **prompt_args: Any) -> Tuple[str, str]: - """Predict the answer to a query. - - Args: - prompt (Prompt): Prompt to use for prediction. - - Returns: - Tuple[str, str]: Tuple of the predicted answer and the formatted prompt. - - """ + """Predict the answer to a query.""" llm_chain = LLMChain(prompt=prompt, llm=self._llm) formatted_prompt = prompt.format(**prompt_args) diff --git a/gpt_index/prompts/__init__.py b/gpt_index/prompts/__init__.py index 70a9a06c1..1d4640565 100644 --- a/gpt_index/prompts/__init__.py +++ b/gpt_index/prompts/__init__.py @@ -1,5 +1 @@ -"""Prompt class.""" - -from gpt_index.prompts.base import Prompt - -__all__ = ["Prompt"] +"""Init file.""" diff --git a/gpt_index/readers/__init__.py b/gpt_index/readers/__init__.py index 0fd7ca35c..04de8b7ec 100644 --- a/gpt_index/readers/__init__.py +++ b/gpt_index/readers/__init__.py @@ -1,25 +1 @@ -"""Data Connectors for GPT Index. - -This module contains the data connectors for GPT Index. Each connector inherits -from a `BaseReader` class, connects to a data source, and loads BaseDocument objects -from that data source. - -""" - -# readers -from gpt_index.readers.file import SimpleDirectoryReader -from gpt_index.readers.google.gdocs import GoogleDocsReader -from gpt_index.readers.mongo import SimpleMongoReader -from gpt_index.readers.notion import NotionPageReader -from gpt_index.readers.slack import SlackReader -from gpt_index.readers.wikipedia import WikipediaReader - -__all__ = [ - "WikipediaReader", - "SimpleDirectoryReader", - "SimpleMongoReader", - "NotionPageReader", - "GoogleDocsReader", - "SlackReader", - "LLMPredictor", -] +"""Init file for readers.""" diff --git a/gpt_index/readers/file.py b/gpt_index/readers/file.py index f9ca48c17..ea20cd2ea 100644 --- a/gpt_index/readers/file.py +++ b/gpt_index/readers/file.py @@ -12,9 +12,6 @@ class SimpleDirectoryReader(BaseReader): Can read files into separate documents, or concatenates files into one document text. - input_dir (str): Path to the directory. - exclude_hidden (bool): Whether to exclude hidden files (dotfiles). - """ def __init__(self, input_dir: str, exclude_hidden: bool = True) -> None: @@ -29,15 +26,7 @@ class SimpleDirectoryReader(BaseReader): self.input_files = input_files def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory. - - Args: - concatenate (bool): whether to concatenate all files into one document. - - Returns: - List[Document]: A list of documents. - - """ + """Load data from the input directory.""" concatenate = load_kwargs.get("concatenate", True) data = "" data_list = [] diff --git a/gpt_index/readers/mongo.py b/gpt_index/readers/mongo.py index 7404223e8..16a5b24c2 100644 --- a/gpt_index/readers/mongo.py +++ b/gpt_index/readers/mongo.py @@ -11,11 +11,6 @@ class SimpleMongoReader(BaseReader): Concatenates each Mongo doc into Document used by GPT Index. - Args: - host (str): Mongo host. - port (int): Mongo port. - max_docs (int): Maximum number of documents to load. - """ def __init__(self, host: str, port: int, max_docs: int = 1000) -> None: @@ -48,16 +43,7 @@ class SimpleMongoReader(BaseReader): return documents def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory. - - Args: - db_name (str): name of the database. - collection_name (str): name of the collection. - - Returns: - List[Document]: A list of documents. - - """ + """Load data from the input directory.""" if "db_name" not in load_kwargs: raise ValueError("`db_name` not found in load_kwargs.") else: diff --git a/gpt_index/readers/notion.py b/gpt_index/readers/notion.py index 1bec6a4fd..8fc985505 100644 --- a/gpt_index/readers/notion.py +++ b/gpt_index/readers/notion.py @@ -18,9 +18,6 @@ class NotionPageReader(BaseReader): Reads a set of Notion pages. - Args: - integration_token (str): Notion integration token. - """ def __init__(self, integration_token: Optional[str] = None) -> None: @@ -118,15 +115,7 @@ class NotionPageReader(BaseReader): return page_ids def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory. - - Args: - page_ids (List[str]): List of page ids to load. - - Returns: - List[Document]: List of documents. - - """ + """Load data from the input directory.""" if "page_ids" not in load_kwargs: raise ValueError('Must specify a "page_ids" in `load_kwargs`.') docs = [] diff --git a/gpt_index/readers/slack.py b/gpt_index/readers/slack.py index 3fd22a497..73cae8651 100644 --- a/gpt_index/readers/slack.py +++ b/gpt_index/readers/slack.py @@ -14,10 +14,6 @@ class SlackReader(BaseReader): Reads conversations from channels. - Args: - slack_token (Optional[str]): Slack token. If not provided, we - assume the environment variable `SLACK_BOT_TOKEN` is set. - """ def __init__(self, slack_token: Optional[str] = None) -> None: @@ -104,15 +100,7 @@ class SlackReader(BaseReader): return "\n\n".join(result_messages) def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory. - - Args: - channel_ids (List[str]): List of channel ids to read. - - Returns: - List[Document]: List of documents. - - """ + """Load data from the input directory.""" channel_ids = load_kwargs.pop("channel_ids", None) if channel_ids is None: raise ValueError('Must specify a "channel_id" in `load_kwargs`.') diff --git a/gpt_index/readers/wikipedia.py b/gpt_index/readers/wikipedia.py index 2db0fb0cd..fd361aa1d 100644 --- a/gpt_index/readers/wikipedia.py +++ b/gpt_index/readers/wikipedia.py @@ -22,12 +22,7 @@ class WikipediaReader(BaseReader): ) def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory. - - Args: - pages (List[str]): List of pages to read. - - """ + """Load data from the input directory.""" import wikipedia pages: List[str] = load_kwargs.pop("pages", None) diff --git a/tests/indices/list/__init__.py b/tests/indices/list/__init__.py index b24c607f3..1d4640565 100644 --- a/tests/indices/list/__init__.py +++ b/tests/indices/list/__init__.py @@ -1,7 +1 @@ -"""List-based data structures.""" - -from gpt_index.indices.list.base import GPTListIndex - -__all__ = [ - "GPTListIndex", -] +"""Init file.""" -- GitLab