From ac328a82f583f32a8fe425db93a186d6861f19a4 Mon Sep 17 00:00:00 2001 From: Alexander Whitestone Date: Mon, 6 Apr 2026 17:48:20 -0400 Subject: [PATCH] docs: add GrepTard agentic memory report --- .../2026-04-06-agentic-memory-for-openclaw.md | 311 ++++++++++++++++++ ...2026-04-06-agentic-memory-for-openclaw.pdf | 245 ++++++++++++++ 2 files changed, 556 insertions(+) create mode 100644 reports/greptard/2026-04-06-agentic-memory-for-openclaw.md create mode 100644 reports/greptard/2026-04-06-agentic-memory-for-openclaw.pdf diff --git a/reports/greptard/2026-04-06-agentic-memory-for-openclaw.md b/reports/greptard/2026-04-06-agentic-memory-for-openclaw.md new file mode 100644 index 0000000..3a8afbb --- /dev/null +++ b/reports/greptard/2026-04-06-agentic-memory-for-openclaw.md @@ -0,0 +1,311 @@ +# Agentic Memory for OpenClaw Builders + +A practical structure for memory that stays useful under load. + +Tag: #GrepTard +Audience: 15Grepples / OpenClaw builders +Date: 2026-04-06 + +## Executive Summary + +If you are building an agent and asking “how should I structure memory?”, the shortest good answer is this: + +Do not build one giant memory blob. + +Split memory into layers with different lifetimes, different write rules, and different retrieval paths. Most memory systems become sludge because they mix live context, task scratchpad, durable facts, and long-term procedures into one bucket. + +A clean system uses: +- working memory +- session memory +- durable memory +- procedural memory +- artifact memory + +And it follows one hard rule: + +Retrieval before generation. + +If the agent can look something up in a verified artifact, it should do that before it improvises. + +## The Five Layers + +### 1. Working Memory + +This is what the agent is actively holding right now. + +Examples: +- current user prompt +- current file under edit +- last tool output +- last few conversation turns +- current objective and acceptance criteria + +Properties: +- small +- hot +- disposable +- aggressively pruned + +Failure mode: +If working memory gets too large, the agent starts treating noise as priority and loses the thread. + +### 2. Session Memory + +This is what happened during the current task or run. + +Examples: +- issue number +- branch name +- commands already tried +- errors encountered +- decisions made during the run +- files already inspected + +Properties: +- persists across turns inside the task +- should compact periodically +- should die when the task dies unless something deserves promotion + +Failure mode: +If session memory is not compacted, every task drags a dead backpack of irrelevant state. + +### 3. Durable Memory + +This is what the system should remember across sessions. + +Examples: +- user preferences +- stable machine facts +- repo conventions +- important credentials paths +- identity/role relationships +- recurring operator instructions + +Properties: +- sparse +- curated +- stable +- high-value only + +Failure mode: +If you write too much into durable memory, retrieval quality collapses. The agent starts remembering trivia instead of truth. + +### 4. Procedural Memory + +This is “how to do things.” + +Examples: +- deployment playbooks +- debugging workflows +- recovery runbooks +- test procedures +- standard triage patterns + +Properties: +- reusable +- highly structured +- often better as markdown skills or scripts than embeddings + +Failure mode: +A weak system stores facts but forgets how to work. It knows things but cannot repeat success. + +### 5. Artifact Memory + +This is the memory outside the model. + +Examples: +- issues +- pull requests +- docs +- logs +- transcripts +- databases +- config files +- code + +This is the most important category because it is often the most truthful. + +If your agent ignores artifact memory and tries to “remember” everything in model context, it will eventually hallucinate operational facts. + +Repos are memory. +Logs are memory. +Gitea is memory. +Files are memory. + +## A Good Write Policy + +Before writing memory, ask: +- Will this matter later? +- Is it stable? +- Is it specific? +- Can it be verified? +- Does it belong in durable memory, or only in session scratchpad? + +A good agent writes less than a naive one. +The difference is quality, not quantity. + +## A Good Retrieval Order + +When a new task arrives: + +1. check durable memory +2. check task/session state +3. retrieve relevant artifacts +4. retrieve procedures/skills +5. only then generate free-form reasoning + +That order matters. + +A lot of systems do it backwards: +- think first +- search later +- rationalize the mismatch + +That is how you get fluent nonsense. + +## Recommended Data Shape + +If you want a practical implementation, use this split: + +### A. Exact State Store +Use JSON or SQLite for: +- current task state +- issue/branch associations +- event IDs +- status flags +- dedupe keys +- replay protection + +This is for things that must be exact. + +### B. Human-Readable Knowledge Store +Use markdown, docs, and issues for: +- runbooks +- KT docs +- architecture decisions +- user-facing reports +- operating doctrine + +This is for things humans and agents both need to read. + +### C. Search Index +Use full-text search for: +- logs +- transcripts +- notes +- issue bodies +- docs + +This is for fast retrieval of exact phrases and operational facts. + +### D. Embedding Layer +Use embeddings only as a helper for: +- fuzzy recall +- similarity search +- thematic clustering +- long-tail discovery + +Do not let embeddings become your only memory system. + +Semantic search is useful. +It is not truth. + +## The Common Failure Modes + +### 1. One Giant Vector Bucket +Everything gets embedded. Nothing gets filtered. Retrieval becomes mood-based instead of exact. + +### 2. No Separation of Lifetimes +Temporary scratchpad gets treated like durable truth. + +### 3. No Promotion Rules +Nothing decides what gets promoted from session memory into durable memory. + +### 4. No Compaction +The system keeps dragging old state forward forever. + +### 5. No Artifact Priority +The model trusts its own “memory” over the actual repo, issue tracker, logs, or config. + +That last failure is the ugliest one. + +## A Better Mental Model + +Think of memory as a city, not a lake. + +- Working memory is the desk. +- Session memory is the room. +- Durable memory is the house. +- Procedural memory is the workshop. +- Artifact memory is the town archive. + +Do not pour the whole town archive onto the desk. +Retrieve what matters. +Work. +Write back only what deserves to survive. + +## Why This Matters for OpenClaw + +OpenClaw-style systems get useful quickly because they are flexible, channel-native, and easy to wire into real workflows. + +But the risk is that state, routing, identity, and memory start to blur together. +That works at first. Then it becomes sludge. + +The clean pattern is to separate: +- identity +- routing +- live task state +- durable memory +- reusable procedure +- artifact truth + +This is also where Hermes quietly has the stronger pattern: +not all memory is the same, and not all truth belongs inside the model. + +That does not mean “copy Hermes.” +It means steal the right lesson: +separate memory by role and by lifetime. + +## Minimum Viable Agentic Memory Stack + +If you want the simplest version that is still respectable, build this: + +1. small working context +2. session-state SQLite file +3. durable markdown notes + stable JSON facts +4. issue/doc/log retrieval before generation +5. skill/runbook store for recurring workflows +6. compaction at the end of every serious task + +That already gets you most of the way there. + +## Final Recommendation + +If you are unsure where to start, start here: + +- Bucket 1: now +- Bucket 2: this task +- Bucket 3: durable facts +- Bucket 4: procedures +- Bucket 5: artifacts + +Then add three rules: +- retrieval before generation +- promotion by filter, not by default +- compaction every cycle + +That structure is simple enough to build and strong enough to scale. + +## Closing + +The real goal of memory is not “remember more.” +It is: +- reduce rework +- preserve truth +- repeat successful behavior +- stay honest under load + +A good memory system does not make the agent feel smart. +It makes the agent less likely to lie. + +#GrepTard diff --git a/reports/greptard/2026-04-06-agentic-memory-for-openclaw.pdf b/reports/greptard/2026-04-06-agentic-memory-for-openclaw.pdf new file mode 100644 index 0000000..a177b39 --- /dev/null +++ b/reports/greptard/2026-04-06-agentic-memory-for-openclaw.pdf @@ -0,0 +1,245 @@ +%PDF-1.4 +% ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Contents 17 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 18 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/Contents 19 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/Contents 20 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +8 0 obj +<< +/Contents 21 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +9 0 obj +<< +/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +10 0 obj +<< +/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +11 0 obj +<< +/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +12 0 obj +<< +/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +13 0 obj +<< +/Contents 26 0 R /MediaBox [ 0 0 612 792 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +14 0 obj +<< +/PageMode /UseNone /Pages 16 0 R /Type /Catalog +>> +endobj +15 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20260406174739-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260406174739-04'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +16 0 obj +<< +/Count 10 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R ] /Type /Pages +>> +endobj +17 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1202 +>> +stream +Gatm:;/b2I&:Vs/3++DmOK]oT;0#utG&Ltdp..b&E%;l;pTQCgrn>He%kVtoVGk'hf)5rpIo-%Y5l?Vf2aI-^-$^,b4>p^T_q0gF?[`D3-KtL:K8m`p#^67P)_4O6,r@T"]@(n(p=Pf7VQY\DMqC,TS6U1T\e^E[2PMD%E&f.?4pb&&,t]OMpq+s35AnnfS>+q@XS?nr+Y8i&@S%H_L@Zkf3P4`>KRnXBlL`4d_W!]3\I%&a64n%Gq1uY@1hPO;0!]I3N)*c+u,Rc7`tO?5W"_QPV8-M4N`a_,lGp_.5]-7\;.tK3:H9Gfm0ujn>U1A@J@*Q;FXPJKnnfci=q\oG*:)l-3F^4`o?N5`3XJZDMC/,8Uaq?-,7`uW8:P$`r,ek>17D%%K4\fJ(`*@lO%CZTGG6cF@Ikoe*gp#iCLXb#'u+\"/fKXDF0i@*BU2To6;-5e,W<$t7>4;pt(U*i6Tg1YWITNZ8!M`keUG08E5WRXVp:^=+'d]5jKWs=PEX1SSil*)-WF`4S6>:$c2TJj[=Nkhc:rg<]4TA)F\)[B#=RKe\I]4rq85Cm)je8Z"Y\jP@GcdK1,hK^Y*dK*TeKeMbOW";a;`DU4G_j3:?3;V%"?!hqm)f1n=PdhBlha\RT^[0)rda':(=qEU2K/c(4?IHP\/Wo!Zpn:($F"uh1dFXV@iRipG%Z''61X.]-);?ZT8GfKh,X'Hg`o<4sTAg2lH^:^"h4NUTU?B'JYQsFj@rEo&SEEUKY6(,aies][SXL*@3>c)<:K0)-KpC'>ls)3/)J=1GoN@nDCc'hpHslSSGWqRGNh']0nVVs9;mm=hO"?cc/mV08Q=_ca/P`9!=GEeSU3a4%fS?\Li@I93FW5-J+CH_%=t*SpX*>A"3R4_K$s0bi&i?Nk\[>EcS,$H:6J,9/Vb&]`cFjMu(u>)9Bg;:n?ks43,alko`(%YTBIJF]a0'R^6P\ZBaehJA&*qOpGC^P5]J.,RPj?'Q\.UFN>H.?nS)LMZe[kH6g38T.#T*LC_lG'C~>endstream +endobj +18 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 926 +>> +stream +Gau1-9lJc?%#46H'g-ZWi*$')NWWHm^]plBNk6\t)lp@m=-VJ$hiDeA\S!@!*F%>ZRX@.bNm=,Zs0fKWNW:aXAab4teOoeSs_0\e>@l*fD!GY)nNUeqW&I`I9C[AS8h`T82p%is)b&$WX!eONEKIL[d+nd%4_mV]/)Wup,IMr16[TcU=)m9h3H0Ncd70$#R6oC-WsLG8"JWS".'1J?mc4%TpP0ccY/%:^6@Lblhan.BE1+4-0mb%PaheJ.$*bN4!^CY#ss48"+HFT\qPEH"h-#dmYBXcbt'WZm>$'11!&KAlJirb9W-eu9I]S7gLenYQ^k0=ri-87W(+"M-)"YQ>:s!fE?Ig(8]+Z;.S@rn9Rr:8_&e9Tf3DbAWcM[]bU,*"s/c;;gJO/p;UuYK8t=0i%h\Zquj1a3na;>+XaD$=lbJ%(UR&X2W=ig_kj]1lDZRm1qi!SI^4f^Y/aP,(FKi^K^PG9%nmVof.,pCO5ihrG`W&g'@SB%_;hW+(@1pC0^QmS`IS:?.r(5'k3`XsL^;'^E%'Ni'^u*153b[V/+H$PpdJ=RR1`b;5PB7&L!imo?ZSX8/ps`00MM'lYNm_I+*s$:0.n)9=kcnKi%>)`E*b]E$Tsp\++7'Y40'7.ge+YD>!nhk$Dn.i,\5ae:#gG]1[DiiPY0Ep@\9\/lQh,/*f#ed>5qa1)Wa"%gLb,Qo@e''9^VhTr"/"<+BLOAEjAc)8r*XcY_ccKK-?IHPL6*TsYd1]lBK$Lu\5e0nI``*DkQ1/F/.\[:A(Ps&&$gB8+_;Qlo?7b^R_7&2^buP18YSDglL,9[^aoQh1-N5"CTg#F`#k)<=krf*1#s<),2]$:YkSTmXTOj~>endstream +endobj +19 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 942 +>> +stream +Gau0BbAQ&g&A7ljp6ZVp,#U)+a.`l:TESLaa'<:lD5jC#Kr")3n%4f9UMU.2Yn4u1CbE-%YMkR/8.QZRM[&*<%X/El(l*J@/.Q.1^VYE5GZq?Cc8:35ZQQ+3Zl0FTHFogdfu7#,,`jr4:SI[QHoXt]&#,B'7VGbX+5]B`'CtnCrssGT_FRb/CGEP>^n%OC(9d^:+jXoC3C#'-&K2RW0!lL$9@-6&?D@^%BP#E?"lh6U9j,C^!_l^jiUqcYrt8$Rd&Z(m5/]W@p>VrJgKA<0H*7/q*l&uh'-ZKOSs^Zk?3$[eE7G'\gd'#2X#dLW26gCW3CAGQX1)8hn1cM13t,'E#qDIDlXCq+aX@B9(,n)nMHUolD*j]re6Lu@1jr45&$1BR/9E6?^EpTr?'?$sGj9u._U?OOVOlI7k\$*c<_Mr&n'7/)N@[jL4g;K1+#cC(]8($!D=4H71LjK<:K]R^I3bPLD:GnWD7`4o1rlB@aW<9X7-k^d)T*]0cp-lp`k*&IF3(lcZ)[SK^UC4k;*%S:XlI`Vgl(g;AQ.gME?L%/f^idEJ]!4@G^"Z)#nD[;K_QW8XJOqtA"iZ>:SL771WKcgnEc&1i84L#qlG~>endstream +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 987 +>> +stream +Gatm:;/ao;&:X)O\As09`(o<&]FB]@U`fbr`62KB`(<[e\?d3erd2q)1Vj?/CJ^fVoj.LOh.M4]'I%qgpfhnAmg=;\9n>&JC7kl)TX]RI`Th>0:S'\#N)@I>*EUX\5&:gp'T*Abo,itH7"1sR*?m0H>hmaY"7&?^#ucC28i.0(_Du=VqZ;ZD:qZFF?h!k31Wi7[GgJqbSkk*QeV#^teuo)p6bN21oM-=&UjX3!jue'B3%JD^#:nB-%"]bp16@K12XLO'CPL7H7TMf3Ui6p7Y+=of/Nn.t/9JaF/%tDfDH5Fpcj"<#eBV39)ps<)f!;;ThZR*E;,3j5L?17a%*rS^>,W5&!M-B(OQVl"ZU(a%0?"^n_)g6m$/.oX[4!d0p#)LoVNLYfdg6B"1>Ju;AMiM85U_[K,bFeG3WCnO@sSPs4=8+hjAH%\GYNQHn4@fW*.e3bDPVY,T]C,K4MSVL7TiR%<(Q'e!pII'3N5P3tS>]=D7"cFZXGZlL=Z8AE23M/P@g#$-IP>@lo&,`uaM(oak.<(2&rQ!Gl^h-rl=."$\:BVfXTG@qQ0MLZXpKSSLl_:PS$Gqc3'kc[Y3\iV_endstream +endobj +21 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 976 +>> +stream +Gatn%9lHLd&;KZQ'm"2lFMmZ\kbW$_[#.h^8qN:#0,kbPf"g"OlaZAdmf9d2\S/&%aqb0cn[tH]I:kQbo\oa'DZHpq\GX3pqiI)Y6P`#^%;rK)HH,\T`ZEA&PU.J95J&u`G_a(\k4Q4V@RdQ^7nUQ@aI7\=FlsdAA%]@h;JCfdQ<(F%BWt?[G6,Q35J2^:-Y2[,*I"F&311kNA#/)N06me2nE'tJcf%aP2:tM>BS"_q7Ic.KH+%qS0mfVknj$&O`'GunE3E;JiQV%+ae3U#D4Qp@rqa>l"&p97997.L4I+JO:Q`)V2=VQpQ$Km2[la-7d@:'f*JgDK?Tf!S+3;k7a&iS<"@BdNHH5W5=?=CQ1BlBmV*`&X.#?pkg09=;rOt4,"5oNKE"q:-#Br$r]$;Sc3BIc`<>N:B7E@4)j(XSFJ3DsnF>acsu"#i%,VD9ASfTGRtMG+#lM@`C>pmu))6\9tg/PSGW5F=6FD"n54&=DGb_NJ-O,25mZj0X?P$^a00jaM4U9QA+A/4c%6G/e!$TMW>6MgW&M\o9;a5NYK*UgZSOJ9D6qeAaO06$aTmT[7sACbhM'WodG,l7H2LAF@4;CH-"'BtDFLKMl*N0l,so+Y^11B[Tjp$Tkbi`j\dqRr/G=W\m=SB=%+fAb.Wlk@(_.S3(ZW0iq)%D1Mjq$S1//&hBm9n^.Zaq8=9/Q@3MV^%7@.On$P`k+6Bi23KZJ(\7\d#)Bml=jb`BY)"oCrobCdgtt>C82IdO77,t,RgjJ8mJD__R/I%aB^5$~>endstream +endobj +22 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 892 +>> +stream +Gatn%9lnc;&;KZL'mhK*X'5(,30ol(Zia69DHmm&*Lf#d.`lPV?]PmK)(6A6LbkXELEu1gbO<'T'EWX/ok1N0\BrHg1&i9Vgc;^a]':`(lkcTrLfcq@$\6*s,I%PO`;MkUEY[4E56)C`$0)TRK'puELcp=^#`_a+iXFIe/djYK,VdQsB9bAN.ja-@GSB>\8RE7sds/9;fT*#m@D_QSnCIDmD6Q`4e:/%LSHSlYZC`)4c?U'sF&I-,i>SVDA1u9[gjsh9t-lk`B2@S8Q<#69&XJVQ7UbZ7_QmKXpEf%qN=\H*!BiH=iWXMfq6FOol@D&-jM4&/B)nd"=T@j@L@4Ft\!jMkQmD8;?lg?IN8=]%)dh_(*3JG(0&t#=*#i(:M?[U8*1##!TnT*0fm=i@m"1fj$E\L.=*UkIW[*i<[=Hj6s(gH*ETphfbhM`bu35Ut059Yi;&_9P(b-Pp^+I]QDTL7Cm-5kK%dV$Z$;/g1sS)`['3g),T&l"jnbmH;3=00u^G?$1=Cg;#(0uD,G7_6fMp>>ET1>g6HM`JO>F!4dendstream +endobj +23 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1105 +>> +stream +Gatm:bECU<&A7"aKO+R"VI++?@:aX%T[_PPt&:t=Ho]bp`pb$+P_Hq_4g[L)l#qD.iigX[G\NZcgcg[\-VVH/\"'>C>^4mT*qM5C!TR=I;n&.o]$7sc1_GUrMigamdOFkq5O5K$4hN)Y$jP\(Y0[AeM2\:a)D*#VKkkCB#/Bm<^F8@Wr.Uur#&]4eJ1a5@fgTQOkP""sT+\U\QU6>McDJR<_/K1.j]]&K^OGt\3hu2NChH[Nkd7L!hFibAW1NoWo!!HC=??_2Nd,Q??;GE@P1n9>;F>j.<6]3'@e3GcHiH8[M3<'Zr+U>nS"UOZ>$t+\uib/EY[*X4A&QJGGL'*8e^Z6QEJ2BS;XpsXYf8jbq%gR:"k]:PkIV-+KLa!_(SZaU\Ja*4B\tQU8NJ,iDU_SaXm'5!IlBaLCt_-"!s>NUVEq:_,Go;-EJh9\QsdQ4>iXbh3rc['8.Ks[q.%'s-^$bhV77r)JJ/NVSni'$do2"]O7)e-^kN5_iNP,3,S7]J]J4J1Y">*)RD`GW[OL*Z^-@?J'U=gAeSS1fR(O.dZ'3V_iDP&"eRA_eM#Lc4e(@.0ZijofJ,rf?[4p,^jX?Y/d0]@V.rI#8<$IfZ<4,)Q~>endstream +endobj +24 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1129 +>> +stream +GatU2bHBSX&Dd46ApIV9W1pA[]1_uc$hU/f.\rPMBR+-nVF4^QZE(b/:lcg2<>\,Y%E%>T3eoM(cB(=_0/e9F%D\G7^AFlEmr0CZ]TVmR_?0JK"'brCh$Z)k]/T>"Hiei3_4:1T2&U50aQb`31_-Ei30tE//_iG..AYE&9Sha.nq'd[fX]8ltK]_9,)"0BsH&#E.]K-7e;T,\+D>\(CL95-=;8KpV:T2p8+0L;d3:cW,\WapQ,"`pA.oOV,QsO.7<:(r,K.pZ3G*5=9i-?-CLaD9d!g\QYd1+mW4T.LrM.m*/5OqJqT(N(P9eq*bZ43)In9]rX&!Gh_gu:HK7r-nYF/Qh:ZGs2rVJSVJAaDZ#1kW'c(c\:EhI+l,Gj\"GTnFJljL!u93KQoH.Z+1]UVoYNCYlKJ?a\ZeL*(uU-U;PRQhHoq\/ag#3)s`>.r`a?8TjX*/I@8N\oQpm?NOTcZ_=pA>3UKWPu4QjtpA#Aqo?*U5%Yk:4VPNS8`236=)m/KD%C-%Wd065pl*G-D-Y>rbkOau6OiSc,RKj#C-SFWAZl>Gr^0&pXl@.-#JE,W-H_>Z2uap[SWc"a?0.0=C=Ylq&>o@*Ct,6;VCbJWS1?/LM-jiq#M(e%;:.pn^`VFmMP+nU5]#hMb:e4SHJOM@TA0JM5L.lJC)uV!JYGCNDU1QGAe=+P"r191)0=F!#`l#?q+OM%f0,Gi:D8ffYEiIZ1+QoHdEM]Du;H.endstream +endobj +25 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1016 +>> +stream +Gatm;9lo#B&A@Zcp6`:f@`_um0qDo'SP2+Z3T_OP27U^Cd75Vb^+0J'Rki.)A3>LLf'#9a54'"''"[l+Zg%NCB5hk0JI@i&^b_:mlioZ"7e\/,ph#XR.6&jAFW*ttULl6T+7c>?;O55%gWu+;mpW@Qdhue+4/ip1Zrsg8!\3"fr8leOlmL$6#H1k^E@bFt"HKA%8)(nLm,@I>(-kc:0hTq+qP=K@X4e(U^CuP[8l+B3K\E$KfuSK.L](C15J)n?E%K.KWtaB12]7P7=T"8=%["j`)50O?"N0kTBa>l7BA:K@HkG>sJ@eZ6,+nU*i!B1E8U;)u08==T>.8e-F(kNf_4,tO2ZHuD1(2Bb$;FP'a9SaUJ.#,a2!fgN'W35R9u%tXVQV"R4UVKQ&DSDE_@KM,[SciKceT&2pbjN3l6M(&b,I9F@R(r$A`3dka]06XRYCAep8fbE",=%L+D"\ctiRfMSL&t*NB>[U_^m+B$Fo>gAE4TVN\eMU@W+G0+jD,e\-'m=uAOp>/X9!pecQ3u@1?!En=K,m$1kJ8O`@uZK?.XEEQ<9[?>s0@?l&QIL7IO#INB?;k5&G[J'ciL4(^2fp!U[oU>@ZsP@OB:Jd!eKDu@kWMY;q'T]'WT)2GdZTGs$5G[O%%QSkT9QeFjY7O@%WM4u1Z7@<0PI5CG"K+M9crG_*HmkY8N@27\e?8F87Q]tA?"X_1m1:1k2fu+f8agFgQ\W3e*I22C$ht*jD\di,#N&M6<[endstream +endobj +26 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 257 +>> +stream +Gat=dbmM;Z<4$2IHYJN~>endstream +endobj +xref +0 27 +0000000000 65535 f +0000000061 00000 n +0000000102 00000 n +0000000209 00000 n +0000000321 00000 n +0000000516 00000 n +0000000711 00000 n +0000000906 00000 n +0000001101 00000 n +0000001296 00000 n +0000001491 00000 n +0000001687 00000 n +0000001883 00000 n +0000002079 00000 n +0000002275 00000 n +0000002345 00000 n +0000002626 00000 n +0000002745 00000 n +0000004039 00000 n +0000005056 00000 n +0000006089 00000 n +0000007167 00000 n +0000008234 00000 n +0000009217 00000 n +0000010414 00000 n +0000011635 00000 n +0000012743 00000 n +trailer +<< +/ID +[<25b005833ac6719201eda8c8a8690d7b><25b005833ac6719201eda8c8a8690d7b>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 15 0 R +/Root 14 0 R +/Size 27 +>> +startxref +13091 +%%EOF -- 2.43.0