From aca27f47188736e0a4bd3fd6e61f6c8eaa8d374a Mon Sep 17 00:00:00 2001 From: "David J. Kim" Date: Wed, 22 Jul 2026 19:15:19 -0400 Subject: [PATCH 1/2] packaging: exclude the 12 MB showcase reports from the sdist corpus/vapi-defaults/sample-report.html (11.5 MB) and corpus/real/sample-report.html are rendered HTML showcases with base64-embedded audio. No code or test reads them (only two corpus READMEs link them). Excluding them from the sdist cuts the shipped package from ~12 MB to ~8 MB (the compressed reports were ~3.8 MB) with no runtime or test impact; they stay in git. Leak scan clean. Claude-Session: https://claude.ai/code/session_01BqJW5Dey1DzqBeBCAJXrH9 --- MANIFEST.in | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 5a55bb0..3f6e12b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -107,3 +107,10 @@ exclude docs/saa_behavior_card.py exclude tests/test_saa_card.py recursive-exclude docs SAA-*.md saa_*.py recursive-exclude tests test_saa_*.py + +# Rendered showcase reports with base64-embedded audio (~12 MB combined) are +# documentation artifacts, not runtime dependencies: no code or test reads them. +# Keep them in git (linked from the corpus READMEs) but exclude them from the +# shipped sdist so a plain `pip install hotato` is ~0.6 MB instead of ~12 MB. +exclude corpus/vapi-defaults/sample-report.html +exclude corpus/real/sample-report.html From 1a0f6f265d00d75b98d84f0ed6a6787620fc1d71 Mon Sep 17 00:00:00 2001 From: "David J. Kim" Date: Wed, 22 Jul 2026 19:21:09 -0400 Subject: [PATCH 2/2] chore: repo streamline (broken link, dead files, hygiene, consistency) From a full-repo audit (555 links checked, 1 broken): - docs/CONTRACTS.md: fix ci/github-action.yml -> ci/github_action.yml (3x, the file ships with an underscore). - Remove 5 stray root saydo/ scratch files (byte-identical dups of the packaged src/hotato/data/demo/saydo/; created by running the demo at the repo root, read by nothing) and gitignore /saydo/ so a repo-root demo run cannot recommit them. Verified: 35 test_start_cli tests pass without them. - Remove 2 orphaned demo assets (docs/assets/hotato-cast.cast + .gif), superseded by hotato-demo-cast.svg and unreferenced anywhere. - Positioning: .github/banner.html + social-card.html led with the retired 'Conversation QA for voice agents'; now the current positioning (the social card renders when the repo link is shared). - Claim-scope consistency: docs/LIFECYCLE.md and llms.txt called a generic prove a 'release proof'; now they state the claim-scope model (Captured Evidence / Test Suite / Candidate Revision) matching the README. Derived llms-full + README.pypi regenerated. copy_lint + positioning/llms lockstep green. Claude-Session: https://claude.ai/code/session_01BqJW5Dey1DzqBeBCAJXrH9 --- .github/banner.html | 2 +- .github/social-card.html | 2 +- .gitignore | 3 + docs/CONTRACTS.md | 6 +- docs/LIFECYCLE.md | 10 +- docs/assets/hotato-cast.cast | 207 ----------------------------------- docs/assets/hotato-cast.gif | Bin 72429 -> 0 bytes llms-full.txt | 16 ++- llms.txt | 4 +- saydo/state.json | 8 -- saydo/test-run.json | 155 -------------------------- saydo/test.json | 49 --------- saydo/trace.jsonl | 4 - saydo/transcript.json | 28 ----- 14 files changed, 28 insertions(+), 466 deletions(-) delete mode 100644 docs/assets/hotato-cast.cast delete mode 100644 docs/assets/hotato-cast.gif delete mode 100644 saydo/state.json delete mode 100644 saydo/test-run.json delete mode 100644 saydo/test.json delete mode 100644 saydo/trace.jsonl delete mode 100644 saydo/transcript.json diff --git a/.github/banner.html b/.github/banner.html index cc9b8f2..aff03ae 100644 --- a/.github/banner.html +++ b/.github/banner.html @@ -130,7 +130,7 @@ hotato
Self-hosted  ·  MIT
-

Conversation QA for voice agents

+

Testing and observability for AI agents

See exactly why a call passed, or failed. Five dimensions, scored separately, each with the evidence behind it.

$uvx hotato start --demo diff --git a/.github/social-card.html b/.github/social-card.html index a7c8c37..c3db55c 100644 --- a/.github/social-card.html +++ b/.github/social-card.html @@ -93,7 +93,7 @@ hotato
-

Conversation QA for voice agents

+

Testing and observability for AI agents

See exactly why a call passed, or failed, with the evidence behind every verdict.

diff --git a/.gitignore b/.gitignore index 45c9976..f4076d1 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,6 @@ docs/SAA-BEHAVIOR-CARD.md docs/SAA-FIX-POINTER.md docs/saa_behavior_card.py tests/test_saa_card.py + +# hotato start writes its demo saydo/ output to CWD; ignore it at repo root +/saydo/ diff --git a/docs/CONTRACTS.md b/docs/CONTRACTS.md index 0412578..0805c68 100644 --- a/docs/CONTRACTS.md +++ b/docs/CONTRACTS.md @@ -28,7 +28,7 @@ reports pass/fail. | **Re-scores** | the SAME `audio/event.wav` the contract was created from | a new recording of the SAME stimulus against your CURRENT agent | | **A pass proves** | the evidence, policy, and scorer are still intact and still agree with the human label | the CURRENT agent's behavior on that stimulus still matches the label | | **Leaves open** | whether the deployed agent's behavior has changed since | nothing extra -- this lane speaks to the live agent | -| **Runs** | every push, in the shipped `ci/github-action.yml` (`contract verify contracts/`) | only when you recapture by hand or on a schedule -- see [`docs/RECAPTURE.md`](RECAPTURE.md) | +| **Runs** | every push, in the shipped `ci/github_action.yml` (`contract verify contracts/`) | only when you recapture by hand or on a schedule -- see [`docs/RECAPTURE.md`](RECAPTURE.md) | A frozen-recording pass is necessary but not sufficient: the recording never changes, so it can only fail if someone edits the bundle's audio @@ -149,7 +149,7 @@ Exit codes are the CI contract: | `2` | usage error, empty directory, or corrupt `contract.json` | `--junit` writes one `` per contract; the shipped -`ci/github-action.yml` scaffold runs this on push, on PR, and weekly, +`ci/github_action.yml` scaffold runs this on push, on PR, and weekly, and publishes the JUnit file as an artifact. Every text and HTML render of `verify` also prints, verbatim: *"This @@ -238,7 +238,7 @@ matching the packed manifest. ## CI -The shipped `ci/github-action.yml` is the minimal wiring: +The shipped `ci/github_action.yml` is the minimal wiring: ```bash uvx hotato contract verify contracts/ --junit contracts-junit.xml \ diff --git a/docs/LIFECYCLE.md b/docs/LIFECYCLE.md index 48b081c..4f99890 100644 --- a/docs/LIFECYCLE.md +++ b/docs/LIFECYCLE.md @@ -91,9 +91,13 @@ deterministic: the same scenario and seed render the same bytes on every run. ## 5. Prove -One command composes every evidence lane you have into one fail-closed release -proof: contracts re-verified, suites re-run, before/after movement measured, -the stress suite cleared. The proof is a content-addressed receipt; CI gates on +One command composes every evidence lane you have into one fail-closed, +content-addressed proof: contracts re-verified, suites re-run, before/after +movement measured, the stress suite cleared. The proof headlines its claim +scope, exactly what the evidence establishes: contracts alone re-measure stored +evidence (Captured Evidence), a suite or the stress suite establishes a Test +Suite ran, and a before/after run reaches Candidate Revision only when you bind +the candidate identity (`--candidate-config-hash`, `--provider`). CI gates on the exit code, and the receipt stays verifiable anywhere. ```bash diff --git a/docs/assets/hotato-cast.cast b/docs/assets/hotato-cast.cast deleted file mode 100644 index e04b431..0000000 --- a/docs/assets/hotato-cast.cast +++ /dev/null @@ -1,207 +0,0 @@ -{"version": 2, "width": 100, "height": 12, "timestamp": 1784237784, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} -[0.70685, "o", "\u001b[1;32m$\u001b[0m p"] -[0.736142, "o", "y"] -[0.765269, "o", "t"] -[0.794733, "o", "h"] -[0.824266, "o", "o"] -[0.853648, "o", "n"] -[0.883111, "o", "3"] -[0.912902, "o", " "] -[0.942379, "o", "-"] -[0.971684, "o", "m"] -[1.001321, "o", " "] -[1.031185, "o", "h"] -[1.060415, "o", "o"] -[1.089508, "o", "t"] -[1.118924, "o", "a"] -[1.148044, "o", "t"] -[1.177044, "o", "o"] -[1.206138, "o", " "] -[1.235192, "o", "r"] -[1.26452, "o", "u"] -[1.293682, "o", "n"] -[1.323218, "o", " "] -[1.352376, "o", "-"] -[1.381968, "o", "-"] -[1.411312, "o", "s"] -[1.44053, "o", "t"] -[1.469911, "o", "e"] -[1.49917, "o", "r"] -[1.529012, "o", "e"] -[1.558153, "o", "o"] -[1.587233, "o", " "] -[1.616357, "o", "c"] -[1.645445, "o", "o"] -[1.674653, "o", "r"] -[1.703741, "o", "p"] -[1.733203, "o", "u"] -[1.762695, "o", "s"] -[1.791975, "o", "/"] -[1.821095, "o", "r"] -[1.850267, "o", "e"] -[1.879708, "o", "a"] -[1.908774, "o", "l"] -[1.938261, "o", "/"] -[1.967359, "o", "a"] -[1.996569, "o", "u"] -[2.025948, "o", "d"] -[2.055203, "o", "i"] -[2.084494, "o", "o"] -[2.113613, "o", "/"] -[2.14275, "o", "a"] -[2.172229, "o", "m"] -[2.201253, "o", "i"] -[2.230431, "o", "-"] -[2.259573, "o", "e"] -[2.288961, "o", "n"] -[2.318388, "o", "2"] -[2.347973, "o", "0"] -[2.377548, "o", "0"] -[2.406969, "o", "2"] -[2.436649, "o", "b"] -[2.466115, "o", "-"] -[2.495541, "o", "t"] -[2.524754, "o", "a"] -[2.553985, "o", "k"] -[2.583229, "o", "e"] -[2.612476, "o", "-"] -[2.641834, "o", "0"] -[2.671028, "o", "1"] -[2.700348, "o", "4"] -[2.729536, "o", "9"] -[2.759185, "o", "."] -[2.788335, "o", "e"] -[2.817522, "o", "x"] -[2.846747, "o", "a"] -[2.875855, "o", "m"] -[2.905165, "o", "p"] -[2.935307, "o", "l"] -[2.964781, "o", "e"] -[2.994063, "o", "."] -[3.023166, "o", "w"] -[3.052424, "o", "a"] -[3.081598, "o", "v"] -[3.110836, "o", " "] -[3.140188, "o", "\\"] -[3.169507, "o", "\r\n"] -[3.169549, "o", "\u001b[1;32m>\u001b[0m "] -[3.169579, "o", " "] -[3.198742, "o", " "] -[3.228337, "o", " "] -[3.257471, "o", " "] -[3.287013, "o", "-"] -[3.316091, "o", "-"] -[3.34511, "o", "o"] -[3.374163, "o", "n"] -[3.403405, "o", "s"] -[3.432548, "o", "e"] -[3.461985, "o", "t"] -[3.491277, "o", " "] -[3.520576, "o", "3"] -[3.549805, "o", "."] -[3.579079, "o", "0"] -[3.608422, "o", " "] -[3.638179, "o", "-"] -[3.667299, "o", "-"] -[3.696547, "o", "e"] -[3.726294, "o", "x"] -[3.75553, "o", "p"] -[3.784725, "o", "e"] -[3.81399, "o", "c"] -[3.843186, "o", "t"] -[3.87248, "o", " "] -[3.901651, "o", "y"] -[3.930838, "o", "i"] -[3.959975, "o", "e"] -[3.989107, "o", "l"] -[4.018632, "o", "d"] -[4.048204, "o", " "] -[4.077269, "o", "-"] -[4.106383, "o", "-"] -[4.135579, "o", "m"] -[4.16477, "o", "a"] -[4.193989, "o", "x"] -[4.223261, "o", "-"] -[4.252604, "o", "t"] -[4.281812, "o", "a"] -[4.31109, "o", "l"] -[4.340222, "o", "k"] -[4.36927, "o", "-"] -[4.398448, "o", "o"] -[4.427627, "o", "v"] -[4.4569, "o", "e"] -[4.486565, "o", "r"] -[4.51622, "o", " "] -[4.545645, "o", "1"] -[4.575034, "o", "."] -[4.60441, "o", "8"] -[4.633683, "o", "5"] -[4.663021, "o", " "] -[4.69217, "o", "-"] -[4.721544, "o", "-"] -[4.750724, "o", "m"] -[4.779953, "o", "a"] -[4.809258, "o", "x"] -[4.83882, "o", "-"] -[4.86802, "o", "t"] -[4.897307, "o", "i"] -[4.926487, "o", "m"] -[4.95601, "o", "e"] -[4.985165, "o", "-"] -[5.014291, "o", "t"] -[5.043341, "o", "o"] -[5.072777, "o", "-"] -[5.10233, "o", "y"] -[5.13161, "o", "i"] -[5.160889, "o", "e"] -[5.190082, "o", "l"] -[5.219309, "o", "d"] -[5.248931, "o", " "] -[5.278164, "o", "1"] -[5.307247, "o", "."] -[5.336609, "o", "8"] -[5.366183, "o", "5"] -[5.395317, "o", " "] -[5.424467, "o", "\\"] -[5.453586, "o", "\r\n"] -[5.453645, "o", "\u001b[1;32m>\u001b[0m "] -[5.453672, "o", " "] -[5.482926, "o", " "] -[5.512103, "o", " "] -[5.541345, "o", " "] -[5.570561, "o", "-"] -[5.599728, "o", "-"] -[5.628879, "o", "c"] -[5.658549, "o", "o"] -[5.687757, "o", "n"] -[5.717079, "o", "f"] -[5.746325, "o", "i"] -[5.775493, "o", "r"] -[5.804623, "o", "m"] -[5.833833, "o", "-"] -[5.86309, "o", "c"] -[5.892329, "o", "h"] -[5.921462, "o", "a"] -[5.950686, "o", "n"] -[5.980267, "o", "n"] -[6.009798, "o", "e"] -[6.039009, "o", "l"] -[6.068561, "o", "s"] -[6.09799, "o", " "] -[6.12759, "o", "-"] -[6.157036, "o", "-"] -[6.186152, "o", "f"] -[6.215373, "o", "o"] -[6.24456, "o", "r"] -[6.273729, "o", "m"] -[6.302862, "o", "a"] -[6.331941, "o", "t"] -[6.361084, "o", " "] -[6.390869, "o", "t"] -[6.420102, "o", "e"] -[6.449368, "o", "x"] -[6.47854, "o", "t"] -[6.507626, "o", "\r\n"] -[7.085756, "o", "hotato [single] stack=generic offline=True\r\n 1/1 events pass (failed=0)\r\n [PASS] ami-en2002b-take-0149.example.wav: did_yield=True seconds_to_yield=1.25s talk_over=0.58s\r\n exit_code=0\r\n"] -[7.518234, "o", "\u001b[1;32m$\u001b[0m "] -[9.719899, "o", "\r\n"] diff --git a/docs/assets/hotato-cast.gif b/docs/assets/hotato-cast.gif deleted file mode 100644 index 602535a53ba9e31cc9aac1d74610aff6baf8c40f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72429 zcmeF)cU)E1p8x-S`l0tCO+ZAzZtN`z7OXL9jIqTomKcr3f+cY1RTQv`ARQDNc2uzU z9%JvumZ(WgZ@(9;xILPiOmf@I@A3G~Kl6CpncSJn=lOZB&sux!eL8pP)V#&8L8@=0 zFzL7d^7_@RXUD#Mg4*}$*r;9um4biS>lfXav7_rv89!F?`d+Q>%)eBp@_)PXp9{Bi zasBk^V{12e{>RE+Bj*(!{oE>hdFiEujn~S4w2HnJyztYwyoX0NKQ=q~W%p0MNxJvL ziEn?gGB=Icx9W@7?g5LA<$Yz6)HVNH(bw_E$8EV%@~xR=!ofQmzEA8~{K;pVf3%o) z^xm`WKPR7j^zBc(etqKP*}Suk74H~0^OASDYn|4uXLXyMxP0|zL(4w<$$Z6S zw;qGvyV_#Tnw`hrTYS~Rqn_orZ6?l5{^hNV6W1O;F8!t6>u+4Qdw1T-wI@H={p44x zNkO~A)MhTNV;f}ci86O>Ia}Xw)xJ3U+5^gB8)hF!`qiyf=ui4aIfv%^bX(dwu2Jrh z^g08#&o+52@7R*Y<1dxPy_SDsMeA8V{AAL&;8a$J1eZ4PjSJ7@c3;+Vj%kykbA^42 z2keY*Qha{RpdFzJm2Vg1OXOWPzgU2|#Egv;CKm^CZ8vTf?4OFI*qt-ZE$_K!dO zY}S0;jfzM!*S3kx*WcQo=-O(od5aBq4yV-~xGS;6#!rtgZ#C-|^OmLePv>-7);6i- zriUM|9=Kz!MXSx9T`V1cc~?@aEsw93&HC{di`HA8-rSeq`g(HfZC~C!wyf1hmTk5_ zdvLCJ;O^u$JHGk+%8psTTDC3w?u$D|m%To(?am**{_OIOkE~wb_0#vy9$nr&@Acik z{QT38Kk^qE8m6=i9vZIoh#hJ$t#@c>gk@X(ut?jU!NZ~)hr|wxcA0o+Sd7P9{qR`t z-fu|UsD%S29v-!5$Xt`ri-#w78NFn5M%?J7<4O*XUN&); z$(ZFIoai!U#k6a2V=_V?A0D%E?k^@GnFhm3QnPHt;DHfKT4u48i- z4v8O|w{+r>vH2NuO~)0iO71$YFfSv1Tv1WUk#WT(yG+Ng-f*Jp_%)la#g8x9{&;CS zMP)x|w3Yp!mrSJElARRYxmS155_#*^Ht*t`Q)YAiORGDNKihcR`rK2?)FRuDZ(NI6 zFh6D4(gCAK&yI;X^Vrg`$ZqxK&DS5?JAd=~%|{O|-o9D5Y2)_&d*jp7_ntVmaaY;9 zlO2Xka_rpSDX?eHUc;OkwRavm#bNN+kT-`rc6{^AHeI^-G-%jw*f4u9mvOW0>$Y<4 zGt%+(uHEXjZ0Xym(K{nXb|36G_8to4nmNE4SEeK4pFImet`qR%sa-iHjC} za`VQ4($8WK@7~^f{OGDRt5a93h)7Dhdhf1_Z!Hi1fNC{;Z9S^n zxO+I&@Nx9=cJT5RNl}kLAu#>}|4sL6n8FYdAw|c;#>K}flaiAo=O?75N%I!Xk4#^d zxG2S-)+}AVJY%IID?2AWFGkYd;)uU_ad}Dg{ z-KNl+c&>`ttF!EHWi~k4say1r-px<9(pt92BZ%-?HI&JLS zTb7&Z_&dApw%EucoE5b@*xb z*3y@w-NrSnh|va}w(jt>R|iF;LtO`pL(z9*G<9Q__ALnSGhFW(Y-=8Ox@W-xGrPuV z!RKz5C*;*^|4#AJ5J}awpO4$EnBM89HYT_YYS4atzu~?cVvp5ZFiA7~>bmLguixO> z|7p&kaIze*no6(%fUWit*p-C^uC;07zGlNlJqNsV@XV=GmoA*Sa_Q*D=cqX}{=5%p0(8iI@XvLC z%pYH`big0+$38Z}C_3OT^8dYkWBC6ZXw96Vp2;?5@YTWS)w zD3s;BZht@5+iUVC2|qVz8Yndg_VHU`exp{fWr9V*m^~N0Bd)ve?Q7F+>$Tk2q6Y42 zr{)9NHc>v-hgwON9ead@DqL;Nx=&Mvk5SmTRF``9jY)}X+|+-;ij3v;S7qij&2Ez0 z-0MYz)kj3lS498;5yAq6;tzJ>!g)HJf}g#5nIcb}JGaL>{oVcjdkq|T=AxDn*{+=p&CYZNAC7WTegMJk=H znx)&q)%gl<4|jFVT6#%k?^=6P#rnN=Rx#=T>tjv^7p1e5t6XCeU>j@ddCbwER+``3 zlX>@EjA`{_n$MNmFV1EvirnK<>R#V9_twayUcI~w)pbX;_fjJF5a zkAT{qb?SQ6t+)T=iJb=zBrRUFcH7p>;v#5LegFx(7y_kOis6M(0Tjoq%&0;$vW;!w zk5wAq2nHF-g)){TePp>~Gp~) zjQjAzfulxM96d~T#HKEozkC@Z>fI-w7i}*6`1&=`!ZaN{&YD5f(av-n{Z3QUm9#Ux zMmy8pbR7Lf50V4)m*^}4LG+P`h3qwJXh52Xt{1&S@6)iff9v2b|0$ z6p;y{N$14I5)QBz;ULW4czFN9t((XvD~J^2|M$V`c2uQ&ROO&*P$VWL#wq77m>-|M zaFLXpoRYd=@yg7ErSoD}WMmbjXXnJ^r4_D=DON1cTfZf87r8v@p>jB2o3=(dYW7 zsqMZjI8``edf2-gd?iKWy*|C(t(cqN_Ra76-t8S^&~B`$&Mi(mkYxV$=S$UJ_Bq(E zdbgIYO&YE0+Od{JO*8ciPi^tktxQ@%bLw6dKPiQpXP|&w%^?7S#oH~oEXbMbEV0= zWm96T0yRpD?3}SN;f31OYlf{YP;Llq@wRuTohh58^&3myt=PMC|E2|_4j(yitkb@e zZ+&!p(z#P323@%L_W3iRM)@-rFD@^6Ati_lB1p`az!3u_nLw#U8UO(lgb9cU5bRKP zqC=i0MH+~iQf_=PT#7Z0x)Ep;mbf55Kngc(LRFw6udoJHpb=A$M46x}XOTR62wdPL zc8qZuv%-|f9HK@z5^3{FY{H-9{O=>uWjx;~M=RqK5+ajhV-pu7N2bIqNKA`bC@oG} zs)$xARf{r|nORbHZd|@X=VNQYybOh9CpTH>xzncCRziLvnXFFBy~dZ(6yoxyUZ^B3*H z>W#>3J~pVJ%T52jCN0`@zx(v94&AIcc$CjpLLk%rB{FzHO}lR0kALzpUMPa2cMZx2 z6UvCA%0nO{xIG3Wg5W1Zd!bMXXil;10cdkrWd{XTC9Tz^+3Fx9llj zw|yJS!k%MCV$)KW<>i77H53X#!VX&DgB|w1V$CF>;0aQ(Awn*82r1UjSF~aWr`Q1w z%2=<28e)jm387#iasCfxjrRESh#5BY@JMgXsgTB9*7z>Fkl%OQ=b`I+eD3(LZl8)1 zw`Yu-=ybZ<&35gaOAbG7EqSDz{d{`pOoh%@8&Jc%o5P4H;ga=`h6Y7-M=Mn|t;HN^ z%7=l|l{4*9-s`WEELW@y8=q5;Y(;|=04q-v8g2Vt#W5+<^UGQ$f=a#5)$^58|Wv4sqHfk~`p zB924~iE>g%l83MoJ6jP!@D+~^HJ7mc_YcjiS zo|``Gy_r2)XU`k%zwC3%oa`wr!-S{FCfv`LfeMU7OL>APyH zo6IvzP93SPZrV-bxV&S;%E4LLT{RB*9SV!yN?)W{vTXXm(!L63jk(s+E_ufXfgYpU zq^WE@yxc9q3o>^0`S4)mCtW69x-xpq^&6corVPJx_u9PyVm+%mM~i??=a=YE)Ud>O zF#=H)DoyQ?Bo~-NR1Qc7ju|t0^5p8Z>ojQHhB>5k*Up@hlI8h%oUCRPuVWNGy|BgeDwu22IjYh?GZUNRc=40x3_!f~g!-P(!3lO*ms| z#Mvvz{_hCW?Rzm#OE1mSRpa!cjFpi~l9nx3X67$mrN~)cP!d;E9GjcAc5_zI>eNiD zEis8|2Nx5`RMKkHf2V^2bRJ%iCK=%q?~Msdi4UH{12FY27_#sA5=IRHjGr50h>x zw0g&Z!+x^w_ICdKjIJkcMK?~1`xi5JeFG4JCRtGLv~T2Kre=DVTg^1b%3EaMF)y>hmp{Kllr);{|^dv}TJ z?wJrdxn;Xp=dc6Qnoo+=OZ%Pk8!uNxZCd?va<{{erAsGnfBNkQueF;#A!1HYbkja@ z4PzUJ*Y||5+m-kcrd59EZgyK_qDk&-t0m>)>fl7)cs&eqDI*X<3V){UbSe#fw zL>a|KS}Zw8q2|<+y)-2ig9((Vq?k?ED~Wotp2=mzg@`FJuwaDh8JA8J?SHFc|CR?! z+KA`FPSt)Y)lks*`F<+BYCjcMwVzr%yK$ehlkT)EZ*uU-{+T-ywoE)Xepa73b3#W= zjGPhuUToatgiaHc$@3Jd;eo0#(t<#{v|%Y77t~#uIdoNr6>~mHA7NOQ|88MW@rI4z zG1IneUAujDS^v_&%@uF$T|Uuh-?R@GEnZq@#J-6FqF`2ZG-uzOdBOn;loSY*lm(ojlS=I2MpzCC<6GlSR))8SqE^tEzzqiH{wGl!1lnMl{ZZ}Etdvs0!H3d=CM zZQq`P(hZ^;IUD4$f_o3gj8P}u9Wb-Zm9maEq9>TKxQtvpuY;AK(GQ@3_U>8>-& z74CkEwr{w)>3X`t*34JulCp8no{i_qG)5IjOzX)u13ngVhaEZtT+}dUW!$Eh5 z`v&=|Ne-qOVse*6A?)E<1$ z!7(d?7?go7uX}Juw#*$~_=dae8)w3|7@+^5Z{z_^5SM*pnr)Q>M*ruD= zw;!o})9c(+>*_&K8A_u)`FBXE^->&BF@lIyh;tlUib`%_OG zA&BV&RyY!fs5~J9A7KYLlv=g}G5A#OmY)k^juwL8gB=z(<``BmRw^+9vpT&p*fRQv zVTdIZO8Av2$&Ls~AxMr#<7|Yj3eh%Yb(&|Nebi|GoW865>Mn3e8F*}5{eBYyr*!o1 z9F4O}v8xG$~q5pq0ve$wWyfsZ>FAQdAZ}YSV&=#qI-F zZwyq|+cJjz)s9tx)_D~}6`s|+YSglGO{uB2vG#AaIAW^8*U!>LZ=2Gxk%MLP>V{E; zV^c<6-81RS$Jd5W9`fYtZb#pF`fRX?@0kuEEC(W;1s9`IhiQhWui#K7*JV-MLrn=6LS{h8_dL%EY5?Bu`wTu zpkmGvS;f%*?;@ue_Kz+kT#~LmR17((Gyih7Vb$TGW6j-Ma=u(u;OV%)V6Sg(-l(DX zqLi@rK9n}RllaZ>JzEQvhM^rwCtOiqd>%VHNM zCM`)>o|dsPCTl@7*TZ3rq;jjSQ);9F<)&zbv#qO{yO-9W zQd&7h96X$EY7%Ew)BLQ?FY@B02z^b>yY3$FczgYWK?3Fl|u(Jp2 zr$rCwt=Amt)h;MP=biKOrMFA2mq}V*x8@D^7}hH6*T2*H;JALiAFXJ;7JK0!uZlb^WS9&&BUxK4rSO%Q6X{j2pK$5;z>UD?KuAD-Uzm+I*-KBK+UKz zp~7UqvvIE9aqEsNckGV1PAA4#MrKBDZqCVPH>?Isuk3vBNwP*74aUDpK~YMoSC!CYt;3U z9BNm0cUl*%vZ>V|z-?4LAN!gnJA04Q_Z*#j;*DXaPo5hw^pog|gF=ipR$f?n`RM`| zC&e(s-vJ0+L|Fpo$W#Ac>k$5=ux(s7LPFwd4w7`0FEvbP+^wz`+MN zkOU5RiLDuH0ns8Bf?*RTuon0?X~IKxHey}h>Ng|8z>L9M!6g}XUd5X?@dTXZ54Dt& zj1(1A6kL4#dbV+%&u0x?S`sflti7ol7X-2y$fh$z@GJ_+B#hd2)qCjoFbJ_&#b z;+cg6dgQ^BSxZ zMTWFEap^MU%DlL&D3w|zt1@~%VYMw!;a6Q_Zc(c&qD4)& z^40s+D*QdQP7O?s8yYo<*s}NB{<@}%BU)M2zj^k~{#tggnFJI`bzED2p7UhC!b2ZY z=hUel6^g)$A7<`}3@bNn-_ZGfyZb$}awT1z#RctdEzfkdHLa;`aN<^$?_ZWuCM;F2pI>+Nl-%=wwEdDNX9A8O5c!BJ zM8R8F!Wb<8Y&wEQfEFzPX)y)iA5_?;JH%Be+ zc5mW5kz8Z;h8%q)cLerm3c*jb2Iu9XJ6Pmt5D~uE<_tlEAT2=G$PQ^ADAGQHB27dt zbM&d(D9A~Q*tpne1IIM;5*Nh8$1O-%oSK-vFmZ9p(&*(087q^sqOui>@{|RUJn>u` z5vy{sHkHf`jsaTtn$nt*(lnK1;hey@S+|%qXo#4+#B#eB265DK!dBp<&{>;0K9+Co< zno~U%HQ>lO1Q{SB7p=$z4tNm_A5gOlv6kToMB?}WU$0R5M~?OhN;C(+NjP?jbbt&B z?3fau=n1jFv9tjyxObmdKry$mf^!%_*2g2^kU>Rh`7C2xj5;3v^G0SH%nWUCnKh2BsBqP9hc#l*lWH| zP^b2;e(kI$wQ~;+EDMYaHR-dkJ7+@sTi9-yNOS|SV($Q4VNv7jN1m9TORtXcqh zf0TY4PtI=_Pz7qb!IbM6g_&mDli~Bu}FWv81JfZSD zI>&KXkb3Lmt-A{56fT}Ix}WQ;aXmEVu3;J{wRyuD(!@8TqI&u{zu|3bt*x!LNL5;< zhxVv$<~xBqKDt%8dEIMfzTw`;tlFEV>()=|;b_-Ws_Wt-@l;Foi?C5#fV_1MdXgy4gwp z(Wny^KW)(V3Y=}WwsF~4y?S+sv-q`#@fpB0u)Vw+_+W;fk&<<&Y3&7}w7C9!u6T0*Qbjdx$0$vs?o^y%E@}dPuLg3K?gcu11Jk~?t zp$?+*WG=>XI*4`<oZP`nKEF| zfMuusK1?WWH18e1MGt?rbTG8<-*V!@)Q+X0SEud1{a{n(Tyr;GrjgVNsg||g++ya` z*>8Om9uehbXJTTOI4pS{XPS|ci)*0el6RJMn7d-7qNdU|P@OlRAW%_lMfC-~O8fO2 zhj(@vq42iu;;V z{mG**M)iMM@cFmTzW=flSIw%jtLkuJHk?|%lwJJws3{8;B__d)AEGl-QEN&}St%T) z;m=MHi4?{bYQ${9+f(9XVN1nsdFC}fR-ml#5NPo!IDr;RL>6?hBz6f*SQr*)@eE_= zl8RtPBcg<1P(e<(!ly_=RErptGZ5jl0JOj_ED7*f!aR5cdyuohfgdx%Kf4NA04?0% z6>Hf)ZRSs&y6N^lUmv5Yo|#CMqkVE(dIS$m7A#n}B6e}Y(q*X`xr^denylFDoV?tG z!s3`U%C&i!NvqdvS!ZJ?+U{+k@vt&%iX5^td3}XKa&mXkxmEX>S9WaSi7ayygHCOF zF?->#V^@>ZW)WJ)yUQ+LDL5&8_SoTz(r?#c7)m_8pql1EjYII!Ex{KeaE;H*4{IoYOZ+b2&9bi1a$Ka~n zORlIjxq&GBP*Y}e3Qg6hyI2zi3E&}6NTB*6zK}+6p^my!bkq@CB0b11RFDjK5E8`7 zND+~M0T}?Lr<9_ID8d7g1#ht?f(>JsM;C#^rcj(&Vjec|7ITy^LvlhLHbT2Bhgn6L#^-OcB&Vk3;VjB(Gmj8!|vjNG)$m3UtG)nEY;))w96KY*awyUdekYe&E`*Cify<1k_Lk$!|!zJYpbECRlNh2e z_YB!r5xL88zySN(?eY}5kdgf-f8n~y&t>wcbvHfx80@VB)BLstjLMbzv>WY5#Xf#5RPX;rzwS}tp#h#olh{1ey?iqOPT)ZlmF4y$xI~z3!)gtCv2|VyNhbljMTz5gusjO@{)Teb&s_~D#oS_l;2MSRI;4W}>{``MayW4mYYxIXV1I+!*V@Hn*O&+9+o;YLqiTanejqc(- z=Uug1H8W>(t&^mF^ZlU7%E(BysH*MKwV!AVHcbB~K&il4*KNL7~*M<|rP8~S=UZ#|qb0KQ;>4TEZ zVC(BgZ}tCZ)MuZM8y`0K%Xgo2UiIzU-*@`)r=ss_H}W^yL9WBp%eM-sJhdgX_?t1> zFw2N@N>MjT%}U6MgdP6m6p(RVoHam0oHekY6Jv{b&MSr#wosg6in9iWCJ}_-mF40N zyl}%B%MtY8CaiI(mUILcve=svtDwf0z=duWPmz}}2fi?ltXK9H;@lKgOqB3vRfH8= z69I}=Aa?;p=weFjFgVhZFH_P$ur)qYkPo*0bzHhl&y(yg-YSTxx=~QLbYp40!O~M> z=PIqwj%l8zS-#21+@VG_jpH8W#@7w|Gq&5fL{v9D9n*Ph-b%ev^{H0rb?s()ygDNO zjz!d?&pufxndqMF`6g|XbL-aD72%TR{XRdr7ipxx7>%uENVnsU)ZR|l;Edn` z0og_2!AHrdF^d%Spb|{B+zKP3C~D8Dckg(Ko!vTTQIu_NeB7qpyErJ|qCF$cg5}G3 zW-m@W6h4?!|Y>?MItQn6iy6tg;{ z#PcCk8Bgrcqz4ejddu&D&H%LNM4$fnkwEaim80BXi;`fbme zkCr^yojG}E2dQ1uY^hPZNjFZ~m-jzqZmsU+c|A^Js$M@UGn3qc z!p(d2x)Y`Ure~vWg&%}8y=iozhr+Y@7jI%R zH+SySTkQ6m2L-W)5fxO610bd})+e#+qJuKEm)uEAR{Op^rd?W8!LEo-f7Yh6J-_&URsWqE-{A5^h z%l}MRSg(4)UYF-6mY*IwI!tk~zolyO?73mnrq2xZv<)_q+!a!Mpo!9bx-zyy1If+C zBDk8hSxQFGszpmWT1lo|G?of0rD@RGMXk9uXX@clW9|BlJ9k?aYzt&dnUyW&2Ij{c zloXzJiBk2H^Qp?}2M*4%cJU4~+`g-d9&`4bVv3jZWa+8%qoJRV{HoK9Z9k-pzR=^x z=^Y0&pQF)u_@r8QH=4RGq3h+xL%g|6aXJ2j5Yq4fD(X&gDJ%Ixb!c_g5S9xtu#R!t z2#PoaAuLgc5TOnsNDwP0PAIOZEEy*Pj%osof>KAyhZ#||55qnpR`#7Z&SsT!C~A#o z$YB!FfX5{GF%L^&9^Pma!Z9q6BlGvp=>?#oUBsWUOu!R)Eb_u6c_$7g;3qHjOn9vJ zI2X+RMOWe=1dAFU-e&cV z^o%g~eDX9eskXmMnvJv1umf%9MwB}!4}|Phj#HZKY94#)%qlw%`&gGrZ&*iI+1DOY z6qXg_JJlqloR0)8ahh*x5^iRlbt-nsCyfqWaO~}~s_!<-ub++8hcwCB8QZT>%W!(7X3bxGEYpOkh$^^?aFpE$tk8iwS4dGSf>Nx{!mfZzGl;W%F{)z=SWu=t zWX<#mokJVIi^#(krXeMi(*puJr2Z|K{?^B5)bZAbx)kqhc7IJn>!JG4k?%}iUMqfd zw^hrwCr_NSC%pCLvdDXqVQ9N0r$aZb>=3-%SrdHuWP=*B6VKoG8Smv6v3J#*kA7&h zztx7rZqt%Ku4ysijG|f1H)goi8mqSssU7MuWVWrw)NZ)Q?*gO-Lx zj_*1xTyCG?n3>gfUe5b@`AeMNuz7JX{|p{4ZwHxlC>Dj_RGXS|GR+jtwI?!#;hBMj zL}28hCsBbAGJ-511z^D1MiNm|N=Bf-i30IBna*eMVZagHE+%K@8a9iJOMFUzSq5ed zFC01+ZraG?!py?u0uVwGu|y>K$YueDBL2VzND)c!12Zfkm%o0kV1_ZV`U+aY6^f84 zCUZfE77z)G9OQ$Cju1zuxD^h?on|xwiP!!Z7{x3GCowsas$6syi!s5!r>r=fU|HY9rjE~! zoszd!FC9E`MB!D<*3{L+Z=Ym--f;0!#ZpVjZr`V$+~57MT;c4#U$QFG*=TENbBlF1 zdK5?jL#4t@sa^P7i$SH1p_zs+c=|ISm?~?AuATaHNfCO4wedwNtyE zUrowXHw~?3)%KL9YL9-&5B=K3Hf(S&e^~A$m;I5?dY#TK>NmNONqXVAoW8}K+?#Cb zV>Ixqm9IV+0u9Rx>j?@GM)8O$v{85%i3*AGFw0OOx>}yD**%JVqgYH{SxMMrQfy44 z8RY^N&_RrK_(B}+Vp#^g*l57c*uB6lhH%D1Fo}aKkwhYZ5D#}4(Hpp=J)lg7hz1b) zK`bUOdVp102%{NZK_&~MNlsq;1mCm@n-sv&Fqos|dog>l^f`4o5f3bBG1OJN; z2}Hc=kAc7HLjrN)Ljuu!NFcrS*2RgA9y%|5X>Q5xBMQsv4pz=OryZ$rZI6_jR7-L< zJC}c9y+-o(j_|y`_U5|V=1UE#8zsu~kJ1%d^^-$+!@en0cutD-9JW_7eQ^Kh8h4J` z*08Yao08`DFd+~ zGJ{HR-b4+=^v++O)kY2vrYVw!m_e8rZ1}VCnl_7-7}N<8am`Ys2q$8EsYiqj%OF9r zb#DdB5yzmAMHqz?ISMrqrLe{pTT>`w3&$vzVF4P=#47G96;|C|7TZM>ibD}R!ARaE z5~V^CB00}xf}$Dd7GhQC2bNga=@8C&$z%FKWG(Z&&?ArZ;(S6*Us~mF=`l__-Bmfs z43)>Jl_S=CZs5dL9;b3lzoPOuH6`oSv4HE6i*? zs#&WyJNw)3*tx5`!l`D0PO2VxT-v3K(Vt4QsBM{GVrzP#?9#~$=j+ln^F$k~`zMMY zON|?^XeF6@`ZhgQoc}l@%kMkOC|9Sb$^-hQjK-`Ou60vyD?^I(^_9~VWOu>O7V+tUgX2Ss;1P(SS7k4MHK;^;6;W_nW z5@MUkZcGpp2VSDV`@H)u`$ax2#ku;s5Wa}0VoA^QiOB#2k z#JMG*#96vbQg{?`N?Xtqz!Z%FQu+g!gr2<8Ly~qurE$B^A6TYEpej2R?E-DUvige4 zfyQ8IBX*yFrJ2ML2mJ(Cw#AqQ>?>47+@Y049k8?-djfg#V^9!}tNsEs>3i{VjE%YDjoniHdS?5rTrOH)R$I8n z-YnM)UA^w~u)w&fmk&79*uf^RxMd?OsgCW9agi-)5qxX>MAX zMxip|nF(Y6^AJe8HKj>8QgN_&9lVdz)g(H555L%WL5uHkw(550z zXiegWP@y$xN^w>0m2{yU2^e~jMkD}e#L8r<`tlc%!{R~e(2=hM4+&?yJp9uQrwjY* zZ!={^JK3sgxMgSLNv2*_HCQaZ}Wwh1*95FMgo0HIL0fDbe%3&RHKDeAxj3TTk&;*ZUPUjEoT zML~ynINGS~>m%QPpYedCuG^voIZLpz;%KaQ{ z0Rk?uXn_}W_(ho@24ta3+y)S<0;`2s4_;ZQI13fZgm>8*YXjCGFRXzYZt!OTV^Rm5 zybQ?V=mz=VkyTBg6Keqd@kiWPUrD#txGCeSzWToU<%jsx&@s*^3oAO|^zCnj55g_08M7rh2`=P`$ObvA!bKQfYU@ zVA|F{s&=!QR`Dk1+qAZDh-%_wEwxdq&o?!-{iv?NOlcEc=kp^0el7~H?i2J)%F7KZ z?{8*4>?L(-V_hq-X3FVur6y`yySNQ`V{7;)<+q(?zGQMv&A!Gb{sZaZ%5QGG=wbF% zG$E2mOHMF2L=umEI4`1gX%!Bj#7iC=c8h6_Eg&sT^U%gT|DoYUH`0ncPbAgpTY8Uq ziou5~$l@gro=T-qF6@i|oOXV~ngJ@S46grl6C02|(mQ)fQ zOaBuS%&J5ftt)be<%T6gG%))Ox>sZntA^Neh%946FFIL#%1YdAWbI({N<4|>gOK`v zZ6>$bKYh!<_{qv2{XKP0}v(sURQ(xuVGICDqukg$HWYXuBe**nLNerDf0H)?UypPx+~ zd%7@V>gnzAA1^o`bo#d~T-E9LR5IY@Lj!U5o%UiW=dl{A9upZoL^kjUhQ*zDpwZ=3 zo93e_X>>AxrMYrjRdt)39-@Pd2R*uw&Y%%#1v-FsqzQPy!4St3#^y&J`UoL8e&~BL zh8UplNd=;aj3J8Xc#$+5Ysei>>Ts!nh$5&&@Nm;zJOk$WpmB?fQ!Toj{w5~~Cpw$y zk8UQVh%Rv;#Vlc*SoE|!RESn4!-x}c5>FqCr_MAnhfqWsg9?32u>BD|`P1#M9vVD< zZKvwcfY)}a4h@tX8YoN*DlYe>=BY zIDhn-I_R$2)~tbd#{#w9`d07$_XjlXnBZNf*Uf?;jcJ|0#wj5`T?`|1zVzv_G9-KMiF)ta=_Q$a00^yoUHwAYzcDaMBeGZ9yL!{NoM zL*+5WMJaqyYKB4nqWtApgh0m%MDZ~QG%#X~*Hb7avM3r;K7|4ihePBwQx!Lz7~dz& zo<$b(${`UPJwJtWLitTmuAXo#z-oaqumcU$EOlVV8t{PzaM>Et;l@hyC*tT2@Zyd> zfF7;zTwmp@76PE$8C47?iP2RoHZ+Rtkya3^4&xy(g-WsH2%EH#c&H;_(o$kIm2DcY zH1L#L?T?WDMWO%nzU99Y;&Lbb|Kp{Jt9EoVdv>);;?#JN!WNvUCrO6mapTs**hln&`a7kOm!BLReVhRp> zjwP1qXPQ>bVl)*yW?Gt7r={t6x=ySwJd>ckX?uE`uH&2G^gmrk!;tW_v`F>JW3SQ; zEHPZLrWM)uk>1RP7FEv`Xce)6;t3USShQwz+E^g+{3fs@Zhv=sD9B zwLNwE2HI+pPyIks2UQZUulF>S{G__-Kx<1WbJg3;J1c6v<``rq*~CgU8kHoi>$jnk zqM?&l0AI)tw5YFhF)5$AXQH`e(%s`&puM_!Js^Yx^vF^YYq0q)PPGQcG22LT2Q^5zS@)HbyS)35S**O2jaWPvgmHTVRT2 z;=2j*Enm?htc*0o|2VCXvAR-uXqGRMR6gZMOX4C4PdRwcn2RJSRqq+ci1&;Y4yG1S zmG2p^SMdHy+@jpGc89^v>~O`g{1cM1t$W0gl4g6(OE!*|&t}w4dt>1Z zCw+Cpm2-JFJakr1?tXgghE&b`+tvNm51vMvpDypVPg}DAzamsNBjX#z4XMJbZEU)a zt#i8@UI!9QEN1=`8{pHRpU=lj(hdX|-AJnZsiA91Un5BT!q8h|96R)N>eSEaz)eej zC@6SH$$yfrj z=n+y%hywQSEkT`qtjvjngFhF=PYqT6PDj-j+~X4xlalA9%wLe2#!bt`OO`I<@ML9X z)~f8B+=YsQ!os}OYf9FxTfbpr>88zFwr<-}RJMKB?(&K~d-v@>aPZKgvZBMsPnmbK7Z-*m8;jT-?*7{q2Si1_wGM<_~^4GcNCw0@#R;~zW!$4lW%|c@u#1E z`Mhn~{2x27%dCjd@4VaX(7LR>G1jiR_e&eB+MnS3nyr2B!c_<6c?QMbxi>lIaH?OQ z4NET+Bj4~^=!rDX7%A8fgH_2`x- zIc3V9Og+ld!ZfOtlHHJF7siCERE-+x}W}G2o6?ukwyO zF>w2)N3q&~LC%@s<>R)ko$|={yBXywoms%fYdy-Ew^2G<`*=(&+cqU})yi%wxfS#E zqYGcZ!;QEfw|{%(6O&VS-4<1e;IwqI)N+@j)_TV(r=vYkdPa`?#6W5-XF_dHqIBIiH3aPfJI+`4_| z?r$yf`Qs-~S17)E_AFNU-S^*pL5ut<4gA=3#vAYM3e(#K3_7&#RC%bz!Zaj!JuPzE z<5DZ1$ddRT1@+?OKHLB ziK=#*Cg&#KI-TDud-K2n1%>B|`)>@*?s}-`JS|f1cFRM>7dD2Redt~L(CSNDCN;Rd zaJX6dnkzeIeARo^__x7ApCe>8r} ztd(RVtyFqQQSvY65S}9H$yhndq4Ggc~d;gy)LC|tRg1fI5j zgL6^(RuXvB_Kj(K4jww(Z(rHYBP4LAV@^AZ&%o=obB^aP-?(|p=c>c?+a$1ElIpV^ zs!ZE^kG}rq!d?4k-~RM-#rJmKeD4~Z;!r;GglWK_f(M>bxOt7PZg;G2?Mra}s&Dtj z>$5wzbhUhIj$4-vJ%R_+>{H}sCuYK`L#*zS+n;>nmm?f%L|4<#jA|Srvv1&$6b}nI zf1;CFLkS}qUc8_xmQgkb9Q$&|glkb$oW+rgNo=%P5V<_ZqamKduzO&9;-p7>X^{hQ z#xn}~${>L^Xd%jYoRH1@l~npYhJXE;^?%~uQ@gDEuY9MdeWR?DdUxA-!8Hw*B0o^L_C;g1S zRrDraUjB(Tc6|f@Kqx!KWK+jP#x72L;ee=T%;$<6e1sj~P*v2h2}B1qM+9Sz{5*nZ zejMtsJ~DhUd9hBhNQp}yjCG9g;_(3^yqMoP(cuybJ45DoW_I?d;%No59;b>dI`Tyi z@$mz8gYs!97efdq)S8L?i37domTCF3rsR zV^m7D+R{?lkDrN|6aev~`Id`G)I5o(X7edC5UxYgOr z)b-Bb1x+$LhwGYmy+7PW6%?Uv-+1_{EhgtXExZ^Ubu{hB-L8|@jy$pVV()voM%N{V zfy?)$4JykCH|qexE|IMrMdqx4afWG|T^a5~0nsOFh%y)oXuy<9Dx*Uv?gUcmj8jSt z2P6uxlpT_Q6>|y!hhKQ2Ko%-E7&{e@xx@`+p_S}o+xaJ8;Uf+)h(*DcaFpc=P{J=@ zAxvDdH(*;Xj>oyD{CgDtu4q$FV!a%*^}F-_+rJ&Sc$C-E6{DIAzx#dexuU3g`fi^{ z)^!G(H5=6K;IjATmS+yn{_0~x*p-s$Kef-@-|nc(zTUMDJ(@I5J>~sHD$g%+J(o4; zt{CRGs4;cr)nQ_U^kCm6@_|b%%qfi7+??fIUS@A@35bV@ zR2@=)lQAI)L-+%bpaVqm4U2+~aDz*Z4FnxyH=yB(4ud^n1Q+;{YzTfu%pX}1$6n-{ zoHpbeP|z=1Ax{5@%fDhp8^wy$oS%#96#l_BpO*83^UigN^vLZ#?zCxn)7q(l;gfAX z*fFI2&}U&Yf?Z#0w#L^*$}C^f^PHdM2mNOAdvV@g;k_ah&UzD_ZRnJ-JuM{d0z+B{ z8_9i1{8*J~bw|F!s9IvCRCP&nck{J3sTRJvBxJ~dxHp##n64JRyevJQaD2i3gIXyKvQS{8Q{=Kkcia?6LdCM8BkdWAxoB^ z7J`BWQ3Oy{JHdjbNGy2h6dN;{g}mAcwK5C1BbW(|P7o%L%Gm-YG#{O@I+n6n`ZX&(!yc)=C^LMBVDntecHu32k&h0I2POA&ssHo z`~+o?_pH$h&+6SwBoD=mfgNMx`kB_S?54FbTM#*6(L{}8(Oqqo*(oYIdvvaalZ#tn zamO`lM=x2XSg|s-cdP9~5}cDI+btco?HjBx_jb1nk60ab;^btVjhDmut^C^8*rP$m zZ+E%-Y2f__ogY=a_vGo_FGoH5dhEAKBT64Y>E+){;SVMj8>9$O$PzbOsXVeU1t0lY z6NvDIHHcAjp$t%vk$or_RuWj6g)e1v+XDALvnY5mRu(5kkR8yvPNo)Z(WE zMZu8;Udj$wD$n@k?m_U{&59sCrkp>Ng0Jm+%vW zRlk{%{M&D)B>wiBDKS;QnX-O$>Xx#EZ5vAq+;>K-S8QLgZ|#9Yn=LXQHpRyqgvi4cXt&XzxG+iy~qb&e7XBp#W#hI&#w7#;incwx?c0! zwZCfosI_tx>i$yJP)s1egyyG2ECP(5JWuD(OjS{X5r7Z}h#-upGn-^8DV7~kC?0JF z_UtJ)Kg)u6uucSU4G#$PKMM;pFVE9yex_Y_Cci!V#weDGRA=lR;SUlw$~z zLZZy@Ule5gZd3G2?>0rf`fka}-`*`r7w?wDR{cn2WTHoXl{P@p#-)kDUZs{wl)FwV zyc@Xr_^Rxr>MB?1wMK@Mr*|oA{ga$54JOSr_1fGjxwBIznVCg2j4(CxjJSRO>V{9+ zr)IjhaOog5uYX=Ay_@r(-B4>u%eCXglrg5UUh|aoHGUPhJ488XmPVC-A+^)0%$GMY zUlRYO((LsR&!J(%CA0Qz2V6)Qn=tzLTRVKKwP_jfpfERcYWh+WhtzZZ`W6q^KJNZI z;*FH5efhlK`QtAOJ`@5DeAHMxU8lhO^~JpncGWy-<4BElM#KmLa0y53l3ju!e;@iVKkYmrq6325m9>1}q@L-Sdp$8C5Gw_^;9w0nLW&#e5C=~4E z>z)J`{UG-M@ksN~2C_N8(L!_rl#R`?`q2-BEiFM`0Z#P8E6wmP$`k+ii;v#r7(Z(6 z_|l{1`%kJKH9vh=^{Dv}Kf?0FPNiyEuZ4;GRLQfp#;sQ1MCIK1VUnqth2CEBuH(_t zN8=^UYdwEXm`!(c%W9I7Z%}~as)@OIDytsW7IsRl*49>8cjL58@8-O-W!r0I)jQ2Q zFg?G}vY}L8ce3>Kq}24r%^OKI^fm4ILEn9|uZ#_A;_A?>L5z#PgNd%yqduQMR;f!r zdvLG5d1lzaBNJ*DXfxYI?ROr2S~Y*gzS{Pew;F%+ZUfj}{z{ox3Mn`16w^dyHhI?o z01-2`>O1&U8HX67vhd^i7)61E{H1YHgUApc8)t{Z3dM6X@v(6RDCQBUFv<$jc*ZAL ziBDjImSBZ9Pu@ zmVu#N1g^N5@^3LF-|~3z%P#-JSIROKtFrS}7ZghD%_FmOR%cZHvP;A!yR!4tjWasa#h1$ryOQ6O z_D0@Zp?Lb`!~1Op-nCq`P5&TRf9gQ;Q2)963c^D&E0hf0y!N!!-=##-H&66i*M5(u zsfUMt(&)8AU+-Jga=VY#?#-hyXU2JKpPArWuy}dsuAjzkH2yrxE|9%^U5-kVQydJk zmxY3eHV%!s#X$L4XCOs6;X)ND5|7e2>}86k0Q~id2_E}0Hu3x9;&n)#_pwdlNiGqS zxM&gYt1ZgP~-; zD59ATF^0&a8ZlF1kq=MNHi(oj(~+~{L)YS_1C1miPt1Izr?}w2IRULj{Gn6K0)OIC zoB!MN9?WlO4*KmkG`*J{ulxeNw=Dt0m?5$m%YKy(&_wOu_95q2Zj&~}xtx@glzK=Uk*XXk^AG><~WXE%N zyWZ=NY&5Pv!_LcR0z99B1`#AyI_!`kloV6c7C}^%P@;O&_OAqp{OY6esz?6thHfQ_ zs&x&df)7aHi4kmK1fJ+X5YSM7Amj=H=!O8CkxTu-3wH3bMq^5(CH0q!FHqwYjL=3s zy2&MgqZg> zH;>oUF6_AW9qSb5ZDWt>-+Vax_<*g}VP0?ca?v}DpZS)RTW4>($l;-i%Fj`2wMxrG z#fYF3hhB@9&N4O0n342WH8a;*p5``@zP&sYovM4OtxfzF_Z>2QXvnN_xgk4uys>9@ z`F`VzR39Vb<&Oh1)pGfSffo}j73{lc6RN_4A^w7#>`+3WP!F-9@V6%G#dO6n8#6WE zlw)w=TX2Lvmpa5X1J(?$st>ec4tehI5CzO(A_Rm35XfVhtU-hfAc!e82Pnh@J413$us|>@WE0{;PlAP5 z6a@~{;u7K_PX9$Bx+^a>a+Tj8c=6FE!>b>CTBxuxsFR~~N)?}e+8mptDanc8_q&x_ z_C#&lk+^O{dBxt?wk!9q^>)&lnI0}bcI?zVH)p-xt*Qt6y_ZcI-Dx^s^ zHQxCt(#tMe;W0s)WG#ioTAo||vr9AEbACgj(mpPoxp9>LgjNmtI7;xCQ{94EoNhh9 z|G^srjNknD3UDuf6NS9N9424~3t65BC;Xv=2mv2Bu=v{`Gh+twaDzy6LI)@)5f-rm zP?*Azz`!mjjjf2u8p?=4Dhh=d66h5%xFkYeK?7w_%8Mmp#Cj=P5mM#ZA2D#D9}q*6 zfQBz1&>Mn|=#YOA(BJ*Xb#tDBi+TRV^LhLVUTozT&r{NuFR%RKxw7(C@Zz(U<`zfh z7gT<)Zgq*GaQ<5xi#Kgqwmr9O-TK|-B|A6l%Q&!S)!`Kts$J`|Po!5wpZ)m!(F=Po zrG651@p@kV!E<+_Z${pJ5cMeH^T!cS4PSmGeJ!00uew%OwN+CnUL9=cXcX`ug1ZzP z*6`==ege(~me6S;= z$V^0@$VLDtm3}om+WcEopR;*7@4TTer<45>$8ZJ-U2i|@yXFmBN0~0#7Z)?JaA|bI5&M&_w{$r(!!PqtppQj0GoxSI zwSv*hw=>1}Pq{S2DniJx(Pwa^!C47tLpIrLxS@tHV39MxLIb3D;J|VPEL4GviXw(2 z;f#o~5hLQziQP8$gV>$3HRom!hfeZNh;U$C5##2rs_*NFV{vhjhjBBu>QR)u;l>|p z70&PqeUebK8~%*T!SjrpkldDCit$LV&h1(m1U55D-Ohwk7f6K-bCwe*{)RyDR)w5i`B z&|l>#O&B$Muw@5DEjtT+J#}5lL}ev4bqGwJl`^`&sZ=x2rIoIJo9vl+`L<132bl$# zyLkmAm*zL9Ud>l8X#y=;S=QdYv0|`Ra_r`FD6pY<4VCkTk*9|!)HV0&8^;>QkjDPqn`sE)!TPA+^EHzibw+&R01r*lstZDV#$&`u+$;C1B(5Y*MQ9t_}NihD!mjS4G z`A5OUw2cA?zy}4Q?EH0!1=0yn0Ko+)goVll?D-G88|M$D7O_KZi5(91L`g*%$qnL# ztROmYC(;kIB5DX9+<}h7!|(5{325SoUeHD~zKn5!9bCqHY~Tw}XkzRk@qX{TSLv-7ju2CeV<-i_d=z7@)b7tPz{+trNdy04n+(RU}cs}bkc zTI)W3X8)chl5@nEP{$hPolWE43sHEQ*;Ug?ngtW}l0%@=vd-0gBl~DA_10cFoy`3F z6QWElYWujZm1-C($&x`N2SEizMNDACj5%PyQ06MW2Uhi|qt#tq-M9OF@BRLDILaDl{?;?+n$KKw zGkGh$Tz77q)pR2CRMW9DuIHvTi+(2B0)TvfBSRGg5KvLV#>NQ;4oEu)6p|PMi;$wr zhWj%L*vYeIA|NP8aFxYM2$Ua)GnfKm;0vMy#1L>HVuUGFRsagP5vBmb4@?m+mE<(C z-rxtmpb-!wo5_=V8R>an228*RfFkY(ND*R!YZov9BOsCVVZaFLdPo~|hcH5f2Gm38 z{#WSed1Y`^SPn)0(;FF!y+1jJnO_!Jcwk?4NojdqNM&(NN%)ldj3W$L4wrE-Cvs#{ z(h=V2=(8yi_N{G2ms+kgoV!t8sHDu1$_lG39T=h0^fKY0n1o^$e;3tx|3MLhR?yq* zvU^*a$wC0C z?Op9OPWinok-?xPU~0g3sR}GWO&}I1bumzZAq{W=xF9`H92gC-!7+(JcD4aP-~-SA z2#^6Ch$=D&^aY`VJ&r(;0Y*$sV=w~)(lB0Ox#NO_5omZEn79aw-2qL(palkTFrklu zQ=t|hn_w6ljAM)uFcM%1?|>c5f_D^cz!toNXrKz-A!m5S0$KqY*oUa$OrR74YpBL> z6i|>s5OE*~zod}>^m_U{z4{0MadeQKiAv(c0ObEFZrq06+DPdS3wD*9dKT=ytms*= zyTDL&!zhW1XV<202~%f9sGO@R6UZ=mV+Z$NxoVv)LrcA%gnX?c30giZB2t=b zpD4aYSJFm~MeW&Z!>6SjSek1T0;xWRxhwMvii$PXP-=Q?S;gwLwT$FcI^9MfsVy_9 z=9CUgOhR8K&PHXB(ZGvK=u;fkp|YmR%We8H#qPP+&RORB=G6PeC-YbTJoDqCUygn2 zlv=btP+xeHz*>H1wb$46PyEY5Cx1$ z?GCO$JJ5m`3#5S`s0Px2A5?=hfGvbg6f-bJPzPzEm=W>;8-f1^*n|fG$l)xYFF@wf za3V-vBxm7Yf{=IqccJ=sW&jwn29nBJWvqTi`1*JSbLinJhPt$B9}P)02EPBQAQyD@ zLaU-?jK0KmipAvzcib!H;XCBPhEG{aA+KKNzLCnj!GF5{gv|5+wk(w+-@e`5+Sb3@s)zhBa}+HwB55j4j5-m6xv==49_Fx403KV4T~M z66Jj)OHt(G1}lKr_Zw0X3UGu0Ak2E;T7;e*mTKTqjZl*`2?hxcggbx$LmxE>KmeGK zIzjwsW=Cw~iY0d85o0OtC_WYyT5stWkToVJYG?k0-IER!8x`&uRc>AxYNz#k^C%pI zeE%UI6evg_-~_S8$RR2c{E|4wxG4h+kg(j(5A8vO9#db?9!M0!9Rg9v$$wpke*dIOk1O`utzYlATR&Ve*N*-!jguexd974#V^AJL zM|j&D8+!d5uL0`A9neo%g4(!c^H!Fsjew~Uu`FukRwWb7f%--RcP>m=v6WJHQs8gc zmGRS7LzbecE*&08$rQSJ50d1J6_ZYz&9ZB#S>-vP?_nD;?Z&Am=Q@h7o-D=Un(4{p zRXUugxpc*+zlt1BO(#FSZTkN4cV61RwtMr|?)|tAA8kL|e*G5mNj+0vM0H}o)b}64 zKnocM5m+I5zzPw@K_s~fTp&LI4WuZ<9HGWfi`EO4`ygDHz`%$b2GO88c;AI87bPyV z1V1(`4B&~L4NxVC6JP=y@QZ33c!FFg6TpNl0bbAwkV!`oU;^Z|Kn6O50|B%_jqq3q#{vKjs3Ft3U>5k} zto(Ie{>tCv=Krme^cU6?{N!%chh6iy=2vrl&o^^71&!UZ^{17=!E3YxvSOU|;fn`F zZel2^N^#};#;u4jFi7y8B~9@HT=u(V+RYkG$>c97TsljMk|LbD# ziS+L=?)?Jw-wiWj3^62+4iRR6i%1K@OgJOF0!JWA{1g&$f-ea<8c}~GmVd<^{Wp5n zf0DC!>q%J@`gcAJyqD_zHZVT%zAY_%duDtVV|OkyKf3ThZb?{KPDN!%by)F1nC+oQ zCN%^d3psM~6ob`RM6u$imNU)4S597wDL#{&Ri1w5=H=U0J8JGfNx8SDGvQ^%>!>$7 zh_%t%BJ2PQ-}~-}AtH|-n>1Ze3qWX5k0SoUW*;!YkBXQOScsm00`P+1BWS1vAmLB| zoH$`2i^6whZxb4|2I^6CanS5THF2c*l(4UdE4Hwyhr$89VMrOS*Z>500#d>w)a(Zm z0U*$Wwuo{EZ2ySfZ`#t!-5>KL!A%I7P|cux=5->_KiF0Zts))dERK}9;nH4?x0Z1%^lyMo9_=CoLMEh>UmPR#%M z!8Eg<6wBPyro$toCB|f=|HTu9JI^~=9{%}D?Hbn$F17GDE1(5sx z>r12ugZcnHAs`2eK#s8Gi>ocFUwE9v)&MqOMyP0D6~qd44Y&eP;0j6sun?ht)zA=? zHX+Z%%>dG12_O-$p?5eMqITQ=D~1L)g_Jvg^2uJNc(4aP*{df;9bX;cdhq5eYR<|5 z#T>u!5_W6`#hbF!W^16`DxWnrYqzbBvE8xR!8dAhf}O#_q_`!?(UX#0G8gYm@krdw zkfg--7v&tB%aE1k7iKTZiI0f1|o`B!ZSzA zgboyR3dsthgTs$H7l{aWCvx!?_J~k@!-OXeJjzuh7UAp#Xod`-%mT;IGJ-V#g^Ut9 zMbQN4XsZ(eg|rd31L_9)N!t@3BD)F^#9@Gz0YMxIQ3P>32!%K#P&XoN5NI?Qg_`?+ zE@a$fq_rLoV|?K1d|kOXC%sD}LbS6ddbN2q4XeCWJVTw&st*bbJ?`YhSJR0~q-&en z8G@+}j#e6!(NO&nCSrz5=6NyHbs2K~sJ{Kj57LX;z-Dkc44#e*QzA=>Ic(2V*1nW9 zex{16XJK+GkH1s8Y+F%Pjj@@k`9NAZ-?8FAwVk->U@d8jQ#0K?JQpp#c4f|uY1bFt ztaBs4^p1GEg~WV+qe37cF2Dmw;5SFaiN4@x#4kpIg}{L;#0zM_%O`0GS_8U(7V;dR z0!}@$Vq{DV1jG)sV4w_K0X#wr=mId1Az@x5@E|o}R#bRT0)8NqL>BTyZr30LXkoS) zfd*jU6R`$npp?vdz{eot9wgkN;1S(HnMTr>u-%ObQvx$482<+{nP}xLGU5>#`rT`g zkRM-zB>napB&x8d3&;*BW|r26m*eB5#Tp^g1`zN2#is;PY*#E?qg6 zb3I>sPhrE=p!24)?v_MzgR^d3D?af&()q{(N{T6VJLP@zCraSfAxJg!?6#T2@(!?O zFwU0ro2Jql+Z36mG;3G5?5>kG$|GleX|%s0UtpY@Bv3aOxOi{&_2?<0eJ*9VEO}RLc)NTkS!rt1Sw&|43k{A8Vn)YAM^WM7u{|HFi4WVgEpbQGo``)Zsgdc7ebjzt zQhHuN5?fPNtB*o%=KdrlDHU<`zMSIPG#)opT);n;63Z4ygt6!|iRUh~$p=ZtBplB^ z5h`~2@^+~-WtOCvszzhY*))#Y3~f2Z>RkuZ4!pkdb*V)hTgz{y4k0R(<)GL?sRu5c}yaCj7Bqoh}Y zc|TlZ5GPE&k|}v;4~F`1c}J@m6)Ye?n-L^|QKELD41reyE*K@Q2*DIo{RVMwFB)JG za6y%@?F^~_F#!uGgDtdsNNf0vR{yuN*HrMV*Z_!kTDFXH9~+RjlcmI zgb9Rz7GanWR;UR|O~hSz$YDi_)+3_5S<-YvOBO#q>AvEoLwp3}F_Zvc1DwFUB$Og6 z0!zXMNC2ErG{_maC47Qm01QOI0~jW91^@`IQmSeof#6CeR}pKL;9Xami1>S%T2u>^*yw4#JMt#Y`cimG8| zPb!t_yG>X8`k9-zFC_3NK0jFR$=O@yJ0o5yr5$T%}##{usx-_*X6Q^gsqr zMoYuVJa>W3w#CKG{E0RWvJtWaCac(cPqr0TV!GzJ@SR)@oK0q@Zp=4atTk`Q@asc{ zzH4nsp}fB|iJDhEh<$&R2L-@{Ow=P#s7leOLp8ayce);AAzPuk#rXyxnDs;TiP>bd zVsJFkc*E2vVggK{D4-RR21r3DI29rTR6!FIr3d8o>xFUxz5p_~CMZGYz!9MsXbXV? z(S#`w4KOkF3IL%o1TImH5k(A2gDgfsgL_7h2dxA*qB^3);T#a?KpasZQSJzIr06Hy z;h+G$f4f{3{k+;gyUOonQ!GZ$Bu9Bf;emtMrDYZM!Bxd2Ifsuk_{vg}64i|<#}6}< zWbyjqOl|4;dY-C6wAj_KLv`2lUR%U5|fzCYz-2GiWs zG(c^P^#{t|D2%aZko&a|!#UBOU48H{{PB5ADsqBuKTqU`ioK*>zoFi}56M06Gx6gp zr-sc>Z516Ax~}Jha@Dn6_@xQ9KAEEL?`HuS`|t7_;)bxBn2$jJ8I5IJYyc570rG;3 zgsTy;AaIR=(&OwCBLeII93Vzii@*XLa81IIM+JnN8*l?1Xa}OXjTSLf0{uU-d;zZ0 zpErb|LZl}wbRLL7CfWoBcPNgamS|F^VoizpRN3{DRK#DRb`VJe994xqXKjl5v`xB24z`Zr`Edi#jKf7_Az@y3NdV(+&d z!x?f`);uj42F2RR3c|hXSO{bIU=H8ZR-%p$YdGG<;EsrvrgYC;C~iB>FqBmhAEYT> zr_EE8lskHBH}7^CTQX>r)FHk8W0hqsU*^17z)AN=KOUlNlO(%QkWNva43`Ac_yAdk zxVrcVy5n9(T|@>=<*9UJM%n1I-MaX6oN86$qGZVwh-!r1PEq9 zAA$+4K{|K`vjkpH58go#VDB;B?8bw4uus?_;QwH}fhL>-@CB{`6eJR72vy9Qu!fP{7j8bLTNz)F;HFpJhUD1)5_%>QlBM6db6i`w7)L(Won!FFx;)ZFx9 zBZo}WGlz7dTa4%4(7W?|UvtxA`KL^(IrQmBra_2JQU2hiaxTg89ZtS0r`>qgN-ZnQ zX}P~syl%3FSmqX`G!xZB%a`3(Q5m&zpn-}^;M!FNEH;Z8x7jfw*m8&GuF+b*FVE)V z-B;m%Yv(bx$syupA&5JPH~<53K%&Q!=rzL$Y{Y*B za?nLGDnS$u1d1X7ib#hLi~$b3!@x zeljYhXXo(^DTB8C_B+)EdpQJL%AJxhA!UN1%H_i8<29}1ooA;;k&YLy+WE%q955BzB5L{ho zQeWe=;4P&O|?=%&P0-oc;_8iM)qRa*8<>Bqup9WM{_rVOmF9jupO(A2X)TxT`A!wd_=yX_KfPnY$x zNcee9OS0+!^^r@5taNmsozz5BxOjgWUBtZzrpyQ1=xJs z!svf7z-t-%lJ_|<(=*cdWM$)Xs-Y<)sBzpkiGwLi4K0sDzt zqK+|Yi_i3Ih+lo~Lgtm8_1CV~noiuo`s)WB<4@E*hFTtdYWMs#HpFMW8TStRiGPjU z$CXqa){zjqrCZKuPK3UuYzX!fC;OeeM@J|O_PS+$;=Z*{AE@QhCLJnT*QFrZQ|?jA zZqt{QY*nb`y1{F2LoH`d=6Q|^7N4#p(oJ`S>-&8@h6IOPiHZeT4CV8rnQrKCqrJGa zcV!Ja2M{7O%h6pxX2dIe_!l_u=ue>)g}3;)3Zff@S{q3gJp(+%hcyG~Ky40nLSq13 z2eQxx9VpyRk>HSI(SE?~pDec#_M4E}(BZaRjaqimK!j(IB|=tAI013>(35gYzWr#+%h;ka2pj9x+5YgL~pL+u!Irg zQfwxsr|iobmNO(H)11`vy|=lQe?S6N2bp6>WQ9uYCV3_~{A^BfHgR>IB*Ktqn3I4O5;OlN~F`0XVy7Qbd?}9$X-C)}& z*l+Ks!9LxV*oRV4I>)@9bgUqfdL-xRUT=0kfHvsE4C8;vSzLE7V&P8-1=V-C8*HYp z3kb6JUmv(;%V@h`+Z_?xtzvgsB$~%hvlY3|F8~7Hzy89J#u>(WCMf})DuRjNW2ge* zLM4If0d)gTDdG%LKnI|}xy3<6FmcWi1QNHP=xDOqiJV)USO^3u9Z-LuR>1E~Dg&Hk zphsW-vN05Sw|0ey%t0T4kZszgXcJaNv2JpQkQ^j}@Zz&-u9 ztIML_mkG}bKlj4L2wz}pFM8MfGU&qe(lu5FiMdZdIUi=1++G#9c}f=V#R}UE8#iyB zD6Vh7>8HGvB_^h*u1W>>33cEvm8SLhTAEVZW#x?ea1u7y>`k(hn8uLcXv|{C+bA*l z!3S0|WF!}?Q?TJORq79W9&M})JjpxV;$F%ToIk;AE4XwyS&h%_n;CHZ=BnG58REKz z93AcL7j9g9=ITHD>4zDg7Tx-~^yx!mR#&Rk)-U2lBRm&5iM%Zg23^CxYhROuK}roW zyhQ*5RNx2j;F%vhDd2|&kPtAC0Q`U%&;mk$2Z2UW0>E(ZMYW32E{uPnRkX5qcKXO4 z9?hcz_yc1Aj2Kd28{7hHQVk1<1!fQxU1#i9Tr;dq3*|nWb}-fDzUWH=;+Ko+Tva5K_Lpdw(<4tPW`lI zRSmmt67p{P$&~t8kD@u3FXv~Ri_(*O?lMheVk8i>eecu~+8}2D4m^P>XxVZU~~~mBy=EfD?*=`m=JIv&m%>}-)M{IeRBW1SrYW4S(5mhSrS2(6^CM3@wl2J z45%1SMX`d?8pt!#hj&5^s=1hUc^hkxjI=7>kkT;~4DQF%rY;;g%94+krD$q^Ua*Pg zlj3JJ4GQ2;PKs^f)({X#Nqk)XXd9=546pZ;oa4*&bpL5get|SE1E&#It@zbF)W(`NpnDXwBFiwQ*X+kY@#RNA0ud z%b7k^1iPKU?t70884SJ_z(OR@J%bYk;Gk{b55Wd@h%q7!p3tVltPcz;LNXG$^uZYr zhXjH%fC$9FIw*&x3Uw4{;%opu;4b73#{dZ8v;aX-`U#G(;|P&ZO5g~-A;7Ta$S48v z^RKxZH(KnalteF#3#gQ511;x7z7xC5aGKD0tqD2QYc^+Uj+UEom|bAU<2@V}AO z{%JRW9oX}Ey-Kal&4Hf;?J*Cl)_P1RPC7kzY4iE`uT1GR{Bb51O=i2tJ6Y-;kumk$ zH$-V?mV2!nQ!;;E{4B2t+>ob21ah#xo6Wpgf{vyN7(jQ9w1QCxqy0-7zbJljC~<`*T{uVrDqms0 zS9InYGJqrq4sl}xSD=xkLI?>^1e2hV2nJvy%m6lm3Lpe0fP^GIq76_5KnNs2H82)3 z0G`1lFc6-5F#o>-z~5~W@{$4=LBYXPSa=u{!$u+7BO;>Xw}-@r$4Bo9P3-x^F#}(y zh5wM8mCe(Y)6-B43S+5ha+&OWhH_t3sXki#To!Y(Qe+lGMj}Y6pX4#F!R{?2??_)bDdBM4G*;vaDaC|}8M@xkr`yb_mNvX8z%E*UViBn1g#QPfc zqkI{9uG`#Gy@7md;lq5&CzfQ+b`&MR6 zyfX8(mz(cBfu25+mbUP<1%ioe z1U&+GB)mfOh+u&)pa%?r03@D7{_e9UKoZaa0dNNjglvlT5sBRVz#~W@*-JM`t(5lDV0+j z6#OF9XYQeHa9CEmij3{w)bFkGkY>1^3EkP|XPe~1D^px6m*FBNbv0g$y5H`|mEOi2 z{BXJ{K52G&;;jAC+B(%=DK#Ewt}QqpDPk{whJ1YAL?qEhR1s>N;ht&x-f?_#0Y>z2 zK5<+j5F`lX(t+PwNCc8T1O>k(sWgxyP+E|oKT<-9z7r(V$0!3(tAHZ{(GLWP;)7Bb z!tnz>Kd?idSb!Sn7hw4T6Cz$<1b1&CAkY`kfwGj)Aw+{n4Du9`6ybt2%Kzg~@Y;XB z0rjkq`uzsfd++Z3j8x2TpOIqpenu*qMX~os;7d}q8H}=u9aYu2Gs5`?rNhc7IRn0t zPEd7DxNTFod2MO=eodLa5?Xu>s_oFDZS^;HaJ7T=r5-dsZhv}&AY)(A=B{!c>sJsLC?Tm4Xlm`j5tHiktuoUsE{-F~p>zwKw2z0e zC2c2b&z!1IxM#?i{8^kA^CwRkxoX{)JuQnb#Mv5iMp+n&^c4A!mhZbf&=v3o#sClQ zq4|IN7!@!;{{;#Gy1*M!2mm9myMPwBf^r}m0S1H&hZy|eq+%wAyt;>|U}%Rtxd$yM zJcJ7|QF{oVf0DKiY3PV1OJLu_Hn2A|Lbemqh1v$#18m&caS%u^33L&{kszUD&>@04 z!3@9yY?RI9=^`W$w`u4i5-lnsD3kC)O`1(8lF7vg^b+cX?ePB~a=aVA!`8D{@pst% ztjp88wzcOGB3eCoglKj61W(T>T8pD7lf%YC#QrDh8A==pT|>2sp7)3suOvx^N6VTh z=<)7!9LsrlHJUHhH|zEN;;S=N4Diue1J~5sl zzx`UzC&q)7_ulR7dh@K`_#x3x-hTda+&bygSBkartA0s(qst=`Sn zjW5_|8ZEfh>=S=-yI`!Ig5(3tRPLz%JWQQ`PF{o}4zAOTn+2TH4{qh*K;jG%*9FaR9_ z8}Qgrb%R6r@DNU522^lSLy?b}L{wlv0(_$519Sl-SOVL?26_XG0WI$FxWfT&2o-b- zH5m#o=nA-k8bJc#vEphD&VezE6G$VJWJ0EH_)bpt7Aku&z z!@M{tU>>@N^99s#?vPrcvSUarGn#9Cab&6G#nK(W?ftLvwfkYjF z?tSIaBbZIb{3Em(Pg9}s__7T~FR^14W5W164pgP5`#aJSy9e>;51-IM8y_p(ApFn@ zG-AmxyQZ-T8msWH2Nv%(h!knq+D@3X_`{$;87PI0#r7 z2Hn7%a&b*{SX?YVlKI!q;Q!5kliy8A@cWq40gafUG@8>~l5rd}loNUfk}*TsJCJ;8 zhoEO5xePOuJp;*N@#zy2O&7K#JM;`Bo3D9}5xd+A`v!>p+Gj#VUe7?X(cG4be3xL3 ziZ8###X5iz(;h~r%Qj9Im)$yNl5;sTD08;M1pZ(FH8XhG%_BdnQOl22OnLYG_L=H~ z^P`<}k1S6TSg|8RWtL5&JhbP?u%RV7(3%=u$9I;~&bX&kets6;$aSud0 z9YK_(%DoUS!?W)?-f06Z8{@pGc2W$QqP8+VEpdv_N&G}_zWd8?jhVUG9}=xwq^@h) z3=@xt-9BV=(;S;ozp5;X>8nyq!dNL87pTcYqF1FI?-TTXIZp+48Zmzp5J8D1S?LsyjW@(`o6|sEx5zmt7l7 zZ05iHw4!Fw-bg*_(`xl6jePwVbEXOSzD!Ez>C&;>#TtU9^qT&@Ibtft>sp%>=f7~u z<~6=yj7=Rx1zGE}O_|g{rv*;h1sc<`d9(Wr;hx}KX^A~8IU=g{B-c8ip}*Lk=}~1e zCoIbg%sbDPw{R=Jt-j2Cd25A~-kqPa+U&=(2T>AkXN&8^8Vj8g-l;hZrCilRhElUO zUGKAFj=pX}L+82fxz)!4cmw=goD;NKnN(8x6UONF=&`57QfMAiX3kp9L%!LoPn!?* zZL*f~ioF+lZR2jO60!AcL6EidWykDA>TK@@hRig7md)sa?>9W%-?`W9*3KCk4Uec> zbeN5zqbVh3I&9aM=TyZ?s~6?hG#Xx}?VY@i(sPZka^YJP2D=ZTs**>XHx7lZ2|kSv<+XeD96;mE#3M& zk762lFG?B7*PP|fm3wMEXQT1XUw5TjT&*n*Dlyg?ySh47YF$?_&u1D-Qzd}UOyBIV zuR+~caO9_$+?l!|sqecN@D9^&V#u3`kt)3&^{F*btU z@=NUe^_^GcWXt%nuFOeuB-7QdHQOahmITN>n0ein8$l(X5iD`Kr_OXgZgHnguyCKw z6Sa#$tN?oA%sxq%D68_v41xGuD?W2VE3G7VF_!n{f%RMd;ZZkQJ&Wyc%)HvgR~<5G zarCq+y2|lm`ZL`VB%JSmIuaJ(6g6r4Vi!%twY9YUpf_V89pz2*7mNvR9;6i)kRi_< zc6OM>yFIP9n$`E`=IYP_ri3?3N$*jhk?%Qy3cpdcg5r+W$l7<89Wb;s|D1za$Rh3t zCc8|)7(S#^U?`zS4S3US;+X8jQEP3oPHhP4V;?A?WzT$-bD7?7@lvXo^%Lu3BhIhB zLAwp%A7k2inA~%7XYTaokD2o50!Q|8I)D1p-1i$U2J20WF1O{|4Q+7_FB-h>=B~`i zvP`EyjX~~T2HQ_`5szEI>`3A-ZIWB;5j9M5dEUU7oN2ieriVDfdgG6i_cCQzc)t)V zy?GT2Y$Kfg_~ku9j}JE1dJQk!^=qfRrGR(rvYtmAoJHCTVr{W>$mhdsE7` zLqILFieLnExCT2m^5s8SiCtXk5Yn!AaN{KV*|!(ERuo(bqav);=LH0~@F$q3eF^BV zJgEJc#;{V#Z}}p9iD@&sPb!tg|Dreb^Yd#uF;x|>rt#<0eVIOQvX9ob70c(lENpR= zK3iIoec*P(kdwilnTo84AWo|B&0DTN*LAE|=pXjvdUc*N$vleZGG|1Cu?+irF^PJ6LmhhxqJI z$9^4a8aDjwJ?Tv<$JKr=`}Z0?~&bgO-n zi-F|ZSjBjZ?pU!(hBj;1$2}ZYcfEUSc55&{`E0DTXM?~ewLD>I&`-H;0+~~0(u*E) zWVJ?4)pAq`P%fjGeKi+JTltk|>8F@l7%yV50vMqmUeE&=R?TMS&01D*`-ip}OfIBnEcd7#qiD3eZr*UavLr@le?AjRFKJd$)My@DUC-aOX$NNUtLPS zxykMm9l)($wmV+^TUYA#7s0KgBJ?bMFKzK=b3B8nxnr8IotpgRqH^{Nar0v~Evd0X zwAqr0u?_6>Ctq%iu691k3XmA}$?NFCOmQkn>y>rgrf#MAI=roxHX$zckB3FLl!uREgB!D z@b=1RnG>1@jSj(nQ?)+srWp~kM{_p&WsP6iCww$K=+?!Fmkxbc5AA7}MMXI&>#n@@LKPT~4*S7`ZtO$ad1g-a9KFwWUA{i2(bqFZXB&$dUO{}kP-5_8c!=CWJNf+h1F&yag@!by{{*j9^cZz`9kXyt3| zIo`wb{0zStpXfVz^rLqAX`bnu8u^z=^y|Elo$U%A{pbfOlYFz8zm)RcETJDgGzKkuNbshATDN#9mr{>h%(aeFij3niw#&CIX&!8( z{wA(u+)qC(;V>Flyi#tV6N@F_rg!JbyZUa|zr6jOo2=Z-agX!1Cx0@0DNBubraWdt zeC@Ru$98(;=cS!b)`TDso0K) zzHfFI?-z^orZjTdG9Apo^>k4Of1iL;78^yC?B4Qux6B>|pH?vmQ>Jf+XJnP$y~n6o_%>q2l|=e;Z5k!u`lU0N?(8{<^!-w;#qp_2gR~v@>kWQO|FXxN zbz^XHBIR5n#&q91wTl|zPT%(km$fzDmm+@_OCYchWK1Wmfi# zsO(c$_a`i&=Navz8a7Hfr_btMnk?ayD;bxY*Qh1elKsux$goUXS~hp8su$PHYjKO- z_dWH%cNYD*<#b_#M3f?x(^@Raqn;$L-ve(2t?7NsOD{45c=GsZu zm3g0xDnG@f-h82F)(y~^IETbq8Z?&!$k0p2vfwYKvHZM%PnqBu466n$c3{gd^y zQp4U~y!KK~{JQQEu0$70J{>R|b_w8XQ4)n$eD$chvWaz7H`j18woVT(zfwo{qnDOa zp7At)_ha9I%4-HMq4gwWr!ApnKlzF+U)yQUHgVUEq#LW%orjJeZuxF=pBZZ(H}Z)%@8qJ`^DvTs_hLD%a6_2x5>n0kOZSq&aqK(^JJamMm5W| zeWLTCT4o*jYA|2G(JtXxI1SQ2zU#$CdhEyJr^<%By+IFk^fg_t&6#u9ICi*<&*5ou z8zs$nkw` zEiJ<&sff+m>u#;*G5iwM&Pr%8S>F5E?v!hn*mQZzkSFWBuN5c+ZfLu-^H;6&7a!1j zt(Ym^`;%stx6T;#%e&)`P4IL75 z_SNdQO2wV;EMmNTaenQi3(I#WbA4KOIwwdlTEy>h7#;ayqmFYooNdxMQFzvpZfw1? zx$uD6S!4GL2cu7?n8<2$_w_nt${N?eTja#L8tGTRQ???CJ`k%W(^V>F#$*Ww+TRw8 zQrav%Wb@e7&5t%~_*OEf;~Q&|>3Ln0!}Wkq`&l-o zRO*ebRELAOzjkcO)~`?2c0BKpVz7s&^Cnxd2GUb4f89zo_`eF5mC0*(7)?)q)ljg7 z!))M|PuyVlt9|6YM}6mvso65^P>LhB)bUuweRSxs<1MbGH-=;cR$ zBaMlNZqxn!?@g+Gx@tZ5!#a8gEwO!j?WY6GLn&+-T1{-0jzbA0=ERhzG$g${YmamW zexpZvIy)aYD{;PAx->{DnZa%-+&_|<)t)@FCUpDB7w6~2KWgD6I{C|JIm?HJG`(^b z^qb~nKTXQ));9JXcdnv1`JW%^`}Fu6oUxmg8PanuSiUDU&RIGeAPt*_5$o-j$zI zyCyyfah(*Z`MR+-g`RL?+T;X1rcUh$GE8fWHS89WSL**XdEpY%};&uHOSO& zlDXm>aoM*z^REnE)xdjw)#$<-8IRSxqPTOZ^nw!B5&>VlB*p5Jlg$PCPH}KYYJh>} zn*DE`wXQhXU3hoTC&)0O%Rq5@-6Q(xuTj&-6wkWw^Gz}4V479az?FA8YyJAU7^73H zjWKgMtzb%heav3r#M15HXO}#V8}m6q^M${^YiLr(RH=vGuFqbfGS@e6ipy|~VHI&{ z?UAgKFS%)I!$Q*4Oc|A}=@NnA!OfrJBW6ja&uSey`&k8DpgF+HPjR^)ZI()n>0+t` zh`-wP@o3uYeO9S{3Y-;lT@Sr}ohH*&()}SkFo{lls+#0h_9TH@aFM&tn~qBg@M$h? zy+DVH>zoNy%Teg2Gx$UN>33Td-G~3W;*=XDD_~I6)c2ANloke+r1}oqRr>IrI4v`@ zQjI=gL-C|?RrYjc*ye=G3>Row*^HOnAs830tFr%`1UuJ;!M~Dql5L^KAN179n=w9! zD{HjKZ_uNb_(_-87J^v!^C_eDjh^;i5HVJnQNJ<4x@%!`oU{}bY0>I=EOdsL(&y*X zoyRIpRhN!Xr#RG9FYZIJ#@vjl2`0CPZQiTYkf6#O{jl|BSJ47Wksh+Bt1)4Af#sHA zY&pTPsdMYb8Y@F^Sk}ueSG(hXKKaZ>6TcrWQtx{urHnIH0E2WP>~${tYYhf0=M(WD2?b?8=1Zr z>EklvbxUpKr`Vc}Q=GA=be!`15HmZ~C0V6*>Z_W}#`j(SuynlUR`wu!t#I8kdz~G& zgHGqD(dnb4Z%iFD!7w+gY=Uv*!m=#3t^8|;u;ke*D5<-nAM zc&=4OHOdZs-86X0sE@vUo)K5T6c3u?>>gU(&9!GzD)nAv83MIFuL@L}1dKpEcV>e) zn{8mbEmL|y=S1oods^%9Iec+So=JyHnK3_fsHjs`QUl?=urXYYN?bi`Vt@O4JXW4ErxEuCi)Qd3Fy%z2Zg7^*Ak(8~VIk3v&SM!H) zx7Aw0brf2&?#Jw~vsjv)(y6i}!i-Lz?nw;;WIL})NTTGlh zlm}U>xUW%kUZA9)rRKF+q5nt~mqkjBbCu?B-SUaz(4w)a6F0iDe8N|?u6+{+)p^3#QG$5C#+8x zpm0Bl?+Mcr)+ZcKVtvB&gyRX{Q)qg^@r3UQyA#$StWTJpa6d(TPne#tK8f#1Oi$RC zfAl@!9{v^UQ|NpC(e#Al3EvY|<3II1VR8OoeZt@T!SwudyAwty98XcNllYrL$Mb*E z==_rrg(#^#nDP~lDCFfAkey7s_LWvtR`rf3^lTaF9Z@)OvS-VPa3>Si$o#gG>CWAb z)be`|A7PEmv*)?iojp65-o88a;C=5-CTtnO8kwG*OzD5w0&QBd%IQpks0DiV)6`j0 z67TxI>LXsBVzA$KhhC2bdMVdQv!!9!(CJs~Y;@+Xs7RPS!)5;dsJ;`cimqcPQ^DLb z{G~e8Z@N3mQYKax&mBMWb*~3{_hR4O$=uDE- zlXGWl*ErOsj@_m)>5y;!IhOOjdDzL+c};ox@zfZz<=Qt3ysur9iX8s(ZUbhPC)b;= zxVtLGc>ekN+8z&dV%p@xhkovCFJE@|{9){5>NvhlbIOtW&+ncZ2Xjk)b=zcLcFD!R z+u+EzuO~L$I8`}DWA&#eP1oidum8AG= z`x4^5M()GovomIfdS21dTOH~Ub-aXsHR^dy#Mz*}gS7V#<`qm|7-nfvwQxt^Z9nH= zm02NsW4#pj?C6f)FQ}awGlqL*#x6avas4dD%oTf>IA`6nN4wp_3?C;gN?iJQk7rK) z74hozm2SN7#2!su{W$25}kQ z6PGp8r^=R#aeQ077ah87S7c_)aHIoD6chp)PrM&p_vUndO`#RXKoCpubS0J#Y8kRq zu7RUdQ_sC>x}ic z?XQ}3Tb5s2q%TLl@MeOd)db0hn#1}al6a6{NOnP*5hfT+_lc$iVLm`^_+j=1vx1m? z5vBw({(^jftU&SsCSZ^ckQIda0J%XlB_JPQewm~Mk_<3~_`@6w(u3$IjA%YUk|4=| zBnIRIWCfB5FcTvjg&}h=NDQK*Fk}t}6EJuvfguSpnHXbQ(sO z7?3mm?kJ3~_&|n0o)AvMAVVNMkcxzi#UOwDOC<;fX#Qyx@_$L<*|T@w-%UKFJ^Rc4 zg~W63w`G9Oo_CUEfN$Snz16>+c;=ig%kEhQ_`~c?niZA-iq763@$APkz{-Lvg>F~| z*iu<|?I4x`iX@&YECclJe$djBcy8DEk>Q&^PdtN{-8oxZ{^UY>Z{n$Vb}7%LkR+ax zg=bPH)m6Q`S+l0|&bhkk*S{s6nl}%ccm5&q#27Z8@B8S(tB&#hGELX@p>w_`HYdBjiWB zxrTJP*Eoc>dp2i;E?8>c7JfgLuRW!ELuN)qm1mN+*1(Gk?hDLZ2S13MQ)?aN@Few^$Z#><_u`s(Q!sV8^skxtvlHS*jUV8eWxLMgZzYz`jw z{OSH!JELb=yIj9ZJZS^OpXbFyOn9Cjkz_G#Z=P3nfq|jY2#vyPf-h&cmc=u35A19z z;2(Uyf?1?B+U|ZXzT{CSe&F!2%p%?6nNyb=TzK`ipg71>eR4%ha_#}+TV4-5CSFUG zD>l$e?2JB?wYhU=o!+F0d+HyQj1;fWGw@tx{MA2bpu_tK!&V$UPQO?+^^-9w z^VC59jP=%BKdE)sQhp8g*ks#wb=hdAt@he%x9#@ZaK|n8+}8wP_uY5X-6-CC>pdvn zc>66V;CTzKC*gJ*emLTa*NJ!ljnnyfUOSb!_rCj-z32YBl)>vhJe0-XemwHYFaKon0yys^ z^wKv;ef3LTkA0HbZ+~R>-v0=Gs`w|4PrilbpO0Yr>X*lU`{BJ0zwOP>Z~y)H=db_% z{P*ww{{Rf200&6G0vhmu2uz>?7s$W{I`DxIjGzQ3NWltP@PZi3pawU{!47)xgCGo{ z2uDc55}NRYC`_RWSIEK^y6}ZCjG+u?NW&W1@P;_dp$>P*!yfwZhd>OX5Qj*_A{z0C oNKB#I`N56jG`2$NX05z@rqc?q87Kv#V&d=X@LL$JMbn%Gynhq diff --git a/llms-full.txt b/llms-full.txt index 13d9b20..e10409e 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -5315,7 +5315,7 @@ reports pass/fail. | **Re-scores** | the SAME `audio/event.wav` the contract was created from | a new recording of the SAME stimulus against your CURRENT agent | | **A pass proves** | the evidence, policy, and scorer are still intact and still agree with the human label | the CURRENT agent's behavior on that stimulus still matches the label | | **Leaves open** | whether the deployed agent's behavior has changed since | nothing extra -- this lane speaks to the live agent | -| **Runs** | every push, in the shipped `ci/github-action.yml` (`contract verify contracts/`) | only when you recapture by hand or on a schedule -- see [`docs/RECAPTURE.md`](RECAPTURE.md) | +| **Runs** | every push, in the shipped `ci/github_action.yml` (`contract verify contracts/`) | only when you recapture by hand or on a schedule -- see [`docs/RECAPTURE.md`](RECAPTURE.md) | A frozen-recording pass is necessary but not sufficient: the recording never changes, so it can only fail if someone edits the bundle's audio @@ -5436,7 +5436,7 @@ Exit codes are the CI contract: | `2` | usage error, empty directory, or corrupt `contract.json` | `--junit` writes one `` per contract; the shipped -`ci/github-action.yml` scaffold runs this on push, on PR, and weekly, +`ci/github_action.yml` scaffold runs this on push, on PR, and weekly, and publishes the JUnit file as an artifact. Every text and HTML render of `verify` also prints, verbatim: *"This @@ -5525,7 +5525,7 @@ matching the packed manifest. ## CI -The shipped `ci/github-action.yml` is the minimal wiring: +The shipped `ci/github_action.yml` is the minimal wiring: ```bash uvx hotato contract verify contracts/ --junit contracts-junit.xml \ @@ -9895,9 +9895,13 @@ deterministic: the same scenario and seed render the same bytes on every run. ## 5. Prove -One command composes every evidence lane you have into one fail-closed release -proof: contracts re-verified, suites re-run, before/after movement measured, -the stress suite cleared. The proof is a content-addressed receipt; CI gates on +One command composes every evidence lane you have into one fail-closed, +content-addressed proof: contracts re-verified, suites re-run, before/after +movement measured, the stress suite cleared. The proof headlines its claim +scope, exactly what the evidence establishes: contracts alone re-measure stored +evidence (Captured Evidence), a suite or the stress suite establishes a Test +Suite ran, and a before/after run reaches Candidate Revision only when you bind +the candidate identity (`--candidate-config-hash`, `--provider`). CI gates on the exit code, and the receipt stays verifiable anywhere. ```bash diff --git a/llms.txt b/llms.txt index 798a407..fb41c8f 100644 --- a/llms.txt +++ b/llms.txt @@ -9,7 +9,9 @@ > finds what text evals miss), pin (a labeled failure becomes a portable > content-addressed contract), test (simulate, drive, and the bundled stress > suite), and prove (hotato prove composes every evidence lane into one -> fail-closed release proof). The wedge leads the demo: give it a two-channel recording or a +> fail-closed, content-addressed proof headlining its claim scope: contracts +> alone are Captured Evidence, a suite is a Test Suite, and a bound before/after +> run is a Candidate Revision, never over-claiming). The wedge leads the demo: give it a two-channel recording or a > timestamped transcript and it measures turn timing and say-do evidence -- did > the agent yield when the caller took the floor, how fast, how many seconds > both talked at once, and did what the agent said match what the backend did. diff --git a/saydo/state.json b/saydo/state.json deleted file mode 100644 index 266d8b8..0000000 --- a/saydo/state.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "orders": [ - { - "order_id": "A-3090", - "refund_status": "none" - } - ] -} diff --git a/saydo/test-run.json b/saydo/test-run.json deleted file mode 100644 index c7380bf..0000000 --- a/saydo/test-run.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "kind": "hotato.test-run", - "version": 1, - "test_id": "demo-refund-claimed-not-issued", - "agent": "demo-agent", - "inconclusive_policy": "report", - "exit_code": 1, - "success": { - "required": [ - "all_deterministic_assertions_pass" - ], - "conditions": { - "all_deterministic_assertions_pass": false - }, - "passed": false, - "rubric_gated": false - }, - "assertions": { - "schema": "assert.v1", - "exit_code": 1, - "inconclusive_policy": "report", - "results": [ - { - "id": "agent-said-refund-sent", - "kind": "phrase", - "deterministic": true, - "dimension": "conversation", - "status": "PASS" - }, - { - "id": "outcome-refund-tool", - "kind": "tool_result", - "deterministic": true, - "dimension": "outcome", - "status": "FAIL", - "reason": "tool 'issue_refund' produced no result span in the trace", - "public_reason": "issue_refund produced no result satisfying the declared conditions." - }, - { - "id": "outcome-refund-state", - "kind": "state", - "deterministic": true, - "dimension": "outcome", - "status": "FAIL", - "reason": "'orders' record present but field(s) ['refund_status'] did not match the expected post-call state", - "public_reason": "orders post-call state did not satisfy the declared fields." - } - ], - "summary": { - "deterministic": { - "pass": 1, - "fail": 2, - "inconclusive": 0 - }, - "judge": { - "pass": 0, - "fail": 0 - }, - "note": "inconclusive_policy=report: 1 pass, 2 fail, 0 inconclusive across 3 deterministic assertion(s); 0 judge-scored assertions (a judge kind is a separate, quarantined capability, not built here)" - } - }, - "rubric": { - "schema": "rubric.v1", - "exit_code": 0, - "advisory": true, - "gated": false, - "results": [], - "summary": { - "pass": 0, - "fail": 0, - "inconclusive": 0, - "error": 0, - "note": "0 pass, 0 fail, 0 inconclusive, 0 error across 0 rubric result(s); model-judged (advisory), deterministic:false, never merged into the deterministic counts and never a blended or overall number. ADVISORY: no verdict gates CI." - } - }, - "dimensions": { - "outcome": { - "pass": 0, - "fail": 2, - "inconclusive": 0, - "ids": [ - "outcome-refund-tool", - "outcome-refund-state" - ] - }, - "policy": { - "pass": 0, - "fail": 0, - "inconclusive": 0, - "ids": [] - }, - "conversation": { - "pass": 1, - "fail": 0, - "inconclusive": 0, - "ids": [ - "agent-said-refund-sent" - ] - }, - "speech": { - "pass": 0, - "fail": 0, - "inconclusive": 0, - "ids": [] - }, - "reliability": { - "pass": 0, - "fail": 0, - "inconclusive": 0, - "ids": [] - } - }, - "reliability": { - "aggregate": { - "pass_at_1": 0.0, - "pass_at_k": 0.0, - "pass_caret_k": 0.0, - "n": 1, - "k": 1, - "passes": 0, - "ci": { - "low": 0.0, - "high": 0.793457, - "method": "wilson", - "z": 1.96 - }, - "note": "reliability over 1 repeated run(s) of the deterministic lane on the same supplied fixture recording; pass^k == pass@1 because the deterministic replay is byte-identical (zero run-to-run variance)" - }, - "origin": "fixture", - "runs": 1, - "basis": "agent_deterministic_replay", - "note": "reliability over 1 repeated run(s) of the deterministic lane on the same supplied fixture recording; pass^k == pass@1 because the deterministic replay is byte-identical (zero run-to-run variance)", - "per_run": [ - { - "run": 1, - "exit_code": 1, - "passed": false - } - ] - }, - "repetitions": { - "runs": 1, - "per_run": [ - { - "run": 1, - "exit_code": 1, - "summary": { - "pass": 1, - "fail": 2, - "inconclusive": 0 - } - } - ] - } -} diff --git a/saydo/test.json b/saydo/test.json deleted file mode 100644 index d3ceb67..0000000 --- a/saydo/test.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "agent": "demo-agent", - "assertions": { - "deterministic": [ - { - "dimension": "conversation", - "id": "agent-said-refund-sent", - "kind": "phrase", - "regex": "refund .*sent", - "role": "agent" - }, - { - "dimension": "outcome", - "id": "outcome-refund-tool", - "kind": "tool_result", - "name": "issue_refund", - "result_subset": { - "status": "refunded" - } - }, - { - "dimension": "outcome", - "expect": { - "refund_status": "refunded" - }, - "filters": { - "order_id": "A-3090" - }, - "id": "outcome-refund-state", - "kind": "state", - "resource": "orders" - } - ] - }, - "id": "demo-refund-claimed-not-issued", - "inconclusive_policy": "report", - "kind": "hotato.conversation-test", - "repetitions": 1, - "success": { - "report_dimensions": [ - "outcome", - "conversation" - ], - "required": [ - "all_deterministic_assertions_pass" - ] - }, - "version": 1 -} diff --git a/saydo/trace.jsonl b/saydo/trace.jsonl deleted file mode 100644 index d21e591..0000000 --- a/saydo/trace.jsonl +++ /dev/null @@ -1,4 +0,0 @@ -{"_meta": true, "call_id": null, "created_by": "hotato demo say-do bundle (scripted conversation)", "deployment": {"agent_id": null, "config_hash": null, "git_sha": null, "stack": "demo"}, "schema": "hotato.voice_trace.v1", "source": {"format": "scripted-demo", "span_count": 3}} -{"end_sec": 2.68, "start_sec": 0.6, "type": "caller_audio_active"} -{"arguments": {"order_id": "A-3090"}, "end_sec": 6.2, "latency_ms": 300, "name": "lookup_order", "result": {"found": true}, "start_sec": 5.9, "type": "tool_call"} -{"end_sec": 8.72, "start_sec": 6.16, "type": "caller_audio_active"} diff --git a/saydo/transcript.json b/saydo/transcript.json deleted file mode 100644 index c9a1cf3..0000000 --- a/saydo/transcript.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "segments": [ - { - "end": 2.68, - "role": "caller", - "start": 0.6, - "text": "order A-3090 never arrived" - }, - { - "end": 5.66, - "role": "agent", - "start": 3.18, - "text": "sorry about that, let me pull up order A-3090" - }, - { - "end": 8.72, - "role": "caller", - "start": 6.16, - "text": "i want a refund for order A-3090" - }, - { - "end": 11.86, - "role": "agent", - "start": 9.22, - "text": "done, your refund for order A-3090 has been sent" - } - ] -}