simplicio-prompt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,148 @@
1
+ # Prompt vs Normal Instruction Benchmark
2
+
3
+ Run date: 2026-05-21
4
+
5
+ Environment:
6
+
7
+ - Python 3.14.3
8
+ - Repository: `wesleysimplicio/simplicio-prompt`
9
+ - Benchmark script: `benchmarks/prompt_vs_normal.py`
10
+ - PDF report: `benchmarks/prompt_vs_normal_benchmark.pdf`
11
+ - YOOL profile: `YOOL_TUPLE_LANE_CONCURRENCY=32`, `YOOL_TUPLE_MAX_LANE_CONCURRENCY=64`,
12
+ `YOOL_TUPLE_CPU_QUOTA_PCT=95`, `YOOL_TUPLE_QUEUE_MAXSIZE=8192`,
13
+ `YOOL_TUPLE_COMPRESSION_THRESHOLD=1024`
14
+
15
+ ## What Was Measured
16
+
17
+ This benchmark does not call a hosted LLM. It compares the local operational
18
+ behavior implied by two instruction styles:
19
+
20
+ - Normal instruction: flat agent materialization and sequential execution.
21
+ - Yool prompt: lazy `batch_spawn`, tuple-space routing, and `LaneWorkerPool`
22
+ fan-out.
23
+
24
+ ## Results
25
+
26
+ ### Scale Representation
27
+
28
+ | Profile | Represented agents | Wall time | Peak memory |
29
+ |---|---:|---:|---:|
30
+ | Normal instruction, flat list | 131,072 | 217.11 ms | 28,749.88 KiB |
31
+ | Yool prompt, lazy `batch_spawn` | 1,048,576 | 0.16 ms | 6.32 KiB |
32
+
33
+ Observed improvement:
34
+
35
+ - Speedup: 1,397x
36
+ - Peak-memory reduction: 4,547x
37
+ - The Yool prompt represented 8x more agents while using far less memory.
38
+
39
+ Larger scale run:
40
+
41
+ | Profile | Represented agents | Wall time | Peak memory |
42
+ |---|---:|---:|---:|
43
+ | Normal instruction, flat list | 262,144 | 431.45 ms | 57,542.32 KiB |
44
+ | Yool prompt, lazy `batch_spawn` | 1,048,576 | 0.07 ms | 6.39 KiB |
45
+
46
+ Observed improvement:
47
+
48
+ - Speedup: 5,902x
49
+ - Peak-memory reduction: 9,000x
50
+
51
+ ### Active Execution
52
+
53
+ Workload: simulated yool work with 2 ms latency per task.
54
+
55
+ | Profile | Tasks | Wall time | Throughput | Peak memory |
56
+ |---|---:|---:|---:|---:|
57
+ | Normal instruction, sequential | 256 | 603.98 ms | 423.9 tasks/s | 17.33 KiB |
58
+ | Yool prompt, lane fan-out | 256 | 94.87 ms | 2,698.3 tasks/s | 879.82 KiB |
59
+
60
+ Observed improvement:
61
+
62
+ - Speedup: 6.37x
63
+ - Throughput increase: 6.37x
64
+ - Tradeoff: the Yool profile used more active memory because it creates tuple
65
+ envelopes and thread fan-out structures.
66
+
67
+ Larger active run:
68
+
69
+ | Profile | Tasks | Wall time | Throughput | Peak memory |
70
+ |---|---:|---:|---:|---:|
71
+ | Normal instruction, sequential | 512 | 1,212.88 ms | 422.1 tasks/s | 33.55 KiB |
72
+ | Yool prompt, lane fan-out | 512 | 130.28 ms | 3,929.9 tasks/s | 1,739.41 KiB |
73
+
74
+ Observed improvement:
75
+
76
+ - Speedup: 9.31x
77
+ - Throughput increase: 9.31x
78
+
79
+ ## Findings Beyond Speed
80
+
81
+ - Token economy: the Yool prompt has a higher one-off bootstrap cost, but it
82
+ stops repeated chat-context orchestration as soon as work fans out.
83
+ - Scalability: the Yool prompt can represent million-agent trees without
84
+ enumerating every leaf. A normal instruction tends toward flat lists or vague
85
+ "parallelize this" guidance.
86
+ - Memory behavior: Yool wins massively for dormant or planned subagents through
87
+ lazy hierarchy and compression. For small active workloads, it spends more
88
+ memory on tuple metadata and lane workers.
89
+ - Auditability: Yool execution emits tuples and receipts; normal instructions
90
+ usually leave only a narrative result.
91
+ - Recovery: Yool has explicit tuple state and can resume/replay pending work.
92
+ Normal instructions depend on chat context or ad hoc notes.
93
+ - Guardrails: Yool has named CPU, queue, compression, hookwall, and disk GC
94
+ concepts. Normal instructions rarely enforce these unless separately stated.
95
+ - Portability: one prompt points Codex, Claude, Hermes, and local scripts at the
96
+ same Python files and commands.
97
+ - Failure isolation: lane routing makes it clear which class of work failed.
98
+ Normal execution often mixes planning, coding, testing, and review into one
99
+ opaque flow.
100
+
101
+ ## Token Usage and Estimated Savings
102
+
103
+ Token numbers below are deterministic local estimates using
104
+ `ceil(UTF-8 bytes / 4)`. They are not provider billing measurements. The model
105
+ compares repeated chat-context orchestration against one Yool prompt plus compact
106
+ tuple envelopes.
107
+
108
+ | Scenario | Normal tokens | Yool tokens | Savings | Savings % |
109
+ |---|---:|---:|---:|---:|
110
+ | One-off prompt bootstrap | 19 | 210 | -191 | -1005.26% |
111
+ | Scale: 1,048,576 subagents | 47,185,939 | 232 | 47,185,707 | 99.9995% |
112
+ | Active execution: 256 tasks | 11,520 | 6,610 | 4,910 | 42.62% |
113
+ | Active execution: 512 tasks | 23,040 | 13,010 | 10,030 | 43.53% |
114
+
115
+ Interpretation:
116
+
117
+ - For a single tiny request, a normal instruction spends fewer tokens because it
118
+ carries almost no execution protocol.
119
+ - For massive work, Yool wins because `batch_spawn` replaces millions of
120
+ repeated subagent descriptions with one compact tuple envelope.
121
+ - For active multi-task execution, Yool wins once the prompt is paid once and
122
+ subtasks move as compact tuple envelopes.
123
+ - The break-even point depends on how much context a normal agent repeats per
124
+ subtask. In this model, Yool starts saving tokens once there are multiple
125
+ active subtasks or any large lazy subtree.
126
+
127
+ ## Limitations
128
+
129
+ - The active-execution speedup is strongest for I/O-bound, subprocess, API, LLM,
130
+ browser, and external-tool workloads. Pure Python CPU-bound work is limited by
131
+ the GIL unless yools delegate to subprocesses, native extensions, or remote
132
+ workers.
133
+ - The benchmark measures the local runtime mechanics, not provider-specific
134
+ behavior inside Claude, Codex, or Hermes.
135
+ - Token savings are estimated from prompt/orchestration shape, not from a live
136
+ provider token meter.
137
+ - More concurrency can increase memory and scheduler overhead. The high-speed
138
+ defaults are aggressive and should be lowered on small laptops or tight CI.
139
+
140
+ ## Commands
141
+
142
+ ```bash
143
+ python benchmarks/prompt_vs_normal.py --json
144
+ python benchmarks/prompt_vs_normal.py --tasks 512 --scale-agents 262144 --sleep-ms 2 --json
145
+ python benchmarks/generate_prompt_benchmark_pdf.py
146
+ python -m ruff check benchmarks/prompt_vs_normal.py
147
+ python -m ruff format --check benchmarks/prompt_vs_normal.py
148
+ ```
@@ -0,0 +1,118 @@
1
+ %PDF-1.4
2
+ %���� ReportLab Generated PDF document (opensource)
3
+ 1 0 obj
4
+ <<
5
+ /F1 2 0 R /F2 3 0 R /F3 4 0 R
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ <<
10
+ /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
11
+ >>
12
+ endobj
13
+ 3 0 obj
14
+ <<
15
+ /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
16
+ >>
17
+ endobj
18
+ 4 0 obj
19
+ <<
20
+ /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
21
+ >>
22
+ endobj
23
+ 5 0 obj
24
+ <<
25
+ /Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
26
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
27
+ >> /Rotate 0 /Trans <<
28
+
29
+ >>
30
+ /Type /Page
31
+ >>
32
+ endobj
33
+ 6 0 obj
34
+ <<
35
+ /Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
36
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
37
+ >> /Rotate 0 /Trans <<
38
+
39
+ >>
40
+ /Type /Page
41
+ >>
42
+ endobj
43
+ 7 0 obj
44
+ <<
45
+ /Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
46
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
47
+ >> /Rotate 0 /Trans <<
48
+
49
+ >>
50
+ /Type /Page
51
+ >>
52
+ endobj
53
+ 8 0 obj
54
+ <<
55
+ /PageMode /UseNone /Pages 10 0 R /Type /Catalog
56
+ >>
57
+ endobj
58
+ 9 0 obj
59
+ <<
60
+ /Author (wesleysimplicio/simplicio-prompt) /CreationDate (D:20260521154938-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260521154938-03'00') /Producer (ReportLab PDF Library - \(opensource\))
61
+ /Subject (\(unspecified\)) /Title (Yool Safe-Speed Benchmark V2) /Trapped /False
62
+ >>
63
+ endobj
64
+ 10 0 obj
65
+ <<
66
+ /Count 3 /Kids [ 5 0 R 6 0 R 7 0 R ] /Type /Pages
67
+ >>
68
+ endobj
69
+ 11 0 obj
70
+ <<
71
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 2409
72
+ >>
73
+ stream
74
+ Gb"/)>Aqt]'RoMSR)aa2l.dr)!=MGS#I^a"X(<"TcEmmPinudmrr&E+a1!t+;cHs&TrQK03HO?Xqe"-m2FRatB`'el+S=XpS\CtW13@MmW5&I?]L/kTNkQR^Xeq1^)+atZ>%>FOJ9`7a;4Lo4JH]3pL$8t!a:L5F+Ci5-V%R!A%*1(KB_5)hcI'27oI&fPmjI=Q?RF6UbHB4tp&nZK5o3>E8UCq,oJc^7Ef.2X;_;@D%F.ck>_r,FJkMrtB_4&cXBam#QQj2g1QQ.kFe3HeGaW.O2a9bR.%8GaVC20r9/fr$eL!d-]L;)DrAo1aUW:44dFi,g-8,&=&0jl>&:)-+/UdXDT;KeELgr]<QhPdONA6-t-8aN1:'G3EKl/q>jOXMc7^$]WZH6b:4?D@N!;IYlhC(rW(G#!XOY2_;4V*&pgbSU3PbK\;S-%OJk^8T)3?T)6%Re+_`6B=dY1L!u0LTe694mG:Td0end^`_[[D1F+ko*8YqW?sT17Pc[+J-)RlH@p!XjRX!"L_&]TD7(h5=Y+sdXOrsCS/9NgWrUL.X-D/HAk&"j>sueKLH[?b:LtfG)VSeQ>C.nqODg9F&9*Nb0k3WP%J,lSkNe?X5dq`R(LN=H4>3+4:CTRRiH6WC$sdY[TA@%=h%au@+urr\Vp7[Jr+T+gr_;+]"fJ5RD4EkCuQ6]0EB,Dp]-?40278U]46M*=>=S!&o6Jn,hR-`p'.[LLV[3irGqQ!IrK8Qiqr@*0DT26=L%bgSJAjSMJVJJ4'-Xp0e1'9Yq#+I;%Z!p*1U7*Blrt28IM;sV-b.]i+B2+D27Qep+/fNejd]t1^\TZO#%mA#%h+Nn%5(8a,BVmoc\ig"1VjaXFM8-<e`hjr>d"6&_.!t=9o]'QlB`NKA4r18oU%4V;N%TR(@ZK=Js:iV@aT&K3a.q,nuGd*:&Z<SY-`kVH$:j8obdmjBP=`g,FH-748?_@Pf"6,TO12IF'%'.]Y9Ha?$8/i"$f$X>o=1"(d^3,p-Nc_T<RJdikY6Ydi[)4iX`NIIUiU99]hW9p9"Q&Y[nV1r0?l_MR!p7@=k`!QHQHg;lPiP^u_,1Ju(9-l!$TMl(H[<,+E!:J,&GNU$CdOs/1LKR$u@S+t#+XM`CWb6Hlr)/K^=750>'eD"]#YT]BEELg2@N@01\=o$*M#RWl7\EZ%F5F\,ll^2[m`=NGLNgZ`V3(]2L=^MSWfEtk3ffMW-@_k(h3(-!#P:Gmc#q.h$!#0Dn$<qAV'T([U*TT;<WMEX0]a2"+DLFZ#$iWXLoIMojeFo#jC?&E29-@=.cP0lV;Sokt$2Te`dSd.o"WrUOJXMHsAM9IN[Z71-**=7)2;td8OVLs,,2_;T)GOWSL7P::2O^.WaElG8/rf"?kkq+lcVF*(g+S#>aX2kpcX:$k.p]6bmYmhSSc<G!-T$Du_%2[]>>;$2Upo'YeSu'aePK!'J5eCpc9@Y2p7/aX7R)80e9s)U7,<F+cgV(O2o8bSkAZ@he;"N)=fW/%Q*P!L>-W/5B(JaZa4i!;D;'HDhK6QrVQJu[obeWOh<D/N%FhQk86`-'m?P+\a1?]f1bRZTKb?8/XM7lT$C*8!9FVRL>7E*)@D+i&C%\P*'/`Uu3ZqA'G4dIdHb3;''S_p"s,1u2CP@PW83[XR!mt0:?/U/"B`nAT0hNAM@8`nnm3)L(@-qMR<?[P=JY`F8:DhadMlg#H"'*nX:;b)U%-jU.P%m`ijWo`#:YAd(H=#HGN%6PKTchO]pMr1dN>lWr;$]9P8m89&5ZtPPUMReW%EQ)Fnjc4mBX('uEJp6NWaWO9ro/%G*);BS[%?m[<^#)7QB2cs`c!7a^)sk=#`1XHiV\UZRU#a3*d%eQ#+B>jD]e?>;\"+<*MPAhI$7HWUiL7Om:)r]8NAp\RWWRJX)!76G#2+OCC,8'i9[,5dO-'"F=C74F=NSEF=JJ8C>AdEVZYso-6Ok`Z.,cUj_=ib;U^2:D4DP:25a>=jQHT4*=?nT@KgkO@L7.S,-#U"IR;QcnO!n+!%^23/l`ctL0AI0jN9XJ.sqk]pJ>rB"a?;>81ni>pWF0"72islJ<1q<a8aHA*'r#(<5)'TM`Nr8BTCB5TQRqrRFHNlNSS2G9;$$NBF.'Y?nDC0"Vaj`UcsU86+%?UVI2HBb<[G/Y-).kLoWffk(FF:#&uN!`R*^8rh?nB<+8-q6!Fn%K3A]^>%B.@bJ@5l[mFL+8i-mgbe=Dfc@2VZYR9K;Hs_q@Q1+%NWtV8g;W:Jpnu"MdVE-_lp?U)Z7&o`Q\gsr8[_]bqQ,u1Lr!(\C-cVE,iu2-JBPeppOF(`c]1'gb)#o2A8LM"_[dg]t"3V=N"iGZonN6Eb+isY^8cI3b#M(/T`)"A*hO6hj'HU;=`,(2-MD%M=eKa;AIu[,Z-N~>endstream
75
+ endobj
76
+ 12 0 obj
77
+ <<
78
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 2040
79
+ >>
80
+ stream
81
+ Gb"/)gMRrh&:O:Sn>/Ag,Rj-7^,fqZ(+ml[6Mi0IjL)*l(IsXPI"$i$muV=Qjt7SXE%2.%6-\BVm$Z8FiE2U(Gk(M%Ce;_4KY2WK#o@,m::R$U9R\A(9MRdBn6;^:<,*^*WOS]s3X,Dr9UTDG)+(m\aq6,Ek2KnT4"MVF.B8AIjJ?6pdua1a-e)-c<LcluQ/i;O3l,shD)1W.dqo0$i!#4n90k&->;sO'POLJV8W<>n-$f4IApljM1d@2G7l#@=#KMOo9PY^-PBqS`9n9@=g57A1s/?eBZ:r&fFAu5n7+]0.XD]^DYA\Tf&pkld[AlXUrbK#4$EQ*bcL;Z5]1b>d@YSXc,3M`<le,9ZQ@NaYf7u@G^V4G`YpZW,G2_?iLI63N=fjX+H9p\om;?u$gWe?N9Or+?cmBDBKIU;*@l%OZ[,HVJ9K_lP?o/G;16KWZ],5(07!+7"3OtYe>e]!%Wb(B/_s'Ug&rt*S]nk7b:m%G1mfh,iL=2OpG4]Bt"PFN#>G!i-\(=@>K7h)PkI!ZDl(h?kBZ8.M$/B**`=,NC4&XH0Q\Z?]3gA.kE5%8.#!X2*BXP&<'V8Y4=k'm0hRu('mR"X0SRWPk!3?ssI;A&[hg_+!>_KWe18\\<_4Z)Y'b$gL&=nCL:?Y(5c+(PNn]L:[gmYhYRYB8gaEfWpcn$'ha3pGs&^6^4,M8Hs"e$/>qlk?%/qR6LIC*1!\%"<qe\6@#hcP,Lkkpr3/ZeF=pB$9_J5<jBd6W=oT,kY(6hg=\_tpP+m/>@V<8W>MBt^!Ac;tfZrZ(^>=!HA_k]THBE`=6DX@+m@<67KR;F.@*K9]!HGdaL4]m/g7,Yp'[/'4a6[7h1]RrJ:%M<*oLC.]btCCh:]%2L-a+!jXWpjj(:3I*QJe"[EKhs1hj/[Ye#PL:UX#J`;>!j2=jr2eS52t_Q<"&8ggHF;M/(O7_:ZpaXNMNOYNH"8Xm3nkZi&Ooot!?<R$ac(`pB(k/C)j2ShVliLpr/-;;5$3\UiVWcgQ6U[(T:-bA&fZ)G3F9T/`@raIdlbkFD_+@OidsZXo&Hb_AMgM=Vitj`aT*0U7_JM0^@"7>/?_"WG2)Hq#pCLXMf*_Q,"EgIa?h.LU[QYT4AeocFU2WA\Co>B:'c4X%AI46eD^+jk`?dtYmdUdaq-1j@bGpmdfJ>nJilTmIutm7?DFSrh#BWn(u]hX5Rin:oW\TEqusS"kNXH_IL$f8Q(Z,'Q]rYV#J`;:o!X:U5UQ/Z?FTA"@0Dj7EWe8LhBY#a!P(s)"Ti$u>8f%WK^.r&705kbjaKF0<qU(=:)!a8X/p,j5HVE>@_PH+(?_W>bX<D!"kg?`S>o,s=_aAcd=slSh.AiD'F&'GPq'NI]6]h7hL?3UC+CO9%qDS4&6P"&Z[1"m2iSWLc"^<ETG0EgEUR:pJQ.L='gD,D]=redS#1:8+;F?D<gkf>29..`!(U>f;mQ;,%TgQsIVu%-f4K1^J2(*M(`TM8!c;a!D2<tuC06cYKKEk1-:o+tV]sR+^<ra1X^fd1ll*lF^^ELIcg_b.c@?$ho48:)11N*dn7@LP1*cT]4GSPVQ7bRX.+;n=YT1sdR;@3#SD@GJ.XK.bpd5ZLV2CX<,FJo!>:N(-WA$Y^+S!lZM#s^"CHX>NojQJFmD!P9ZNj7faB844)eJj#MT3+*:G]ut(`Qbb"(SEgZ&rT]i$DD!WeG-5BuVHuZK%@Y`C(H+G?^;6G"c5q@;1F\D<nq_2;Qg;X6GDWDb8bPR48+l(01-l"WlWO5aos!:u<cQdU]=dZHB4q;3=pKq%YBm(m&-]"pn^T>,N-W2L`Ao6FBA;O&W&tJn=hR(m\RK>a:YZP3Q%H]Z0#51:>+2PXIV'_,J$$G@sG)*<\O8,=:@F8G.2Fdj*7!M0Q8S2mHcM[V+UI!/pTDLI^4k^)K1TKD43[OW1t%#*7R'HZ=7eL5*<=1c4!YU.*CSCOk?cp7Fq5N/Kq]LU16TU[8o#>6MQWC7gRS*3EEJ]/3uhHL7N0>=9XtEh@3NHekF&mtY?4jBjh(Pah~>endstream
82
+ endobj
83
+ 13 0 obj
84
+ <<
85
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 1187
86
+ >>
87
+ stream
88
+ GatU2gMZ%0&:O:SbY*M/O`2V(\imJjGHjSec*m%('aSK0NgNA36;$+XfCr+MV+k^BM$kOda>:^i4>WL!8-(p5pg#^E^Fnd<]9#?Sb;G!*$!LZan&r]1,2?<JS4*bIP_M1+U0PJC.*L(-U`m!*'2^1IS+A=/akeUQ\7G\t1gk<^K<MM`MUl\]_0@5!G-!-N7p<VO`V,m':m-+2To73bN@pL0>t\H6<o"OgmB*@;VWBrmh`PrgK7HC)2S6H<2R4[c]&!ocY>'A^1!a!m#Kc?.R?NhMFlbZ\b/6t:cWCrNiIPYM=kE)G=-Os]Mo6-*M-rX=orth0;jPC*1g>T3LnB]0PPBXE:%"W@Wq9S>eQ:<1G?$To-\N/r#l!4i?Qu"bQ#P_o_XY=-f1CDXTi]]GjkTBpfkJIP/iJ0=As6/3*`RJYX3"O!c;."h)5de!pee$9<pK&23_-)Lan-L:Nf)oPjraB1?a+Y,&6["O&Yi38j3O@d(G(I.bLe*CC::g]VSB>iF\KP7/LEH%\j(+Ga6]!;5V`H$#p<i156:O#aDoN_c/UO1Be_>rH+Zk7LSr)oo3?,'iSeK*_3ck0%![##bc6?D<qJ,RrF-"])F*ht&i!%b3"VHX+j4Aeq.Xuu+N\5Ja!['bD[Mn[P2F"6(l[LFb5@d@pjeO:W:jO]Hf%=[8U,?GM/TBk6Q)ktOUA;Q?=J.?;f<@!LXmj[DiJN-r>VkL?W=M;P@%K_GSc@>.q9ksg8N^>\s0%C1\q]4'jAA`")+o=%c=[jU6:Kejn(5ZXQiaq2b/bL7bLDUdeas[3%/l*=\-Ho,8JoJKC3H-_]P-9ed/-t0^CS;V]jl<`qC$+3U0)s+!Yg+R2C,]8Wau27#8Hi<uB7tAZr&`%;<sNX4lJGD>\D7-\X%0Ab:nq[ObC[E,E#1i%,<\d$97uQdd4H[B]a",5'#N]=U'AoiehDF6muij89(+4BO>irYf:S\/3L;kt)d-GIB/lN,AT=$V%.WN`ntfNC,^jWkim&>?sdOrj$-XZP*kK62%Z]O>kobX/-iuSX$rXSb9!7[(N1UMRD!%RU+B$aEqQ7h>>\"[O`m3!bpaAoKF#^gWeVW.l4OYFb>B\6T<p!b-[MrL(t>)@!Ef+U`(VU=W><26F%&`,^!>6Z*:YO%`jtN7L/4"X>"T(%RCqXs5Eg".V\E+^[o`R~>endstream
89
+ endobj
90
+ xref
91
+ 0 14
92
+ 0000000000 65535 f
93
+ 0000000061 00000 n
94
+ 0000000112 00000 n
95
+ 0000000219 00000 n
96
+ 0000000331 00000 n
97
+ 0000000440 00000 n
98
+ 0000000645 00000 n
99
+ 0000000850 00000 n
100
+ 0000001055 00000 n
101
+ 0000001124 00000 n
102
+ 0000001438 00000 n
103
+ 0000001510 00000 n
104
+ 0000004011 00000 n
105
+ 0000006143 00000 n
106
+ trailer
107
+ <<
108
+ /ID
109
+ [<0da54b4afa3b68d501c20ec7de58b460><0da54b4afa3b68d501c20ec7de58b460>]
110
+ % ReportLab generated PDF document -- digest (opensource)
111
+
112
+ /Info 9 0 R
113
+ /Root 8 0 R
114
+ /Size 14
115
+ >>
116
+ startxref
117
+ 7422
118
+ %%EOF