From 98cad6ff07c7755f52a5c633af33d0ed8ee46088 Mon Sep 17 00:00:00 2001 From: AK Date: Fri, 10 May 2024 22:16:17 -0700 Subject: [PATCH 01/18] initial workflow tests --- README.md | 74 +++- .../mindctrl/rootfs/usr/bin/run_dashboard.sh | 5 + assets/mctrl_arch_v1.png | Bin 0 -> 575051 bytes python/pyproject.toml | 6 + python/src/mindctrl/config.py | 12 +- python/src/mindctrl/const.py | 4 + python/src/mindctrl/db/setup.py | 6 + python/src/mindctrl/homeassistant/client.py | 4 +- python/src/mindctrl/main.py | 52 +-- python/src/mindctrl/mlmodels.py | 42 ++- .../src/mindctrl/routers/deployed_models.py | 43 +-- python/src/mindctrl/workflows/__init__.py | 52 +++ python/src/mindctrl/workflows/agent.py | 94 +++++ python/src/mindctrl/workflows/deployer.py | 148 ++++++++ python/tests/test_hass_api.py | 2 +- python/tests/test_hass_client.py | 10 +- python/tests/test_workflows.py | 340 ++++++++++++++++++ services/components/sqlite.yaml | 27 ++ tests/conftest.py | 7 +- tests/pytest.ini | 1 + .../test_data/test_deploy_workflow-input.json | 203 +++++++++++ .../test_data/test_smoke_workflow-input.json | 104 ++++++ tests/utils/browser.py | 33 +- tests/utils/common.py | 5 +- 24 files changed, 1179 insertions(+), 95 deletions(-) create mode 100644 assets/mctrl_arch_v1.png create mode 100644 python/src/mindctrl/workflows/__init__.py create mode 100644 python/src/mindctrl/workflows/agent.py create mode 100644 python/src/mindctrl/workflows/deployer.py create mode 100644 python/tests/test_workflows.py create mode 100644 services/components/sqlite.yaml create mode 100644 tests/test_data/test_deploy_workflow-input.json create mode 100644 tests/test_data/test_smoke_workflow-input.json diff --git a/README.md b/README.md index 146cc40..ae8ecfe 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Home ~~Automation~~ Intelligence +# Mindctrl: Home ~~Automation~~ Intelligence :thought_balloon: -Manage your home automation LLM prompts, available LLMs and evaluate changes with MLflow +An Intelligence hosting platform for automating your life [![Addon Builder](https://github.com/akshaya-a/mindctrl/actions/workflows/addon-builder.yaml/badge.svg)](https://github.com/akshaya-a/mindctrl/actions/workflows/addon-builder.yaml) [![Addon Integration](https://github.com/akshaya-a/mindctrl/actions/workflows/integration-addon.yaml/badge.svg)](https://github.com/akshaya-a/mindctrl/actions/workflows/integration-addon.yaml) @@ -9,7 +9,59 @@ Manage your home automation LLM prompts, available LLMs and evaluate changes wit --- -![promptlab](assets/mlflowhass-promptlab.png) +![promptlab](assets/mctrl_arch_v1.png "Mindctrl Architecture") +_Mindctrl architecture, courtesy of the amazing [excalidraw](https://excalidraw.com/)_ + +A more disciplined incorporation of AI into your home automation setup. This project aims to provide a platform for managing and evaluating conversational prompts for Large Language Models (LLMs) alongside traditional ML techniques in Home Assistant or other home automation platforms (bring your own events and triggers). + +## Features + +- [x] Manage deployed models or prompts with a versioned registry +- [x] Evaluate prompts with a simple UI +- [ ] Customize your agents + +## Platform + +- [ ] Scale from [a single device](#home-assistant-addon) :computer: ... + - [x] to [a selfhosted cluster](#kubernetes) :globe_with_meridians: ... + - [ ] to [the cloud](#cloud) :cloud: +- [ ] Deploy onto + - [x] amd64 or ... + - [x] aarch64 architectures, and feel free to contribute support for ... + - [ ] the rest +- [ ] Developed on + - [x] Linux, but it's mostly containerized so it should work on ... + - [ ] Windows or ... + - [ ] MacOS with little effort + +## Goals / OKRs + +1. [Increase Spousal Approval Rating](#reason-about-state-changes) (SAR) by 10% by the end of the quarter +2. [Gain a better understanding](#why) of true AI/ML application deployment + tooling required for successful end-to-end scenarios by building from first principles (no -> light -> heavy AI-focused frameworks) +3. Incorporate latest GenAI techniques to evaluate utility + - Memory, tool-calling and RAG have lots of room to grow +4. Justify the purchase of a new GPU + +## Getting Started + +> [!WARNING] +> This project is in early development :see_no_evil: and is not yet ready for production use. Or any use, really. But if you're feeling adventurous, read on! + +First, decide how you want to integrate Mindctrl into your home automation setup. You can choose from the following options: + +### Home Assistant Addon + +1. [Install the Mindctrl Home Assistant Addon](https://www.home-assistant.io/common-tasks/os#installing-third-party-add-ons) +2. Configure the addon with your database and (optional) broker details + +### Kubernetes + +- [ ] TODO: [TuringPi + K3S instructions](https://docs.turingpi.com/docs/how-to-plan-kubernetes-installation) more scoped to mindctrl. In the interim, intrepid explorers can look at what [the tests do](tests/utils/cluster.py) +- [ ] TODO: Convert the kubectl commands to helm charts + +### Cloud + +- [ ] TODO: Azure Container Apps instructions ## Why? @@ -19,6 +71,8 @@ Manage your home automation LLM prompts, available LLMs and evaluate changes wit ### Better manage conversational prompts +![promptlab](assets/mlflowhass-promptlab.png) + Home Assistant has a convenient prompt template tool to generate prompts for LLMs. However, it's not easy to manage these prompts. I can't tell if my new prompt is better than the last one, change tracking is not easy, and live editing means switching between the developer tools and the prompt template tool. There's a better way! Enter MLflow with its new PromptLab UI and integrated evaluation tools + tracking. ### Reason about state changes @@ -33,19 +87,7 @@ LLMs can be used to reason about state changes more naturally. Can we send the s - (motion, time of day, device usage) -> "is AK asleep?" -### Wait what about Langchain? - -You heard about Langchain but not this whole MLflow business - what's up with that? [Read more about how all this fits together!](/docs/prompt-techniques.md) - -## How? - -### Getting Started - -1. Install the MLflow Gateway -2. Install the MLflow Tracking Service -3. Install the MLflow Home Integration - -## What? +## What are you talking about? - LLM: Large Language Model, a model that can generate text based on a prompt - [MLflow](https://mlflow.org/): An open source platform for the machine learning lifecycle diff --git a/addons/mindctrl/rootfs/usr/bin/run_dashboard.sh b/addons/mindctrl/rootfs/usr/bin/run_dashboard.sh index bcf7bef..a4f9127 100644 --- a/addons/mindctrl/rootfs/usr/bin/run_dashboard.sh +++ b/addons/mindctrl/rootfs/usr/bin/run_dashboard.sh @@ -12,5 +12,10 @@ if [[ -n "$ingress_entry" ]]; then bashio::log.info "running dashboard with prefix $SERVER_BASE_HREF" fi +bashio::log.info $HOME +ls -la $HOME/.dapr/bin +bashio::log.info "Starting dapr placement server" +$HOME/.dapr/bin/placement +bashio::log.info "Starting dapr dashboard" dapr dashboard -a 0.0.0.0 -p 9999 diff --git a/assets/mctrl_arch_v1.png b/assets/mctrl_arch_v1.png new file mode 100644 index 0000000000000000000000000000000000000000..db6bb1a5d3a04cdf56107176001623286f18ed32 GIT binary patch literal 575051 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 z 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

t=S{?)jBzIEDmU6=ZSom~nPnRLxu8D)IN_ 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

} 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

*sj2--5J% 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%0AqWGeO8?*=3p;-Im5Y;CwvBWo(wf%_EC#*rg z91BL5X?}J5Cu%YxK!ma>IuZm%!udCLO|Qb2X-W_T`MqEt-M3@%Lc4?ko zIfO>~Jhn#*?{ki@m-9vG8KBrdwzmhG+FYs-P$%HnX*MB_OF!sl`U}2VXMOx)o+_zA z4C{9>iZ{8-f1L|r{|{n|j_>kAn|9RkU28*p zF%jXVRv%l_G)tlJ7!y7xKUl%l_r9X1W5eNc_j4Z~BLhiX1BBdGwUc39cxXJ4c}2iJ zNJ*4{;?7HgXA?_*d|sK6o%O)k9;ra?IgkAy{HNzY1NIZ%fdGxP!v;Q3EoEqX#HR)& zYfatfb<$yViTiJn+q55C|BKLgU>e`G>?{&23Hd{Ry%ANqr83`Q`|g5E%bfgEt=&j` zcUKpKvghejY{ZSF`{wvK`epp^D&ohqkUF`)aE#1q3XXiNZF*b%f)u$uUnD7odZB{& z5nOT)W)QCkT_|u{AZHom==$r7fVgkb*NW~aS5&IzZ=ZQh6cr`nb2e5vVz7RyenY|Y znebyUAD&0Nh$t_^iKXLJij+rio&El?B9BX$=+d{!PHCSZ36A7BO?_o@ znz<+x3IM|91|S{*vdXlxBPmzX3gudH*1N>;VNWhn%%H{aK1abxg8WtH($@cs+6k1+ z54kn=qDVM-phZO^c4eLQsw@3^T{Gh2X%znf3)f1M5wT_qSCOsFP;9HGkQ~Eczz?=EFlv4h?xsS|!&6BNendm-IEB zKRue~>GB1Kj8nSYQH4uKRI`6X`nR0%wBR2PSkN33n1Z>PTD(R})O0+;%h=o_b1Cs`vkj)8l{XpBZ(f2CrA~6h#QPN^9TtGOe0tTJ z5_ktalqz;Kb%pNX9c8a-r|Ad&VkH3HGRyu^{*(k>$5eXf>6`dC{WTQOt&w3w!Js*` zn=&(=s{&g|nyTmu1RFv(b!>f`a(IYirnO#6`-iy!#BRD*-jPo`ecUCG~b8q_KV*X7Ks0dDty+q6u6h2gH}XLumNH zs9#PloUbl1Y*PG|k-_bp zpU6|KL}m$N%TFTk+g~uKvUuki*|+c|rTq~LxWJl9mS;&X@QC~sPlurtx$fp0Z*Tx& z=;DG|;{EdbwA1aUqd>EbXx@%=wpq{D+o`3H*HLM7W+OIipmODmhYLQnH{k;|^ziW| zZ&NUVv-f)REqF16mlMTbghMWPauv6j?3;>Knl=SR1}_Sv;?S*^X2khcJPMt!*PBGH z=Nj;6d>T?BNMi+PYahlO;_X=DyZ+_mt@Ih?JKq+e^t3uFrh}0%#%HG5vOC5H+VXn7 zzEu*Q#Z_9@=nnw01VA@p%aF*(Q83q)0fICf1S~kP+3_n{ZjAKd=A;`d&&8nsYEdy{ z<;ZPKcXok7AH1!yup13%xFM*n3)dt)jYQiKN&UD8h9AsQ0InjZrskgDYldOJ18{@r z$*r1Pd(?L8`cE#(bNaHcdB{cR{#E=JPGZ?9FYt9~$gU@TIng$E7yZePhN~|t+{x^+ zY^{Lv%)uzO247N0B#haPQ zf)RJ&K(Tf;#S4jR>=82or^k`7q^dHrE;XbV!?=KdXe{T*5Va{cu9v-kbpER}o-^DO zerW`w1C^ZUSw=+KMcVsf=s8TmYe*!Ty#)b){)GYZ0JCALLUbgS4o?UQMz4}a;`{Xe zJ$*#+F>Uh!+RB$dd1bwP*T;lA4Zqecrz|DsDXnj+3W%vp@fF=<+`UdFDpr7;bf+s%it!6)z@x8TBrKm z#ph$=5f%Lt1?I4}cZLF5+Q#gZSx>_BSQb<|cpG#(OSA9O7ts~m(qFJx)CfK!3AgNVn3TFU$84Yi=3t#$7nD{` zw87oFq*6$`(FM-Y6P$gzf3~!LgP99fbu%=A08{i&df&WpV}Zs}oDkuoL#5_B31J)` z>nqh9pqpHj4l}m&n9on}cAAN;brY2R18M(y+hL=b-$bTG0tf)znFG;Otiv6R1S|vP z>HN)rq@V9^=lFmIsL5wJNz4*V2ra}KUu~E>ZHG%eP&!&3xF?-Wh+xDIEU?=hrZTCg zUg|P{oC7`3RduW?N{WqsLa};JUkT1x|73q<4V1AW7?}a1?qP#Uyg;1~{zBMaMjt#B zjsV6{XsS@bWBMOnbcsUI`qGQL_x|Pat3Egy092$3$y{4lW#cJnQ&0B4tB)e(EQpHy z*@A_H>?8h7;NWapV7;AV31r>;Sp>BLp$dk(%ISz8!eZsfzwrqRserv~_wDcaf(fv1 z{~*lvQzg$s?JH(T?5ghjkWUV@YFjo@zolwDle*+O-KE1=60ss;KSm7#E+N#SCLfZa z8J3#3th7qXKvV&-vXGsYJLGNoak@}tT3Dw$+_pvg*S!Mm>v0BkWjIO~q+t&&I@WNV zdU)<1*3Ly-ZK$2>W>lgaNOc|{z-0m{9$Wo!@h%#2WeHNmUJ5Iz?koWewgGEBs*}o5 ziIY8L1V4mF`GgGd`6+Tm43uh+FEh_c&~C8ajWE;y>M*rc0o9FkSi_liiYVTRy}i8? zkENbOGHwF#@0L3_+A?l{#EwOKIB_0yV3*Pah4*piG1MkBe{()+pFm%eh`6V6zt)|= zJMw>801u?jNDYzf9}T&iP7^uXDaZwSFv*P58I&_#HM-Yk%AQkro8wAh)+=%Q962%# zf;B~1W3FV(Iez0veh5x!`l8re`ZhtaXk?51vKUWhfC@KXtG zdTTA1A_>o3;aWkiqUL#l^k!IRxb9aTrPw$b5C@HgllJKh8HKF^PC?wQZ=U{58LC>h ztM4~bB_ERKC`w{`&bw}R3u6Z1DshZGez{JE<)ib2#f>miV9 z=MbLcXcJRTs@ThPbh+u~H5@f4oe@cc^#*)|7^NSb+^oRAut=UC97~hhpjF+fwjIjV z=}I|+_`HOW-0Jg0h?w7DiOEd$n)I*Jt2Aj@ueR#t$_pWQ?#_lOu&rv3QklY!>@liH z!ZO&v9nH7-@+}=i!I2=E6|4n!9yYukeA$Rg#`C{`p5qAi^q$fPJ1~J97yD}388KX~ zd`G**tSIX;G@d!{fO`lKL~lM&ZyfzV15AMqnM7>7F1K%+nMByWAc zwY61>T#aR6Cj_~x7MXL&_yiB(5R80_;K}%KclVLZlnF`Oy`N)@j2f zmkEzts!#iSb>4#ov-)QNQ|0q2StQ17rh~aXOHD2ZcVComP{6Psu@-oeNTTHM0^ni;&m?uE+$@(Lc10f{}XmvXd>Vic@O zT@at&mjIWO5?bp22{oqk{GjIc#a7+PSFDd`5c==>8-IKe6|!}tz5iC*lz5xA+f`gg zecHgCJa>&KidSKR!dMWa7=47I)&buWltc>OEGz}<3v5TBn68xTgbYoSAtux>T?Di^ zU6vo&IX=lBn%v^j(+&R79FpDEQ=(rMd4@H&dthk`lRW_1DPJvO*V}(QucD+_KN2elFj(oCV$P&RZ+wpx26ukLDE}Krwd>&5)na6yVX~b`2g; zA?R-H#l`={{g@%8jSL}l?beiUSSj2C*cpuzrzT zsm^w-mA=CxCYr3R9ldh?$r_j837o9}#M84A1cWnIL@33G(r8}pvSkwsqQ>`ye-)NZ z&wvgNppX`2`8M-gxkRgZSl`3G3s?74h}QbKQO4PI>AL=nl>x~oZ4f1DZXyxO=$MKp zilhMISSzfwVCzWgeEbDX9SwvLur7BHacKxDi~XnHdB zPHv136+OXcT{OXL?h8MO1f@iC`n~Z0m_>DB*EKM$_oVlw0AKv%wP10#zCng0t|fOw6JYOK|(RVFye7r66UG z3q484{rSe_RG=W7Cq~$)U*+8Vx-uFf9V9FNxGUut3KfOUZg+)^uoi@kvme($~I0_O+K@eRa`pt$(S9B`a{cU6oW z0p$w9y#H!;yt^vaj(_TleTga}kR$1G^fAa5W+q&W|Ed0ptX4cwvyp zu0~QXC-D^^%s_kk`_&mT(R;m|O=-5$3u|Efr>3(s2?=Y4A{MKxnNV4A9qw`_I8VQt z)%ZVbreYG=JDoft|Djk~y5ZyU>)AiOfjK#^0y$-{?qwf%*w+x7q|WRM9T)KNAEA5M zKRD*F#E>Dca|HXnV39eOhIDTWqrB@;><7Cc~lW=(1@_Re`xpK4)OcCFLocFlf ze)kg-+x>o7V3wjYUmAG&JJHBzL)yX>jm2BuvW-===ARpv=$JbV%H5YHZ}usqn|szf zu@^8{M_rHXmr)+8iT1Vm6#J|ca8l=u6#7A0+h@t}>qrvUUcf6zcuN!ioOU1{>tEo` zFnD_-O0q_A%yZ-i*%wK?&l~kl^RxYL;$8lJITAnWozeHU_th`lNG?g6iL-oe+6+hB zGe)u?e0%FR;t_!frOP`V13RC>w8aLfJ%d67g@g{IA)trKEzhDkFu$pt$xdhnE-{Fd zSbG^XiQYdCf8rfZDi`ypcct5|{c(Q|Q6o1aK{9=fnPBdYZ@}$){Bfmu!3JHQ_>-)d zKX}XcSe^6@G2ZAhSvvA4PWTz~ggS_qina89|3EG0`Z`~gV0KsTVaBpovCsr{_J=ID^QMXdsV-KHLqEcEQUwe0}p@aaJD?)Yy$Sq$?vOg-cQ13^L%tw zPmwT&uqiAY;IeBR}y`DCnru^mNiJ5m=#OHVJV?GW9D zBD1cUJe_kJ5bHMJ;a8O+zAeS1O+wr-miR;YUcU=L0=D?>pK9BLawZ)Rqgd9BD;Cd* zku2T6vHA``6;LTBnO!WacQ`QI61qTMe5B!LKpey|+NghT*S!C?OjK29?Ks(FeTzTU zH`{O}2)rlw7L$2JxpWRX`vpK`PbXu}htabU5aUUk1u-FaPEU9-R!j>uk{UTY@kp55 z1l_bF~}5Jd>zHH8F%AMvtxH` zk8D9@s+VjYNl+?_Wd2&Jr6Sc75lmbV@4eN=v@oQF?V+xZP0swH1f&fx(SDz%;k7na zG-r<=CRLx?Fd|CO;6zSeA57(ZZpU+k)z&70PSAG4aqE1{O zxwqW$t`#96p$GgAn|uA|%j?Lc=}8bo2lZ-kSpPg!^P7~g!>uT#DZcFjeM=Y;5*dOl zW)EOT7{Lfxwm2TsO25~sFxW=l>iO!xZ>wM!GE%y^x#=<{{W;vsaHLhMEOx~ZH)91# zXS+z=@%31_tK|wp%MZP?_7}klA8X)LpUcQ0g9Ew(wK+nRNRN2BhNF13@10hSAI2DQ zHQf3T>#aB@qz>PN1(DHDW4Jl}8s-{u58P~geo?6J8@=YUZpY)ze(QhkHt)bJOBQA24`$?KUv(!eUuL8HL2(cr3a5njYa??R0dow|&oB9pn<1V1k3HHFcYyu8Dr% zEz`-EZm|&sSuyK~_B4J6Do{LLrm+-*8Mfs`MMZ-VmMtk)4F0h)$x!Kgpla)T)%BJ@ zs<(jBnCC20rdj}3i7<5qsjfP?w2`C!_!Zu!Miah*(M`o10AD1sC8L!`Bhyx?5ub0} zPmw&WEUcPCVR)Rg{+VnLbA!qI7W8% z`d#{bzQ6DHpWEYc-}gf~uJ`+Ty`B@zi~rEJO@N z8ohnye2GUNlx|8414LvNDV0XYd3wa?=Gq?l)GKlgc6>kqm4C zd+Ui3BeN?I)C4R$^|E{0S9apB#- z0H(yZWP5{Zb;^<|4tIoZ89DMwp^301O(e{rX861=nF>nO6-hQsn-?arK z+i!VvtCq?m=NZ^JAN63N&vWdB&QA1jnqAz=0b`sBR_?hVEXdzmSvnv)8>Y*VDE^(Y zecf1I!{|BpgL87TKk%-J8{m)#q^n%Hh_u8|ih(i%+aHZKrB`Z^YWkcn#c}DvRsuOr zdVv6u{mqdI2f!Ow{@8P7Cv51k~u)sn4*$ zl|kQe{d#Uf+xA-Dn-i-I50A3nxn82zFPZ`NaTX>Y|)}*tM+;Rp3Eo3=9k{Rv__HUxZy~ujVC|ko`mq9UYyo zDC86B7S;XUllwKnQJ|5_fcjU0=r>lS?D-Yzw^;i_6e0xEpZ2FbGp~Cy~+lWYuD;Y-;tTIcY^0op3 z=(Zm2QY*|^w_i!59*g~LmRV3rzlpor%y9hYq*+V6{Z`!1C)1o*FC*^mN=k{kPP`G` znVgH-)%t^-d9uwptxsitKSR+TmdOFfg5MgH@96eRHV+8HrsNdAwY^LAS?&xQmqfhi za~y3T5i^$C0Oxk>27_*!5s(_G_HYU?wKHB zf4oHy<_w}kQ#DLILEI0F6cY>=KU}V>StKl`54Acuxe1EnBzK2YnxtpBj| zM0%*0((Gf%rBTa#ak39gU`P7*MBM{uxSN_X3h!Pj zsCeP;+Jh_N@PGY~dzS~dgjUw0P^ z8Q(qrq+;*4+w(+0#2*KOV)VeK@Uf;ZHl(jB3fFL|{s_1nwOdtCnD0iYy^IElH62*=K=^w_}nSlYFi|ETC>< zhkVMY`F5mSmAhE8Sx~wpEX5Oo#I-mT$i{h7`~B)ma%Q>_SL#3wByw+5TlXzzLqmhs zh+=cO#cs-s9Qy%|nf>68?FHW?iyG-7)MRDMmjSs}_nGM!^7q6&il9g{#u8UZ$s)J4Q!N~+ady1Bv^D2=H}NpcB&6L5*j2X)W61kioYJ0mZd_;FrcHr zFsw?-WXtqlX==DOW9WQ?oC}hjL6|9S6IjUg1^E|p@3`A`O|XEq@HZHFu)>xf+^AH$ zZ(QY=Io6CQsqa zJ-7~|=CGe6n52VR&m|>sc7;ICp}0g&_I=BDlF#Hv!3MztboEXqR$_ztQ(T%UA8slv z{(Gt4!-^vbHT;84%e2rP8^__lo@ROJil`w<^fSVEFurDbyz?TaiAABmG9q!vaPH^t z$dV`BC7c?}OTb`Hh(Y~3XeipJ>_*Stez0kjrPvfkt5Sxz2oQolP!!rh&f&zxgRJOj zHmXi@wqXI)GTE4|?QMTuk@V)7mh6M_J)dsT1PuBSYx^LsOZ>NhA zd#mHbE^L~u-mmQWC?&&VefA*XA`(XD2X0y${Q7yez>>IyHFoEIdMOZU@lzD?Oi589vG~>I88$q1)XvGWm-fm%HK4~ zuW4qF@A;)&{=0TjxEws7@8PwgN#S>-XhHOEyD&(bz7YXeY7O<{xx$7RK0DB83KR=z zjNXyD_u+3p7^QH!Q?De(^yY@}M-TIQ5|JBJW=~&l=4m{dQ5-s)lx{8e**W9rA!d_j z-+dTO4VIMe#DU5Cdprv4mFqIyHQ;mc{kitn3)-o*A-xcC8Q8`M2!GJ0r#}c+>JH>n zrR!R1Dg8Wq`e=D+h>6my90jX%o01-~lmuASv@m)ujCnDGF~8#-V&o1l<|SO5gGJQ_ z+7X+sy&A^%EO_>@Yfc>2Ap`VpM-R=K_3VugoQ(ph6AO)SA^E-jF}~U^@xqSDXrfX< z)*gqUDVwMXwBbwj@i+3XfUl3#^O0@(#ekfcR5pjqd3WYvLkhN11F9~PaXLT;-Yhm4+y7->iZN z`nBve3m;YNmR%|SE=Z<%KQrOWOHk~H!h zWJ_h&T#A_e8O04zzc^x(3YFmR+F@O%F*{|fKLZw1N4#%bfVTMkj<<|=?L|&K~4I3Kgaq^-}(m_R_n zaVr*Knw31Hl+RmlfaPH*%Yx)1RhNO5IO9XmD@V8rQkVRdGm^fOVBRJSOx`HT1O!ER zI=(brZzqN8!SV6&`!|d8DpB6B<1Mxs<9wJ{lCmQA3=Ra6YDz;)xPI!HjV3mNR$z(K z)!ZU*H<1MsZ+DwLg>{_N(6)@dbNE#sG4@IZNCoq>Xhxj;7_$=E-2Slr&f&*jl;M9= z@IfV=I{q7#nNbbbM#`kLCn#0q0fr#Cy%!8-_7VdK!)_a960sg-jjSymwg7E<@Xo#% z+HaqXC?B>Ljr!DZE^*XbIG3j}W5bCMy}W}L?19m$-+T2z2+BjCZMrBqdKTS&F-=&0 zkCHP_yxuPZvENFD!9$3Yh;JKeXCTn@P{PhvM7fxmgwLi^w^d2p*==A9`8*$!8$d<^ zmef;_E3*v}!-wTTC*?%CqTf)4-1YMzdB#NSR(WMUUE4BwnGyds2>2w3iyB=1Seu_Q zg1z+6fM&161?h_F*4JYBz7EQVu$XnD~5&7;a<|y0K^R zpqIZGynSvRf(Y)GlZQUqzmejnvJ->4+}dgtvxvIb}#d!eRdKbFKugpL9V<4+49R zeBQ4_WMmwrV;6vmrJXPD+k#zf3F0sQot-t*P{jM=GVb2au~><9MXfN}9#L6bGxkvB z;~}kjPV*$o zkx@v+;66vPqJ|77p@Z}XSkK45FhGRz75@1Nq?{~jOyCz!buTMHO7nPL2ls)A6bWni zOP?D7ic-2K1^XY1S(Ny?FiE$9L2&DC6p;`8O~6gf`US^3n;HxJ{0Pkp4V)}1pe+>H zORC;T1UN#IfK`U zlApI)x}IHRn6<*vvK>h4YHqNftkOYx7#jv=fG1Es4|kfvH@)cND*5#`@Nh-rd-8S#9os{g z9hmJGfv1crBo^o=Y_(?nqgXzGX@_o z!-l*%F=oH)y~jmUiO62dehN7$a8y?V{s;>QR0DXmArfBe^kN`D7?mI;^)eVIEia2E zf?!ZPQU?)#4B!$3Ebig#3m<>U9XYA6jRqdmh{-~7Y^ad?OP-RSYz>#a{LPl{RVAD| zQZ_*XBEh_d!5SADCvB@%%EL{SQ^Airay2+iu%iO%^kFEooW_j?c^$c$ImIVZkI?6# zuQ9UgURf{u>xdKyZ5VC^a@k&FR*SXh00*BXO#kE%PM7s z9NV%5ueG$U9BKvTd8P+_ZN9EK%1=;!q)^NsANNw0n)W;}Ehk(^0B#ESfimGC%n$4f z&m(aO$bxL4I*{+5zU?);76JFs2o+7+2cw)+@KKnMu&`$++DqQ>cKmlU*ixF2x$anf z9f+db?8`e$&r6_5ae>Xc&$vS|w^><{?mrEcGCz}og=<#pa;`ztMgTw43e2Bapj4k=Yrwv7V&fI?3&-Q8wDMtI_Xqof(q(%}G|xDNQcoqzsyi)fvn&jQ0p-rQWwQv%JOvN=M~a}3DoDGpKmFt_bkWgHT( zoK2}v?LEc3da%eSvvnpRc_BuY5zY{Uhu=hA{hbJ^d~&UdDG6#`urDMV1Yo9HVC^(e z$5oA&8F1d=G2{Z;8S57w9^s&17-ZAv#`c&?b0m@i{E0DLmb)GX0xl>S815c7w9N|P zgC~PyI_3v>5j2hS)R)ML)^Mr^RyCu(r*1+_$`rx8cu-yE56C=+BI0QzSnABkH#X-Na9z#NY$8#W*o z9R)n-$k|q-Q?UFd+55X#m*mV~N>q}~vhgPdavLurQ#7pY6xaHKR7ufx zUPo?D$1i=`56$w|aS-M}w)zHa&OI!GpDC-{G+!%_+H|m$v5__~1zG%c`a=9$dRRca z6S2X0Nrw%cxekn{6r9Z5*Y%-B9vn!8MyC|$mQX|h**XYNX-IT)Owt_vI8Q~^&O9t% zD1^Ug&&6VN=0FuVh>7-N9{Dc zH5Coo5Zy}yb%!3M2NvMdF83A~xkl!Jiw|6#&?=c!6VmSDJS0My?(Y>QreNI1&-Rl) z=jj0^7k|)So447QiXOFsoe^i zt?*@zeCh7)TU;XLtFyX~``Qw}a*v#y1;wLkJ9P4U#a8xtKeMLl$C2>Mt{9a1+G*O_ zNbDP(+~rCHdTu4nU)t^>idfe-u1a6Sgcg^$P&m178PnCfv*~(~t?YZU91WZkDpGNF z{1q8tk(7LU5%QyO)B*v?y6saOYI*@j8s%44XDnc&3|jV=-;}7L;r}6H#0A zTz3fu>v(buBrNoLptaK|)g;+oDH@7Jee4c>^?wf-ZzgfFAhO0n*Ji-WMm$h3Ugxzd zh36v^XJ<7oy=t7kXFL8^XLE_J6oX>>_(Z*0#x-GCFR+`t_Q=7OljwTq`kzOBi^mZx z4?NW}r9u_M-Z@j<{&gqeGtTLPw~z8Nmt_?yT~O%0e_%e}>lCVEs@b>r?|WMvbhw$2 zdbvN@?tchO6g;=3p?IbvbVC9p+$CCZi^%;yJJKtkVy-`OVYerDjZ0GO&? zFAD@HT7T~sr(jtCuule%ABv*8Xi@;lNB~Z}Bf)^cQ@d-V({8t55+_jQ@x3Sw11%HZ zwyKi%f=nTld^=Mb9PS{?aF9v;Oh-lA&Np54)p@DvcVF@|nZ$3xXl>mj_g5n!i^7Ff zv;=Q0s@D+Yo4yn-v?zoy~}Xs&5$uLIo$3=&t`V|LJ+9s>&D{f8KM)E9esto3)Sf; zhDoE}HF(x_mMlb&nS(eOwUdG?hfA@-ipcc=9-@`f71dwwD}Y-FADX)nF#h}Hz{!Us zi)^H6erI9PtyI&anjH`Rrdh=zCMvV>kdd8Y)XQ7(z#k1nZrl7_hqxz3<3~K)j@>R= zZUaVCQ!mRC_DYp6vKh^SB;VkGz(P_qZKBNLlpA=8ZgCkj2+U=9QOn|d=fpzAsJFWq zf_U(zs}`XS%G=sOA9nrSL@`9@ibQtY!A--^&fEMtXg}ske%=5eWJJ`k?OHOz^rhPn zC0N47ZAzn~k1y^)#+|(qf=u+xBQznqj!;E!4^}j=zS-GnHbtdML;;;*G!85(%|<5H zvg4`H${h>|`2IMqp%Q1r>-9}2zK}u9{YB(f zpe5bNqH@e?KOL7U2PA1sQN3e#jz8D!8x>?SxX)S}e1;_yBOf93+y0jCIfA$OUFnb9 zJt{|{KgVnjP5e!}gD<*hk{;u$Pk;5Ed*7-xT(Oll6E4PrWf=rr7R={LofAG%J(|qh zls`S>`MEw%C2@PYV=&hKvgN1|w)%FF1MBbVFOyVZ)>X8>A=R7A6E_X}%k9CjtI4)a zd7+2+X0J!+>B-VXDZ?*@xJk!-Qxm-yE0vEUGtF9(FUc<9U4;0K&S#v5gzU?MmesEW zl8LR|z&ihtx2p`d-m5gBD#!C<0%QKVkdcHd4?P9|els2eU;yw2u_%mrr&@>ZqP8*Y z-=G%j6u(_ESeH|v0@cQc0tlhU_WC+Fy2j^wSXGnjL0 z#UkW%GzWOd{M_Xoj@Y5&3WsTr@z*Atr`1eFB8txAdgbyQ6q}qpnVRAs&z^_k(*|$B zGrvXkR>e=*$Do*m#&f8}(6poFL>)bFc0g5v*rVs9VJ30WLxS%}k8*9NFXweeU;MhG zRZF;C4r~y$KG|EZja>&$+%4QY;)`QziT(3O@FbdztxZkkADvYr@e=n9>8SUgu`i2m zR6h2_4Frg)`;2IOsB}c-bbf+PegHMBB8!BQmevQ@Iz5;JTTiZL_rSd7l(NFG>yGHT zMRwDJs0#;12v^?k-pBr?r!Y!ct}1kX-wZ!`+lchMo4;!y26<`RZ2S|~MS9>9>+`O~ zd|(Dm|8#YECNb^k!hBzIaO%XUu~YR@L$0+PKjDSpsU`a|&mvb=0f@N}8#wWbsI-5c zX-#TfHwY|R85!tcg^@FOSH^hW0d<$6sC>qlo`m`I;gicp?W`Zz`1xhPB*iZi(?#~5 zVfWuF|A#J)K;$aT6Vw(L^EdtfJP3hMU`MzL772{kh&VY!WAg+TIpq9Nvp$*USdBJ4 zEC9LwFgEUp@>`IpmX)lGA^3K!N+e*MxEikAy!*Z5CE)Zk%0+ywzYV-9Js<(yLM)MTmOeml{*tyuNc~vh+ zq1Yd(L2BM2BGRU`J;+vrs~Om3`=%6hd1ZB9;Ze0@_`*@i1C+(y4En$h zECk}hW!qjYH`+b#wUNemns0)+W4WD`JK``SGBr(k>J-{Mb6+2snA4#)e|`n?20Uv)Pk|f zw4Jw1QNF;761psIY&?_WS5I<$3Av0)SDY$98&3H?07 zh$XDCtdR%pgAFx3kPek~eIip2f2?qB*v_l6y}3CVSHDgEe>{n6JFS}g~fuQ@g*&j~;h4(2} z^9@-CxcN!zW_uJ4Y@>z6zGuY!#Q-7^>a`nK1UM+q5z?(TdZ- z-u}4*PKS5vVz+#G8w$ zB1A+PEA?<(yo6nNOr;VjI-Mo}39h`E^_&jzR!VzU>{j%dV-d>>BlY9k$6un0aNgAV zSy6U<1Z@kkzw~N?<940ra5To-&A{zk4vepDvZ0kgG${)1T^ZOLnZBw^^}$M?=Ma3Z zvCc6SntwYpGm{y?>a6m%@42J4qKQo8cJ~QTdU_oDcso1q1j{EyrMU&YjhaWiL3_1G zk_tk`2W&nXW!M7Qn%{GP|+Bzc0;lnVO-f* z0;n$+X>NXOXrIWjR}pY6rH{j1$H#Snw&r?vscso25f;K|QmCP?_B{k~q#3a1pS%AJ zao2FDBhjpe-WJXQx(+;L6o0}(Y@3_;{^Djwk7xT!g^DTB83zeIeE5XnE+Ol z`!_p(J0GgS43Gnk%dw}&k1@f=JBQ1u$=4NA5q$Pb1#TXp&|&xYi`spzalKsI7n0(r zKY;P%2b$L>!~hGjO2QqwEB%d8p4=gB_F{=Dz|2+DOoS*o+f*Jrq0!sduckt)RnQQ=G5d|_uCT@yu@$#z_QsF*5) zahXvYCBKPR4W5g&X0Km6Oy3pa6B1!f`4iFtt94+Q#h*5RLu`Eq^Oz1)TNR?31r|hI z>K&#tt;c-K-x4Qtg5lDWi(JDbd8zBgxRm;`CeAJi)T&4tPkrgHnt zb_1G=`UF()AZ$iIY#LBXm3np>A61aaT|tB3)!4}2RcrU!zs|pmTbo@6Wb~|q%cucY zs7E>#kUDyul-|lCbU-E;kIncHC`kYR8e+|N{Rrj0dj^~n51>DUkZzaGT{Nweq2(?W z)Nr2qA@QgVv}O#}5lEzZZu`#)%%wz7eE?(;kgN)kw7UB12oW+Qm(m|KR7JW)4GJdS z8d>K2B!$DZ@TdzRm(xQDMJ!kyM{M`K^8#u~B9M4sj4Ndu)Y>F#OpSC8gIjh$yyYXo zD+ic7KjssV5N6`xGyR=Q&Nm)^%Oo_HHm=%*ENX^MY zy9qjpse>LCZ@1Ev0$R$yt&6t%@u;E3!}ddC)_6ooEZ-2^d=w8?K=Jq*bsN!Jj9lOi zs~tPe;38At0W;4!FBPoJ{^hrOq(6DMi+!&sAT=*BB?zx!MxP^5#c@g2uQX~f&nNxBT`XAAzv1!`X7emtGB_R<+A<&si-uY2UcqYX7b%dj$UDQ0pP?|sq!i!zce~pg1>psW6+mb^>&k575%?KH__fu18)mOg_ z`%K^N;=7w{16qE4)Apm~I6Z<+&8ns!0hGXKYh$C`e30t1jr@$f)>Tu&-g{wn{34M< zT8=*n4C8nuIL|gJ@5L=+%qQ3N;)5;Ht8N>Nxy6E>knl{cgA$}_Zt4&1Kgg=^x( zDh=0FSs>~uH|J=>_F#JZ?b(s0fdT0G)(_6Hrj1%m>p*mGPbGxl^5|{2gUFr0ZPQ0F z3m1)}kQz*#CZw_fM0j6~ngyJ`yaQ06t&#&qr~eXb|DLsEc1(w-&%5I1K4$ufG`16p zngirDPDZMhI0r}`HRUHW&=&k3l!8MeI~;suOE<2=m2oC*KcvDloWKXl0)$mqk zaK`kV@()`$0vW`s_pmVIc02gv!ZEU>1iGv;?Vo#b$209v;l{B*_i)(Q1)yCxE^>R^Esj{9hz-*bR6(o)>fRcrhr>Z5KQ zQ>O=_ZU0#bNqU0I@lNeZwSg=1sVx=5)|=lqiZt;0e#wz#w9RM%sJ>^}HJWWwTk#76 z?!J2d7w5D~k3EON44v-gH`3>CV{p`1htI*Z`G?13bd~wFg1^5%ce)Bwwijk@%yuQ# zU(iH!Kot_mk*$>wK*8AJ1JLSSNzF3qS&}wVR39DCOTG~EfHe&B%*y&fLM+l6QutSWh>pj+ykx}swYRBf~P(0k{BP3zUs z%d^;~!kUZ(d2%YFVZuRn==x=I#^2idy-28#4#)laM=KQk=cu6agTngW&)VpugE{67s9DQC~U~{Qm z`ffC8k@h=6&eZQkl&#%M8Ex(HclUQkBpe$>5=uf9Y_&n&kzHHQhdLw7)@*>6ZLwr8 z1~&rL#qQA3=gBEApU%}MLByW)&c}0`Mmnn&PjZ1>Dm0CU4EgSv# zVlK*#(u^UrBLesJXXk;dg*j0_4}{C^m+X^fZBTxuQ)^G9Rruj&0q7gxn9g!IpJ}u6 zNj^RW5}cv}8`GSn>IX=cn`eth%bZf7`fcb&&#h{N-Z zL+qM^lW{*f{_pJiodfeAQ}8=VbkpIwp=s@fNaXTs&S>5>k#j#EAF*`B`~u>dM}vKo zA@E&9TzxQc;?dU)TP&vmFFYRC1gAKv;|L-ng-?6BJ0fcc%09}c!Kc*^SCo<5rr8}sfvhBym0rJTMM z63tx>AtoAzi#N^^o~~=n0+B$RstA2|Qokjqv^6uGhlj`ASo#djAK5cHpYc_bu z*ZrDX0?*fMh{>P)n%Qu-<|n#{9nj0p1pIWEp0VF~c>~QD(um{n!Mc&SQBWZ>bHpwQWA)fLURApqNj8BDt@i*a z)45oh!5vj4CF4#+COdoZnQEHL<08n278te;!hvf+v` zpFA#eS6HY?RvQqJ2E?5bDc@*n=#&``ePx%oigUZuLBJ_?+J5Sr#lN;;uRz5O(N&ZE z>jYgD@_K;zJ_QMg0>p{GIz8`A?0C9AHY3PHO z{=X!_9cD047{>Hn`afQLl=t=PW3y?8&w?4ghq`7UY;JXHO9S_B%3}76? zN}Uohpd|vz!Xspn1{k{Xq!?#kPCI;&xH=ikA8$Uakr!rty(2YYa$gp#57wes1u)Ir zDlyi3GSeHV8DYD|dp+4eIjBK0bPJ%rw;feiO9B#+g_gm+W@H43onXP#u#)-NJj)t` z3P&oI9FM&0XH(1K;6>G%w5N_|hBKLPvmg0(S*3X(2YEjD7?>=-$7ITY1T)HXd%r%N6B`k z4RO_AlhTsRgU*E=>}^t-S;@0kzIfG6pn$ETNL?(UBo}1k8F%yM?}JoOu$aC>{RVVS z7uNbsco-YEDt;Vx`kmG?%l3i|#gnt1VnQjGJ%xxneO5$12a@Myi|fPAM(5}6kxGeY z*UW~%Uw*OBEyNoq8AkwY6|Cy=8jo{S7-3C;`6zsK#RWe~R%-*Md}+Qrf>K!z0DN>e zKD0Sw{+B;~yKu$l&*KhH(LF^`GOgO54c=h@P{rx!;NSwmPMNRq`|39OoW8HB4Xcga z66}2g%ZQf-)z(91K=V>=9^u>cya+3r1?0f_HR#@xz34y{?FWb6eS&ffg=n9=ZU!Pm z*suWn!-HdnNK$hKS_TFQi?yHmC#!l3Q;b8@kRi>K78!;hDulN3kwT=1;*`u@E!wO5 zR>!$@CmBRJpT+>or%iFZl2QUsp^-+}dElu0MfiXY6yxp%|Jyv)e`R-?;R;0!zo7gW} z}dFA?2-Hc1xa4)Wp_NlKn=qBB*0|7=7ce@7IM2)n?mBdD_ zXcf-xf(yxrR<1!?5vD-bv!1ABR~7J2%c8E(=o*!#;mhin`L|_}2aG-Xp!iIP{lvGy zw{CPAL?u=m<$vUJkCa~1dFZ=a7|U0AKIyvGA)$`V0PRqbneOPdb$n{M*p>=y8GJu? zs8w#jHYk_3u44FT@BciRIDx0vMDIoN5YGRu)2q%{jCUJ%+x}`MS(r>pGD`x%Yx}rI zcEfhVR{C=4%fkEQj^KGN6qSD4QJT=USJNo>>!Kool%l9m5CbDqm{N0onlb+u3U|e- zQ(EI|xSM#eHJpT%Y)`?((G9K znQ%ovXoqItgiT*&&*^=-5___>0 zvg6=~UBb8emP)3%`tY`g9cXSL#x8LZ${W+7M+v0DTvi3NOg!aC6&|F}GQ1-ll^%>k zUfMT&1Jc+r$e9JArCB?}U|-%Gj?8pCi&qt&y!g&PXpehTT#)rB{maW~dX^_<)L`9AlPyV)YjcY3D6ef=|AJI2AnK8M}hQFzZRI4eGm0}G~=fi~Iub$IMg^{6bW zDCEsEmbhv&)UL+!VwQzrRjscRoOWFZiLNRxCFV5k2a2e&0;NacflQO9>;orrHDk%r z@Owe450yXhhP%bBA+Gtpv%WBfTha!UG&J72jcknHVfF%o|3NeV!yM3s1NnsL%e8MV z|9jZ1$pdZVM`a-S#m)(Nru=nTjE^o49^ccmoXrFYJr5pdvf5w;N@W|{mM)SLc@VyL zbL<@2~7l5eP6mU@n+TrJnSRzD$ zyt=GmdHnH(KrYO#G{sr$WdtIdILw)BgCrXnV`4%nULM_NXJN$$0%B@e@Pm{?l1R-I z)VKj4f^R@t)Sj|-k)!gL8bIJe!s@|_NCJ!k4s6RJ;tN;7plW`?w!QFu|M~w2ok&KN z*`|CLHOaN=z&8C2g0xC;<9IGR5E3A8R$|0n;Adq^iv%En93PPVRQ7+S8TYdOw*paI8v^ZX z@~npWb_X*aEk}M+uKL`x`*ZwVI@~3S&UGPcnJyg(vl6LldJqR+2gTIK&xN0M)0fI1@7=XHJmzvF>r6f_(9L?$MNh3n`P?o*!7b~|$|Sr_o#ZmT_Q zT)<0ks$Ljj%}W-GvLbQgd&CbQR2`M$kO~UuINf1-p{k!hHAwaou;o4hJ)GM(QjItiH5-ZTChh^hR8Q z$TTmlYY_o>muQ+b^-sCq?RMEqa}y;b1fR0A&AlwMENm#|x!d&v1!bq|Q9@jPoi_3Vrb)ar^0) z0$;05MMA`Af;2S)MWys+n1h7d1o|5pHF;OCi$ox1MdQvZTp&xOx7Suo|4!LB=6`h! z3F42tjiNNCxeS|*3x3p~rfbH!bE`al9`(D=m;ruxlWcv$&xqNaDa;?~s)}zz(=%94 zjN3G&?VU*cTXzlI!*rgnQnKkLGRWHR#jJ0=Ag6sW(N-WI{=W$&3 zzjeEC^F=QOl$PRx`}vik&aY9aPzIY)Bb`fMe-g7l!4Z`P7{=otE(ZpU&-o$eOkzxm zA%>MSiRT;JEBGsU*~+q#?75f0c6ah_LiyF*xfgNa-4-eN%8pB>KL z($VYb*Mmdj+CLX9d_cs$tm3eIAMxbhLKjY~^U1P5M~T%9$g7`RCMdI|-p?<4{9E;Y z9&mQWO3DHv*$&G`YH_=-o6x%(!4Xt9BGB(PC4%ExR!UMRg}U_l5a9FG90u(?uNfTy!22KU#+~&t;A;^T}gLNG0ZRqDGc%CmRf7Tk> z97;x9i?D*{5*5Qc#Iwyy6JFthbWmWmX|dC^*q6$#cn*vTHedaJm_<}Ru%P+L;2&wB z`w^S@4E!g4En4?(Y*)*)r{+E7U6v*QiXnql-c-;9MbvsyNQ+PlD@IjH$c9}`YoQBhc zm8-5l96=MBc9F~*GdqpXFI8H8u^Eq_9avXi@kdnNiZKS*f!5*QzlE{{Lv>@&}jww{Qm=l6PU!vOHc$zt)wuQP;h$~u%wh2g13cyiu9g&9Z6Ax z;k_dNrzALuSAKV(W|QedHvRQh%w(>DbDmlI%T$NyMy`MzcIkh&Q^7rAt*==BI4FQ< zJM(8F6|-Fp^GT!TR+CFUK=GxzV9>?Ac=?lAZ{y*0I@)&>nYqs_BS`Au9@5LC!}^A3 ziFWh*WRnth_ME@_{#~8 zGM)0)uj|s^buz{wZdBQ7{^mDbh<;4U&dQH1y#y5`N`=N_{`~a+RnNh6!su=waK>6u z_|Hv9MOBaW`R&->ZeSJv_4G;JFJ)*)2Gsbd^SR(Jc$g9noCFuxw%0FnKo6k(Qp@PwR%#Unjt1kb7uQR z=p#bQX0`6@pSKI>K>BLNjzxo+H&`Mn4F~FrYBJ&yo|O-dp1vPH=7x39rR^sc*!*r* zDkT638n>c#3EwryDvmnT=`4}{-zi2}60C;GP^{AbDk3DUV8qWDcktMkyWx2G@)cfj2jlpZ)EBhx;LFskytDo@6zZL4yLQ<0K2RFJV&d8phf|6`y zhb8X%pC$lR+U+J7yuDH; z0;i`O{u#LEV=u3b;kGKbC7SMjtkLD~oeN%|csJLU4 zgv>D77SY^@4x87sQ!Jv;5U#2CC{rbJe&Knmi^hA=~J>35W>mMo-&nf%#Z*)>wqd;o!Z2H2?&CEVToU!>BU0%sz zPX@f8e(^!NNw(8y+#Ozto7m0f*AC6EfQ%eBOj3^o9DJzod4zdS7A){c7S`dew_$}q zi-N&BTbQ}xHgqFxpGgfatcY4kGXl2xwg0@L{w0{yy@S`f#s85ASqC-knIW4pnk_CD z0Ht~U*A2+UuieHU&bC{wJ_*wwv5dPD9gW-mJ||Di26_b5uNUn`sv75naifmodJNH6 zCqCl-uZb~7dn&V0`@2aN7v=?(j73ew#T)v|zP~F%OFsq?docBQ`}mxHwdhN7D6-(r z6rdw+e*=q7s`Lqg*V38UM~9}fcWh9yIMMDUkDbQXI^?#&=WnSq`esoZhG(XafEWaN zW(KxnpRfd18P4Az!O15Z*rkq*x+wMWu012W9u-uZTI?*O=S4NRm}MK6cOX{McFfQ6 zMGeY#LVx}5O$YLmdaln&Pe2^v|14Af*ML?uUsn}ey{Rk_PjNGv(QCpHyc%L?Ux0>t z#+~YEsaT01$#5{@F7#V*1wI-QMn{92Bkz{&zk><%$`#VU%i=k3Vj>>}OdJdkM#~bU z4h%FFIDoW)AUB^(2@=#pByFT2RC8VpnU`+1P7nCaFoG|ju8`x zm*0ZK(zzk_n7?+qV>Sm$U|yLmt!d^LD|n_bDo%B{xqQ_}A8`wM2`qR<$G|+9`6U^C z824)DakG`zcY@T1PR;E1M!O=9DDs>vBj|MATzCTrpvPp?e9q_zySosY_Uixf_1*DQ z@Nd{iB^u|Dop6MZ9oegcl98RA(Me`@c3O^|%wu$f|+ zpxtRF2K^dbNO}8UT9uKU3Ly{y3qki_8(>JT_7V1`BS(&~fk>kd+2`ylUhN{0PXJm9 zGX7l0a_A&Y@G?F0S-iQ(a2z^`lRb9I z?rrQ`((qL)2ng$><2FrdACt5#e5_%ezR50TJkYgP4^5BG_u3Wy*MlwIhdg}PQNE4! zf36NW6nf6&-SV~14~r<$-~*wrt4Hj^r?{X`=Toi>j}4AWt|K(%3@ruQeW0|;wG1S^ z(&p-ZU+G-%go5+>Z~K*efc(@^zHFhdX`uH@n|NQ856PWoF zWC1*ONzv^oN5lqGVSe#`U4w!kuUB?sv3hDAa81^_f3~-K&N%>P_|m0VfVUFDYQWo4lh#%^4JOZx~d4rq|OvN*GcV2HEJ&$K}sw z`K@M?ee*In6J1tg{rbTI6f90MrXh3-)ldturt=0^gKZ|V6Z^@c5fokN3TglJEO$u| zm}L8(7s~GYS^&+NmPZACDVk5cJjtIO@H{d3dRYt%8f8>TqawS2P^(z>V|nE5+G}c+ z@^12E3@elLf#HAt2#URF6n#5>(Sz&ahAiA-g>xFUzd5kghso}sL*JcwCvzQI;QjFq zo)>Ne(RMdvaExzmw)@>W!c5=ls7IVin`XBCmHGoTa)m%5;%+5e*A=<0I!~4l3Omyo z+}Y^Wt%0ZUuXZPZb-|O~b@1&BJWJ+Rhr*_O7+}O#lAzgxc_~*@XyAgk+<%B1P}?ng z+5L46z4^{SnJ~LVWlgR$`BJ)7B0!m5u|Lu9i!OPp>HjM!qY7alMc)kMS|9%>-XW6G zw>1-*AOHB0dLL{F9n7e2XOG!DM^ky80=s4TSs+g9*D*5R;mY;dw%ctteqS_N#D&Y} z(RVr%NVEiw(jnf~5hgu0IaQ5~D9l~xw?$pK{PbkUM^Te9WgdS)WdLG)C|+1xjC)KC zEkk3jVd7^GaUxV+80!T=7Z6DK%x4~w(%>^tRT!%J9tT>bACrVEHk16E`Lm!VWwd{-8BGqyQHmrl$t&WjUJdtPQLON zOhj&e%YGFjHJjC$nHeNVi&VeTkhdS-EG{lyfw(6TI9Zj>idahPey`Yo$lYXu4{ zvw>zKC&#-3!w}^5UuQaCgrI3F9)oG2vNh?)?*z)N?Z17_z0(Toc$jQdbbjj?=bNm) z&6f~v?dGREza>%$-6@YN8V?lgf{ddr#p=ydbdE*378~#RiFCAGqR6GUH&N!*O|H8< zR@uIjBoFW3;b>Xb?lsz#pql?3S-yIK7JR#Jdb3a5ih2&h~ zWB*2<=1R5oZ!>SlE4;-5{DPDpL22bJ{g?Q3oEWVNHbg~4o`L`C2VMPwJ{I;|`v!sh zEYRz4Hn`tJXOq&Uz@HsNmvr;2q~sdJ;feC1nYK9t|4ZSzf(38p$5|}Xthomlow-R0 zmG|{JQ2;FFK3u67vYepDHA&NHL55JB_0oGwWRUVa9>mH88CNmz08{j;ks&!z{gLKe zl%^p7qcf7f;N|j&{i-YQB1alNEGwHTEBtXE%e%}csB6{EuRcuY8O+f_z3wd&@wtxD z#=kYp4sQd#`~TqeRlH}D3kNyk8WK6P;%gH{z1>Id<<6O&VK|oNN}VjYFNw#2D&zuw z3)G!CKAvTFXiHY43WMtN0;mCRsx5+aPr%mZw_n<)499o#V65U~S|;)(MOX<`6PSL; zEek^dc3U3CP-c?a%f=iz?@ER*YPJ@UScsCTqt-yq82r5c)-BDrIX3@pO@O;ZejDan z*|&jH!LTj#0){s`BQmDhGT%);iub(EqNg5ZMdFZ?ME^5AqT6Y#^~7kym%B}$e7#jj z?Je~l%5DZv75YUY>wuMjbcuLabazQ8W8WpdcF$&MLfM@~5$N;%&LoEfQ(# z@9#f4!!!~D-G9oEySpi3Mf+r<@Ee85`McZV>DsJcmNSFpwoF&mp)0St;;Gr^^swFX9Rji{k^<6Bpb7IDw_BWhXOn|TUykV%LaY2Ll7tXl zs;jMaA-}!v6-W8I(juMQ=8253zOa8BJWtYlfuFrVRho`?#mvmSF&%IzBN=8B%`kSj zr6mDhF-Z?^vwpn!f!bncs9UuaNmvxvlS?Lvt1*}_PvTYdeoi7^t?_h9^K@FIc3{}4 zjz5cytOrfnBY6UhtR&!7Bgy(FO1bb+cHIFjUe*CPi=QHTd@IExdTjM# zRD6CawK((dP5PHCndMAU5gb0VUs`4FogpZSRIbYCN!S(&v@nuH7%95tj&MHA;!vl| zc<}xoWze`%=J-ppSre7`9$}>Z0!9@ zDzIyZ$bOk3AU*+cWAX0|dJZ(Ug|a+yC_|rbDZ-Q>U7d^dayVs#`gZ1Ca}Lv?5Pp*P z;{vLwh|byHU~~!h=Ra(@F4AvfA*+UXb}m`UqH87k)Ah{21DJjLvU|FiY!8MyeH0yZ zBGZyI3x{wjC$hAvRg0QT5dckRK`$(i*<}dYgW8$=ZB^b|J<<#ED<*e4F%9l3;#CkB z%3@<~-yjIlmWR&H;ecrpDY_*n^$f}S%WBH^Q%zuC;5-Ynj;(3vZ7bFBE;n)a&S2F)&NF8yHXQiSQ94_@6l6MY zCN=FZ+H!K=ZvnGs(tYi3%{j@))S%U>DLC+qP^r+ukYCGytMv3b*^Bd#>)rJ@>M<$X zVJ1s48E!5s+VU+qNaOWt`5A$`GzBak-N=I#4B$uLN2zNFDN%1ueVIE zaw4xH=qgM}A2TPV>@>&j_o)>^)nj9M@%^_#Xq8!HdG7>QRb-tCK;eZr?VPTCw@068 zM8*H`FT0om+Uc>PYvGqCJT)cP>&SiIQ^LnsVItF0ug>v-`V&mW9DRQ;uZ@x<1r1|P zsf#3bDi1hE^=-D93!O7R!f(~_bM2e!56}c)glu`IOOn+F#*i`FX3`9E>v@&wx@5>_ z_grGK6=1d{0*dNeT^W~6!Y6@pNor;iZK+fqBl~=#a{~mES@1qDs1Csm+FA9k>0Mk zo@aJCzc}gaR9?>QWnz-ZiaM7E{&r4A#O)f)aS+JxDjO^ma`@Q=z=b^Mcx+M4IKcG4 zM#1%v@2TO}m2|xp>qW&VImpNbJ`;mp5b{t*wzMB4shLrYKnd8)wQAIR9g7vbJiLI2 zEs*c>cQrc|aVkX{hL`P29?W?5BNxVTm+emuZurDf<4z_Wz0v`Mn3AiPd-tjK8cr5& zT&?`hqsAV<30;b=>=C+cVSu)bqH z=*)3Bj4V7~pj*Z4zqM_`+FZ6J&DXcNwh77P6o}*!$o(?WKhu)kT=X>> zd>hA~C{p4n+)^0^B%fSf+|2XKzTu z->=w8$WfzE*Y$c=Waoe2#DgzKTatP4gVNDuAnWp+x9oFnEPP-;y4?8tH`pAc8Pec5{5r^%FpBF66)#gz^hixikQ-)-NFYa<4{ct= zD71N55Q%QR$Br8srwV_?)=_b-?NZTIm$~VKH(6h@;7FrwEPE} z{c;JSc&{iJTB3Lx7i=z9kNuS~o$Yv*`#}eMPOv&!Sonalu7u@D(#>!X$g1c>=;G}Y zbp*0I^A-!4*eF)%+bkyAExD(^(w4DcK2;et7p!(1FY8s|2>vk189h!C6F=8y6U{-j zbR21B?i?dQ2>55dwyM`gNETzR3#Erc7|Dthy75jOc+T6n!KL~pE@aX5DLTMA*0$7C zUEvm=gi+pO1j0e}X`88Q&<u>Dxd5tlC|c zs)4WS?&b2^UuZP=%p&hTc>v!-46|SV%6Hko;`}!TW<&^ zCP=IB>YkE5%|Ngf6mZ6ymBZVB-Jd?z6T&4$MIgP9ODI!Q{CrG;-kOin3B&+e$uaN% z(&Ea`t6DoQM_%8|0Wi3HTq+{x>C;YTCZ=DGf=Q_2Tt6Edn*soluRBN!w`A14$Tuv= zP?VOgiNvl|Ji)fxFZVVunrS2#zuC^W+d=J-Pa|m{RYF-6RD_~SOkOLjPRJH_ibh&=)n^Bbe zqiNqtD)xhv93scyX;odH3RZvc>z-bI_3fJ{#j^w`Q()?>v(J24-CFZWlsg`BKgSF# z@*>y%2ce-p7f;c?!)?%aOOdE(&u)GHs?NeZ7BC$xkk1gyCfDWf-e~(I*qIW2?=HtP z*`;7P#n*nIp$cxast=^ zmM-hq5G%N63(zp5%RPKtijm&hyf9v-_fx;AZH_~|hN&J04D&%x#KnHrh4GyQgN@21 zS4wR-VlOP5N1p@r2Zu4uR9^9-)zipTdi8twxha!OKeU*b*bkV?6nzTiub(}2wk0h^ zJI7h~&`~O-t0yU7Na={LgM&ldDCFk*t7Mt%|LWb0LLE0e zH-Cpyh^pt}zurNPEj)kz-q?#9MkSV`;tC2uS=jnioRvCyxRc?ic;-ay5_eg}>lMW9 z7X)~5Nr>*uaI-J}?5}qiG655s9x1wx=)N@m<9KX=T$gNP`jLmj3lz$T00T6Y$!wC>cPFbKW=brZb|$wj#-*ve=e zooa8dB~_%cA<5z<(A`zea{kw)Hy?VOTkD+YQ-)p;dPvwJM@q+IEzME-{w6D#*Tr!2 z$s5aP&qoapLj^s7a;j5Ra#ZZDQXnOShXy=x-?_@t3*(3Wd0(v1eU*W#2Oh_^C2Di( za9M*PpO;4<{^gmD)8L3%qeQz$gW*{1x>g$dB1Mf^;`%lzQMG42lvwde7|mX>KlaCp}D$uKMAf^d1Zxi#WUZ>*5~Au$fSBZ7bl~YPXL+L{g@lha*m6wGCq2s3D5> zdo}f(K%%Irdeq>lv18lJE=BHy?x$f`sJr>))%PJnw62*l#}Ag8F1Iu;5Pap4C3bPg zY>mD8Xpx|onemRPcZTl4m+qG2f{50)c4GVBpFqB-Ld)-`9-_6syf3vOq>C_JTTJA; zLfQuK-j%0Y?*6d^5C(Jz-iBvu$&Nnwd-uTg9-+kW}n8goo^MGU!-qUTVSUO#kxpNUeI zFWiz69=t3UG7!zTnlKec8>^JH3HM$ZRU3-+8&^}0)nDx}bAEG>J>Z!S;NHt%19w4{ zx+$CGyJJxaFW!f~#r?!|GN=k^NwgGu9xhsy4YT)kQ?w-rfISFIh`zt}`#44FZubpk zNY!giOfTg@l=XGc|H*zze!BOjyUEz2*tJ*My$RBIiM^|hu&0Mpta_`#slDex^La$f zbiICd3~ap_$g6b_xEVC zoZe1h>NsZk562Jxbs`}D&*Ll}`a8o#wqP|TIe~xU`4mI&dL6Z5SeiYrmvZP=V=#+& zaHR;jcyOoJ=*PvtqE!~ukR--E0AW-{|MEpI0umL8POoWKd6&enFhm$XbQxi*!lKGouXG3v@;!Xa=_ z_uzXflj)+yvg2zXbCEr?v)J!$d~E}XWMfJ{E^FBD#Vo@7_Y`we!Dh{?MTPCXUwZ~P z)^qPPIHDa$1}-IqiH2ek=1W-$)0b z`Sl49fDw02Jx%LqLSD4`1^sjMDk>Q-D=oB-8Y{N#amI9D6Vem18%=Z&JC0Sg_wTyEuq1`I9pq~AVgKy=iH(i?_NjUP z%Xn-ioLv947k2+yB^T1GW0l~!^Y2T|G9g8;={QAwZ0nNgV(k+1nu2#e$ONjKNFc3J zPqaK#={gL`YYofgeYBVkqdq(zDEVUmIZ#A8SI!rWlAlfO$Vk@CVRvaIRP+U+e@dWC zHPGu*5pBB$7mL?Nea0lsoJyM?M~|OkYpvl<(2zI17+ik;g%gCO>|KP^2K;cYKXtn31Z?OcM!c9F%8#W!+b*1bFI#MDJsTw0R5{4>^v{bb(I z8%A81@y#&nk_w+@`SWlTm~iZ{HKq^6rszp##NH;=x$>giYL9+cdwaW`t82-23aD*p zXliM3M~b#X|J}1HO&;4O9uSYAyU&%{G2|N8l1w@L?u}hpw7fg7($MhF?N{p?CD0Xf zZMcPL91-g*x!th+^!?KwkNe)}v+~7@!l;j9thP^y!_y14_e|z&66i6U*@5H)UK9#d;sL@cI{$rus+{yaeo&7XI46)<3?pD`miZg>YXA4M@JUI^5Wl-3g*3r~l zXeQifb@M|{>_DB$p9E1{s9D))Y+@B3{`#!}Yj2DiO2j&atYn7G6r)k4^(7_3c9>Gz zaH`?-Htfv4`_jo9r(hx^pO3cegT74ze-(?yE-#q=nf-A#=Q_(1&5VGF_WdSeca_DCe91H8bXFziSNK{hG*%e+P&orAcnT2TebWXA_tcgxL-<04r| z*+9{>P-LcX{*EZp+2rhW4ou|k5qK~o2d2>s5>ka9w=BjkJ#U(ijE?pu$qHRWTYxf- zmoZOV>Ha1Q)Q8^QUWx7Pi3z(T!K0NigLkeXaYEGICt4YhI>8mZS%Y|6|FNKJQ&C-v zON@;}(@t)s+omIuyMfPtZK$vk)8z5n3u8j}MSldh4m4eR>PnDf)3*ysb!?a1n3lYu z|MSWdOQB>&iWS;t_j^%ds_3=l?OFVSlccOgyddi1{r;9@t)=0$ji8VFhc~=GT7}t< zZ*L{DvUf4Mxz@YVG%gNQ#sqdoUyH<@d>y346Q^H!c|;*2)AbdT_>xrT0b)f#fumep zd!%dA_S(4ct(P<{G{MUq`=P^D8)a%aaxV5lE|e^<3XMNLMv0+?arGMLgQ~+hODEP{MLy~*Bn61n@rNwpXCoNWcu#M8TaSL6%_B|rUX2Bs0wHwD;rfER!O4?%;tw?gLM`)kz9~wv5&=f8vR7!qY2qabq7JdtKtJ|`@ zuKqPBR&Va{fyp~JhOdC{b*`_zaO7`v{pL5?MziOgWwbdk#@St`vpdTXHR+Sj^u1ae zP(xf_s__m;X=q?y8Rj}~*BuU#tGOV`wW?HnCA)Zj$YSwkk8T!PcXd%CZ{IxAfv5Sg zw@0Hy4!`b?z;4T9#%Mnla^u;d!~Ig?851$Fr1Td*WaWZy<8-+2jGd1M9#pCjmrv&fBvajB$f@8=5mZ>PkEQSipS_X2Up98OjvEIRc4gg*{>BOaca`fm>Q;3^VRzA3*-S-)QwL%nNoWOi{?|#FaEF^?2AJ6Qk2-$O(mK0^j z4PBoXT-McuSk98>p6}GD%QiW4;t6`*jQS@KxphiR57b$0i-j@D z;#^a-3ygshWFvg=&Ktgz6>9wpA~-2zgUbWTU?CJEUv`kL%gZGacn9N}Zt{y~n%bx@ zbUdYt&BV6pcC$SFMdIs9`HgGODIpJOBMsl;}DSZI}RhLbb9fP!RgOp8)>d zN09vVFV1npCr{{j=0TXb*9HS<4l}MhKMjB)YnK`H!M$;+`LZzuuYK4;|D1H#1@zH% zx#ila@Z;S|S!)y<0(2vW4o~%Xt9lf~2$%C2bjuSWzvJ5eQ+Bt3Pe!) z0Qk6=Xx#84jKN^|s{@gVx@f+F0_Ln1@m<~$f8~~z;jUBb+~I`udP2&HPWuvQ{)Un) zTo4DhRNETu-CmZ{@Pz|kZRb)B#Si3ddUmZS7?)iX6`{l+sP26BMh-SrhmA`egm=eI zQ5;0!rV0)ABWW7hpG=!hi|98{E*yOaoJen8`?@DTgSf-9`sup0T9S4C`8XSTJ-j2D zkupTEXUE|Cl}h`erC%c;Rm5sbh>nYkTjs&rMtEb)T_dGsKp-va*4B)6H~QykWMGS1 znxlSRynLzi=Cl3p;o`K4tbA{lwPm$!%+Ta%XIj|__(%jKYxv-S13NOQZU{>Cu(s^` za_&h{3Ko1`x^8a1Ws{fCNm`nkX<`7N5}Y<**O64OzuDLl+MAK0D|HtA7N6vFQM6P& zBpk16Qil+h>UmdwP?b-@pb0DT(Hs)4CT_eum*Uuh%S0&SuA)N!_u>|+)>BdIG%?dn7mgFzX=Gc^ z@V+b9*~;`fx*2&95gXUUjeZl9d37o(hCZV#Ms=7mqs+?L3L_M0EGMME?lR4&A39<5 z^ka34D0c$Idd|fZK?Opk>foX`BwJ`nWrX1-oNt( zC0kg4d+f4zkp)J~e7-|95gW#6=!qi>ZFC*p^dH_d9;vVF=um~FMSay~LLP629o(3ap6Hgg+)rPIw~ zJx#9;<5*;M8pSKRB8o0A!j1q{LiiF-T;-KnZuC#A=u{gxsdqRA0ZizEER^q$k~&&< zEJsS1SJKncY&#}$^;Wf7OqaE0vX!O z3-kJP1*ybi5#NDX=EAdK+bmVTqO;>0DE3F!zj&JM|;m1C6$`OH1B*j2OD)ilJN!anGh_9RlYjvx{%?>ldev9yl#1uGo7U`$NL%AFm) z*dn1rMpqsWk+PXX4dTq-Y%jS=sbd$L?sJdnzv700$<;*s9PbZygxYnB{CIxf!LR(G z*e@KHOO?!ZCH~-T^v50?MI`6k7R-RRSJycen(A&*)gRO;-Swrrfg%KaE~-|UZ?%~E zf$~QNhH9AWSZVU?>PvFe4@g!mP9-FOJP2TFOHogy?N0ra+jtrTLzN`VF z&?Ea;?UAEh-S{~UDoadcO(M>xVtjD4SoIHT?Nkp+a>L#}K8mhTqQjw4-wjZ)za+(* zq{o&ivwQk4Ma9N+ER{REuH7<6D}43+^!%$rN6IoJqGOnqmn$7mLurh}YM+h<#*YuU zD%Mm1J@meiO;S3~B;I8Z;9saWm%183CEj5O_|ks#+4rNP4erp3w3{+7HFGc|7lLvl zluYiM&a%plk2P^Ei}S|-q9zNu5h8MUvHf)tv+Ysb!7#z+L2Wzf7tlIWu8!`!7k7r4 zRxXI)0U53C<$wR2Z-w*04f@= zmtl*%E@6!=itHYfwZ=Xc)n2ysaQm2hmlh1Rk=Z@QL!=-_gW~n;*Owl(Pux5;HO8O4 z=8!En#Mwuy+S|{UebhB{>*4tgiUQ-3C1z;t9$wz0VAuec4v&oHU0#@;Ji_$*CHdWOdeiA*B#9WfvXH= zPHrmSwTC-0mdzvI=ePlwRq$i?Wcb}%1$uK+Evol%obPWzRFoLjR(A>gV;Zupz$eBC z`+y!S+}hkwCFweYh_))2pHqAC`&9tOvnn8?>q2xhct!f1UqX-auB09UVY1A#EnBkd zKHtS#k`G}rIPmRy-$ho$QO~2XecZHRtNQx-^XNCxWi3oA6E9xe7MyG8wxh6S`gGj* zMGSt9$L#dIeSiIT{wZ+R{K_^=dv@Pc{c0rynu9NwBI%^z9OuutsjIOV8wjG8bvjektaWUQ&{Y!okPogQf!}FV-#LMJITVKuRq5TbX?Vym0 zMn9K5;wYx+1&j`#qCI5xZK0F^)hBqt$p%}325C3vX{vI$bI)7$KvDnC}k^jK${l=gZB*||}|V}wv5 zXrMY*M4XaESVU6tDG<@*W9j@Q53~@H0PTF-q8?5K*V~U;?%Rufvv2~LlisO;oti7* zZAAI5I($Z{wGeE)1m!D{t%ssdoh1{lPSu(B3vL}5W{G%Du8YsD-N(Spr?O{eLQs%? zk5B$ve7mjGdWfKB;4HklUdVJDszD2a(_<18Gt?b@LeOp{aMuZ=a87aF549oL5cke0dfeZ<9v{kxp2$=MK0 zmyhI4xiNF_Xu`HrGcNT9A#&|8k43Ri^;m)D{)pQU&&Dvs?t}ek*on1PgZ)54x^aRR zmC1{D#-u`%DiBHz7bX|6WrUJZ%IIJ9^!y2qUN$GrJJn!8GP@@=^=xJIVSzu;^^glQ=6S3-0Vl!nXXM(Ikz{@(BD zq2Tt;56YbOHJ0@HOm!5VOP*2~e(rZAI0s66nIBaZ(Z)@xr)%(% z=CuJF`{@GOe}cGkb#bVob)jMX)BG!uk&EbJ##rOwY4k)QAWI|$zNI$$I}f~-+NQzzYS0(}NR+~Y?%$65$be34r(lE>L9D`%i2{CZ)%XDJ{~UVttH~`0p;hLRoDf6RK9bLCs*eHzB-s#~U1O{$a&%T{R5M$xI@uPT+x?W)Bb=N`w;ImiA) z@IWHO0oLRwZLHb5t(xbhxNY3HROdg~EgbeFH~tLLnX!g@9+!x{2fV-8x4Ns5WpPsw zJn|Mvx|7QEf37SV40FNX%N$Jy=~Anpulgx-NQrC{^u`vb$WB27_=Xy=x@m9Lom#y) z%7+yh;5N3=1_Ar;EU&_{t4SGrLTVKDRCyoouu4Au&iFf^o5td}sqPquwfSIYn$dPX zc?!yWUPWwUYZj$8%?c3IghIMAiu0vGZAM_Xgy4{R`uiD&M8Db`y7T!2a>K6M!{bxl zP&9JTdAP+ldcM}`*@|P)7>-D`bxBp$aTkg?<20)M&EG3D8Yhc|ha@cF^0JGq@YKBp zKq#0$Ve{hnlk=1a`+A_|5XDzC>vS{o;`wV*y~f4ux2YDE$J z?^It7tS|sz6R0YNs}FK_cTXRea)kUa6NS&g*LimOyB~&gK3nuV;tB3xcrWSvo~rO4 zC4x&=Ws#smqb}MdIVHtZ8uA)VPngpDSg>lqCL&#R!jQ1VU`v<}SLm^rmFnzSaA(?l7(e%ZfU8qxhKbnr5tMxO*JyhQ?<NwwNv1<#}-v>pQ7Y&@}^i#D3UaQM>X&^zNqsi)XBhS9;{2d~y^j-7)!iP*L= z0F`$5QM(s-;)0>NzW~#|=Vd79E~;cjQEEU~L!aHFK6JVx`Xcw?*Tzh?#hm!j{P^;1 zrNInyZxic!n2%@+2s?l9t{Wz(1Xv;+K8^N!aq0?l|8KsRW$a5!6@{f|NiI9U`+A_a zQm)syQmQhx349Re@8yCEW4D-WEmO5~f^{LErlU+T<7j$4E{`sMhW=+vUt_S~=;vHK zJcqULqrA;WaKzmmSLhcrrq6kO88JYrrz)V_L$C|t>WRMTk>^^ay8))Mw+?~7tzRmd zj!3M+21MZwy5H~jPr!X0udIgF+G}t()~~H8mr2q=1V|)ot=XFbveLo8GW$DkB$=9j zX%%|`Vb(Y$hChETaJO^>#`#1mzl1vby2gznQuNm#ddTdmGfmO7ubdV-CJejn^CP+8 zME3S41xzF^$jQNBt`tN`f??9-FcFin@>muK6*{Cq9k~IV3HHqC_cNb3Nba-7;;Eul zIo*mmmv0-)wONH97|l4BaUTk!sZpZ+^xn@IVhc#Ooo>oM;jX=I1$IDy?*waAnRm^h zBFl!_>(H}@LT%pE%v?o#g7vAqT{vN)Ruu1ABV^xy1upN>@mOOE~x^!tOq=f=ed zn^)hgcL}jZQF%U83QNxyHqtN*7+gGRVX;&5mSBdkMtP&%|3OG;#`@kOP>_r`hD6&-!|cRFGH&4qfoA45m(SV_C6JW z5v(m!oiIc&oje)j1qM=FtS1JHV~k0;eeCw|k%N@^JctL@!BDZgjXPFsciI0(rRdXJ zWp_j4^@Q{74wsYMiaT`Mtj(q_>Al1{7 zu>BV8IEjHG@MQ1#h5t%+e>nmF-v07xQuZ1^jtnY%;UsIw=;M%xpTB@w+ehUutwpqM z6l@Gaqjv!He?o9t9!mvr{isQZviRw+0{NJ!uG(UMwQF3Dy~L@p7i@0b8d#j0^J5cV zel)!83zZQ@x_K59HO^Nmwd0ehen<-TCW3O!u56aB^G7QQ<4x7k&0QuQ6j?bJX3r~& zk+2Gd{3&P+M!6beXSCLKkD+8DMBtABD4yNJRz@!XNK-OV69_~<51{;nkXo3s!ExHKd!t<&U+M zxMTVnQ4)8xb0&umPc5D}4}3rDVZRKYVA<)Y5e^Y!uppiEv1Qk1b`Jo#e@aGS6FmMZ zU0ddiHz$(K%)tnwV1-uDL=U5fv2Bnm1WbI_kJrmAv0_L*1V&jMY#ax2n^WlA9~J>a z1}i8i8A+z53l%fOdg4y9q9=yz#C)BDgLg+s=9z&OVmlf^29^JUKSNScpB^Dfxfcx< zaX%CgDU%f*O2<*RN^9iJ5=|ZJE-giiG7B1NjP{!1P(#|Zrz`ZmTo}dbSZ5-S$EFu7 zhLV|JK2?hwlu5Dt!R5|flEdz!DB^%^OdmdVYkb$g=;1yar%0&jF{lRfJ%9b#57WqH zd^*qBSI-hZ_r5+I#7D| zk7~cG5-rK^OqM9lO~EBq7t4NNrf8$3NH}yDYDj}0KYAQPE}raI0LH?$vK9Z1N{(!~Kz~rHX;gI~EYxOiA7tf%&xbQ{q%!iHnvTYQ% zPM0aBD1&R&IBu8;42i69k%u=`DJn0^P~EY0R~%k+RYJ7B*tl*f;2k#Ms-+(+INj>(h)*RMU@qF+choeNtgnQF)I-o_27YjWv4#8C? z*xEE+6nDwJ*90pwXog~jYU^qxY-_sBIpXLCx3nqhBQu7ZeglO`}m+`_Q|AnCF4RS&x9FQC2G=gtdcG22YdKObCp4oK~l{oC)$4?!FU zWq>;TW8jk=Vx-~xFEZvQv6ZQ@Bre|{WT_7@huydu>TVBeU0`xRVQjQuQM22`{YWHs?wbH2XR-B^D-4u5xWbfU*AIAui*rN)lmt3!Ms+gH zssWcawJvn#HlYB1CPAa9MD;LJSuMaSjcM4vC$|f0i#?bHi*s4(8oN}Vdk}&4 zp^mP+fYIJf0*)%IhM7dcGF2}9_`~_W#ElB3@$h_)rq>HYV`ELVz3$5Oh+I0_IqU1Q5BoHm+^=drQc#Znb z=W7taS%!sSD+R?HgTvdzP_>;a^+b|Y)#3qMh{p`^KTwgw8Tb;*KHFP+*EvN8u5(8f z57vI?PaS6=6TlaIMNk8_J_5JMx>L4z(thD}FQwT&Xn(0Akcv~2{y#I`D(J8zvZsRC&qhY=_Mzrj# zI?tqP_l=FjoI6I7q@kyleBZj9{+v#ep&dlbrGZzDM_hd@Xm@IvJ;Wqas6 zZ0%xcbeoMnDYUIKgJD$D_Y=V&4On_V!mg#ou!~!TeVyB&s&pOWpi&S(<*14U0R6OU zG1bfCx)DBibDu`uyHr_sbbld5fl-m)&YL%HED32m_#)>t)DKGWVYaFV&{gErH!w|W zoHHrQ$n|s3fK)%G0q)%EXTUGQFhFej1m)g-xG4IvhQ)AuH0tX;>s#(ilvyj-+`2ZK z^RBMT!GfmcGgj#fcSjtB!BQM;VInU7Y-7gALgfVabvkft_k_5s5yzh%5P0>P*Tk5c zs$)c_Dgd5gtmvW^ha4dtIw2~J{hk?jM4Zet(r~W-aE&jMl#7Dm22FEs34gyXI;fTK z4!F-rf|m6ImeO?UaWsIVq+^}D@2~?kHQ)>4hBtL=OoTdtO*^9x-i{WXJh+X#& zCvV90dnw)^F*iBzY&Or$^5bg@yvo!j7KOlDL6o~pst?&ODI>O&(4SdJV2s0 zGmsZm$n*WI;7*C+iE9reZf-7&EwcIA7r7D|yuMdfPe7xn6p*Bzaalj~v;fpGK$SFM zb}9T+$!XCq%Tc1&)o30Y7hWlKgu=i+q_h4=46Xz!UC<52^q`f=w$bqCR{VTz1HozT z(Fq=ib7YJ-mKqA>)J*R8?w2ZBEI10sQv3eh)5Yv4r0A!NSB-8%& zR%b86l{@mLwP$bF&Z@x|qTE^wE9g&`>U*`vkwXy^BA~B$8%*82{UG_1>RPA#O4r>GqqvX_Zgc2hB`Cxfq`*H)l2dd;nUEoSy)TGz@F0SA<1RKwSF0h=g)fw7iij;(GR*UZt(Aa3bth zl%4~zuN}XQ64W)=7Rv59vX~?&Mk4V+L7*Bx2h$P!hCz2`C9g$2l!^noRT`IrLvT9$ z^hNMgy3=o(ag}YT;)Fj8Eoh)oKYZ#gLGOq+FZ9IZ)+#NzhU-io*!BzyVYi+Vht3i0 zkrivEr;(y-6*a2gS5QBKx>kx$%Q5_M311qwnL!3sjV z-UB3dQOK`kmc1{uP(c-nK|IqqIUU#KW3le!Z{@h{ih)Ev>C+?G9Z4P<0yS`vr}PZA zKi@sJRt(c*-B3gM_ojC{Z_X~_5??G8x}w2)xwj{p;?aUyFmS!ddminIc zuW*>ldJPk#dMF*}G?}=IF5nL@Lan*ZfHz{O$a=~cW}uZS-E0o0-v?!!5WFO~{ftmU zQhN5D3g`f1tpux>PC=BhZ-&p7xh?hUo4mFJQIz{x@nzF?DU^F)ahF(jPYnNTXk{;{ zhA1F*0vhOm^wY(}^bgTxlM#Rtuef3hLfA&0%ZywZ74b>b^JfR_}! zV-PZz`ebvX+_1WFxgDOPvivUkR`M`?L)Ge zqICV6(*vOi>K_GCOB+3@@^NPU6S)O(kDNU*+lVfwA7a0@;n1 zw?G@}d`-8pW ze@%d>`lZGuZFfo7Ol??L*fn?)jsgo2Q!6B7W4$6K@+hyIA+z}3X`LerraSL#|?)OHr@}0PKg1V6oOT| zow4>1sL6pGfn!)4LgSiO6V_Z_TH1G&#H2RVV0#VDUmOU-i=8)911=<8IJGtp{C?J( zzb(q;z>sA8T%=xp!KS!1nyS1>X~*?AQT9@vz*K-SUxkU=CE`1d^He?B!2Zh{naLCq zeNFG!Uo3wOz!=MOW|WP~%P$G%n-|d&ycyGr?2D`qz5tWxeE7++Ukam6E1!KyYpWo! zr`Gir{Q0}bB|!--P9wXo%f|&k?e_`~u!%-u4C1>TOl2dVNUS;Yi&o|7BwG3O)C0>s zH>s3mxF0Zue1XvFJ(MlEjPyO4q0w4rM8@zAsVRMaC0o(Fr8xd<$qk~io*%ObZy7)Fif0WRTSLNZ)HR>5V0?9=|{F`%1k19gi5ghVxbI_gWMxNIhZdNNju&egEJe-lXL4iCZV(laz|~8~saFP-u{B^wKZ?DSVu~!Go*;dPKu>nXK+Ku+dEqa53TDKnwEtiss$B zI~?zSLiyiilN;oG{>8uy%)qAgGBn@n;J6$GJJdQelM6Z*USVlFpgL+a;;}JmM!ml; z@LI~iv6GDumTAkRTN(md59uR6iActPEM@O>mWvei2WHqoex?Jkaipi9NxCy$8hOrd z7ost+60{PURv9rcn!k7`t28)V6UffuQm->lP3&<20Bh|1wp6#==v)bp`Xk!T7^9%W zH(6zR6k8<^D;kT!HL0RYA~A0WT!6%mlfu?XOhHBE@{y6_H+E-7!iJ{NtyFie=3xiu zlp|u&A*ep%qfkz2rMc_~sKa^m&pT~$j%=-i0x&wn$Z-dVAlxYLbqD`~nKzndGaZC; zh*-gAJ02A_ucUU7ur{E1%FKn}9qLv7ztmm8)HG4GS-I`^HS%-@ph;N*UGA*8o~@Br zM@AEZq0cqat>|!txr(YF)3aNGE)F)*Xz=6--8z_ipJHAwX-?>*jXAo}F|y`FQlV3y zG1FHEL->1rez3PVYjXY}6lWQFsEm*fEyaZ6X>RSr#Ty-I2W{>uiIW`LL+pqtKM!Un zZN4_=oIatf8DCM^tj9V<$i z!3iiOZdkfkAhMOvdqY1~JMHD*%Nh*crjVA|R-IZES2*dvnJbzL_tfO)afdXY-lp5 z{XcBI1yq#l_dTwNf}qF{(&39lneij!UzG<7) zOP3@|@?jtZfFEJlm+l6P)@gg052R(7^dN}e8YxYEP|bPFL<{Uaxm}3nb6MfgaqrQ~ z7n5kB2`9f-jeW*<{~gwVzp(PiaDgd7DE3*}NO=9?%%hq5%BC7HxOqV6Eyz7Qn0rhI zB*`^wkOmF0w87*#h$Md+HA8xEEtjf`+sJ=lq@0@&Qefg4GOuo$qX>a6~f9Xxs<- zBlIZquMDGa$)4RkfymO|xcaRxot{H6qvI%09AWr{g#{S>`W~L_{!47`>~pMWlODt) z$W8*9xVgnlX}Jpr@5f=pHa(*LDF)AlTuE*ppMbLXE~e3l=L6Qay0}(E%LVqPNrInE zG&&$6OVb1XInuMStQx} zAIUJfpd9!jH^4P*?&!Z~lVlFhrlUa-{g>bi%Liq=i#vu_=pu8vuKFMlO?>@M;SR}( zYFC!?^)?R)vJ=m+>qKTQDAEIq`s8Do^*htzrvbj_zCF19C6&K0#A$hd&X=;sIrK@C z;Ckz=>QCxVdrlMK&wt%LxQX2xw0;8el-U(%BZfYt{`2G@*Kr`FUI_>Zj!iW&&Vwbtu4Ag_GP4rkmOA|IJaVj3Y5(Zj^ad`etNunVi`VN4zTGm8e zg#5gtUe-aUI+$P zsTwz6naAp-Jg%x&6U$c~?FUh9JAvT)wA4Gl1j%r|DZoEaX^k}rX@Dde!BD3tPNJO`J^T#1zd#blZ8=xhRNf0a`MR? zd@y4a+i^o~BMev`C@f@zEp<}@!RocleQ-c4NR-_k!apmNdyC<7=1QLXY8NVUSv_qi zNWJbTY<#${+KJaVOSQX!!%>4<^*{!M zx({P~@+y}grQO5Gn~vDOy>s*$kJ+1U3qkT<`nc@VTn5Iee|mogi(i8YnF7d)tl}wM zp%Z~O?u_&aKNDU*nWyhq-oIM8^Yc1=$b0&A`5qZ)QWTW%Oh8NLPk3J?h~qB)MvZXg zVhC+iFS{{6HS^lLIZ)=|9KY+2x|clIQhU>{)Mv;|dWRPII7YV?U|4^U$a{hEgoTiY zf-|p#d`!0a5Tk29Cu7IKJ^4Ru(2SBLX?d-}$hkL!u^*RTV?RT(zEgyuPLTA#sf;Wh z)vUS|bs;OW)<+B}f;}EqNl32-NDuA2i(}}vK4{JO+}yHL8^i6(CJrvYtG!WtXtQU; zbxUP3U#8==6xya3&}ZE>)H9{s$lo(=y#R>io3Kaj&nkVu$?z}BKCFK5AcPPZ9k~VG z$Ml`^oiFiG06A?J_8}yT`XGu)rfbF>*mf|^DDs>eN0`GALbOMn{fnn=Hz^ZDR?UPA zPbfG4h^!*9l`)r0@}K5!Q&6*1(W}03B--T4uY7y#m%xUa`X@9nw7bNgk1QK@(Z=}# z|M3Q0XZ>vTfCpJMcnyrbrh{gcLrKeD06RpOHKdz;FgiZuo)rg|t(yl<5_!18&b^Mk z=kZr9%04^<6A}s{L42o}np34>r!v!s?|AUAb6JPjl{EhuOdMDgR7A&+tY5a0`#sGL zg3iuFmM@`2PlsxIzu4H=a6kF@Gj6u=`BN!Zxz!AqV*nW%IRvEOM^_hAHlxm;cwZHX z4%Xh}^-RH?s(d4b(ct@~PL^vG9D1GHzr&4`5=&x+>Av=9<*R>@l)`NY&~%6Yo+Xy^ zFsTa8EFA=A7VvC&W2EkM&a5QUu|VkkxvGMz#^#T@Rut`hO-d79k2q%2ehfAi_%6}u z6;^T8F}K37L^iXcxfTpWKoG_DLgJ-=zepp~1Sg);Y(P_>EYIgD@^R45Zx3r({iouJ zK{;L7PA?ox9XFpW3p(YT#-Uwk^_qXQ_1M|96&i%wQG?EfO-02Z4cqSsF#k7G-4$FM6&sse;WUs0D<*9Mc$04~ zDgPOv$*c%fxKPm=WI;X$lNHX~x1fS?t%n_@qk0qEQnq+8Rft?*HL>{$P^IHVo%}W| zy{8!*VCB3)U|89OEgAg}R6%tvL<^MTAtK&$0++9E4ttz89@Ag3U0caxwIeUYNV*=u z3@Yx3BX~g$vuxo~Liyk7!@0S2LyqOCF7w#@LVB7^QhGJ`x-Ixt1tg%z+VHO z=`cFaTW&McRb3od10^6~cGkK@L3h*nm0!biqD`Ls%J7}vEcX*H1M-5UpD>=s|0}T!jvIOc4wliK}oF~odtypJc;J_MzhJsFbJ)L9n z%azVyqHobvL1Akf`--I=4W#}%Asf4y4fpR@4If((#QMJNW&S9CwVOChz-4fw%iu&H?>byE5)#~0q8-bNKao|8UuFJS}Id(jBhl_|O zNGSLa)gi}X$pLHJrUUdYO`vX%OBIvuSY+vs&=!jw1N4LYZjc}GLb#<)AXQ7=tQP&t zxhZT22AvIOLptxL%~n?=d(Xsy2;#I**}e(%k$h8anB{NGEJB;$8NX?{gLRBed5}1W zF7~L9|Ih`yPTV26ABAZ0UucdHxReCi zRZ5@u27>odkvBhfFOA@~s`1WWuP_bAgOzBCL-Ir^dDr09*6N#CZWl|w%V*N(R#5ki zGbi=`YtSFA_G{iO<%F9N81MPiH1>_zWZjEJeVJJeC&TE~EA=6E0ntj6WjJz+qtd%y zG)lHT%zErzG?m0(4SWyTEtfDTFTGtb^x?p_3A+n^a*GRHd!ZZ@(6z;=p7mj&r#IGZ z_ZJW&PSUjcQ?~e0^+eiO2f|v!z%1*Kx#tfn3BHS#OYt!gL&WMA`keidtb`LE4+?boDwlqY&SE#^-MiWc~(NX-G}_nS6JjImvjgo z?ch13um57H)vr8r^e-SLPb$BnJaWhTV1mNh-0!w%1Sa|^YVPnMa% zt+0V=Z zE*YAQJ$V(C2}@(#Eu>(zbMWrw+8&dEek$JA6TE-u&*iIJzeNAQty0>E$%Z1&D*XHO zJvZvOVK6UvaVNxqk%N->Z98fT*Q_0mUh%hJwCXrR>3efY(RP}KMWu`@=M-6dvdt3W zDEtt1Z+pg)$^xk(5jHaZs?StGjZ=92J9ouDS9&tlKoBOyaZwXX;Yqirj-gDk@+rNq&V4^cRn`QQygdIq2fQT z(Q)P#7&h6*#>O_@K_Bxh*@S6M^`S;dSK}1eev|<*RBsn2H!c>nrur6EUy4t$6zb03*Wf0^9#HU3V7nA)$ zZ!@kJ+$yuyIJ#^mD=1hRbnDhFN7hLZ1EZqN8z?VD5iTHL`-IN?o6BI=5d{ov6is#H zFVEf0O|S*Y0a&Z6TSw?hSKuo8wW)ia30CtMsDBe`D0kVE=CE$g$9N_WG zjUt)$>_FM8p&4lrk#ZMM;CQ)jnvtn0eW*Ix??bW(=7Etq?oTO6-`@%ooN+^y2R{!N zoM{H$>rw_`hJR@JKrE-dM$A$SO-jJxi^oCuE@w{|DRQiDLkNQ86cW!lf&pAa_@t36hlcxQXv(*uWsCJV5Up_t=TO*%JSgbSWDvE_!o%_zG4!; zne7;$Lsl-KwicMTg8ODW-4_f17ssiNd>J2S!@5Uh&p*gq$TlG({u{9m5icO&-qZ-# zQ2h;1Nos_;y_^x9WlB&fVC$+DYZ{CDnWtlfLBy6bDbW~RS#`e;j%O&M+;KbBs#xkCPH8u25;p@u6zc4RI7!kMUr8*v59TNsPcd-Xv4Oh?l3huBu?tJnFi zGMe!^ib?){x(9?`+y&TsOSaFKx~F}X5f}q;5alzugb@t>Lggz)o>v?&B7)f&B_LN; zXQ7(@<;n~mIFAX<_kdUV9mUF@5X=OsN4+a;$G#7og_>21|Be{;-11$uKaM=ns^Y)$ z7w_Cyv0n&+VN1phr~Cozy|Z5r7V;K`B%r?wwbF-ZqkN~xUWNc0(81iQAWkZRvijXd zVvf-`0P+TJzoPMVB>&R^UgkU|ONWaa=}OwrFVrEcmUF`N2ExqZsJI0}{Hdmnu8t+G z*{#bXhY=>kw3pt}-3TDGA6H;EmWo+c0%jJHcm%B zKZ(Aco;VmOQ;SzWw;u{K$T<D_}u@uI37yx+BzdNJ+!;OQWBlt{m!Jax}p*ZLgQr94qmG`jc|*FrQp0x7f; zy0Sl4KL(D)s+;(ao>-Zyz30i-(SmmE`#*lXa=j$`SSu&8B{2^Ec4m{YJjSmw-gwPl zjXocpLODBPxEdvR5el8uXyzlO3WtafG@B%SPaw=iPRFjTJnI4ooHxHl_FiYy4-fLW zSN$PDHLKlh#6w}XJ(qJ(Ubl+Ol%}ZRrj%{=eoLt}!*j+~?BA{MahDD5IYtb>pMupE z!D^OyqTVQM^ZMtu2|hb$Ef-VV`C9cEEj(%df=kK>HTHy=K68N~o$LfD5&NM(U&4x3 zEsgh*c%Loge%IU=7-|$9NKN%l`iUu(z*oW5e3Hrh@FahwEeGkD%L+wG|QC=d2Fb|G|=)hN$VlPUr0dvcrT>^+tZJ>A!6F@8P1drQej*XAgUaQ z7VJjjLhys8enT4*f`>>&!r{T#pf;)n-;KiyPalAJ^jos;A70OuzO>mgWZ_U0Z1jJg z&2cbV%?3xDJkN@;G{L^8#O(k?bpSx!d|;1NvKj5OcP{D6>b(@C_}?=qKXw?Mf6a#V z(b2!3HJzYJR3)HNRHb0{XgJ1`!n$gfll62+Rz5=6_r&>8B z?3oD$??KXsHw9McR1Tu@y16&`ByOg) zib1D5(xA}l;m5Qqb_y3@V6$1@jvlIQ%N zt7kF!WZtT^YWxK$tP?*JUX` z3*)+{I5Wis)~~PL7k;Ao3=;}}A?|o}b6{bX)1C2lmA;+9(P%A=n8VN;&*KpLdz=oD zVp$Id`AY?U7Zm#YSrZT9R%h@d^aP)jy{VJ@%Xx`evFL9OM`1pogYH35tOBpD_uw~< zHd~>cbLV2zC~tM%*t~K(B5*V9$((7y{H^AwGT#05 zDPQ8oSi$FS>yF;GGlAl6V|A9?@j{@`hIt5&mHldnN_b9DO2)fQ%;&$t?`y=yl!L{Y zI(1=AJorSRKqs(1j+(M_TJj@j=cHzIx%BI(*kKgp(#P*&3MLlnv*SAD6Suh$)kCI% z??om=3NNDiPF@aI_!pwsyH69d=etJURDAsJv*@#jbiFxlA`J^DbI*YlXBxO2R2q0V zSIMA0pmaBOUI#v_p(%*mEI;KvVLfwg0~UTiSTrm&UY#qyi&Xf098Pg5npw180lOzZ zwi|iP98Im%O1MjSc)tTt z>jz7|$k*{-NFuM=+d2xUCR6GR=-M638_!3yIXW$^Csu#qJam{Ci+KzR}+2O z6rbOU!yP30v7_^IqG=ERN-|~;mkuKr!bR`oG7g*|g`KgpBjVw6Uw+=gY9NISk6Bjr zyH*@>d2qE^fW7-FF-&^Vfp%m6G5T5TlP|+X72~dXAL35@I_wJV2re43uGO)ESEfh% zKW}SPv|;7#X42_xLjHqb{zKz5x$dUMe=WxUUOBtKE*yijeMyC5|2`Aeup-jkoDoc+ zrYP?}aD1TGe2ZO2973|=%6^$=^@yxD$))!-5Ew18CLC!^sCy{9z4J?YKtID&ha2$r z@fib2;p2x3iw_Kim7vD2j}lx-R5jB?iHElh0LY9Nj=v^52?t6Zxi;f>4V}Mu=Ajtj zPZ#hen#P^nN74Aczn>ehAkjlj%&7!PlMR_!`$48CEoRzh9O(Si&2l9s%EWf!6wg`e zp4G`-zoLq*K2OYH$0NT&q=O9MI9=AaGIxKarEPQXA!@31-pjPPkGp*9Gupt&Xm-RX zd@lH7%dPxka<)G)hmfWfh7q@OYnHN49EVH#J8x?w976SdK8HRiQq6dl%gDAM=9>+x za)hG$^{?C)RN{J6UV~{iwGUBB|iVS2};}=I<~J zPe3GAfkp|>i?qy(VMp4-wAZP*uFmQ+$b~{dsg(R=@pI@AP@SOqQd3jAjNz?YGE%ah z;ba$p4pgRfsl`x19KXQm~|r3{>eU7P|;ak#?wxLvoSHHyWZ>mEnX z3E4FWk=_~aH2kDXW6qB(LC2l~BDUjL%hAJ>iTuQwT>p)dQ=t3c00&`$dIyC-Tw0fg zsR}stRCSpoR{r3pG$9f>w4aSefll>z+J-@vcc71ODH>JQ7bBmyR{i~)Bo)|UbDm?A zWE5K8O4fWyy^*XC61jFjVBmlV)hSe8^vm%7b49v$h_iQF$~P~f9{jr_?2p(9Sr{X& zboS%POh+>{UQIY3Nob#n{)74~>U5irFrmi}EnungI_1l5B%)v2Z-B z`j&2apHZPa6z0PTaay{I)g%2PF*iATXx8T3_zo6-VES?goH#j2iGuMlM~G*54Um=Q={G2PN_kX7t!fDMAJ+7cXnzVkWknn%MzLHd}kh-F9AV}GsCo5Z> z$XPhg59>;wXP=B{nxwkbxlbb8ST}KEZ%xqR8l$G}=$6XS{($u{yjVhek<$iypC1U< zK6!h2eMq%DC^2*%uJs`XyBC+R3-oW8Mwe^as@P^Qw&%xp&F7p>{QH;rFgza_3GMqNf?N`sZ&-T zCUy+ZSDFfk1fPDAG?w!7*>0GbxaR9y6=BlXW3p0}ZrAqF%P4GJmKL!hJGLtiQ);|8 zAYV>ta~jtbc`lcsywvw#TpEm>#5F}{%;v=K(>vk^lN-L8ZDg*;K_`f}80ir))axaW2d5xnFZ;DwSz` z*F|gtQ^#6wbhz@s(rs)v5DLQwrE8v@=2t-P1bUadka;%C%=Fq%tfU0Sqw7*Jr}8-R zcq3n!(QaJh{ zo)4mC`3Mlzex|)8{}HAODENETR}RI8HC4hhR?ODt9&N&EGsT`d=zQOIoYNnGp3pbmT2242M`N#tK6$~?kEhbmUj%ce|jn;TepE`A_@g2Qq2F`-T z=$Xcsn-7@iZCLf)y_=T;^c}#(HGw5@(?aROMXC!+HbwQp4?cqv7^JoQ_>Jig|cbgBGJ0(*~-cP$34Ht*Smu#sBh;6P-ye1I~|8R2G+?9Er}&O<~1A7!XHOu&V{0E zu{ay#+9$A+9!0s|VkMp-0|cZUKKFHX0q`}9A^KwDlXRgPBc$kEs=1XF%W|u?cLws_ zB%v+((CVm{R#6PzuV6`KRbPY&7mXHfER@TiB6C3*d&v5C8vpgJi-hdHIYZ3wzx0Ly zcn&79eP0CZuQ`pE$V<<9wO4sX(|pw*o$|l*a~=UW7$p3^H2mEg$QL*bDoCp^(7F4x z%5W?lgMWhdN%^?SB=`(>aKc7|3mFQwgQ3DLBjbeHnZvs4KD{o@(qz3nC<*h*(&BHd z{+J%yU77W$CRzBdS7!2D=Z$J>OuDm*ZiT0olSDH5w4q~lI@EL|LYvwf%xa(;@&Hl8nH{?zt^4ph6>HC*h&hp$rv3ue@J(8B;7_| zLYmm?ZIa*&Gjbu%_J@vC>X>IHE)}G*mBu_{Qk|}XRYxyntTa~*HaPllH|Mf<%fPGY zqUyOo9hK2l6b$28A>(x#lnj3&8>hBaU%o+gXJ_X?IGU{R?njl}!AWr#*~T3V!796= z;!1e3m%I?aX_H?mVdx%2M;9SoRqB7y(Vdu+3LJ8i{FAHHpdN4~qs%)_2#0ss=d5O| zsUKW!V_;`T%D@^u?L7SecO|PLt^TEe6VyH98=Od-aM@TaS@C8X1}`Tgv)A+_eQ$~+ zZ5wOv>NtQr|HM~G0q=vn8g|QhCUaZS;uH7 zTLvciNX(|Gp^T_|#!4?ivSD1^I&nhRJFt`KwW~Q%O-2^1NEoJF)e!2@E2>CO@gX>nP?u9ob6NqxSLkt^71T>kX3MTmbw#te;S{Idzi1Ci?rC12QZe z)psl36&ZBTl`%{Z)pv}-N%OMYWElDVJ0WL&Sg-7_W45=EYkS8+)O3nwoAkM-VS`!( z&F0ny1OL-GLF84H84{(b!*>1n*s%>f)V_ypuy3u52up^acrYo)%4);@Aa_!pW5mpYyM%iD+vcbgnEORmkM30n1t@j{7IG zuHMAIk^V+=Rf&$$!Gy3)RdQ@MJz@N!eBhn4q1Hvgn(e3WeE5@o*e_+g{t1Id0mF^D zw}C=JzOF^kS&fBK#$AgRe2yNu=A+** z5Eu$xmSSVOFT&?k5hhpP4>pEf=%rnFp8s_y5Kk#A?;Pc?ic)sl2@S3@=8@|i9NgC7 zd@`tG)XU)dv}+cZOIlz+y3s53&`7r;qQJmb_8Sl_bV^h2S0BLf@82^pUP=i(E}X7` z;!n=-^Da5CkV=(f8h)njhbgzc3(3C&tD@gPQ{jEqUj_32^_M%rKMB#yrrJnmq4&s6)m|{?L6ZDa|yV@g5>af!05d~ z&#lz`9Jf7rgjm=6y$+J{&o6*zUQRRi^BbuL;; znwJq6`%XphxjVhLXo|3G3?nUZzZ$?Hli9;Fdy=36y z6dWTsgSqi-a&&B$1p_t&oBFQ99ekJ~Wi}*|*0O-zUf-_>9~=IPtshU_BM&k!=sR%4 zI>TnGSRRWy<6Y5xc)zs~ZHTd5j!)KU8nQ=(JS|u-;Lpfs4zpl)Z8pO*=XxV**Pn4N zapxDG&X`yL+l47u2Lk7q5;^3}Z1-XUYHbGK=F$SbWOjT<=ol@)lQp7?Z1xpeZ)nBZj^C%1ZSRtS~6DIz+h2wx?Wx~ zp*?jhSCBGiACPdO{fu)V6*_-7)KvE^52AZ~SC{4_RnKETvT0lf9c^SYZrVeVHViz} zb-jwwb@qj@E$IcM`*YqTsLPZNN8k;XJj3@hh@Pg0^&+Q8F8!DeANuw;kd+?+l6eae zcURx416zL*>tBR6Gdkdzc%Z@QX;ZtBJD|Wvdh`!l4iMZ$Gb7Hjuu7El?5V#W3WNgI zk`0{+kTWp7tY6<_TDu=)ecQB^^J|Kppph2p8H0`TO8A_bruCMu4K{0RcNep*i|~Jn z@#P`67yuo81+*nA0Ocnhj;Jpk;GT(=d57ihWT~I;3Mi=% zT5sG)fhyiE%HKBsoijpBMc3;dSs`XyX_JN>87kTmlz`y}!}lW}xBRZ>KnN>wpvK)@4^VpnYx-w%W@E`}zGeL=M?R9V~`B z$U7~K=TNZ)D`fPM0_Eb0kmOHG5S%%I@UKUIXARt&?H@8KH$7-0`IDv@FImAq(3W{S z7C0Kr-EhdK=GzLC>4xJ!p(Y!BW!)U1lEXy#f9gS)t$hf&zU)2Ai#va56D$%STsZ0_ zGG)O%redpp=dNe*2dpycF$1eZ(S9FKcJ%X0R%S$^sJ>VeCxhIGBgBpbVAW-1*N*MF zP>bX14@Btt-UK4FH5m1h?{2^~FaaU~zB(Nqv@$}sYB2}V!v@_BPQ>7SjPLr`3PBFD zvT2X}ZHEdzCgtM`dDM-#0N8Nbq?%a z$7|#Li~U2j`7AIBatZ_yrvwsEefJfge-6ZNziv`DFTfk~oYwvhmCZ9Wvlfa!_nTKx z;I{7p?0mtVgbIrPAVA@T<|HZPb#qV?IMw4yxFe@6WMYIjqk+)f1ACuz0neLtCo;LD za=y!iDi(G;cqzVL5PvH(HwVGm$aan<*WGWxUP4t zHuqY(_b(YHOv3n@RlDGP8~|?;QO6{?le`Hx}xFuER`!F`zh6&7p8Kg<+hx zb=7m_jGrzBRxVN1l21O)&FcQ?C;dh&|Gx|b08`d$s5Dt3HBipVB*KI@ranqw&FmaO zHZuz2@XIZUqxHBhYr9d-fQ@HggaWb=GOToF1@y@nHo+E|g?b~SITg(I;g$V;U@0K& zyfuIL@S%a%{!=fhdZ#@7e6m+6%>&5)c#+Zq>rc?CZY;v)I!9VB2CU%DW!i%iSVU`T zd*;IH!~-IyrPbAdixUfa=sEA>=clfLM0Bh+XnQT_NHvE(3t{suZUc5`UcBf!@sV{W zYw~DIBEi%>v=`x;%()#Da>@q#aNyxKt4Cuwooli`hm) zr*0ELLK+1uldLLAy7iWVezemOV$&$-g;>TxkCZm<&E1t}JW5kDP+%%VW<`4`WVjO9 z@GyVLK`sxi`Np94gpxZNUM@E|{O#a+K80(+50rt@6fJgd(jtJ%Z_l|^ZallzPej{!~vJZ>d9$_cd>P=7eY^dW6D#ED(ByY@1Gh!IH zl@A=?Zm<8*!_Ae%VfW?&eCg04;pubh4I0*wy3Us z;dpfyRtAQ_^8Kx0qtR&m4sas!HCAtlXiW>4_MYhbnRCZ0gVt7CJ?rWVc_y2U+4GfX zfj|!7MlDpx=~?-4RG(?B6bBukahf=7svdG18NvXNB4}nhcs-&!BSpA7e;NsRx@CS{ zzsv5&CQQe47@6L+@>o5~;v({}@c8GxzD;lMTj`G9p%nlQ7J@THmnd`Tng2X}b(FNe zJGxB;>_HN4Lpr(b0ExssPhVQnR!X_pjr)WwO|oX_(|epvX`eCT2Om6oiE5ztX-TAQft;*`7WXpEU=(c6&y z(SZ#rz#UYY@#RS4zWr&B{)$V9N`TP2kU=M)r~A7n4`yb-HL)zyS5yogPoq=HmYk`>6%yncyDSG7eiU_QW>DyV~-rH(Pj79VWqI0>E zESG5%J;VogabaM2b04J%&eYh2^;cem*!QNrF1?|KU{=RGOJUbY&8ykmz zKlW3=5pw7Er*vBr&=hq@|eX+WHI$2!W{lovMU8_-Wf2u{2bC3Qb z3HS)fOJy{#AR4n>2iK=N{hPiyouY{2B?4Lqeciu2b|(*cjxsm$Hac+}e}L0wVPqVN z$M}l2e80*a?{g;8JkjLnKtN+8I!aC%l~+SlrOZK#Hat2IE3mGN*!EP)-G@5rEHV}r zKeR%`KL&oC*&W!2Ppe2|Z(|bj*z3oxCYtzO_nU<&IyY%4ss0bU9XEiK4CN%fqaEF< zW?le!riRBDZx%K0@*5MgE!-H1SppN*Czx>qchmohoDGbN6=!O_n1-OX*arykPJ=Y* zy?_iF)2N6Fk6)K9;KEhYV_!Uscn<+LHZ_X<7Vvo5 zY>bQnXM|^?1kI6awJ|X<*AifOcc(5L``mS;B~hHZC)Ch_Lp;8U+XADN!|$Smuxb`P zFhH&uBFWGWH?u5)m-id?OmXi4lfLlro%iT;so-j&_tfBgQtcg`_x|AIpO; zu75|rF1)f|HR;|i?Qa&}VRtHd!FUcB`Ck{$GZnh)6-i8fEArQ)=BeWn@-T`oB++e_ z7=L|R2w1L*u$OtkvtBv&AqdI--qu4zcxZ8m78C!AtNtp4o}{rBn#9y8RCLAa`Pa%b zP~`6$g8cW}s^8bu(G_!DOy zEp_kDB0V&Xj0QxZy7kZ1;gV?$Y?Mp;X?EHmLFqp_W2e}3hfMu1^C^MC!s#ZohQjOo zkhfx%mX`J>QTvm#gc@tQejISX7kxIu%kdLJ4zIQppzX#BT-#6^Cuq|m+VBRbGH>z> zfFG9nJg50{&sfKtYP^IhHUrh$Lps<=^wm~EBg^Gini1xn7_uepP-S>ds)%}`<+F*-+Q*&tI=i16x`vQag?})l{0#P41KIG)2|b3l0g zagc}e#Ctd4GQKyAixTfl3rg@33K=(!1J@IUJ5U}y&h>0+2eOMpsd3$z1_c0WZCL)~ zMRKxhKCd6q|3W$n*9dKL5kya;WtG%}2M^Nv1_pdfmfua+8(sI_G^}EHXL|^Z4%zZ7 z2vHW2kqIh@k;NQ1kpJ(DuGH6umgRD9O=n=JGPo@|aJ#m1D@13`$)YySAOq}* zf>2ZT+{$JBV{#S^_Z6>OuI!7Sr_^t~3|=SKot8HBJ_aLwR>9On?o7OTFgCEHv)Ly2 z@OR-8$U1J8cToLKD~^=8W(j}0;D(S zA4;!ObZt9KY?lNx^%kYf$Dr>-ku>LBJ}7yLfA-tZsfLF3b2*=84p@z@v86hen z@^U<*5R>)&L!Kh8&vlIF>O*6T3~m;%Acx{Yy!yf`GjAT&f^C+TL>pjPnrvsPkw1%#Zs#iw@Pi~X-Q zPIOdM?vu5!Cm+MmBFoi;*V@O?mTLRmCCP}ndRztN#-!p`sFjnDUrX8jO6RW@z#Ckc zX1!W_4`^3+uA%2%u2tAl3mOz2+;l3ck-G|yVjId)fwUiHsaUuoULMno1y?i*t^E;_ zLLgjtROk+i18Z|W-}Gh<^-tZD|A1`;b>)-QA#LO`I0A&Rlkz1;eU$@_5VM`>esA3- ztE!XU(*tBL?x~xVs4~V-%daaD&k`BV3SNW0JyzILOss+L(e}NHEvK@0J&zHth%w8M z6`y|NZFHLv$Y&2+TMiTPsz5&pYz}YxStHl@Y_MQwaPhpK4VD4e_;K9Ve}IqvVUsPY z@1p=r0^f)lj74uz$K6e;3$%c)e)yb^UBd;aoH`BuKa~@wnpME~7cCC~k$=bKP#A;} zUGIxnA`b_Vu$Q?t-;Eid_hj~>^^y!_E|qb8z~*6)RADS+y1bzJ0+iRx;L3l>5mb>Vr>I*}Bwdq2!>u z7sQhd+_&i1Zr8%l9q=Oa-Q3*FQw=J30ohNtc@-P9AyJX%xuFYo;hisYhXO-A_!6Xp z3ma_0Ck;f3JYn6OcP%bt7HTzdqmkzc`qnN##@OQ9r@h`bJ$o^+wG+)qw9SOsR!9DK zltvnjZW%^qrmM;raM7gA)(|f0c{fXqI)5% zLH$F5uu(;ZKCCf>13!M1cB!CgRI&;@=Cn~mmE4L0PFuE4OIgD1C&jFzrWW~x<@rG` zB8C*RzO5il)jhzEsLtOrU7uPjK0Zzt$KPivAv9beIqQY!xYGIwp!%V6eDfz87xqSU_ z;dcF3`rhu)hBrUxXljI-p(QbS1}UcZ^KEU|!Tvy})WQ&~8jjf= zoI~snnGQF?lpG5kD4}g2#+K@H^CFR>3%hFAI$>d^m3=9vrHa+VGnm|+1r?ZToePGI zmlu7P!*5H^0;abtiI4#21wtWEH%?D9So`Taj1spORfLvQ4)9~4glTNXa=RL+tOWwi zh5(o#uKn~1XbNE+o(nSIa&#rQuqFekl?hnV5?fg7`rY(q4$&7qu(>GX7BTF3g|oPy zOVVn6Gg+^dilczwubqJuF`V6Gqd0Yn&EU#Y8C~Abk|h*fU_ev?`9&4AJ79eYHR}Zd z4l>8EWX}3FAMK$5Dz1X=s)B+mEa~GSx@iWwuRWLL!&PTz=7;Q&&?#MxzLB$2!a0*` z*9j5c6eY6NSz&#VAWjcGx5`*(Jqe5MZ@HQ=Pp2#*;#LGby?fddDVG0a;&x=Ktj$0V z4!F8%_zCZZzxkwB9mBda?ID&d>w*k{CMiEC5yyE4s;+Hr>u|@%FkDH@?WzDtSuilT zt@)8GoYu0s6vDxB+ci#6A2s?*L$WjXnBP4^iWPx2 zNkf9ay|vls^C@SfI^T>xmVRBxoJ;JpzqQPt1LB}UB;u0w|mh@b~{{kGzizfn!|mle_QXmm-n#OJ{}6HQg`1OMxsG!0;0BT2=bRR2^6xJ z-m3zMAS^$9KUu0?bLRYz>$GwzR;_v1z0{FLDKL<**kji4=bi>Crm&Tze1dPU7a~zK z43^+JTlNe+W`LuLnpvthihJGZzn44T%|dP9#u38WeyQgBY42#9MQQ;a8fVWy3Gs4^ zF3u8s26fy$^V5<~Tw%7e>lADNbYGOth9mtXPm|MQEI#~r&DG6vhP8rfU8fgC+5pcxLp^5&M zT5QPAD1Y z3`R}eKt2|3;Q>du9GwkIv;!?-)a11Fcr|d=<06+u=2C|Beae=KX9l2kIR!faWkl`= zT`RtFa&^s(zz)6wc2HiE(}ec`o*-s=g4L! zCqznA^ny1QPB%GSCpW(g8ecrDbNWyy_))xZNSGk9q7{agR-R*z=uBDmq$l%Lx%5yq zD7Ae0Tui$9sK$+0XSpK0>UeFabYCv_puEZ|w!{rc=7QuJBL!z{kylGAYr5Pfoh>l- z-deFMG&*`379A!^qbw{e3p|=Pbk~l8;4f68_eIPc9aYb__|{gMn~U2KZ3k3#a%bIF zHMkzdWX>@oB%lB17L7a5tTuBszh-gIn=_Th0LZb_(rJ&>AKfR2?J!L>-itmku+@L` zt^o<&R{50CX<7=bM?QTBD>al?k;t`g#CKGH&r{sqALrg@Iv1jaYJf3@Crh(}m!4Am zIWyGMTzK=G(9fY#gRci8?FNd?cgw*%MK`R1tjMNTM>A!k*R)W)CAV#-|7xDs6~2U8 zd&leD|AcQa;E)UlXh}A-?cbrYg5l5nG$IkNoBo7Stjfd*=d}GH&T1H#+C0CP=Phmv z!gQGJOkM8T^e+DEGYLZLVJNRAn#!5I1azVG%s8TF1?ZVnwK$tHz7w+}^5G6SjzOS6 zp8Z637J9A26p^QSujYVh(5CEJqzc$GFP?v|cfSa`#{!mpS>uM83->OUklh-0E84$Q zB*;zlsCdNv+q?TYt;9c)Cc31hrNMoNJ z;T4*X-J{er!)~4I*?K9!S@I;JX+;Pb;D7E>!-KjIsgg6->GNMSkbU;wd9E`@6GyHzm228nq!xDbMT?s5<~vxQ^S!i{HF-Ff_$3*U=<&J5 z>yQ>qP-Ds{C0L)}xf*OmqoneT4r?yddE*wQ!jR!BSRI{zWL#K&V=pca3`nx1%UPJU z)qN*O?_}&)__wS#|4kCz#em26&I+d|VH*cC7pDB;abFGSoM=rKXYqNQ9tL;Abk954 zHFy^`;*urg6#pj{ZYm_S+YMjY==?)CgP>a0%V{WS^?1`{8d!%;UV*mQLq`9vOH!HD;<`x6@u^&ggU+0&_a|rx6jTu?>51-LAStCQKtSay{8|cPBAk! zn;+Q9bS&bSPvSu~inr8>E+?h?t@!>=2XXSu!Lw@CMbkX=qJFpB!cP`y{YSxd6^2K< zuEj8BE?H8?NhvQ&^=zu5su*lyK#mrgTj|{?`vhHF+;9-l77OSB{9)?x`5YDsyU5ZhSe3|J>zP>yxmmQYIw)xNc;89F%&o%edj58mhkP(=;L5`ZNmHj) zf9H$Zj2;D%fMJ)AYe(%uJSy&@?+rTpTvQpUxl?iJ#hTdn8oz~;Hdzbxp@geicT)XQ zgeMxkG>j7J%x*7G^&3vj9qdj_3NTk5swe^!G#ihY~c!D2DDT)B|Y@o48^Phr0|0%7Wxd z6c>7!5Z?XmIp0%uVYy-nw0XhmF!>Y31K+;kD$G)fr!RF6YpMURI4KdWe`h$ywzS3l z@7TQ=n7E4hZ<6&_<0wk%bfakhkC2u9Wrx?cvUaymrxMOQu=GVP7AP>z|D z`i`H|F4sb#rUhrO(6idb7T{&7&z%(mo---6$(UGrr?E_~Ar(}w_s_xj5V!Jvi=GIu z!Fv89U}c{KHT4!K-fiGrW>M?e$K3E+zAjtZbE$op6LuloR6Ed;A`!x~}Ve`~1HD zTz|Pb=e(ZJ*JIot_xt^UHRMN4TNM%c0$>rNuQq^{OKpXPtQ?s;ExBt$5TkB?3aaYK zv~klCAb835&kq0T*lKl+=?E*w6I3+TR$k=P4E-n!qu$2fiSPnYejw=K1TRG7wh|^k z3`yySL3#f;DL!ilgH9m$-LMy{w{lb zaVU1#MWJ>C%A>MmnoG798iCXQw|x&vLP6PjJ*HXg-?EkO%2O5%x5ztedG<-C(5Nz! zCU5!@P>zq2@ljiy2WG(*`c91CWY-xA|IvPCpeoDFsQS_S0>%h_2pVo+XjCvu`~a1>JqGyXCKqnlLe5 z4cR1eWJa|eV&BpV}gLmF2`&N^&5vDclc1bz$E%bs;wYTm!>8$Q1^_WoGrn3 z^JR8+_Kol>M?LH!ebm5bELY2`Q>oc(5+ovNu$oHDxPFpRAx7d&z}ZzP4UNi+V%&9} zatwp6Zf>=fyxJnNl(Jn`$7Zw zX9JOkex^!>U}YrfwcVzHnZjx>=1NW;L{8%MwiCsVsRau*lUJR5gmv{O|Gto_tN%Te z^6!-haz6_b)RvW!CwJy>U$v!?-8%WY()rJyUtuoDSHr7tObewgb)-TSKLh5}Bk6{` zGHIWG{tqfFqyRIeBvho+zr`))fn20Ous|ukE+0kD6&1q?w0%%9zMu~}t=2z)u{Al0 zfxD;04%y3cFy;Ku9Raszt3Wo*P2@K^t!h`AG(-2`Ti)w86%`Vh*cxzoG!}O`b;;w! zwo8Y85w4yv@Ig5wkHHH>l#;*t zsL93@(NIYrvx$JaEI8Pt#@{aSgL50Mpk_Ph>FoBdBNxa|kOY3_Kn@aTBQ zCbgG28)+DKCMhBQn*IgQ3~tk*ygdru=Xef@udUqwV4qB7YqFvtYvB) zd;D%ZjM_i(wWq(6`7sl9w94&)Wj&~(A5LVNjvNL~)49yOoYHE@*S@HSAe6!aIN(RK z3R~cup;T=n9*B1_ST8cFc6Tbixt$T_v!VNL>VAWtq2*Gml#q?sovAm8p&wdc^u9AoS<{~+xVbCvyH6i{HGID-6|bBIO72f9 z{k}FG8>tLBFqH-h*JWQdh)}=i!d7u;xKeKRlv75~C-;@<7rvi-is;ulot^X0l??HLn`84cF ziRu}yJl(5(u&6L;w&sEiMJZ1Z=JFe5z6!x5JML|!)2FL&MMcCI_q^f<)DyG#A%_aB zqqIMgy9pJd%}geEG1jh*BYrZh$avu8){XJYq!}_(|QTZ8mbHTZh zp{S$`RdhIwUpbAj9y*WpY^Hh>dEQyn7-?Uxl8(pN3+kIQA5Y&d*15K2XVxKFvlg9@ zcEy7(W{oDMZZ-O_iNYOWA=bi7A^@4wrtlV7q!qCRW~|=m@P&OAy`T@5x~bXG-jM;z z3AI{VA_W;pK3=RhNfHY>|LLyngf>H+1A}cV;{d}m6?J`#-;hefx~i?bAr)7Lf$X$h z+riv6~1;_EdC!Jp`ZvWy8Gv-6dvRD={7L*BO zDDy*+#eqsgE!G2(r7E{kE~8S#^haB~cW0g>XzuE=vQs}wrYDZ*D>}VM7|C`RN z*noIY@$t?Xy8rSUP^MNo9Gf|XRGvQ2TIt7Q+=z|)KG_phJfc`6}uO)n*-%WOrLWqTie|s zsl{96=#XE{%?XPd&r;TQzZ>#*0kB{IRlV-iXykkqW*My>JP{xwB!;B_qZD*8|qQiZ`chdQ7PTX39JbUMPY3q*GSrU{zC!DJ-@96&0fq(jkwLP?MDTEpNP0rm#TXqbI#AG zJa&_nvwrzf=XR%rTO^0*`q%FUV>MfEjBbTApWI2?{&f1i+zn~f)t~=#%sRlW0DcDH zF?y&cw`x>BGLsV`^{QHyCJ;^~>z0ga1*h%w1Zm#9Kk4F=t6gPQw-c!$z)|`~q6)>& z6LAtpg~>L8{GW;DM-=p8z7MO`wR>TK4-8n;NHo+-7ZsD&FXkys9=Glz5u11R+s>vm z{BFI+$sd!5IA|E|+?CY8lvt>ehQa*E14lm?gqU*s*4+XB1TTvO@7u7ijtSTiU1u`+ z=9)tNr;Ys{U{kZAn#yj&o`O1CC}&{%gc)sA|MR)p(Jj~OFj&XdsG={MMfiuVt=>N= zDc%UoeJg5m*#i6tg&uK~^X0N<*lkB(n&u3;@7E04_#YB~pW|k_m2xS5sb+1ACA_Rk zNsl2{OpQz;|(C^5?YAfY-aBmJ6OuIdKv2JD0!X7Jp?>IRo1W>XythEgX zuIFCd$n&+l(h=pKG8(sN(~iHNr|c-`9(zCY{iSfu{uO3(!PU;uEylbK?(hTJU!>CC z=N%qUZ~NiA77?G~GI#WctyTu3L8U>ykT;N|=>T%pOUQ5$$XP8q{DmX0%%~f3&VVH!#W8}Ix%t`@?WMTVeT@Sej#U3Tp<;s6|telo8m1$ypq$RK_gxKDj#a0QaABenL_wL??L2Z}~d^tmMs8!^4WC zv7Y{Z;py9*9ou7 zGiul&tkk3|dTBVq_-?JB%pr}T={X2ogQ_U|9P@Tl%XCK`4^L9OpFd-vtFh7*dwugb zdikowZkj(E*urlDiDa?DJEX6*7&Koj9lm5jtcFgL%x(wIXEL^5&JQmrTT_k8IGhi4 zMnUjRx-EV-ROA8^z8d{+Q-Cc^9^}vU`Qp{4%1wk>2UX2l^?9b~39mxBn3c96%od{szp6Hx zL=$bItIog4%cAdgyeMKL@?!Osme6M|8)fjhF3rw@MUC}Ou&X+vlYfRAtAmzTPAFt> zGe%G2ybFYznG##?*r#w3yt|8_htmh2vk!L^rcjHmP}E@DQURNj7GgDz@OqA2*1f;A zA6{(Kk|YF{T3k9I++{AL%Jg26&e@`t$mzLSC{C(xkGuOBDokF**gE7?;N5K*9(?=O zQNTZCa13bJcJwg<6n9mCr7MM;Qlk<+Zc%rZBG}s_;o||By_CmQIZhqGsHYWn zQQ()X0HFRDuftLAo2V&}N{+d<-#}HhpIo|%I=wt9dxHG!{uQjeCDmm}0PY~8Qa=rJ zn9^w`Fu$S#VV4=vMBA`dWsoaZi#2==r}MCi%ZDhdgeGdqUld}s$1$hkk`1g4cW4}| zXUio+lA?3Mx_CBnsrS5zwGvU$Q(cBQb5m2fv|L#T&V`WX^`<5$i`~ks&!Sk%@y4<} zZd0jREd)_rrWYBP(eEKmn{odftPm&DyY{gtaZ)jxKsD8BdvND7U?8rHu4p@9*` zqyLT+-j4b;p>YgNf=qdZqrJjHlV*JqLwv_A9eV_-m z_8{pq)>@OE^( zpap|4YHbGwDPX1wjF5+{57Briw(K zsCU6&6d_gX>W0v`7YILwOM(~TLC6j3;ET2;mVI~hjmFS->IXeltp-koW?Hc#E90@v zn^ESGf)=oRujE$d>Gv1{xSRd;Ac4P22?Kur5G6SJMRfR8l)eBmr ztr?HW-gP03V(LiahEDqfC;!oPPo4)|uWSKTY;1q0NA|S0rO(dhiu&jqrwQW@sc9=d z)aDwNfBx=ru_hX>wzHL$l{v_6Ya>}qWg2--9EKlSrNZJx6zKlpJTrM^BnSC-o-z(6 z-n{ZJ!R-Q(ByJ(T^ff*KCq~;7f*@fxM8 zA)ho(Fsq_7R4DRekFcOJ(^~ew@7RCZIU{V{f6hU_{ z$Rdp-=}ye05=Pd(QoJazHVW}(!(uVDPV{q)*Af+Bi0r+72KCv0ev=@uZPIvACd!wC zz`G++>Di6X{XQmcrLcwG+h?NC%J`*L?4Q_Qs#(!Z>)?r&fEV4m{1rl@%Q-+NAsf8hgoKrM+quVb|;n zjOi+-htG#4Q}f@*)yCA_9emwSyYhaclBA^h`UvJF_D9)B?kM+a);7OvyS~Q!x*;q& z$*S|WNtFS)+i!kH>vcf9etpRW55_}!?4^JJf?nw@Fm*ZxcgK~<*u;- zDcYEyQMQRE!kZi>h;fR>G1xzm~LbBCh^&XE%Q{6b<{jQ{z8Ah zWwFbQTrsfS8^xSrPiZ9?5=jBex`q|qADe|;jf4Tq77tQd7^$T|PNWPrmAd7~-uuL* zIMrp0Z?BNWB?hxmwgdc*eEvo=79|EJvkn5-cF)-dnjM3&GN^J3%T8{($W!}%5?@oX z@YkS`mmcV2YJTwPFIHySOescKc3JI>-Tyw8u>pnWz&~1^cht{ zkL5+_jqtlcWHkcKl%c0X|^r0Wr%nv>5+0y1NySL_l$YN9;owvq}?qfqScSvpS zedbGBuk^NmsSHBm&>Zd22e9&V1obX+??Qf{%OF#X7eEGSj@M6fn zeJ@FWSa&OGw|>ZEct+JsXV{DA7SYqPya#&>RK})nHa~fso?n`~I8s~K#$AT%RfRaq0iZDBEbCt~n>?bunA z0Jd6Ba49kP%x9bG4GWHk>r3H*JUkmPsMZDTws9%ck_M9uA*=Z!T(I++^?SbxctEO%8tKNr=N9>EuMlj0rk;NPTbqlw$F}AxhaaEYqf8KRDaXi`(+0 zb`II$ht7^c`8iTmRkeFUz2etRKP75%gZpRfG}~%aN`Q>I2|p;^uJAhgtg;_TW7*zJ?|sdtQ?#R@biSTgW`CncoQ)eljA52CKg- z^ZyFqp6HW)4=+(M5>IOFMn-VN%7okx$yje5;#>MlrV%aLrhKS+00u-m%u8axGG7LO z>$J&QSqmn6OBm+&0#$^?9$|3*pMa)MBJvcd@1yyz)UzgA!IDb%1zqcxgo6{paSgfn zA$8G9sNf*E-}*XmVgToNM=AU0_UG_;7+{G-sr2iN0DTEUof?{$r|s`gP0sx~X5%Uu z-90%UQe*+saNcxjnA(dcemG4&%?9wdNBRC1Yaf!E1cm_If7_Zh*>^Jv(l0Duf?=XS z(Ju;x$jxCun?+EYr;)SEd!Hp~FNo*m5i?x!Ezh&v(YSHrNZ83MFQ;{d*m$|~8Q-8X zbIyDX9)Cc^9o|NTE#l>V^E5Dw>M%DqXWCD-rsVc%u zuWPrS)>Qgb`dre~kG`d4tr4BIbe}Hb>awfe4pBUJOmi$^Vx1nJ zt92^WP!UOXS&o8YAKMx7PtZ?E72m)ut4vKi&aILj;{gIiv1XW%KGFD1bEglz0rBH~ zEByWjRjj8LQ;Vp~&XjsLAJjiuw7<&lhr&%~fwi8_hxK%G$8X%s33JuG<@7V2@7pUe zHuC#{)YN2`pY9{eJYj=KccuIHLx*Am1s~{XnP66pxmK75+{S=0I<2oRwSZnAJ4BVI zf0HkT+Dea1IoHo{pf<~BhoRme1-A7%C^iZ*T&4PPB4FBU6p5Ry^wg8r_Pa;$ng|Ub zA38!q5gh2CooeJ9)E>@K3BGF8mLJcZ!cb5INsvtbRnWeEufu@_kKj}dkxM~dXs)3_ z6f(EWz6IR&mx@e25cW|$s+{o4+Y+fB}Z$I z)Djwe#mfk{;J2*j&#)N4v@oC1dka-dE`0zB^aK>ZrI9eTF7{)}gUATi0q@q(d1# z8P=6UoqFyhY$+JX>6x0YhwZMj6?X?0xzO7;;{`W7xc64S%_P63{O52a$xwOr)m*d> z|2rK;%0BMAgMq4;8N1WW(Oa}JRRCV4&6W>$4ZgZ{4-oCgNzy*$y~D!>zA_gtjyF2} zx^wXqj3GI|WQBQD#9_3f<>Gc~_mTz9uK7U9?VIS*6UYi~gBAkyf;`Hb1F>zuMYn|S z?KNB4@a>3(Z@jj;N^b)HSrn}HTAK8nXpUR}5883kCl(r2i;S8@OW#J9c7Ej)Azi1V zWDo>TBLiZWU!FNA*0i?cV(|XTLgwjxq{H+v14A3hqsNb%>_coN?mFzHW1~7PN}@~k z&W_`#f2xs9bsN6Cps!)70obA5mv@2?;`qRl&Y?D)} z3k)W2zic~H%tLz7;NLdoroiTSbLWJq{(1LE5iN^UbF10TdbFw0^mzD<1q=YDYe8a~ zx87e;rPZn6rUp6gzOOv}+Y`U2;D>z9+YL8?ui0?~Xwv0nco}lUaDtR)0rhML6OvuZVcV>Og$Ov1%i(AQ_&H}qchJvz;oR371c`KlOOW#!rBj&AfE61mq z)rbBGJ=A1cR~t^gkH7W?)%ryBqK-QAl6%SBh(R5$rpvZ=IP)H1DqQav4+kUOh_}2P z|GGf}oR_~nKBqF5UQnF-(=y`QnBcb0%TMKXHw0HxTX{8851TZ-{CkK&7cy7Z6g?(Rhlvk-2_N2Of>`R(yBqK>Z0Rg?-?8IAZV(aI$=zBuJ;Wd8ulGELr zw$kU#oF~#lLu??n1#syd;;Q)8;hj#<*{)`6IYwpWsquw}r*x1O2_~rB+G1<5mt$V{ zf;A~IMxW;I)jdOw370GTehK0R&dWyF;Z4|4q&cpvdcT}5SJ@!|6_oss?U%dhed55t zHmUK;S6ZDB(aIZoA0L0LXt8<)GRUBon~_jhW_HQbT5T`UqPVuD=8(V*aamxBE&`sv zQRzZxuIavWaRc02CSfDZ;?iVic*a@{;fH~^kmpD&iuq+4f=PwKZ5R+?B5i(cX7jdl-30L`k69H`d?R4*#-)Sxu=U~u;b-xkE$8|^!Jcli z#`(T``Rv*w4272Sgzrz5(2Y9n;X7@F4PjYAxACY8W4Vz`x@TR#lf8+I$xTn0$DY#f zc5r1sx~DUD#G*Fb7E%db0rq&-x*D!z1j|z1n#EBe%oE#I75*hjZNk9a&=+4y0*4fB6qo*i^To-fp)#)j1A_Lk!#em!Lb&) z{k;5g=DAAnH1j7vY9|3yRar2ug-Vo4_IcT^4Q}F^QX=t$4T1p9!P* z&!Or>2d+O8er}*gZ$PW@xwn@VV;ebB6`%LwIwc@O28ZeR>nRZ3xt9?{=wfU6yBgXl z)U8p-k%X>D7PGgG`q&iemMG+K!lo;^5ane^%*m8r61oXvk{2#GT6Rk3T{@xR_MAMc z{@*D7(VhI0Y$0;N2jns?usb6Kpo+-QKnV#gw-XAWDpM`n&OtZEN_R^Z&7L=4qW}Gd z1qniG;B%lL{rrYyl0aV5cDDL4dsvS5=DNqwH6GmpPvi5k`Wl>)bx%(WA4E&_F4Zha z^5K&rIMR@**r+wXy_DF6){`#Y&&EzoEZ3rKcj~@xT(;h5p>gSWH)oc`-ErsVz$gbr zunThGg?4mg)I?1cY~EU1G=rB%b4iuQssAMUIKWY1Fasf$QyES8N5$K1j-N9fLA z&N0~$H+os=D3WbN}XC*$kh<@n7{7Drefe4DlqvIXGb%Aa`pG6R9~?^vo4 z5S4fh1>`x-o&QRda`qb!bG)D9y@$)GUMW5V^J2}czFA=rRt@Fa4mYE&(sL<)4xyBb zR2ED%h7LnQD?JAn9b6MwuSr0iTb|mM-~_(*RvJt#51pIHTAcU|fLb$@;8b{piHqV{ zMH@;HoxNEXpjOM4K!0(`;b(2$ijHzEtZy|*=w>wAB}W`OHx!^?yVK*{lCWBa%sKx^ zQ@OU+ZG_l=8^(sx`qY=v0{K~fl}C|jb6dNXGgIt#|NVp{Hdq?;kb1#(sz*UvT4<@~ z=<`ufUUYvhwWigphX@?*gZS)p_;!8b0lac<=Evl~@)e^Zo|2NZn%HV0?;9)@5= z?M7=h!03;U(Rytya9x0O%0G4C59aVmiErS$KA|LQKFRN~webBjDla`W>5*WF+$?$U z8LyJ=~=U%rlggLT#>KIETX>yp9WIAAB% zr(J!}QteAMd$~q=HOBp)X77GO2Q*1v?_oV} z4N)O=x_{NU4*vwAf;gyqe43pM>GhX(t+g707?K}gt!`R%o+_LWI|gQ;)2$I87YqvN zM=!tS-Vt5!n1%P3+wNogsa6)RRHP{vm=$UXJe^EpjVQ0S6@&V&5c32kLK>$7VLXvPi*hhP?nCND10si^P4&{1Z&}?BlxdvMY2y%aYhPOt_nob3 zL))Fz&}JC3T&4Gq(CVtmqy#S;tQz1-j2x%0bp2O1;Yc|JC&Vz`dXuEK4a6qs+s2;4 zS*jzmBY9t)N4?LqwY8%_oKNYL(QNmu`Fbg%JL3U%zs`_=o^sl3)tqqIXO(g#%e+-7 zb+++0!BVI;l2O~V*Vmv!-jK1!%y4`%*qrsRcAlPZ-UzTx$RIvGk87J3L~zb+xG}Z- zm^hWCt6lQ zi$Q~&@>9Rxvfq6`DRYnnx?kN2M<_Q66qaCm@GTNuY7*IbHH9ndSXzfdq<2fq>Yvx) zqc61Rqre<%ONiGraWh(D?_^ctJ-qMt%{lpi1KCrlM1#spSPK!f7$y( zgzq(5BjMO$>XcKY7C)h>XsRdl=QQZinP8dtmW*+}r4#|}%8rt$R?g_ezNsg8RUAEb zZ0-w4_5)t0mAO~Is(?KF!i$l0a{IcC$;u@{cRfAAIPPw%{@V=C@z8;}l5QEs<`SsK zXC}mUrBGFFuj+c8QiZm*wgNP+vRXq0BFBil2?MzrahJ(oXtbnw)Dn~JtQw*rnt*7y zi}I#HiqjHem2*|G>t~U6uki`d3}7A>?qfeA)|Ce+;KLz`dvCbOB@*OvC7K3$_bI=e zj!IiBKgJt|+D)(G2*-t5sUyA~2ss)Gz2)LH@q9OZtIo_BWhzRQv8D|VJV#5h*8)_4 zUB=~i2lx6Vkk)|0>6cjW!Inc6+)h^7-%KI!JF(68qsi;>nEJvVEHwT9_qZ+`iT?Jh zkFrIe7sG16rsZ}uJTFqvm)3LmJGpNAjkM(N^)|RQyXsJeKkc-U8f@Q|rgpjzD$iB+ z#cf0|_%VOW*>AsJvt-4FlS}-FHO8!Zb*#yh`Ue-SAV~8)@`9MJDzB#?n-`vV%g7{Ke3mzUQEU&bJiPVOg#FI{?3K4`&M=01xN_F274 zYB2JzpT7rxo|m2dFe4u_9#4x?SoF7Vw}dZV)b#CQByPA_PaKXiWKjFDw6Rz`4rozxzb^*5F=9%AT@A5K)(JHM6KEy?6i$>(A*dN-iTOfBxh zchgE&)5;gOQaJ_0ybHDM9haFZ1Xxwlc@hus;?I;Ov?J8KtPGtWwTvH%HYt!j*|JcS zeI@-LE&$x`Fdz5(?MP?Jch2IMWjeYm&wiWiOqqa&$~o!su&DRM(2>9G$F4s>R~K31WWR*0r?5EFIc-s(>bjPsx{QsSs{b^z;*5x6h3~mq)r=1D zLP!9ef}q7MCCBDLY5n`n(X*J=mQn%qiC2zC5y79>v&;P7#QV{Y-ItR@QiCCWXTmy$ zY9FdCj>eH!OW8@$mL8+GRf`F4#S9l5LhJ^_PyE8;hoq4UClNpMZ-13AP6Zv@-lb85 zwT2s*sQR})K4)v|rabfq^8%-7xTOaW{;AlnYPc1-=SV1#G=e{w{8u7LlDc@-0gSp% zLd>Zj^a?$7_@R{Z&X>7XsBG;PE$l1X18`+q%9P`w6m7qAcS8sDO>lr)C0R>Y&wZ)% zaLRq}^qPJ50K)!>y?_eY083rqafI~tSAueGj~Vv!dx_3Z#VqK%*TgY2_}ls)4ZV#{ zi0((2uyTbvw6`cmCk{o3r%%f^t7Wa`n)OB+Hq(-gD4sbO=*u>PB(_J7&pdwP*RgRK z-_uiGu%W)fd@!&x%Xu~>)M~j>(?%%KiXhFZPQ;a^?EBiSv<}r=dBwQa0>GSX=)12U&B>#eeGorYgT&QrrC;XBE&5vT>fhK|#sn$5Ph*snB-uVn0K$+e zxYUoB*F=28P3T`qFF237hh>wE(|lQ9FMIbxrYk*}kupR<8N?e-=DIt1bDu=f4DXqXz&=$Cx-UU0o1j%CDJ)oc};OifLRLo4U5a=!Vr8y{buI}>3LX!*xg9}+J< z_!G!Gcp;G6Qc>Lsh@T&q!L1ZVdY^;IETwV)DOvtO`DX#JjXD_EP7}2UE9pBrMaQH( zcDFYeX<8(8wT$i1yW@fnvPB>ts_X!1f~- z?q5#GyS?Fwu6c`T&*(Q%HkbPDB8O(ae&sSP87ZQ&kQ$KD)awtg((%tRJOo}oq9LY^ zXd=t(|KVgTM}rF%tCvWBKT=TpW`R>OaVsOg$s4SFP~%GdL#T0Jw^&XcIF(Lt>OZhC zu1od(u$|}IZ}amPEHjOhCHxe>xomVOTd4TmyzXbn{C+eiPGZ>2h~A<7Jfz)lT24N9 zucOG?)5sBej|%-c9JepM@$z!q z*S+(JTLwC}iw1Z=W2|!he}FhUbtotiw@#+(b4u>Xwzi@huZD7_d4-ld@dct_yE1K2 zoJ617i0#m>D%(E5HefLg9gi;W&)He&2uX=3ms$Jj*;UgK#TQq!C;@EOQCM~=o)8;o zax&DSZ+aj)DJFhL#n;6U7r#G3q?nW>KBQFi5sUk$I)X4zU) z9vs4gAL8}N30m_jVDxW|aO@=?mo{bs#3`k0RRM%|URxTrN24PJ#||O*d1R{SCckDw zA*a#${xNpf1s#VI3|>LImJ_!K_|L}45M3@@Apy#;l)I)GvvnGM_sv+1f396YCPm`nA3-d#|WJYA*DrIAZ=X1h8AbLX)@Cu!T-c z4-eq4&9FrEx-f1Y>aGX30m1s0pYp2-as8v6|C>_^F_( zv}|`AL$3D={2~(TEl>MBe)jjdJb)IW6kN3u8s`m4@g=9-uEIJLnz-G6yDeCflLLOd z^0w0Tvt$KtZvn7~_&VGA66-07Tu|8fPH&47g5%TS4Bt&U{Bkd^3`{K8vO?jVV@3xa z=uf)dj6jTa@YsXsXbbe;1+z~t40Ff*oj}oL7Y$(QQAggxZ4Y6uF4b`yFCe|GPp?pL zX7RfjRisB`Gt*Sw*Enw);T2xCN+R}0U(S-IJaY7?bUVg}3t7v}EdNaN8cb=`F4e=9 z*$}KO)58W6s?04rt>DpU8(jUT^gavx%!MQBs7%4zmZ&i7&qrX@TlB&sHB>4LRk!P; zj598IS_ee+U-13riR^>$Xsk5IvS!};@-4?}eM6ykOXhu2LRw=qZLqSI<6Mr)}e1FYy{YQ_vC4|xfqGs-0_|Ii`dV~p9w<^U>MKWu1E>o!#c4e z0jWcJf71Ie8>v7GUKiMvIlj1h1-H`Eo+ywZYT3oqMXfn1p|8E8hwyZACJX%;ja`4e z{6Zp1%dp2TVnY~FbKZ{yslF;jtSR>u!uG;B!_qRr$&mx{D;2S6@tQsb`_(3{(pgOc3ukfSU5bnxWDbP|+zsc_l4B<#EsDZBZ`m-Zu8*Yn+3*s3Q zBB3&^1n0=iQ?Z{mMJNz=r`|G@wRQJyKD zsqRclF@7~prrTT09U3@DqcwOeRr!SpE zZE%(p!Wa78{sl$K_w$EQ-os*c_WJ{++X?z_X0~=?B7H`U=pjR`Y!PyEHmX0cVP<9? zw?I|28a=Vji!jx=&Bqwd(T&GMb37_)iYkRh-!u%;#?215OGxHOtiRBMB>M%|TA7Ep z)@kUY0Iz9T%dL>L?3xUbbz%zOO6e?2M+Z!y$R!>F-I2(a>G1Mi?Dc+T@evyBSc)Ui zWJy6m35%K-P;*LX-qJ~%BdWt#Y>~X3xj@uJ7O6c8dwKNigFo*tSg^skz$i|0?Hn`7 zYfgm3BJRWXI=_GYe{T!aE(5kWhEnrKv|@G<-y+zjbjBI>H*9@^0q{yXVaLYG>O=U% z69)+yp8m;t{E#1DCV6Ui&Iv*UdnFvCJUDuI@KN2UlQQkRUTFlKID$OnAOIEg7={B=ys_vjulWQs`~n zwNq(2)&Vr~6hiq^A-HwkRH3<6C?oc+fN8yCTc7YrB9&m$O{WZB{^y-`^6mSFPxE)xMgMydA*^O_G^7W zR$mW(=s9D@^Zjxaawo=*ZHpo`HFGcHB78&rAf;$f%(TT1zF6C`8kf&RfdQhhjz``hRJ}YrpFHF6`w#IeKl^bubJ~z!G~3a| zBcHJvT;sl5eq^)hIP+e?Md?~k<^VoKrjt?NC>8p90`UIZ8Z#otfF%G9kOfN zNffn6SX_fGS@&TB-s1Wh+{#fLLx|^D$oSPH{>MREyQU-SA$PknmZXTK?vbk7^kn8_ zV1F~*kt{spiQ2q*yZF-@%mE+Xm^LO$MfPE~BDqi9*ei^aXobRn2gyz8)m<1r3Oz)6 zrBzSnUf)n%$}kQ(=GD!WnShkS@30_o(Jx@RdV$&FOU&%l)Gfi48Jq8JMlu<)KEUg) zQyHMRo=h1ub=EZE+piA8XOEitVn+%O1Tw~JidGi3hnq-P7yuJ~AK2=gL5LkhxaSJK z`T>NG%EGOZ)59u4Y#(Dt6Ze>2Zuv5beYK zzm#Z;8bBW?XWk%?vdMEq zv94QCZ`ND2i-w5t!N(cFH#K4?JZ0jr4LiZqeXY#;StuHQr1DiV07!Z*ABG40l$JU``>nON+1CoYNrEoElIE*3z{4`Hzf`qhi}(Oce?Hh@@ndPtcT zp2Eu{_=!d1(>{iF4v(+M%Ap}55!&oO*i-^9+RJ6KL%jTKp|LJ|2`l^f1_|Of^Rb2; z2KnIuZJVzoa~#y-Io1iL7Ek2(6NeSJgafhr(WL^2JNuq~a+s%-F2mRH!er0-9WV_4 zBr1tu$St{aVp+KCY|CtL@tA$97)%RWCzoFo{VB_#ru&#cK25Dt)QeG{KIFr5?-Ym% zt}wOearkK~?+_MX7x3FuaTmPa{0v873t=lG4=K{H@4!u@~ zTZuwh78aWC`%Zy!#!suWXWF#~Hd(V>P=XRbP2&9+W%FHt;m_Wf!pD=tR=i?Ue1Sd{ zV3M91)9)^4HKnO+g`gWx)P&W5 z8*7@itob(n%%k=nGP!XQMQvN=2P|=`etVnWH!d83Wf{lu)Nff2>-U)GU#Tv%yB*=h zj@XtuD#x|LKj2nxP{q<1JdL403$tQfmu>l|vcof{UOS#fObR<~Z&CM9_gq1rV86Y&)@NIWueToeysiA_ z^}#%WS1%x?gS#4rmGqKZ2d|FEzTi+>E62S(T9;ul`>W^e8m>q`m6d*D@|{L!!aikzpRR6{Xl_`YIjPt zW#oIVJ741hNP)L5>d|Pm@y9@Jz!eUC0r>%!u-$uWX6z(n_{F zO^cNv_@BK5wijAQFOMC?%v8OuC_DcwccJa%#D0Y3&M237ux6M(EOj&&TsdTOa%Um< z>%=x>owQm=LVUudiRVc*EbTtCBYL0A1Xp@unHFEa3!V>$_kU4omAG!-{KWi#(~vcG zeUmbH#}1NFo`I0B$2Oxp*_SXNP7q7+{v3XnFY2_XWTjC2X)LyUQRB7})d~LfCrsGK zOR~cbpe7N43^|K_Eu2vkoDk!9#M9wqEFcl zm&=MHRN41o6aOE{hB`BAtnOn*7E@oWOv^2kVL$SICiJH{-MG{>TfZxt zZv-C*l`nKge0Q(JZ_cJQDBu1)Bj_LxT2}b_;y9R}kYop4--{np6Qt3uIO0}-db-&y zVH8V4iT&5!po^XqUHw$_&IBvr$#p61e$>6G~X}70{P0?^^?YbU6vl%2!GzO;4^5n zsCa;K?iHhf+UAo>e*7y>(hX1&Z`XEkuU~?12yCRqAiiD~Y@NknW->}=e9%x`!M*G_ z3$c$cgxAL>%l9i4naRX~3#}8)PiPTe^M9D7hIYG+sCT{CyI2mnaOA2fO{UF*(&9(C zZo_lW&mkdne&mAE-7TDSfpSO9=g1OWhIUP8EvQfuu4FRA0ZhrYo8{zi`2$!d ziA~QLQKRbU07T$~P2dXQvdE@@Fa}lgYTow{OjeQrpvFe8EH4-MyrnXpKZ%;OotICB z{QC$6XwOo-CI?N=A&&hIvHn3=25VeV%Jn^aB5ZUvhHYkK4R0r2eMTVC@!qNxOOMwj zQ%HTSkAJmrm1b5VFY@S_aTRXEXnT=lH-w`AVt#E|SUFc1yB>g;2j`!y-hStqQ&N0+ zij5Us>1z|-cdr>hY$x^ECcxU03dVMGUVR!j)Z%7THy|;k3i1a<4(9(VWOvfWjbZH1 zu-AL&W%jW(($*Af?1#*M+#;f3e@81m_3J?aaEkYU7|Uq zO0UbIAXs6I>kV#j_iM+Fk)Vwr>vMo8oJ06BBIpwi?j~za=NHZ_DiC`3{tRYjQ_I|M zRgsUE9z1go`k#+(qr2bsaH)Ke2swLaa+Q)y<1Zq`n7JUvBWZpC()IL6MH*`Hf|F2E;FspvW!kPe^Ry z`JSDO0mliv-<5NvvDetg)zGC{Z0zN+u*4;1LX2p?Y+>BlrF4bu<34ibL4y8uzuVu4 z)pOJ5(aQ`iPF)0Y8stjTiag>W4rU- zI)t0_9N^3vB4C;$1sodXZJEI_Xbes}U9-nrx~#tWC;X9sR6C`o$23-+V`gTDE`H!v z0|B78G8g|d;VQbA~+Vgkow(ApK?@*$P}so zXEb&GmGci}*yc-)0J*702f=-i!R(0TsE^lB#Xk*|m_gj#KL^V85u0-wA!3coPoT?4 zK-_s$c*ZnB{{c3eUb(+MX3PWO7>D1SE~GFHPIZDy#}thvkTq;`cWtL))qtOIPXRw6 z#;dj>WDq+WjwaiO|PDQe%>ZB6&-hb=SJ;Ka%>xwPSjbaFs(hvm*NQBf}(>|Q#S zSCLW5KsIs>984+_8vA_IP`mwEAvE!Yc53fZUAaIIOxntngt)O%QgEYlo`fJ)-k>E* zBmEC%SZuy;)F5;_#3nFsy!PB=8Rg0H?0z>DaLLr=lTmM`O;(?z z(ZGleTjPsEkD^Gw8gAw%fYS{(o~Gs;1`iAv*az4&S|fEt|L=LYI_+MiBm@+c`5OQX zn8ulBTo5;YSG9Fk0_Rp7F#)oqTTVg-#{o0>|~{+I)bOY6}t4ev&8P%HC=oKYXXlVYI0Ilo)T?w%zUhp`e##dLu-Bx zuXnOCsDBWxZnBpYGw?FfIo*9QnNAV9=?b9uA5O(*V1=U6;J8q{IQAjX-!elvOj2+>k|4-_^h)-!;Xun&d z&~uzzueZErtq;WZ=h()7t_=h-In#4^V%yNM!Qb?haqAB*+M~%VT;ub)V%XZ02d*fA z21}agGN>ZFX4fFHrturHjulT;-0rGO6 zSyrm2y0TRJD?3D$L|ruai}Si0H;)Wwtu9xNc|Dyzr|C6h+Unk6d*1k}AstM<>X993 zIhZs@VUJj|$U8?HVo^&j6_2$<1~#y7L$LRVgBTFSU*Qu!HKR)A(fl#|1Fz8v7yf&q z*;c6LsDU+?u~Iv$KN+X$2S?GAg*&`cw9OSj5^P5az0gaDfTvZ^BD4EUO|OvYLP(7s zyqusI73D@vejITF312O^jvMX4Bj7Ks1w|Pt0|KCaf6!9bET$KJVSwwd=bi!B>OH$Q`;g zeswRbJ2S%7s+3b9Ap^Eb;Of=ytuCM5FBuupc@ZHVaD^4tNFy8GZyhY>^)DD+;116k zHgya%e#rj;>rH?<>^7;36V?$mMmIbT?Z)2gGDBrj&%0=7mm`V@qM6d7iY5G-e}YdYFR6QFz643gD$|T4 z71fOs%E|xH0#wJ}|9as=a-o;179Y}oYU{vD{pydlBw?~GFD?G+>n-$By^?pb0$eSQ z(@X(=#3~63FyC!Merl_Fw?2)B*ya<6>ub?R!nmRRWS(PbrIjkFKGMLA)U)x&{@}p$ z*15hk>~^k8YOR4|!&aOGZ(Cgm0(tAgV;G}QQze+ng=!rnrd;SZ<^=K~PCgKXdkLEJ zxW!e`tx&!89CU0QB;x#nG~5M9LKawNG7!@>R7rD+5%dIBz3iuDKP}V6>xw&KntQ{p zEbJZHXuRfSe*}UPCKSi%4|>Pfi~eW_hYu$I))P5q=USf zbTcq~6ueOI{wL166XA7RM}sD^*(@Q4N0wKP$Uq3)^7ll^hG55qD8Xt(bCT{#&U&?D zNuox}!%BmN^&MHJtS$`sUdDrTuNL&d_j-KB$kZc!MVrDptiA2dcSk55Dev3#RCubsY8W2>ezdceWZxrp6Ft(RQ9YUAiAvFq|S3s zXaal98#OCtQR{xUblg~ZzeEMkXZM5zBD@3A7z1>n3YXY>gIQ-Hxrc5!Xd?~U7DAsO zkU=0)-=)iPhZ8!KY;>ObsbU0gl`7OD60itQ2=Xss9B=gO&vWf-83a}?q3hL&6?#Yd zK~;>w4(|b};I)Ut4;UkEC}alU;Z_(nG0zt?TD!)o6wCtDL|ppQ2XBTRs1HsSTrhI_ zPw7mVpXuyVJ+vzsPgT{0k5EGalIhq6xTw zNH>l~B4hqat={P9fI+&-s!N8qLaOeR*bfT1=$zl6>Ki7QmPO^4h9&`Zv7!VdN>D|)|n!RNBW(4xUT>+t+qj$&~?8h20j9 zP{Jbt_^y%+DxC5pc?jYF2r2Ddo7lT%gmX-&aGr<_i6H9jW!y>ZYBuKcG~CZ6|9y>^xul` zbtvVYt-g62#osW%qq!&7a-uWZB}aW~i{Gh5=l=oV4Rt)^Z|+})nZBB^Q5puI1$s?< zZAOjJ^&RW=2mL+7^7qM5>E>+tAkr$k7ZKE|0@pP+@*gH=XMSN3mVyG7vC$K`lR|F+ zzJKe0>L?;-M<7o4R(>dW8Z`@X-OFK9%v$T;r+!{>s%ofF(*GVPKgN0R?$@+3Qy2PWj8kDXXqY2wIj z@Qe$^lx51$F8;w|V#-T`3I^r0Q%xOHvEC<;2Ox<89}I0r*}EJ7&D`*_uC8b)I)p`f z)yIfz>>_X)M=_VpZ?$Nk{~Awi_1=vZwZ2^ouQ|+D^1RY=ZogZ?pT;L^%Yct9V5`QB zj4Igfm{rbQD#+v&36=9F!d{_z{7tzq5r$_!Tq!xOV=x*}g5k-wIVQ?~QY-6~|NZCz zn&D$`7{7t+hSVz77wB9%@G)TI-59%zw;Q1g-7C%GU|$Ku4P~fk!TzlqsF}HV_C)6g z+l?7~Q8{`2A~W&LePChXE0G~M zUP;CmWf950rboFZd^Ro+DH}97%I!Rg7t~16sVFPWe6<#dr@@(Aixe~2+7F9xn)b38 zE*Y(mADlqaoBnY|0g)72rGb93(|8nN7c&~Z`Ch}gwrEoxwhJqs#-JbT6h))_J$A!NyiEzb^d;j z)oS$4@ZY2>nI7a6RAZR94xL>Z#I}osHS|Y&edSOXbHXB{vhDlI2fpDV*{re2*b z!gyRF*AF-!x_(9pXVy`c&}VhDW%}O_J<||G?^0Q~$(Otji>KX9ptOAAo!)LK(C!4~ zpJPdhp~<>x$u&zkd?gmlhu12|L&4XnBpR@?ceuzk&DSQ(^0Mq7z!^x2xNjJ3VB%<@ z%<>OPF(J|KK%c?Bty}QnaXkTsnuzHG&L;s-9@AfjefAz`_ipdAP#WC?k`s<4@Aiy| zAB;mjMEox1x_1bZGea~K@?WV4HJCx+Y%yd)V;E!HJQ7(fso`?}MI@}(Lm)8}2ns~= zN!0>Lycj$c`#1M4q3s1`0RnudFI6}EZxSD$zNC-xBx|_>Y}yjF*vgZ4xou3$S83F zmDTSzb!5hJ50cjZUjQ({RXE=v)Rt;-<)JTA;=2;|xAY7QUu(d=^pGpIPS`uh0(i#uC37iR9V<#D8w48kuOiNr{96`5gv2$j9yLVhC@(@}e?uBfMy(T`&N8DW z-Mc3&O94bLYK&{yilJT2Ys%lN$GUsUAO;bX5lJh8Y`6*A=f6kwWv1M^V4;9s)kyXs zLH4do#dLLnG_5uqx?xk-TWr)a%07Ui-10TpPq-^pm0F|T0YDH~$CIHcSWUL9>)hUz zLngj3*>NFfk0j~obnDKoJ@6uF08M8J7VHnKD2uStE?e_2b6j+ zCw@G8|NhR0BVu4{1~|{zz?VO+M?jB?-)yG=`_dBp*|IX=!p(yRhI-Dxhp-D0TzVeT zZhDlKMhEiWeJm(Y^UMFV-4=NW4QMR)l^hSodcxgzvjy8y5eQ4(m`Lmt;Fs+mTWF=@ zsht75*>Ws)@vA#U&OnO!@PYBpTfuo^#P3a8Nt6V@_L#(&&|BW8k^X`8ePMTurnXj# zCa&KdjXv%K!qEQ|%giJ~0E=DlP2bA)j8yc4bcBLV8N7Gj#z8$-Q}?r?Yu;{@S`z<- zf*-(GFuuQf9+66hX!vos?|&BAtJp#T+%WgZlx>N$G?ZsAC(CpE9jT@re@4%KRYFVV zNi`@t9t00owuY`t6tfIJE}Sw*jszuPzGGzbr?VDErL4?IWO_ z>sHKJ*Zxa3!o=6^t&)xC2`ta)4}08Z+k9Edc2qx=M9x)0!q!4wiE}?NeferR;+&LB zCazI=8vqX_kuTGX)k$*VyCu#^^|ya;;xT-Z3E_{E%yWJJKpx$Iw5~ae!nj?VPI`-h zq(PGyzI#ABH(Du83OEEBBZl=nda*EkvuLDn@^V!({r4ADRH{wX2X}#3td`EkE<0O zDB8SEG*@$v?8FT{h)e<$W%;V>1ItW13^2-$PF+|>BDVi{H{LCo8?(!f6>U8j#*;c= z2eeu_#2AI`Wy@Oko0{S(+BsjxJRjQpij)#L8L+pK467}f-Hr~n>_MTP2;KsocDA;x zRP8QpCMlrz<&+@~Vhre}U%k}+ZPww-!$gVsbsufj@=H9Ja5x{3*gK+me$9&UrGt~8 z&Dc%H2#l&{IA%w@y2L#?CUHD&57~F;$Ts88S{$ZzA7M2x^}Io_y=#F=Bz$EDryD-Y z`HMS^Kc>C$e)e}6I!B2{*E*$z+>|{kExs%^6ggsle&%}XLcNhHb?>^NLpya}XK&5K z9p84BD}ANje0NjmT`k*PoEX{_$2(lQZ2px08OiZqyEe{+;~e9>%v~Ken>6L*RPD`& z;aIC3d3<0KxFfcwAJC(@=9r_;(C%Wv8NUFtM;GYmIwYg1)&qJ{#dm;|@`EKR&R^dO zf=g-alwAtu55M<2@;@a!5?2gLW_}LD7jg=wRN@z;yNTTUy3L7_D0x3cLe8Z*Y;xo* zdUW7^{U%P9e&KlVJ;kQ_3j>jI(oMvt7K|O8E(~s5^GVmIbQoFjMlF7QXZ`8T> zxYd0{CHq=~NL&3W#J1#j7%o$TQHiggR_paJP3nLQuETIAB{CvZvN6OW)FH$)tPu9k zAW^Qj-Axv`5{FmVwGqzXxj_*RGDD!wBQLm~|)5b387iFZndC*Z)z!G<`2 z*_z+zTh-7ciX4`^xn=2;y%+diyyUDlau+WDSMNLShOhpwL0V89d;|5o(09adw~~z% zu421i^Xh|%w4K`w#&=y|C<^q9u^7>{nb*fJYbbz^vqV9%dFJ}~@tAuRwg%)km`m|> zbqSsvJBQ>iqdZD{GnApsxbW%m(3mA_3^jU)+i%M9#jndm1XH%+_6(( zrJ}r!1Pcv$h9;(KQ)QrG*frd=^m9B*(6g8q_W&SFnK;c+6E$k-7E*W>S-$NTLL89} zS~z^>JW0^_O$+UV7+HEIM(ajT;{sGi8{Yaw(kRF~O?QdM zFm}Ds3?()AtM{b*{tqCfQN*LQK@c4;vt^O%zML$;F)oJuW@|aiqWvvhS5N_<*a%up z45Km~E&0p)9x%kRdOe~%xsGZVco*HzD}wQ7#bQF)ncsv()SS-3slSQs&6*`eU zf7eu#caUos&_BLa7+1}R>9E^!D53QbJWMz(O+wfsHEZbd%e7=<-1Li!OJM;Kmu=YH zLVxI;9|!zFQp&zW|EYymjWZZPOi)DUa!18Q$^>KWUFN@mvIYoj?b%ZO=`l8wvk74M8o<8`%aOMREon7L!V3*1Sd zF(ZIHkin#2OTpLT^WQbDD}j>GqF4O(Ip}C@0Asp2lNrAQ9OdWwLyNonB9c($|3*$u0Y!-;;7JacHcP za!myxRuumB+gX%E_m)46+Q*?#A}(_qc07F_c$0SK>CthhR|s-s#H7@Fi?MF*IfaJWa-nxgq^={yjQaX@Onbe>H{v zJ26^m-z1xc5uej5Cl5TLV`L0y2S$EKlzX$_jZNe?TM}BfN||+!NwMgdOBXIo`x@C) z{o6hGK-bY9@x#GmT?xHk4;Cs0R7OU7mS)R{98WD6lf>KiJcCBa+UkW-iAQ+ojBeRt zeUFcmfF!fJMm ze>X{xX>)srp#VSB*br(|EqHmRD0LJ8sOB=CN1XzNgyx zoZi-=FKbXBnNAX%v*(7MTK<#?eU6{gP4(eU!RlCNo+{YOotRjdJRt$DU@b7!(r${i zH1dXY_fs7#5LvP)a#HJH{6HW4uvvWSS^q9L_|}{z*l!^b=x#NQH`|PoWc9rri-0&I|&INk}KP=cW zkHE^#3l*T!e}r`KhrR{Nl~FLdq>tSoMp~+(rE?iK1iR5w~&q;^wdOdTWIYouWo zvcSLGyrbt%#v60gl48rB3#L)V74bjP>7FUW*U5h<$B5vPp%m0YQ>8D6bX4u9Vsc^l zcRhOcdkK!kFWPdw@oPF(sq^6ZLXA0lEM3^F7=A3jabTf$PAu$B=<1%@GB!ocYn2R< zhiG<*-$nMtP_7lLv#)~#@yF2ub*nkPE$aO}b#UO)k+xAA?_q*KYZm`r z<577}lnHA2>VHiN%wS;dO>%PG+$IBYK#O0~m}>S?I}-&EQ_VWD&f!hZ~~hhygJ~B3BNy`E3Um@IW44N>eXz{?NPd zxcyvTXa~=rUn8T=HI62xEE^~>SPE8ydY}^)QG)yQXPS%f2PIPWo6jV!pi%7VRrj|z zPg#^nQC#h~OX?GF$?;TZ=|5L>?9+Kj9BMk222#_=Ts?kSy3<(7|4m$Y^g$5p zZb$&a#nRW6>GJAtHfjN#_MB=1w;g4xU}}?OK+#8 zUu^hBeo~k!DiS})ElG97mfQWkfNi<<1Ji8WWR0%V*Y*o;H(olNp4z`S0r2pZa6Kz{ zV_2Lt%Kjk4z<#!^s5Kq5J%Wk_pyNpfZT%ksBHEyY+Tcw-k7gRYT zXTAU4-1+K_snHrei+H_K^7D_NBc?9^SM@cq*TrjA0u-Pya}d`Gk<+S$`H zXXp@D7y})~c*LWxw{mDTsDxv>7SvWE{5u!AJZHs9?^J%xb9#c2-l(c>6;wMsk4aFy zO54sOEkAD5)cL;GXjBvk+B59pd314{RY)aidJe8JuIR~4M`LYi?RT3LEVyS=@%|m^QT&RQM^5))+D@gYfVE!dmH_!j293m*aou##t2Vu@nTy@@l zoa1+10T*f^MrSs;doA4sRhFAk+~(^u@6oNFb*gu^!TZz&?)EU4tvOoKWoD8 zXyk+4ACZ+NFdnwI*dVSx(T$fgIY8sqBr9i>+}sCJka#xo!-(lX85pn8VC1AN}N zqdf)GF*G^OjZ3Uh8jl6h*&Logj2k&<;0G9v8gRzX4gXDn)F9)Rrq(|;_lm_!#z+vJ z>Kjv;xOB_zT*1fuNrB=XhmI!86fp}ofK)&;!N7`@)P!<@Zo|7Pg!+DG(eRG$r^zXr6$sFHqjoyKM@b;wL zRt|SK%Fq)|wl%hruj!;VJb8xsM`?QZIrnGO@`^;%+S2@a_T{(0tD>ML`luIM5@$a z&3+^iO~uzOoctrVwlq!%#=L1r9m3*V^K!|O9^N8^e}44>0gZv^NJx2|dS(adm7GID zgnyp^W?aPBNJFISjLFjuPdY@B?)uIq7ji=)di@jnBPhyj*<%Igu6;08e}7%`sqSHZ zN4b%7J@hZTAI!xYMV|92MCkPu? zVN(21<1e9o;e1Lc=_je+%&gH2mUMMvb##k`wYAe+3@At+EydB>qtA+NDKklk=kqK>D-I&G<0BX0hSRg13!@-mmXSlV zzk5=!Xu~BW6NVLiQ(bL2Hac2U`o%Y?-5@b&!DrrQP)+l zgA#ITOLWL2g94FTZ1=KCS=Gn9p|XerZ^@U0owWSOf%faETEQ%JSZ?M7kfJlnqVjkO zOQ$xhd*PGb@gsy47j6nz`s>g3^;C_OdCsVEKEY}V5k5r)uJd=;RoZjJcF_7y$->Z0 zfG9`MHB`v`F3LW-=-J2!#)}!K8`|82@{il8k$b)08;hP$7!5f*sOlohRnL^W79^O$ zQg`22v-jCGd_&harv8Yx!5{`)D z3lyV?Nb7?oMFM3cR9E7ImTQ|xZ%Z)HE1~P4VP#n$^7b-S5+{8Am=n#;+3S`04{{A3 zE!-wNV$O^c%9@&K(5GO2M{`CmU-WMz`hf{F$*A_~?x)*2wE08n1zHA*3 zAEwLyj0@D{JP270V1HOs;54Ly9(O2-#g338?3x6*tQgm?tKKCVS2W$WV9MeMr6eA& z!f(&2WC+?Vw1Qa&fBLDmle>?u^J*iRw2_uIypy0@JDKOoW1|n zTMAVAo$*b@oRBk}4Hs{1?4fML9tIXrx;cBr>GBgar;wlaF@ae=p=2}N$Kt=n-V>P( zPtYJU&ay!GA)lgTkbu|f8i#h~^FDgr&e5GPASO=+=^>^|bnKzI9ZE?%Qgv|Mt=l$F zgpM(6F|DsLm!bN$u|1P@?!5dOk%poi=WU_G>JXn-ntAQ{u$!6(eKfV=zRt4oo-t%zM&;u{S}`{6|}pdGV9?itjE$bDzli-3BNg3 zpB>&lTRngF@(Lx{{$(Y50>oYBmZw8w*nVF0SI>~2y|?ZuY5Tjt0xn}PX%B>T}}k(=@B4EYuwfG>j>)caU}CS_CTP!K!%AOpT~ZUWkDG zvnvr4wO2XnYii}DW5ZuOjI2^4u!{J+J*TT0Tkz`p{N7=ki6cufBe!T6HuYVT?SrGH z?A5&|jwNNMA2+C@tEu|Bqi3N&u2pyY+7L?mO1FTIxg}hHkj9|;_nCJuhouQ}^u6w7 z*b8&cQO&ctOh|q@druBdwdIoRS@Vy|oZ}&p{YI31PsnavZ&AB(;|9M#Z(%IF4o|-K z0A7e*6Ao4-fqKXJnP#35VYA)KH8r;_eM`1Y@6%LCn)usJ(0r=tNK9|Ty_B%Gm57Y$ z%JYI$x^cOqwfTuLB3+g56%x zw$#IvmB>*yysqh0<&2W6y9drAM z-kYHtF1fugY!*l%u_oC;DNah6p`Ol zHSCMtwt+N+c~7(y+YF_FqPBpHK@FcAe0P>FedNfJfhb3y zc27O?9_icCI$G4B%o0;X;j(APNI4Bk8?Emj68Gl@@1vKc3YRWk+?4~aN@Uxj=3j_i znh*?0;WpP)@vu~{DH=Vjzu2pX-S%1+BSZw= zb#$yND=O-;ealw^-iD1syWg$+1MG~41aq+EAiI9zgZ?rapKAjOP@TZD5+*wz>M znFcAF=!?Wy8(nLp_w=dk78zfRH?r_yIoB3}xZj8*P3nbyb{W!}vQOsZ zdvnH!)}EywKj_M~hvk$<1|?WC<93A*#T>4}#N3zK#jDRw+)hkt79$w;*g~V-ly5h* zWjQpeBsG7cy24sm>S^~qIi|uzN?wlXd*elK|4_=Aw+@%aig5=5KlHh-S(3P1 zzY?)dZnCV{Vf#l5_McQyzGn^DR)0At-=a1)Hr8WOeQ%-{=`xksdt0~DX8G1Nqf)a` z@NIWxL?o@+<(72ZZR@ST?7gpN66cZt2n!bS-D9Q0@3ZDft@RMUInZVa-FDKBcJQQQYbQ7*Xzm9Zp*YVgdobwazO3AoE78HX!W2m z&03flcM)S){=>y{hoTJ5aBZ($J~~+fPK+yp#))ZuHAE^+s`{}MVuWS zB}Ms#1gs59Hew*_R^m$*Ty=Gd?r<)vD{4s+>EgMRZ1$Nwt?r}zr@dEkb)t7aG8o2E z!n1>csWV&x<@vQLG)W)s+#ysHGPum0Q(ye@groMtb%Xn!B#&zCcuUI+#c)-ZH^ER= zSiS1UXL~PF=Cd6}tuXw58o?g+uI(E{^5L62Rd@DQssqJP+YOv)nwLk1hiRq%-sF{H z8`n{#bE!re#O!FIjk>}5VFXsWdib#9U<5+V{YcaadnmF&IfMwz7 z63PjF3+38pYoa*a2$+buKeFcSHw?f3iOFfjzWedI^EuNECnb0ibQ?3okL$V@Q2>Ma znP$dOE|)lS_7yqHbMg82QHPE4209JEGOvdHKf=!JMfY!Qfif=B%Y!GaAou z(nus+V5OF9r*V;FyBZB)xZyE3S|T3a&A4#s(!r{wN(N8fw$`c z7ehNxZZtpK$4F+j1Ts=SHHD#PLP|?Zn-+xC7tph&=lV3zZyW`x3X?lH>YP#QvJbHl zof9xhlC)g=gq*pN6yZkxX@?fI+XtQ>_s&H0aI8m_Y4HaWW-VnXbH=2E(?SVJCe7IO zKlRpCR^Ubw8=YWK7Gae|m8N&7U{Wi39H1XSfUafV()HA7$-9&jw|twmm?I-^oHi$J zlt(zlZuweIt;7WPyLC8E0dqjl2O6c3vyTrpJmn+&1$Q@W(ruQ8>_DF1uvgzwa9Z@izZ%&!$3u1Kywt9l}^bswY9QU_$Z zIGmw#_jwz(@<)n;;_^Xw&f$e@U_jwHQz^T7lDDOfsvbAG=$*9--mlkFMKWb!^AbJW z-Tf*nE7y`fH&aJ+X_KYrb0WPJQ7$xQTA>mC>XymTEK!>*KZN*DabI?7YpMv>D8Z_2VY9jL zXS4>^wR0+v#3IMA&+Ye(9b3bxo#`)Kx~A}BB1FuPgt^hmI6)=r>JX4hlcy1$z$=aB zQ6PfEpW*h15q_4cJF`skj|&9EdjE!z_2$*i$3_{c(jot1Y4?1dZWb$ zT=8Skfe_=bpaKEqjjpsR~hR|oB#Dm2bkq#)6^;5{?m3hNw=p8lQFu~f=VvTV9x@J5uf70nyV)JiiL*t zP=LFO(d3+`#;%N}o|;J+0G|!{mTj7prcG+Kr#Zi~fD# zs7RxCBdm6%$QWNMu_rxy6=%IGHIobgI-diMlNjMi9Har1z!{)`xR*Pc9{g4WLd1EC zIOr^@_M=NG)$%+3&10fNn;cIygkqa0#@Vx+C88_SKR>9biPudeY^G&7kU{0_&)V9U zLO65qLP=PV+_J!$nSz_9p4-wp^?>R8 zTb(Ih6~p^TU{tk@9%W%YzM0q==DYJ}uA%(qC%>lCtLBqDIahCUq*Nu-ZeYEckSi+a z-rGXS+2H7(;V>2?{yLW(eq*l1kaZ zTL<4>-{(nI&#kVm_VU>lp4y^yDCzxl+d_D*s4PLZwwqG6{qs$L0>eo>S~3dNe3H`lE%C z{TjaFHvMJg(euA&N4EYZd!M=%0%J=Hlxy!%$%&#Q$Tygw6DW^ZomurLG@PApA0et{i;p>+9oRXS|nFbTiFG z2UP548AW66AN7lYiR1d~>Oz^c23-W#XXUcfU-jaLV@mhaav0@%P zpir!gbZ`g1DrY<6O*}06m&FEL`v%C%IL_d=8rb(3U@6L*igV+H_ywX*Qz*2Ab|?88 zb9x9NQek-hQt(xtoYPG$oDs}kc7(zz5VnL>G8Xuh;EdByj|Ax2+s4%EKSOn`+huto zDDM&F6Vrr^0rj$*X#Io4X~pdaPhQ!L-AE5~B?MO}IjE0($(U(wCTwhf&#ob+0-sMP zFl3oqO1>G3yR`o;CFnI|1Y{!{iKW-qoKgQjVglMqERl_ zP`~KSd^&!5i~<>WvQOVai1NUM7aP0)t=&!t`4l5{UE}`Gx3Mz_lFoPwEy`qSwU;~o9 zE16@;>zoUY7;!_5^KwaxNKCRsFc25ESV%?<3$w2Fw{$#eTHeb3_jG>~g@+a5CxxSd zxLx=ItDM}bFi%c0pSkSIMgW#EXV5$*umcGUJ?$IR#o|AGusObX|KT<-X2=Df@QG33 zoHDv+8{F*J5Os&SB|hP{f1{b{#@DI!`dI8o+i=biS8J;A3ZABP8>^`#Ic9*ZrDagG z?XUYEQKH76*w@S9M=o<0{%HV)!x|+aBkNkLIGF2qAAmj~vYiV+vv?JTK6oRtO1Z<1 z#-Ml6L0_gux06JFJ(-~WG%2%ZInVO5&XPaM?Ar9u6ml-W9r}()ATOOEA-zSPb2H1NJJ8EZB8Jb%AqSMyvb2^j+m+K^VB570;}f~ z7|!+dnDN=-i{chXAm^-#k#{W(OVeEUsB~Z<2o=FJJwkxv!Vv{piXRpboR4W2HL3Gl zsQ?m6G<-DLHY*?uO9KR{S7RW7ooqQ~Z`*<72gmOpC5YF;NPh;T#`&|H5hXz9-`c{j*#kowKp|2F~d3isF!XpLm+^a_0O3|IbGpY*`bR+DGMx#7d&q zY}GSK;D%@PhUHAAH+>3|+%_z*$G58f86nZ9i+|_21BB zwM*x!!#9e`%
%pT9{U0+LDm;~a?-=HANK4(CXAXYFjD>)xXBNJ&G3UD>?ad-c_ zjD5?2&^H_8H%j(>sQwMyizaPBLTwa!Hh+_4hBVed?KFCsozwg<)7{`#VnL~YQ8Yh* z-HED|jkA{$yB-6uJ2!jypUape_krpPdm&)6aS~?rnm>NNN~$}hk14#v3C>Sf1h>LM zavx{sRc^i1@F)KTQt*FY6(gA1+UhfzLXxrY<~WtH^5hKsLfm)u=0Tc&7mMzw_;SA6 z!(1<9{W;;gVj6{1U@-G_YPhjDQgmF3yit10mS zyy}pB8Ch#UO&A-c&N{H-sfpFQ#tA$3S}+$$w;PY{mEe$he8qp>*o=m59696OI133{ zs-X9X4zl0I# z@v&rO{|R^@tv+7W6n9kJ@kj$LOVaA{Z_WGQn$5bD^No@XusAS3>1jldkwnR$9&H*hXDpDZ%$qi@qgxKv0%cf0(n*AHAdUu;)t?h(`r88V77+s)3+u1qra%+3;{NQ9RBs%y2wUO@>JB>-eSdopO3ZB1Nxx!*pBC}i zxAs?r-HRL0YzU|ewFz&v&iMJ`2kB)`$K0pl38y%wYdu>1g8!oh_;my+;hFCy24H=l z^Y70i2kdzMg56C2Y{6ZU^A9$^J6sa3t_QdawWs)0y=Z9yE&A^(${DNisv}*;J=KCO zg67)@flS=t16-j9sH{m@MotCs67rqQXfJx_gs(~xRMmpuAvviIR7V0<}^PFH{ueiDsZ zi*aoqJc;lOAwACo&vv(lmn^QLTXGAsve@gQqUF%n)$%^REHaZ^M?QitG05@USHDSh zJ1vJOP6oZcFZO*{8mOFUpmGv(KMdc=bwJ#F(P6vUYk!(TD7@h$;#^w>8uc=il7CQQ zT{NOF&t}6>_Qtb@x)Vz)_T`(b-j9`-wUu9i!KG}n`sC0R!Pglj*TF^3Y8ViZ+*Ruy z{RxRJ#0`@sd{K*HQ{wWnaXi4&J?crv>)kClKb;yMZZ`Ggt5( z#&6z?A}0w?3K<-|b4iuXvpNUucW8g{yCi)*y-k|D}{6O%+^?4O$!ScB}rzhhlqKolR>@M5Sg(Oxt5eB89 zERw&pML^e1a=&K5Cj#(Z5LtB=U7Go@^hIRv$sqBU1l)+}F5OPqA@VQ<7Y#4Nd7$R5 zVebfKHbi1qJ8w^pS9`Us3gC=U892m~i{XfKZH zk(5W=HjepJ@AZ>_YMTOnpgqBKmS5Fv<`xhwr0HUm;Mk7Ry6s|41u>6TIj8Zct=q2e zH8z2}wA6ajOPmZdynnKzNlFc{cyJzj=PzYOjDF3FE3XV{8iyMXcb6AVNJ2t z+-nScJ2V!@#x-P-pgXTdbIsr<1HNZ&Ae^lb@?-^~K zhjo+Sht$wz-zl4(Nc!n2#OL0>Wc&7qAl6_52zQ3P-)Nvnf!_smIIvaI^{w;UudXjY zg5AJ84u?zAM6;8BZp+oW`fyO4N+m}(kAxX~5rVO@l|0KyCbnNXdu<*K0P8j;k<#7M zWuW0pfk-;>LrKnDlbg$dzg@Y!@fpu#q6#O6guZ1I=cv*d5?~xtvCnVyn=JFQ#&&Q! z2wY0BB{aZ`JJ`m2725D*Tpd^2C<#?QDj42gb7<{e*NKI?0A(xEif@DKkA;Oxc_rw| zn7mYBY$I~O_fONp7JU(~(}s4vOF!!f59kRw2^oP`*9a&Dl;RxI%d05p{E&$BPSUcd zq}@JH1mxgK`L5+ynb_VZ(AhYl+j;+aLWK%QZJcbS{-daaew{n;MC&KFC$$*@KS`Sf zvc{`=kTR=_@6@9Qsz2~g@!m-3i(^ih84-kb9cKVo+xI>3WlOMgM8WV?h z!MV^)rP1B13o$Ks+#BvkL+8Bn)>ecPI#B+9e7$!()%_bk zen@qsI0sP~afpn_$X@9nJ0jV#%MRJA$dQoj6j90+I`%4iCppL}LUxjw@w<+?@B8!p zJ-(0c{m=bJ!|A-=uh(^5&+9o574`nMdFuCFulhwY&}6CtHf93q_WMsK+M?adwdZNW zvp1Q6RHph|4s#AA&kIo2Je!NfpM^Lb3+lKo+xWc_hb57?4}fz1|8KAT&3646+vc_a z*a}NyC`0ZVux1!7Sz#|7GCK1*PCJ0-C-oisL#z$xcq?PwjF~@6ba^x2fOi5u%)n(8 zaIehhf+)pP-`y9e@rih=j2sbihW!=l`5*!Kw4m8c2ysF6yaVy?c^X`-w&?*xjK1}~ z`1V7;d4@`4g=qYjpQ=4KLBjiBa*Y&TFBqcK(NQKXOq52kY8-o(`JhE6#|Y|Xr^jWg zQ0w+q1)@A9jIuNEQ1Q?#D__gL9bo zlkEwdaE}Gy$^voLB!OJ(KKy87aBrz?7LA4#17s!@u%%0@RvmaqH3rpNZxtL^wZ;>V zRpc3!7x`IQHZV?!*TqI33iLSqtb;ir6jy5k_n9%+uX^G?Fv6&T51EQ^RifghuF4!i80uXV?jBtSe znF=O#Y_?i{L{6%JO>hm|n$wb!l6wW;E)GYNzeNx`{bmf+A5Krf;XrA5=4w>FyaLwa zW$#Qq09bdp9%p<$npd9rd3~ok?7JnK0Y~~YT<2U+kGgfkUuw_3MmVdr>=Sr++qd)z z#i0pxSSckz%No4Yl*Oc&4Xveiu7biZ;`7ju`qUi1;#Ts}_nMgTV(eQXLOBi zzS+Fcm4mwLu@e6zn+b}q4bb8zK_*C83L9XjkOr?Lr#Gw7 zaO{z2An^GOQ~pbfA&rWs>6yWK-r-9gqI_qgNx>S)nQnozO~s^WDsS6mAG6J?jqha& z7}lXMgmbX|UOy&IJM~~-IKr&`!*(e-Yvhy5zn(4)jg86L5OVb&<4P18YV(XMufe&> zqim)=uB*wx%>1X{Du;!>PmPxZ5I%={dxbc@0ZBj|;S46cuZ;$m#~LS==PD{Icd8x@ zZXc6xSeov?1haL<@3R;0&#pjYcxKea?zVnzf#|xNSpA*EV}CA4)wj(fv$#OmRHFu@ z=BY9M%_R#$vn}d(LdflbkhUs}uxF_Fag1xyopB^Pz*;?e`t!|$w2W-TmJVDb0b5naO7TeD6t^;FGcP&jOE2$c z5N{>;;5NJ{W=G)jNgwpoWdxhWleiOI+CCwKEi%?%^!d{#pS0;b*I%l1Xo#>uxoF9- zxt8;BXH1a>wn|j6A#&03jF$R@XHAiRC~^GkCLHO#FJq?_gm|W>;k6uMNe^4T3JB!4 zez0imHuYJ+7q5&jfYX9}^v0JjUup*J2|9``;XRxbn_mI*Hq+BfXeE`o0g)w#5dJ6K zwp15;%w@SIvs;^vgZ4mzfGi_1n-FZ4Daz%^-8o1kg$^-tOf-?r#>;8s-pcNpXTJTzn`@HQeeS#@;W6={JZ|s0D2fbfS)UUq zC?2%$uku<+v44abQ2+Cs5;1TgX`)%EU|;)B3m3?WvSjc+uXzv0e4EjxKP`t9s$87Z7Q)9) zbgwwJ>Ix(GYAW?rHp^d;KRU24r})GbB$rsqi`lI-Qt?vb;;YR6ZHFB$y*>t*nmS-= zt{DU4GVpn*2I&kMRVK7pvFaZ2))C ziHlaBr9&E2&}4yQNLGzfUY=)5$utX&%2+T1%%3Xujkld(LmP`oBG7w=vT#D#Sms3A3ZBx%a-n>%#|?RFr_clWLazi+^gS5T>(UH z>FR|azEV)TyY&-Z3HR?#Y~k7M#t$WC3StFiT^+#bJXSl!h?B2~LG3vUtb4MKIJ-MsOSWPlAh`b_e<1vjhn|FcH^Ga#fTF~@8B zLsL!mX@b89C15qQR`uEElb8^;_7UBWDl4+Mh~iuGTr`x!gSAqut^N6Gt3ifA0)LaehLLyGM ztdV!BMzUFu_A0>^%I`AL#ne-g>x@R~VX2sDuhjE*CqJ;pPJ)6PND@F}`EiZNW1+gk zg>6GRhoD45i&Ud1(kND!mX=a!sHYqs9hA83*KtjXc@K^=XL<2b>N7LE+SG_eMr?oR zZ?gB6F%FWvzN2+&CU2`+Ig)ch(JV0dW+h3J;z2gh5F~*easlz?YRh#fo2br@z&K08 zx+z~yG}B3RwO<{f>Z6ZT*JMWv6n(TpUhf7b>ImWBS(zV z{~B}xx7u~+T9yM$6Ym{MnVuny-oCD~8P^o`h|Sg-(1m9zSnGf@V}#3GqBo}!#Y>vl zprxckvNDHzccsrZ8LF<8Z9@E6hlj80fOFMy(B_n(O(c$Zxq>1ah^0I4{^i@858@^g z$94?nLRVg)meE5c9{OO6SCp6M;AQ(@QoC)GTWwI70}Kg4P}Yhi0mQf~hrM09S8iM` zQH}zQv-A<-{~53-rcq<>MiKqx%AZEpOad-Zm>r(j_Z7>J&C~+T`ee*z;jO-G{er5W zZ4=^Y&xQTMzDHi?y;HBq;P9&wXtzzsoN{Q2t{f!dCl|2+$Yf{&j@QN8f=??echieAC0@+s@5w?5?diI|KL5d;p3Z=`S zJ&X(^TaFo=m|MO0ytcMBue#b#O47F_he(#nq2eE;;JA_q4dZX1IUcXc#-}91DAd%E zC|8X-yJiB6q}3w%c_kiTxbMCBvdQxB>wBn2Hx&PkIa-Bqt z&K0|z%eHrcY`4yDT2m!T7k<*E>AH}zn72e2)=WVx)f$H&R1^JwV?2lw^FaoE6ZSZ)ajOwwJ-l=tysMa+# z9kb=4;mO#d4r_2VHa6yu`&Hwe_!Bz|oERs^bkD@l6mfAVrtVInoAUO%JrYl54E-*xzGvzYhOKG1t7 zczb(aqbqWlht_KCHO|xX`_`e8>Hn-_4G~|YFV+Si>WH8!ogu~8x-6ifH0V?ZC#Sue zHa620t%ST&>9dXD^iF~hs>jAV#-F&90ynhtnSfqWmol`_llfr=%af_R%rz#b$?jgV zVA!_*`EGja`sp=ubJ8AZuij+b9pY~I0ewd_Il#>T8?pPPB$KPDL67ByD8mf%(1lk+ zEYkE+2Miy?X32oq5F1)N6Ic1Cb5eWW1RMdy?e*yo!ci(*9+V~$e8>E1)KtnZMU31O zTT#gpa@7dPNu0pCCo9nAzObtlYWXD{C~8Ds`C12d+?6XxqEoXT5g5#^s(4-LL)`&`RX zpZ$4}Te7H)JrwI_n9K-Z3qA;T4bT zo+kMP=y#G(8V_FQ+&Pf8lcVKv`|yYS5(i1&=g&2ytVI*+0+5Nf4lgV$6a*)MD+_?H z0jXucy=3|Fd)Mdo;ViYr7ptdivh%|yZ*Uqsg&9DJZQSa{QE;UOc^ADQ(9O=qQ&bTC{s2K z=3?$q{Ktv1-esDvH#&@1dT`W;HF)E$m40}AsuEe(MEWh*MiLB?j}9{&s8hvx?o*c( zMdDPd526b$Hbl{VcZG!^3XpQEe1*m??5_*(QL@&uF@txFWl(Me}=!1 zj&sr4ia=!r9wpaX!(`o^JS9d^=NIDb0)q{H(r#;Owo|R_D^OkV< zxR0W!1t7amiJmUBotD-1gGH87%(W!wa~4!+DrmuxC8D;`^B>zGi5$S$8@&Qg4oaM; z;@}*W=`C3}jg1HqGNg(Ahjz*>)ohtm{FircUSu2~ZaIcaD>)c=4q;ZE+tGU_n~&xE z7=YfRB*B4$_N)z)2xk;RN=Z)xB!9@IA=guW;<)MBVAk?4144d#X+!?r! zegHUR-*9S((4_!2M;iI3ukgEC8ZWC7W(xiwkxsiq^W+ePL*yJ9Y64IaRH*ws88;k?l&q@a(TnP=4IJ@SNjn(F zKi}U6QsNXx8s5SBKch7#@p^kphzhm#mRH#vHBapyebJN*xkT%Bd8bqAR+2MfQ|+o+ z1}y%MvS2_BR&0s=1VTwps|;s`o9Z(=u!`A(sQTNGiNlCkyx8Ca>7EC0W#y>x-8W2F zDX7$|4No(=>UZFh%%p@`PbH6KYhrSO2Sqt#el1qJ^6<&eCEe>68)}=(3l#wBq0$ws zL~~A)btOzTI4C78(^!Q@9(m1ncQW(CjcVQ=tufy*O;pb$)-AD|Be<-tDEI37^jmBd z8o>Hk1B?;P>?EkOPx@dnTyJ`Z|I2D`1K9&=dFb6VQT71bBvWYolu8N z+FNWP|KbdOyfI#7=$>cbY%b)N@$upT3+`XfO8!r;5B>iOGSal}uLv{Bk%)i*TKRc% zeFEE6cMUH0oYvfvMJt)Hx2Ll{PcFmzqNBm`81LDE3eV=5)^EF<@kx{9OXB4*o?uk7 zK1k{t71JQA&!TrgWZ?|P;G0<2NKcJc8b3G_4V9riX#e2?tl?j!LXNdvUc>I&jl*m5qBb1;bill}Df5Ph&q6Rp;extTPDOW_^AnQFmEi3dMY@d99XvruU7^9Lg zMZxNbK(NUKaCz+Dt{nQl6O2m03i>7Ah{B9JfMrwZ;+uNP9PZXFrk~5_-ff>2No5^} z2ju1%K^nB)Egvw{)Hr6X7VFLzvta>^VJ~!^A%e#>%YK2r#+5oOc=^UyUFu!TlFHI) zW>IOP`c@>Nb9h?~J7lcg7Ns6V52$kHQ-F|H5Y7q%cTwZj(4=UU>oT{JWh=34?7k7c z6%AOwMMr$1Tn15oa2h-aeu}>I9or!h9OhQX``EJwP#9UqeplvEGtRK3eO zI#u|;HyoDqpbCC<+T{I0;-9&WqVX+OrTi*elNb|RKl_{G^Zkz6ZHHgi)2H0~)BF8x zyk*E~sV@ghRcor;6wJ}cg4)W789gpS9o{H22yr6Ku}4?T;3RW%Jdc$iMfjsd02F!P z5-)uIanK;n{dH`HgzQb7y5#OtOzzzK%QnYDfnM+MJ1=8PllQKv_|YNwjx@9dPzDcn ztI-ZXS9TciWIWcA(!St>!D%vtqOjiu#5bWU$&W{^Pun2Tr5x$&3S>Pwh%X=|J-1n| zMrWV5nt^b({4rSeL#m}?M;{~jexY1pTS(+M;wX|e1=nc41J5RaU)NUpf4DgF1-Ryk z=0y8(Yya+*hXX^FcAXUU>JNde(JWL;kJ6<-Ua5I!1}B?RxrV}97FS!nr3a0C ztM3qJkrE&Z)*rOqcoF-P4WFEJPAF&=1?`0B)m9FBb!1_bmA=O{n?oh<$zCa%{UIsa z>wh`|cWP6dl2FhsIF={T&(OUQqC+JXxXhdzsSf)cccR=5%@0t1V%-czuL2yu_oOiN z-$yCOM1A&3wnJ8I5x*zbs%^_;Gf?wF7)wb3|BP+@Vp&8=XJ@0#RonPu|KUYw)FJr^ z`Nox2K0dz*<@6uF*3v{UpZdMuR%Q~{?Y9sEZ(Fc?vD%LM$2eoPYYzrSh1wTFYL(gG zA)3rbK(jJs!NlD3r~;mqeBv2OuxFm{urBUL$n83B#1`u$XMr>X+JHF3kEFUd9~i*i z5eKjkV~Q- zV#?8oJBjvE2v3}6k;BkB_O~Lo)#C1grJy)ptYGMJ*mooBwi)?KBHx}|1EdB$HnQ%k zJl77YA4_8v*Y(+_AGS|ohcVn!K(C5;_|P}4prCtOn#t}JX)kJ8UO;Q3Z`h3?FNtxyRlTA8?R23oOh77@8;tS;qBL z(LtZ?jm;k*0?5yqk>85?cJbFsH2+|ldiC9ak`dFe3+hX7-z_31aueQFoN_HZ20xes zmRf?k5o+!)mO&uXTCR={1@3HWEq`#?4!+++(g&>b3pDy(om{F|T!zRRGrMCLW~ZSN zv~xlKUB9^SPLqo|NPFx@VtTuf(`Z$nm8HAC4YZWn$YoxP{|n-H7@gaHu%0blwqauV zDonLi@=T=B>w2!@%^nK=&2Gy7}(vKc|h)utZV?>-U3KdsydTAe!jM zuj-VUV(T1Jw6sBK{|E$>F&8W6U&YRHq%)ujMZdTNS?Rxyb-*3&H~|QwMVB0{vsq#6 z&mEzu6Pg`lZ4j#}Eb*jW_!QMKfw)6_y!B)rR-_l${tlK@Sk5nMeHSiu-A|HhC2Huy zaWyATJ&M*YiL(!s6b#~~hNk^h#m5=k0Ju%5sd!z@>aNvwyQeM?6i;+hp+YS;_NtR?U_Zg)`k9-yD;(UE8p_w=ifR88AqXRm#_UY^VYPjY;%cR7yR2W1XPS>&!iMbB;@MGRxH^xz$|B(Hdv+dhFr z&UA5pS|8L)7vd6D_qG1y?~Le`xdKf2*NI%7AX0MnrbFnSiO31w#9`8PAgF0VbMp1_ zq1`1_F3nW0?tudwh&RM>1>_??&r$%4IP#9nIt2=%B;v>FBhI;(u}nfsCw)HLB5rpK z0YQntTBa~{dMy93=-5fHw!X2eNJMUIM}lyU-O_fc&(t_l9f%0#76@^-1Q5PlODAEp zbBY*X`}a&fCqdG-aKAB98HB)W`Mg!OG?Z9!JNume+27Yaaj0?U_M&vmlS5^y0}AkG z+JMI5oq$TOFUmdEb}Yf-HS_O^e7m;$hBw9_wbWUB-rMLLaXAk&4fsH`532?q2>bp5 z`xeTYE6hN*ryzekAa4~MdX(Vbd5(BH#tGGYs=2uKF`2ElSoWzJ#}a?vp>^WMPy&z@ zQ|}2V~9Xl7lxqz&epDX?WaDmR1IhZE&Shy|&p3fT%dstWh2#62xR{Ed>E@CfD1;DRv z5(n`)>HF5}nq2N&2w#EIoUo_$YZRCH@2PT-rRyJ5OVSxCnLb8Ix%jx#`t%XMLGOl= z1!uyGCmX#jiV##thYm%sXq~0}BT8ZrS6qY5Z%`OaK#L@SQHdt6KH&-8CWZF5BAT?h z@H_}9)T*JKv}lsrZeGv$jez~ZeG-KfWcH^*teySg^Tv@X0j8(*&E=&ZShtu7vBU8+ zlItKMH=70Hg}rRT*4;N}V2AZ=PR#%r-1qxQZVTcA$G#JoJfE*K@B^llM{+^4J{CJ+E$)n*ts9AQY$%}Gi{i>WTKb1x#{L$)yEJdH0{kKOl>z~! zfiie!rb+6!(vT)G+K!*g(7IFQUM398%)3iHJz7^Y8s@_n$Pm)y+!7oXKR_E0S5RoftxxHDgvLc~qq3vFmPbZoCe((RiRX`0cR)T7>W%W0%q+siP^s z*T4Q2k00p+soQ(EAJgKymtdZ55Br|E&B>cRRr$ZI=5Z8o`W`2#H61&qtF2-K z?U{5}wl%R{Jv^eA30{%e__{y3JP(4m?ubn z>;+7;xjCIKusJy2OLk=b=9KZN$J(a^j)`(yS%+#;`A(;WTzo4q_UAqKB{9hXYO*6$ zS5Ji}3+a|N{B(Wft^v0k1$z1AqvQfurxduB=8T)b5MqE_Hb!jdT-mV}tjr1feg`8V znWT2A@Iom!8cE4&O5GJpfe0W8gtl1GxzYsq#+d~9~qL=&OS(V!nEBm#ZpS4$G}f)_FkGZI0V@g$rfoy*gOwLVWq`EY=yDX2NBq;xfh< z8HMxzE~eobQ=)t=rhcE?xE)$Y_Wo(12G$KSWH|{uLjCRuEaN_xk~58@Gfe2icWxQ{ z@vL~***-$-UtSqIQa*$udXnQW$*CZafhQw&sPm1Flr+uRFhEUZFE#LglXQKx`uL5@ z>zkM>U!Hv&=m53LtAk%|Cf1R``2f5|Pu>`qmX1C1AMR#%$Q~2aPGHDKZ|+{V+v$a? z&%69y`QCl9zii+sW3MvOI~TRwe~h*cmrg!#Z{`%ywXi50NQY}^`N*&ko)4;eZ!3Etc7 zJm}5Hi2>MXDPjY%rxNn6nbrQY1w$dKUReQcVMXvBQ4`cF2QNGk|M;2(G=^heyolTxgU51@W)`Uq)|9#& zERU~ZJ0)b>?;a3{`+6@KJTRKuhJhy~q|UOX!L>vco^9i8<>}9X0O++5I!0V$xOQ8q zh)^=MLN27+974Q>4d>Y^7ZQ$AxM _w6-Iy>wn%=hgj6u-%ICE*rfC>j)-Q1xSo1+eaSfxmM)>3LKbr{EBK6@{=t+r$MY^!TRp)T!kd-xVv?M zM5(AB5qi#ZW=8r}Gb8R$*h?|JVeH3|B{g>+4lE$814g?%HtGm#N=J7NK9Zc39bJ7G zF-8AbNz|`%G|^$m=GrWO6i)=OScXqeO*`kp#3bwpEU`aR9T9k+L;vurg!#SUjOLomy-yL$i5I!swK^J(?qMQYIQ{Uq$L2~V*;$`nS7r_VXpoG* z5Efvf*zg+|YVmjO+{sVwsB<&sXQxwYC_dLNVK?(Jg8}xTJ}_o(vLoiBb0{nQ1Zvf+ zr$GyWCz`75MO6!tM7_-3+LbPqWT;QSTXXg~%fqCXi+L$WwX~csnH)Fuc=U|KmqhixDd(@~oU3XfbX_zHgEc2~DY+`4V z>gN7K@or(v9?qcUKTwWnGY|~cn^dhx>x@;h{BAwTRXEgaTr<(G*x=vquJ;y6X~IEV zGJ$JZLEH2SThGA*b$KdTI|heH`D2N%?}tDli;f;ad0hTV*!zRA<`*W5@39QX#Hq9@ zgwyThktB#asF3rOGvwjJ0iu0bYuH)B*OfpnOaV%>ZpDUf#T8KW7c)wC?b{-;fv>es zc)xfl=eHfIJoi4U#^i_t(?i4XLw-ZV4~=mnyxn(qcl~bo!HPx zPJz2qiDkUeMf3-|)&+$&>tabTW3kA^8!B^!DxZzO1te%QhvAyzt$Awvi{>h5OTQW# zLA=*JHzxx-^|*Y_Q(O>Vs3?^5XW#ujsec1jPddzlb*KU__2XOA97JGD&S zR?_o{xSV3CC)`?)T!RYzFo(DT&3=o!#VLUKUyxQn~jF z#2_nlgzGWd9J(}Kigwit^BrwkNpgO`lk~tK8bU7d_Z!HXj3tSk0(f)(;i2es^|~G_ z0mMNAX_ee?17ckEa>0~)bfv>xirVp%MSPBLl^i?RVaOm^rEs`%Wh#!$H2C3Kv{+oHq+Ybd^&zc^n1H!nJ{y7G$8YG(_ zF#c-D<=M+mi&C6EZa_cWM<6I-M%R(7zi7*U+z+`$r5!SHm!+)FK-KX((Rb@O>9_E8KC)uXdq0uq27Q@QedjiJZWZ$Q*G-h!8^J0 z$x+QFvTR~laWvucWY5=4-x_|C-RiaLVOic~0?rejZTG(IUXq+KY~qz1OSGB? zmGFd0!Wqv42g&b#!4p0&(H3mdDSSNjNIPX{baZzjYd9+=9(Cj`)uBKNw)eAr;N8X8 z%vyZN(F%pU`@H(f*{2kU*J?f0bXu$M=r49^yYPQ9`LGn-*g%Tt(pGt+{#7I0+;5k>`g4z{cY z>xW*j=ei-Y>R{#_U9 zsGE6uZs>0M`lru}8vBAzzQe;biZ7CEK>=xaf1f@Y{6JlnBX9iqm%TSjU%zgCdxFk{ zj|j>Aedr<#aKlkyI3Hzk#A+`BP;*+uP~KHa3q|JihOjI0?X z0dPc=DD_T9oe-naif)c&J)N-JRA*qTCqp=~a+S3~Qk6|#$5{Ll^Z#y*(DCD5XLk<_t^0ir z*;r|r^SG7wBEvdy^eEXleQwVp;j$f>zxw&5(yQ4i$dRyf`=U$tQ;g?#>S`&vyGGF&uLH_bTfweoDbTfxt!@QAww>y z+n;(t$&xe<2m?#r)TxS1c~DYyPQ8x)4eMG71k18#YfvR${>L=(!Bu(ONd0PelH^a| zVNrsEGw|pi#ugnw>%kzrlV4f+J4{hZ1d=HI2L}cQ@bb9Q;LVYHI8LxpB1J4wnC4v8 zS@^xHaOSJjNP8z#l=by>*)iN))O2j8wPu`lyc+MdZ!4QS5Qng<y!*O*R!Mfti!3Ltb^scWdd%SI4kN0ZR)7pP@I*uD2il zglMD76GAuQTfm8B&_(m#F))x^4GyoFsNKR7VcsN=S zfg&<&6?>K>VmKrA^XrZ)!{C7T_bN0aJ*O1t*aB(Neh(Jgd=Au&%HufE%P&BAXv+7H z1<7c4&f)0rM}yx)-K|Ht#k7U2MF$B`vtHO;YM=t@W}~kWe?b_z@R6YJ^>x}BaB^c` z)O*2Se|`*USv>e6BX&%~fIeWotMr9*K!1#ml_Jumim+9*S$WGuzZiwnlRY;HJQi#5 zyHBTmIp8Aok#SqHsfy0*aW}qTN_dF-@>}NQH9w3|uLMHu64z> zkM`Ui2bh<@TREpklgb!-Da}#O7{Q37Z0IN}4%t`j+C zO@XnN^FHgim%&``HJAt7A1(wL%q5FV8}K-1zj~W_dtG;~zreHxQWvC3#aHb6$^ncz zj;X=_U;D%>yayE|ytuF{?0`PQ4zgn(ZQRA4NEXh}IfAgaqZ#iLJrD$b^sC?- z99L*0n}grg7W&pL-sMC}-ly42-;qAM={M}<-gyyD`MoROB~#90yz}R*pRoN-Dpo_? z-YtPI_mQ`_m{Q{#d7LD85Kzs5g+@i}NpU35n9Q}rwp-ILyS;w-u=V9pL>IweOmyYJ zZo%QO#s~pUMBVFG4;aGYzIUjnJKHVHu(xnn6u8e3{KUD%1`94Z)Z6E3!i4ueLkEzt9S-Sr>Az=@560>TdQzx&h3LjJ_AS8cNziIa6U$oPGKf$;}S>js6`{omu*2^znIX#9r-!~(y{YlMNnM)yZ ztKsetFHDiC!{cK{M?emvPuh9oUp7(DraDV<=OQMbUoHM#V;1&K= zf0?cvU~fa1O6LhS%^rh*7k8b9u6%m-j)Lfora@YFv(KqIe51vU#N{-1- z8~4N|6Vy^WGo584Z!lp-i5_5C@UeG`H6DtoJ%mA}R-r*O*2EgRZOlJy26PFTcjdmn z+P?lR{nqeK_lXrSa*kqS4aolcSl4$fPy&TdB@l0ZdmQ8~=lQoq`EUxroZ9M*57X6G z^X@Es#v3ld4sh@0u~Vz2Rwyz<13NthX1N~rs-U9XOmPfNA`A3}afHu%5ttkB30VI2 z`@rbo!foJReg_BbXF}wL)|@<%ZDibRZ-8N(5D^g}jb;kLahB)%C|gCBiPB`sLYUK? zVnTkHlJ)D^t>P)1+H-Bly`t`^krZ^4vs1?mdG$OLIE@UcpO_;FWQ)}v%V{1TH@}W3 zyUyi)o2z8nYl$o{r_G&?vN@tsMALmoIsFrRnn>8IjM!;#KODBn8{tc6kN)u6mKE!9 z!UMAXTGTi$VP==<=rIYy&-Sw(O{6=k3CA0=+e3f-`gLV;vdD0w)T|t3Uf}#8Mjk0h zQyIO>M8B)T#SbnzpKfzpFTZWY0h-&xh)C33#uNxd@;B`oC|`_$Q72yeqj>qHF+NXzB^@Tm!1Rb$PEp?q^EV2`uX4HHkh1nn@jZxM2fC?2 zIL;58GY#z=qVRX9Sjie+?2U0WO_W+#Se%9(jB?2l4Jpe*@bzp}Rn>fgvBJ0QzcQ-! z{0J#T%lIn5@+cK^i8wV4uJ3rTjc-sA-t1uQn08oA8twB$E#be=@hD?%n_`w5t09Gj zg~m|AeohnE>UsXd1QO*0i4Ch_!yL_MM)C@$ZJv|G9Xt`oSwYBUh`(5HFqktX&?PCs zuJI8TcH@&cPs?A@u$n91=h!7O!N=ro_V?HR1(sq5&y>C!OnUZ0FlYi)N+qk7E6I{pbOLA4#L?S z>nWXqiyMdVOj>zgX~JGQT)ILN^7B8+r6=DoMVt$JrMk&Z?$A5)3nI-_Lr}uqIu0KV z+Qqe6jD04WBBse%WvJK2ET2sx171IAU*C~NM+dhS@H$dokM5pcUz(c>zjd-r*;Qlf zgheDp_lub+&a{n!%RZEddVubF78e%-V&_<-X$+||AR(Zqe7nMv8u24RKJ7;uv0MLD zok`)_e z`t$JRj*|hc(`2-#M}T!UBm8E@C!V`3o>36E8~sR@U{L$|0hfV4Zt1ru>-gaqx$AaO zt(Jm%B~t8%h?3n))aRS3jv>BR?#1CeQwUrA$CA!+Ho`9uF*_#!YC{z-k7BXMIz?UOvkcdASW9Qg6HtgU6E64fMw1OIfVFmzBI zpo+=|ZqmvoZsjv^gi-xF+$y(0?m^sy82c7T=1)CAU|#u-bt}cZB`ltHe`){yp!4mO zC%`EwAPZC)54Y4>t&*9qD&v5ZpiQriq_vvyLtE0x>^moWkER-%(jQ69k|j^&Pj>lo zl&K}7-@r#5`$(p>TAW)<9eJTOLV_z0Hvpd0?2grAt2#~gZj)f}`J4W&b(V23XsM0;nJSNasy&;v zA&}3$&Vu}mUjF%U%1;8)1#GSyg;$=&lrQ+o)kZaH_2#Z++4~H1E#j4q5h9!*a-cyk zTSP~Ym4XNZK>4H!^@gDDQl96z&1~S#rTsr{eL!(ISsP3-mrnN^)Jh@mt{d1n@mFi) zLq?j0{{89)S%%h^QDjO6c3EWF+Lg+7(j$~#JTggM`mJ<7akI%UAl{V}@T(3r}B589uQBY)|aT ztL7w#0xgxE2v;H~{V5tMR6iRgZtj^apj2#Tl<-y|XmG%MS}I03-=U6$dx8E_yGulx zP|zSdNsk&~coN4SPYVsN4 zN|HZ*`Qf#9PJr{v*(Z`Ko7*nmHW*E8d@J8>R#MxHvmn=s2pae#03=?Bd=wuu3-Uk@q76zG2n7 zxKsx8=E0A5Ij@BMaGomVW71$twMH_rR@_9sk7>09yNy zIL$_Cw|&>Buf3J$afIKNQzhp>9aWt6l3mky5nufa?G5tK4i@z2kcQAO24 zbHb@R&8B3+bw=9oWC2ny*P0QA==~`#BcQ+lpUoeqqNR|-H4^+<(oDJQ!#BrhI z9$c7=Oa-P@mbS|6Wtrag_VYz0B_h-Y2{H@-SS4Jy ztDUb{Txm)Ko2qvLHLR>0ZDUwBZYP>!j&L0Z3 zcs=E7cmvLNz<}@lVU~=WS;4lu*mgaMU!PNKQGbuMbh4(9L-E6imXK$kxJ2+I^r<4u{4d^MmWwlm z26JC;M+KZk$><}O!xA5DCc|jbPRC~?X7J#GnApZ$n51D3tjW9k0`W$NOX2Q!bqJ2} z!C=DTmF?9WhRt}8ca_I=1uwJ%#&*Zetx6GjaeZP`tW(1Oard<5;@sTOH%T#$$9y5z z^=SK2qTMt_xQikrZ#GYJlH@M^ZkRpF+7Lf^J93q6`rBMCp59V0NnK%_y%&)D}(da5o z#9ZD}%lH&>=Hi9wq&oLF{MvIh4k7BAT6JhgJXF@9Q``MrU(9to@>%gZ*b@i5sjT#o zFP8UWHE%nyath(uv$Z-GP)Y=T^gI$*&Oe{_l0k@NWE5t4Gc#M7Q2#p_p8riIPx569 zBeY{|w^L*_DQ%~9^djeDR3QAA+BH4e4 zVL(2$v;Oo;#z}ybEH{ZK{erNwMm`46^L!*dSPm!0$r(8L!dnd z_H)EC5Pe-=;nh#{@>PR5$#nUTp4@3-p6lsXR_qa;O7lC0FJqgVmO`3FLSKN3l09hA z)VymLMEQBd_nI0A?15)Er|h`+$S>>V8LZw10HYqtI5pxswY<~=T)^emy`^ivevw_x zYz3A=gfC*Lty8no=` znvG!motqpntTCDFN^96?SLuFgnl)MW3@P3%-V4aP^!j%E8LmQ7{`5Q!LoV6(<}m!)QuKD}CxcpH4 z$FOC6F<^@4lgV0K&OFly&_TK+qRdNMi~_o+SE@4v11G=9<*uW|QIaAJAkX`x5M z+;HmZn$*(p<&!hYJ)SR|Bb>c9tl3ZxZZC#w41fx0mDpYu4?g}9mRLvo&nUJ$y)iVe z)A66{@6r)7$_tmNL?T672^#5n2V$l6K`>}pXS^8Un;c=UGrxiNCY;p=v- z*UcUe31axbmLpY-dYkf3v1<*sUk}!0uOJQ87|3d+Z4dw!>e)eic1_BxH$oynV)JNCO?v(b?X)pA2Nh zLf-g2&e^mNd#bw0i5%jGuGMs|Fe2(SNVC3iGkNWe&iEf_9_g5nGGFXZehRVAI}nz- zdL2T7>w6u{5^r|8tgo<_y1|P2AmX!Jq45c)Yo1-Pc0x5y57WAv-fJ(eW@ZC!Yb`}1 zX7g`Bd(J`HNbzltS{}<}u$u;ijFl=X(mM5wFSv~ZVA*}W*Ycc<*syf9Ao+ov5AMbZ zDxCX9EMXAu?p%Xki|IMju@>=Uu)*qKxg63Z7Bx<3x6oX!_S633)PS0qBQlusDu|4R zIIIweRM~=gUzJAFN;R*r@$u)>>N}u7$usk;&$D#1UK9uB{HOPu(w@Zbr}9iphT%Uix!DUllv?7#fvkOK0Jq9G{N2azMyF0Afi zky|PKga02}-yKhN|NeiHLWy&zC}fkJWN!{~Y%;PcD&rVg*`%mrXOq=J#vyUCM`p6K z$}C$}LS+7~)93ztzu(W}_qqSO@4Nd}@7Mc%y{_wdJ;zt?Td}Dko1sW~)3i4)yeJBmR!bMjV}3`B;xsM_UGeIQVR&o&^#=% zulH8m(^#13+$$i^$ZgJ>$rw@7XFjM)HD0#Z@?U0wYvmHB~ z4KXm}f^wQ2C~7Ydmn^L==N_r2OVD3iCG2q4$DDr%mrxGN{_Bs@F3xuUOo5ZB6B-_d2Jg4cHujfYEI2CPjpd>AbJg z8q*u8$&jcvriZC$JAMW_ur3b~^8=)hiN zb#z|p#jF5%rnuxcI~1%dqfU?4|Ga+LzNK<2Q+?%o?W&MU)9T~Z{bDcE7;^u~RsV-qYp$F*_i2nXtJ>4u z{Yuq@Jm{Ry+U5bXion($b?Gz?BRxpxxq3nueQlIB1O}A^?a*{Q1`BIJ%>C<@^XlJ@BFV;3xGgMXyKjsZX zuLka4!|oTF#)2b(z<&g6#Q!B3ch0TrsKp*84f;qE;du0pp0WMJkSX(Me7M8&*TAid z#VEsVP5W8O0J|S@9Fqj&m4FH$ubJ|ddgwbvFx+@3WHs3DM3`aiUSVuVEuAYK1_5Ee z+N<&LsV#JS>zTvdyJwBc`g1>q-ytzXJ^#Vp%+SWc)^7ac3oLVrkZbs?&?7A2xVrNY z@^u$VJ{PBdKISQzs0@*_r`V*ULaWj=1T{Xek-MAXau8T@?;bd#)=u?a0Y1mR;>lI( zrGdbaHbRl>!&6f5!zFlD<$6*$!VZ9Pl4tBxTyx! zXWw8dJjX?j53|-PYa$iP<04{WzuRkT<(LsCX1WqN^0IyJyuhVUx?Fw0NaxPL+O&mS z;~nxiWJ>2_RO^1xlBp8nNQnPM-|BLe!`$Q5mwY4q@ZGh^W^DTzdFp>PaF7QhXH;FZ zcOCJCmurX1GV>Z{?7F&@BC^yBD+K;*Oy|V))Nx`eP@2p^_~G}s+%`mbS|-O ztyxj#6>3nePOJK3lZ7b0%ZK5n^#c^mlbs{JQXmA?n*7__N+RSo{#3t#ps z5>|x5%o7OS83%83$9X{&+ow0Fe%O$P(TRK$wEA2`O;~s z!THS+g!IE6W73}@zwaJU;I4{4<2sMnGvyI&`}%g&Ycv{Q=s#M|H~f{O(u7&RZb2$) ze3egSC?Hc6fxRx%-aIp4`YzjxZFFtCSI5Qu76{9lW@Zc(hH8h$E%M@}irbP}7DR$1 zxuJ7&ZHNn41m1OZqZ0LJA}_)KcEXFOm^~sklnd_&ebX3EL>iKPD#_1{UmcoEtO8P7}~A#u2HghWEuf(U2{ zvvFD0nPBM#cB}I>J~IYWGyzx6ldVEB(UMC|bI3!4GK}I1Nzg#Pah(JFMLVPg*KtGd zcSh56g@)T#L1_<0WovlPe|$s zSwrERw+oFidn&*0{hJHGBt@MlGpBK>rKi!|=S{6Tw6q#$g)C(x=G0xGr#nUgEk%?3EM6WcVfYC~rX+}Fkr(Zal^8hAqU)FJ@(TIT z{65BU`O6oRyI`&y==5Mi;uu#?DL~}DEPg##ijRZ5D^NnV+m{o;e@3ZCnb{)ek|$pMZNFrl32P`rl;!NWk8-^;iGWXNR5P4$8ie86Ber*OP-zV;8Z1>*BLUg#w-~2 z9=wI+->CL5-k~A=a4x(CRC?&>qwNziCDGb>rEo7|&a<0^ zJcC!NxvsnvgWd~TtYj{@GXTg<$o~y!eHL2}7M3SJFSwU(^puz`(w(=a;!EtU;d=LG zv2+kHP${AjoiT2E(CZ?Rhhnkg(nic^?If-+Cl`iPa>hm(FtNd7`k%ys2~yP=@hFF= z!u$XCo~f5e1o>KesL?yu??==n_dteXvFhESmjbcCCjitGeDL%^+X4D0Nds>;Fk8M?Y@s=L(@%vI>*jC9^1q<~l{f2}d`=7Nf^uq{6rKeh^ya}HZB#K41 z^(AY(H34kxK8i@V!|aT>_eei1|7zEi^|+=6P;*3>1iA=TcCxKg1d@ri5tpcH9UwJ=DE_zKO07i1XZ&JCwZ8Z{gzRPG%(+~w+whh9eP z%Y^=?l-0It_ctPhH)<3g{w6LNwHPGxoZvXlGf~65^bZ&IS%QMeyK z1KpEqa}kP#tiC7iLE6<#oryh8#OV`_d; zA4pA!SYsYaAgVB3WuVPQso_z#S1S-K6Pkb3%g5=D7vE}p+=|J11lybdeGIRFIgK^* z8$xaFuv^#GeilauRqMn%;K;oCJ&Y|nyv7jSN�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 }S^MoC#+Ce)xV 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 literal 0 HcmV?d00001 diff --git a/python/pyproject.toml b/python/pyproject.toml index 4107a38..57a9552 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -13,6 +13,12 @@ classifiers = [ "Operating System :: OS Independent", "Private :: Do Not Upload" # Currently just for local + cluster packaging. Publish once evals are in ] +dependencies = [ + "dapr", + "dapr-ext-fastapi", + "dapr-ext-workflow", + "mlflow-skinny" +] [project.scripts] mindctrl = "mindctrl.cli:cli" diff --git a/python/src/mindctrl/config.py b/python/src/mindctrl/config.py index 290eb4b..26bffce 100644 --- a/python/src/mindctrl/config.py +++ b/python/src/mindctrl/config.py @@ -4,8 +4,8 @@ # this is just to make settings typing happy - I don't have another implementation yet -class UnknownEventsSettings(BaseModel): - events_type: Literal["unknown"] +class DisabledEventsSettings(BaseModel): + events_type: Literal["none"] class MqttEventsSettings(BaseModel): @@ -28,18 +28,18 @@ class PostgresStoreSettings(BaseModel): # Just to make typing happy for now - add dapr, sqlite, etc -class UnknownStoreSettings(BaseModel): - store_type: Literal["unknown"] +class DisabledStoreSettings(BaseModel): + store_type: Literal["none"] class AppSettings(BaseSettings): # double underscore, in case your font doesn't make it clear model_config = SettingsConfigDict(env_nested_delimiter="__") - store: Union[PostgresStoreSettings, UnknownStoreSettings] = Field( + store: Union[PostgresStoreSettings, DisabledStoreSettings] = Field( discriminator="store_type" ) - events: Union[MqttEventsSettings, UnknownEventsSettings] = Field( + events: Union[MqttEventsSettings, DisabledEventsSettings] = Field( discriminator="events_type" ) # TODO: move this into the gateway or something diff --git a/python/src/mindctrl/const.py b/python/src/mindctrl/const.py index 0a7b8d7..01936c8 100644 --- a/python/src/mindctrl/const.py +++ b/python/src/mindctrl/const.py @@ -15,3 +15,7 @@ ## Computed BASE_DIR = Path(__file__).parent.resolve() TEMPLATES_DIR = BASE_DIR / "templates" + + +## Events +STOP_DEPLOYED_MODEL = "stop_deployed_model" diff --git a/python/src/mindctrl/db/setup.py b/python/src/mindctrl/db/setup.py index 2baa6fc..b5043ca 100644 --- a/python/src/mindctrl/db/setup.py +++ b/python/src/mindctrl/db/setup.py @@ -100,3 +100,9 @@ async def insert_summary( ) await conn.commit() _LOGGER.info(f"Inserted summary with {len(state_ring_buffer)} events") + + +async def insert_summary_dummy( + state_ring_buffer: collections.deque[dict], +): + _LOGGER.info(f"Inserting null summary for {len(state_ring_buffer)} events") diff --git a/python/src/mindctrl/homeassistant/client.py b/python/src/mindctrl/homeassistant/client.py index 621221a..daee101 100644 --- a/python/src/mindctrl/homeassistant/client.py +++ b/python/src/mindctrl/homeassistant/client.py @@ -150,9 +150,7 @@ async def list_automations(self) -> list[Automation]: entities = await self.list_entities() _logger.debug(entities) automation_entities = [ - entity - for entity in entities - if entity["platform"] == "automation" + entity for entity in entities if entity["platform"] == "automation" ] _logger.info(f"Fetching {len(automation_entities)} automations") diff --git a/python/src/mindctrl/main.py b/python/src/mindctrl/main.py index e6a48d0..7c7b06b 100644 --- a/python/src/mindctrl/main.py +++ b/python/src/mindctrl/main.py @@ -18,7 +18,7 @@ from .mlmodels import log_system_models from .mqtt import setup_mqtt_client, listen_to_mqtt from .mlflow_bridge import connect_to_mlflow, poll_registry -from .db.setup import setup_db, insert_summary +from .db.setup import setup_db, insert_summary, insert_summary_dummy from .config import AppSettings from .routers import deployed_models, info, ui from .routers.ui import templates @@ -55,23 +55,23 @@ async def lifespan(app: FastAPI): state_ring_buffer: collections.deque[dict] = collections.deque(maxlen=20) _logger.info("Setting up DB") # TODO: convert to ABC with a common interface - if not app_settings.store.store_type == "psql": - raise ValueError(f"unknown store type: {app_settings.store.store_type}") - engine = await setup_db(app_settings.store) - insert_summary_partial = partial( - insert_summary, engine, app_settings.include_challenger_models - ) + if app_settings.store.store_type == "psql": + engine = await setup_db(app_settings.store) + insert_summary_partial = partial( + insert_summary, engine, app_settings.include_challenger_models + ) + if app_settings.store.store_type == "none": + insert_summary_partial = insert_summary_dummy _logger.info("Setting up MQTT") - if not app_settings.events.events_type == "mqtt": - raise ValueError(f"unknown events type: {app_settings.events.events_type}") - - mqtt_client = setup_mqtt_client(app_settings.events) - loop = asyncio.get_event_loop() - _logger.info("Starting MQTT listener") - mqtt_listener_task = loop.create_task( - listen_to_mqtt(mqtt_client, state_ring_buffer, insert_summary_partial) - ) + mqtt_listener_task = None + if app_settings.events.events_type == "mqtt": + mqtt_client = setup_mqtt_client(app_settings.events) + loop = asyncio.get_event_loop() + _logger.info("Starting MQTT listener") + mqtt_listener_task = loop.create_task( + listen_to_mqtt(mqtt_client, state_ring_buffer, insert_summary_partial) + ) _logger.info("Logging models") loaded_models = log_system_models(app_settings.force_publish_models) @@ -87,14 +87,18 @@ async def lifespan(app: FastAPI): "database_engine": engine, } - # Cancel the task - mqtt_listener_task.cancel() - # Wait for the task to be cancelled - try: - await mqtt_listener_task - except asyncio.CancelledError: - pass - await engine.dispose() + # TODO: Once the above is moved into an ABC make it a context manager + if app_settings.events.events_type == "mqtt" and mqtt_listener_task: + # Cancel the task + mqtt_listener_task.cancel() + # Wait for the task to be cancelled + try: + await mqtt_listener_task + except asyncio.CancelledError: + pass + + if app_settings.store.store_type == "psql": + await engine.dispose() app = FastAPI(lifespan=lifespan) diff --git a/python/src/mindctrl/mlmodels.py b/python/src/mindctrl/mlmodels.py index fbc18bc..2f4b5ae 100644 --- a/python/src/mindctrl/mlmodels.py +++ b/python/src/mindctrl/mlmodels.py @@ -1,14 +1,16 @@ +from dataclasses import dataclass import logging -from typing import Tuple +from typing import Optional, Tuple import mlflow import openai from mlflow.entities.model_registry import RegisteredModel +from mlflow.utils.proto_json_utils import dataframe_from_parsed_json from mlflow import MlflowClient from .openai_deployment import log_model -from .const import CHALLENGER_ALIAS, CHAMPION_ALIAS +from .const import CHALLENGER_ALIAS, CHAMPION_ALIAS, SCENARIO_NAME_PARAM _logger = logging.getLogger(__name__) @@ -186,3 +188,39 @@ def embed_summary(summary: str) -> list[float]: model = mlflow.sentence_transformers.load_model("models:/localembeddings/latest") # return model.predict(summary) return model.encode(summary).tolist() + + +@dataclass +class ModelInvocation: + model_uri: str + payload: dict + scenario_name: Optional[str] + input_variables: dict[str, str] + + +def invoke_model_impl( + model: mlflow.pyfunc.PyFuncModel, + payload: dict, + scenario_name: Optional[str], + input_variables: dict[str, str], +): + # TODO: need a better api for this from mlflow. + # predict() has expensive side effects so shouldn't simply catch invalid_params + model_has_params = hasattr(model.metadata, "get_params_schema") + params = None + if scenario_name: + _logger.info(f"Scenario: {scenario_name}") + if not model_has_params: + _logger.warning( + f"Model {model.metadata} does not have params schema, ignoring scenario header" + ) + else: + _logger.info( + f"Model has params schema: {model.metadata.get_params_schema()}" + ) + params = {SCENARIO_NAME_PARAM: scenario_name} + input = dataframe_from_parsed_json(payload["dataframe_split"], "split") + for key, value in input_variables.items(): + _logger.debug(f"Setting input variable {key}") + input[key] = value + return model.predict(input, params=params) diff --git a/python/src/mindctrl/routers/deployed_models.py b/python/src/mindctrl/routers/deployed_models.py index 825dd3e..66cd6a3 100644 --- a/python/src/mindctrl/routers/deployed_models.py +++ b/python/src/mindctrl/routers/deployed_models.py @@ -2,10 +2,13 @@ import logging from fastapi import APIRouter, Request, HTTPException import mlflow -from mlflow.utils.proto_json_utils import dataframe_from_parsed_json -from mindctrl.const import SCENARIO_NAME_HEADER, SCENARIO_NAME_PARAM -from mindctrl.mlmodels import SUMMARIZATION_PROMPT, SUMMARIZER_OAI_MODEL +from mindctrl.const import SCENARIO_NAME_HEADER +from mindctrl.mlmodels import ( + SUMMARIZATION_PROMPT, + SUMMARIZER_OAI_MODEL, + invoke_model_impl, +) router = APIRouter(prefix="/deployed-models", tags=["deployed_models"]) @@ -30,7 +33,7 @@ # return langchain.run(relevant_events, query) -def generate_state_lines(buffer: collections.deque): +def generate_state_lines(buffer: collections.deque) -> str: # TODO: when I get internet see if RAG framework already has a known technique to deal with context chunking import tiktoken @@ -61,28 +64,16 @@ def generate_state_lines(buffer: collections.deque): return state_lines -def invoke_model_impl( - model: mlflow.pyfunc.PyFuncModel, payload: dict, request: Request -): +def invoke_model(model: mlflow.pyfunc.PyFuncModel, payload: dict, request: Request): scenario_name = request.headers.get(SCENARIO_NAME_HEADER) - # TODO: need a better api for this from mlflow. - # predict() has expensive side effects so shouldn't simply catch invalid_params - model_has_params = hasattr(model.metadata, "get_params_schema") - params = None - if scenario_name: - _logger.info(f"Scenario: {scenario_name}") - if not model_has_params: - _logger.warning( - f"Model {model.metadata} does not have params schema, ignoring scenario header" - ) - else: - _logger.info( - f"Model has params schema: {model.metadata.get_params_schema()}" - ) - params = {SCENARIO_NAME_PARAM: scenario_name} - input = dataframe_from_parsed_json(payload["dataframe_split"], "split") - input["state_lines"] = generate_state_lines(request.state.state_ring_buffer) - return model.predict(input, params=params) + return invoke_model_impl( + model, + payload, + scenario_name=scenario_name, + input_variables={ + "state_lines": generate_state_lines(request.state.state_ring_buffer) + }, + ) # This logic is obviously wrong, stub impl @@ -119,7 +110,7 @@ def invoke_labeled_model_version( raise HTTPException(status_code=500, detail=f"Error loading model: {e}") from e try: - return invoke_model_impl(model, payload, request) + return invoke_model(model, payload, request) except Exception as e: _logger.error(f"Error invoking model: {e}") raise HTTPException(status_code=500, detail=f"Error invoking model: {e}") from e diff --git a/python/src/mindctrl/workflows/__init__.py b/python/src/mindctrl/workflows/__init__.py new file mode 100644 index 0000000..716ea8d --- /dev/null +++ b/python/src/mindctrl/workflows/__init__.py @@ -0,0 +1,52 @@ +# https://github.com/dapr/python-sdk/blob/main/examples/demo_workflow/app.py#LL40C1-L43C59 + +import logging +from typing import Optional + +from dapr.ext.workflow import ( + WorkflowRuntime, +) + +from .agent import append_message, invoke_model, conversation_turn_workflow +from .deployer import ( + stop_model_monitor, + wait_for_model_serve, + check_deployment_status, + deploy_model_workflow, + stop_model, + serve_model, +) + +_logger = logging.getLogger(__name__) + + +class WorkflowContext: + def __init__(self, port: Optional[str] = None): + _logger.info("Initializing WorkflowContext") + self.workflow_runtime = WorkflowRuntime(port=port) + self._register_turn_workflow() + self._register_deployer_workflow() + + def __enter__(self): + self.workflow_runtime.start() + return self.workflow_runtime + + def __exit__(self, exc_type, exc_value, traceback): + self.workflow_runtime.shutdown() + + def _register_turn_workflow(self): + _logger.info("Registering turn workflow") + self.workflow_runtime.register_workflow(conversation_turn_workflow) + _logger.info("Registering activities") + self.workflow_runtime.register_activity(append_message) + self.workflow_runtime.register_activity(invoke_model) + + def _register_deployer_workflow(self): + _logger.info("Registering deployer workflows") + self.workflow_runtime.register_workflow(deploy_model_workflow) + self.workflow_runtime.register_workflow(check_deployment_status) + _logger.info("Registering activities") + self.workflow_runtime.register_activity(wait_for_model_serve) + self.workflow_runtime.register_activity(serve_model) + self.workflow_runtime.register_activity(stop_model) + self.workflow_runtime.register_activity(stop_model_monitor) diff --git a/python/src/mindctrl/workflows/agent.py b/python/src/mindctrl/workflows/agent.py new file mode 100644 index 0000000..a1f13e2 --- /dev/null +++ b/python/src/mindctrl/workflows/agent.py @@ -0,0 +1,94 @@ +import logging + +from pydantic import BaseModel + +from dapr.clients import DaprClient +from dapr.ext.workflow import ( + DaprWorkflowContext, + WorkflowActivityContext, +) + +from mindctrl.mlmodels import invoke_model_impl, ModelInvocation + +_logger = logging.getLogger(__name__) + + +# TODO: unify with the monkeypatch of deploymentserver for tool calling? +class Message(BaseModel): + content: str + role: str + + +class Conversation(BaseModel): + messages: list[Message] + + +def append_message(ctx: WorkflowActivityContext, message_json: str): + _logger.info(f"Received message: {message_json}") + # Moving pydantic away from the signature because it's not json.dumps-able + # TODO: file a bug on durabletask.internal.shared.py + message = Message.model_validate_json(message_json) + # This is where we do some fun memory tricks like compression, embedding, windowing etc + # TODO: Dapr + async def activities? + with DaprClient() as d: + store_name = "daprstore" + convo_id = f"convo-{ctx.workflow_id}" + current_convo = d.get_state(store_name=store_name, key=convo_id) + # TODO: Handle etags + convo = Conversation(messages=[]) + if current_convo.data: + convo = Conversation.model_validate_json(current_convo.data) + convo.messages.append(message) + conversation_length = len(convo.messages) + d.save_state(store_name, convo_id, convo.model_dump_json()) + return conversation_length + + +def invoke_model( + ctx: WorkflowActivityContext, input: ModelInvocation +) -> dict[str, str]: + # TODO: Handle more complex responses + _logger.info(f"Invoking model with input: {input}") + import mlflow.pyfunc + + model = mlflow.pyfunc.load_model(input.model_uri) + response_message = invoke_model_impl( + model, input.payload, input.scenario_name, input.input_variables + )[0] + return {"content": response_message, "role": "assistant"} + + +def conversation_turn_workflow(ctx: DaprWorkflowContext, input: ModelInvocation): + # This workflow handles a conversation between a user and LLM. It will receive a message from the user, and then + # respond with a message from LLM. This will continue until the user sends a message that ends the conversation. + # The conversation will be stored in the state store, so that it can be resumed later. + + _logger.info(f"{input}") + + # 1. Activity: Append message to conversation history, return conversation position + # 2. Activity: Input conversation position, Fetch conversation history, Invoke model, return response + # 3. Activity: Append response to conversation history, return conversation position + + # TODO: this is wrong, get a real message structure for chat models + message = Message(content=str(input.payload), role="user") + conversation_status: int = yield ctx.call_activity( + append_message, input=message.model_dump_json() + ) + _logger.info(f"Conversation turn: {conversation_status}") + response: dict[str, str] = yield ctx.call_activity(invoke_model, input=input) + # if tool call + # messages.append(response.choices[0].message) + # then yield ctx.call_activity(invoke_tool, input=response.choices[0].tool) + # messages.append( + # { + # "role": "function", + # "name": function_name, + # "content": str(function_response), + # } + # ) + # messages + + response_message = Message(**response) + conversation_status = yield ctx.call_activity( + append_message, input=response_message.model_dump_json() + ) diff --git a/python/src/mindctrl/workflows/deployer.py b/python/src/mindctrl/workflows/deployer.py new file mode 100644 index 0000000..752eee8 --- /dev/null +++ b/python/src/mindctrl/workflows/deployer.py @@ -0,0 +1,148 @@ +from dataclasses import dataclass +from datetime import timedelta +import logging +import subprocess + + +from dapr.clients import DaprClient +from dapr.ext.workflow import DaprWorkflowContext, WorkflowActivityContext, RetryPolicy +from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient + +from mindctrl.const import STOP_DEPLOYED_MODEL + + +_logger = logging.getLogger(__name__) + + +def model_uri_to_app_id(model_uri: str) -> str: + return model_uri.replace("/", "_").replace(":", "") + + +@dataclass +class ModelServeCommand: + model_uri: str + port: int + pid: int + is_healthy: bool + app_id: str + + +# TODO: Kubernetes workflow needs kaniko version of this: +# https://github.com/mlflow/mlflow/blob/master/mlflow/models/python_api.py#L79 +def serve_model(ctx: WorkflowActivityContext, model_serve_command: ModelServeCommand): + # This activity serves a model from a local path + if model_serve_command.pid >= 0: + raise ValueError( + f"Model {model_serve_command.model_uri} is already being served by {model_serve_command.pid}" + ) + app_id = model_uri_to_app_id(model_serve_command.model_uri) + _logger.info(f"Starting serving model as dapr app {app_id}") + proc = subprocess.Popen( + [ + "dapr", + "run", + "--app-id", + app_id, + "--app-port", + str(model_serve_command.port), + "--", + "mlflow", + "models", + "serve", + "-m", + model_serve_command.model_uri, + "--port", + str(model_serve_command.port), + "--no-conda", # TODO: Add uv env build + ] + ) + return ModelServeCommand( + model_uri=model_serve_command.model_uri, + pid=proc.pid, + port=model_serve_command.port, + is_healthy=False, + app_id=app_id, + ) + + +def stop_model(ctx: WorkflowActivityContext, model_serve_command: ModelServeCommand): + _logger.info(f"Stopping Model serve {model_serve_command.app_id}") + subprocess.run(["dapr", "stop", "--app-id", model_serve_command.app_id], check=True) + + +def stop_model_monitor(ctx: WorkflowActivityContext, child_workflow_id: str): + _logger.info(f"Stopping monitor: {child_workflow_id}") + wf_client = DaprWorkflowClient() + wf_client.terminate_workflow(child_workflow_id) + + +def wait_for_model_serve( + ctx: WorkflowActivityContext, model_serve_command: ModelServeCommand +) -> ModelServeCommand: + # TODO: Check if the process is still running via Dapr API + # TODO: Store the app id in the model serve command + is_healthy = False + try: + with DaprClient() as d: + resp = d.invoke_method(model_serve_command.app_id, "health") + if resp.status_code != 200: + raise Exception(f"Model serve failed to start: {resp.text}") + is_healthy = True + except Exception as e: + _logger.warning(f"Error checking health: {e}") + + return ModelServeCommand( + model_serve_command.model_uri, + model_serve_command.port, + model_serve_command.pid, + is_healthy=is_healthy, + app_id=model_serve_command.app_id, + ) + + +deployment_retry_policy = RetryPolicy( + first_retry_interval=timedelta(seconds=30), + max_number_of_attempts=3, + backoff_coefficient=2, + max_retry_interval=timedelta(seconds=60), + retry_timeout=timedelta(seconds=180), +) + + +def check_deployment_status( + ctx: DaprWorkflowContext, model_serve_command: ModelServeCommand +): + model_serve_command = yield ctx.call_activity( + wait_for_model_serve, + input=model_serve_command, + retry_policy=deployment_retry_policy, + ) + + check_interval = 60 if model_serve_command.is_healthy else 5 + yield ctx.create_timer(fire_at=timedelta(seconds=check_interval)) + + ctx.continue_as_new(model_serve_command) + + +def deploy_model_workflow( + ctx: DaprWorkflowContext, model_serve_command: ModelServeCommand +): + if not ctx.is_replaying: + _logger.info( + f"Starting model deployment workflow for {model_serve_command.model_uri}" + ) + model_serve_command = yield ctx.call_activity( + serve_model, input=model_serve_command + ) + monitor_id = f"{ctx.instance_id}-monitor" + ctx.call_child_workflow( + check_deployment_status, + input=model_serve_command, + instance_id=monitor_id, + ) + # We want to perform custom termination actions, so don't rely on dapr workflow termination + yield ctx.wait_for_external_event(STOP_DEPLOYED_MODEL) + _logger.info("Received stop event") + yield ctx.call_activity(stop_model_monitor, input=monitor_id) + _logger.info("Stopped monitor") + yield ctx.call_activity(stop_model, input=model_serve_command) diff --git a/python/tests/test_hass_api.py b/python/tests/test_hass_api.py index 601f29d..24a868a 100644 --- a/python/tests/test_hass_api.py +++ b/python/tests/test_hass_api.py @@ -147,7 +147,7 @@ async def test_list_automations(hass_ws_session): if entity["platform"] == "automation" ] _logger.info(automations) - assert len(automations) >= 0 # yes what a useless assertion + assert len(automations) >= 0 # yes what a useless assertion async def test_list_areas(hass_ws_session): diff --git a/python/tests/test_hass_client.py b/python/tests/test_hass_client.py index 2d88e16..2d66289 100644 --- a/python/tests/test_hass_client.py +++ b/python/tests/test_hass_client.py @@ -62,7 +62,11 @@ async def test_automation_autotag(hass_client, request): test_label_name = f"{request.node.name}-label" create_new_labels = [ CreateLabel( - id=1, name=test_label_name, color="indigo", icon="mdi:account", description=None + id=1, + name=test_label_name, + color="indigo", + icon="mdi:account", + description=None, ) ] for label in create_new_labels: @@ -73,7 +77,9 @@ async def test_automation_autotag(hass_client, request): # _logger.info(f"Adding label {test_label_name} to {automation.id}") # await hass_client.add_labels(automation.id, [test_label_name]) - await hass_client.add_labels(f"automation.{test_automation_name}", [test_label_name]) + await hass_client.add_labels( + f"automation.{test_automation_name}", [test_label_name] + ) entities = await hass_client.list_entities() automations = [e for e in entities if e["platform"] == "automation"] diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py new file mode 100644 index 0000000..5a38b8d --- /dev/null +++ b/python/tests/test_workflows.py @@ -0,0 +1,340 @@ +import atexit +from dataclasses import dataclass +import json +import logging +import os +from pathlib import Path +from typing import Any, Optional +import httpx +import pytest +import subprocess +import time + +from durabletask.client import OrchestrationState +from dapr.conf import settings +from dapr.clients import DaprClient +from dapr.ext.workflow.workflow_state import WorkflowStatus +from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient + +from mindctrl.mlmodels import ModelInvocation +from mindctrl.workflows import WorkflowContext +from mindctrl.workflows.agent import conversation_turn_workflow +from mindctrl.workflows.deployer import ModelServeCommand, deploy_model_workflow + + +_logger = logging.getLogger(__name__) + + +def stop_dapr_app(app_id: str): + try: + subprocess.run(["dapr", "stop", "-a", app_id], check=True) + except subprocess.CalledProcessError as e: + _logger.error(f"Error stopping Dapr app {app_id}: {e}") + + +def wait_for_target_status( + wf_client: DaprWorkflowClient, + instance_id: str, + target_status: WorkflowStatus, + timeout=60, +): + status = WorkflowStatus.UNKNOWN + start_time = time.time() + state = None + while status != target_status: + if time.time() - start_time > timeout: + raise TimeoutError( + f"Timed out waiting for {instance_id} to reach status {target_status}. State:\n" + f"{state._WorkflowState__obj if state else None}" + ) + state = wf_client.get_workflow_state(instance_id, fetch_payloads=True) + assert state is not None + status = state.runtime_status + if status == WorkflowStatus.FAILED: + raise ValueError(f"Workflow {instance_id} failed: {state}") + _logger.info( + f"Workflow status: {status}, waiting for {target_status}...\n{state._WorkflowState__obj if state else None}" + ) + time.sleep(2) + + state = wf_client.get_workflow_state(instance_id, fetch_payloads=True) + assert state is not None + return state + + +def wait_for_input_output( + wf_client: DaprWorkflowClient, + instance_id: str, + target_input: Optional[str] = None, + target_output: Optional[str] = None, + target_input_val: Optional[Any] = None, + target_output_val: Optional[Any] = None, + timeout=120, +): + target_match = False + start_time = time.time() + state = None + + if not target_input and not target_output: + raise ValueError("Either target_input or target_output must be provided") + + if target_input and not target_input_val: + raise ValueError( + "target_input_val must be provided if target_input is provided" + ) + if target_output and not target_output_val: + raise ValueError( + "target_output_val must be provided if target_output is provided" + ) + + while not target_match: + if time.time() - start_time > timeout: + raise TimeoutError( + f"Timed out waiting for {instance_id} to reach target. State:\n" + f"{state._WorkflowState__obj if state else None}" + ) + state = wf_client.get_workflow_state(instance_id, fetch_payloads=True) + assert state is not None + orch_state: OrchestrationState = state._WorkflowState__obj + if target_input and orch_state.serialized_input: + target_match = ( + json.loads(orch_state.serialized_input).get(target_input) + == target_input_val + ) + if target_output and orch_state.serialized_output: + target_match = target_match and ( + json.loads(orch_state.serialized_output).get(target_output) + == target_output_val + ) + status = state.runtime_status + _logger.info( + f"Workflow status: {status}, waiting...\n{state._WorkflowState__obj if state else None}" + ) + time.sleep(5) + + state = wf_client.get_workflow_state(instance_id, fetch_payloads=True) + assert state is not None + return state + + +@pytest.fixture(scope="session") +def placement_server(): + placement_bin = (Path.home() / ".dapr" / "bin" / "placement").resolve() + assert ( + placement_bin.exists() + ), f"placement binary not found at {placement_bin}. Is Dapr installed?" + placement_process = subprocess.Popen([str(placement_bin)]) + yield placement_process + placement_process.terminate() + + +@pytest.fixture(scope="session") +def dapr_sidecar( + tmp_path_factory: pytest.TempPathFactory, + repo_root_dir: Path, + request: pytest.FixtureRequest, + monkeypatch_session, + placement_server, +): + state_spec = repo_root_dir / "services" / "components" / "sqlite.yaml" + assert state_spec.exists(), f"state store spec not found at {state_spec}" + state_store_path = tmp_path_factory.mktemp("statestore") + target_spec = state_store_path / "sqlite.yaml" + + with monkeypatch_session.context() as m: + m.setenv("ACTOR_STORE_CONNECTION_STRING", f"{state_store_path}/actors.db") + with open(state_spec, "r") as f: + content = f.read() + content = os.path.expandvars(content) + with open(target_spec, "w") as f: + f.write(content) + _logger.info(f"Generated state store spec at {target_spec}") + + dapr_process = subprocess.Popen( + [ + "dapr", + "run", + "--app-id", + request.node.name, + "--dapr-grpc-port", + str(settings.DAPR_GRPC_PORT), + "--dapr-http-port", + str(settings.DAPR_HTTP_PORT), + # "--log-level", + # "debug", + "--resources-path", + f"{state_store_path}", + # "--enable-metrics=false", + # "--placement-host-address='localhost:50005'", + ] + ) + yield dapr_process + dapr_process.terminate() + + +@pytest.fixture(scope="session") +def workflow_context(): + with WorkflowContext(): + yield + + +def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_context, request): + import pandas as pd + from mindctrl.openai_deployment import log_model + import openai + + df = pd.DataFrame({"query": ["What's up doc?"]}) + payload = {"dataframe_split": df.to_dict(orient="split")} + + log_model( + model="gpt-4-turbo-preview", + task=openai.chat.completions, + messages=[ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete.", + }, + { + "role": "user", + "content": "{query}", + }, + ], + artifact_path="oai-chat", + registered_model_name="chatty_cathy", + ) + input_invocation = ModelInvocation( + model_uri="models:/chatty_cathy/latest", + payload=payload, + scenario_name=request.node.name, + input_variables={}, + ) + + wf_client = DaprWorkflowClient() + instance_id = wf_client.schedule_new_workflow( + conversation_turn_workflow, + input=input_invocation, + instance_id=request.node.name, + ) + + state = wait_for_target_status(wf_client, instance_id, WorkflowStatus.RUNNING) + state = wait_for_target_status(wf_client, instance_id, WorkflowStatus.COMPLETED) + assert state.runtime_status == WorkflowStatus.COMPLETED + + +def test_deploy_workflow( + dapr_sidecar, mlflow_fluent_session, workflow_context, request +): + import pandas as pd + from mindctrl.openai_deployment import log_model + import openai + + df = pd.DataFrame({"query": ["What's up doc?"]}) + payload = {"dataframe_split": df.to_dict(orient="split")} + + ## Add scenario name + payload["params"] = {"scenario_name": request.node.name} + + log_model( + model="gpt-4-turbo-preview", + task=openai.chat.completions, + messages=[ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete.", + }, + { + "role": "user", + "content": "{query}", + }, + ], + artifact_path="oai-chat", + registered_model_name="chatty_cathy", + ) + + model_serve_command = ModelServeCommand( + model_uri="models:/chatty_cathy/latest", + port=45922, + pid=-1, + is_healthy=False, + app_id="", + ) + app_id = "models_chatty_cathy_latest" + atexit.register(lambda: stop_dapr_app(app_id)) + + wf_client = DaprWorkflowClient() + instance_id = wf_client.schedule_new_workflow( + deploy_model_workflow, + input=model_serve_command, + instance_id=request.node.name, + ) + + state = wait_for_target_status(wf_client, instance_id, WorkflowStatus.RUNNING) + _logger.info(f"Model deployment running: {state._WorkflowState__obj}") + + model_monitor_instance_id = f"{instance_id}-monitor" + state = wait_for_target_status( + wf_client, model_monitor_instance_id, WorkflowStatus.RUNNING + ) + _logger.info(f"Model monitor running: {state._WorkflowState__obj}") + + wait_for_input_output( + wf_client, + model_monitor_instance_id, + target_input="is_healthy", + target_input_val=True, + ) + resp = httpx.get(f"http://localhost:{model_serve_command.port}/health") + assert resp.status_code == 200 + + resp = httpx.post( + f"http://localhost:{model_serve_command.port}/invocations", + json=payload, + # headers={"x-mctrl-scenario-name": request.node.name}, + ) + if resp.status_code != 200: + print(resp.content) + assert resp.status_code == 200 + assert "predictions" in str(resp.json()) + + # def add_scenario(): + # return {"x-mctrl-scenario-name": request.node.name} + + with DaprClient() as d: + dapr_resp = d.invoke_method( + app_id, + method_name="invocations", + data=json.dumps(payload), + content_type="application/json", + http_verb="POST", + ) + if dapr_resp.status_code != 200: + print(dapr_resp.text()) + assert dapr_resp.status_code == 200 + assert "predictions" in str(dapr_resp.json()) + + # Stop the model server + # Yes there's a const, I like to test const breakage with dupes in test + wf_client.raise_workflow_event(instance_id, "stop_deployed_model") + + state = wait_for_target_status( + wf_client, instance_id, WorkflowStatus.COMPLETED, 240 + ) + assert state.runtime_status == WorkflowStatus.COMPLETED + + +# Some dapr stuff is easier to debug on cli +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) + + @dataclass + class MockNode: + name: str + + @dataclass + class MockRequest: + node: MockNode + + with WorkflowContext(): + test_smoke_workflow( + None, None, None, request=MockRequest(MockNode("test_smoke_workflow")) + ) diff --git a/services/components/sqlite.yaml b/services/components/sqlite.yaml new file mode 100644 index 0000000..7281588 --- /dev/null +++ b/services/components/sqlite.yaml @@ -0,0 +1,27 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: daprstore +spec: + type: state.sqlite + version: v1 + metadata: + # Connection string - TODO: unify mlflow and mindctrl to use the same database + - name: connectionString + value: "$ACTOR_STORE_CONNECTION_STRING" + # value: "/home/ak/mindctrl/data.db" + # Timeout for database operations, in seconds (optional) + #- name: timeoutInSeconds + # value: 20 + # Name of the table where to store the state (optional) + - name: tableName + value: "actorstate" + # Cleanup interval in seconds, to remove expired rows (optional) + #- name: cleanupInterval + # value: "1h" + # Set busy timeout for database operations + #- name: busyTimeout + # value: "2s" + # Uncomment this if you wish to use SQLite as a state store for actors (optional) + - name: actorStateStore + value: "true" diff --git a/tests/conftest.py b/tests/conftest.py index 2b71a53..0d61f60 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -370,7 +370,7 @@ def deployment_server( def hass_server_and_token( deploy_mode: DeployMode, tmp_path_factory: pytest.TempPathFactory, - test_data_dir: Path + test_data_dir: Path, ): if deploy_mode == DeployMode.K3D: _logger.warning(f"Unsupported deploy mode: {deploy_mode}") @@ -379,7 +379,9 @@ def hass_server_and_token( hass_config_dir = tmp_path_factory.mktemp("hass_config") original_hass_config = test_data_dir / "config" - assert (original_hass_config / "configuration.yaml").exists(), f"Missing {original_hass_config}" + assert ( + original_hass_config / "configuration.yaml" + ).exists(), f"Missing {original_hass_config}" shutil.copytree(original_hass_config, hass_config_dir, dirs_exist_ok=True) _logger.info(f"Starting local homeassistant fixture with config: {hass_config_dir}") @@ -392,6 +394,7 @@ def hass_server_and_token( yield hass, token + # TODO: This behemoth has gotten large enough to switch to docker compose # decide whether use testcontainers Compose container or yaml @pytest.fixture(scope="session") diff --git a/tests/pytest.ini b/tests/pytest.ini index 529ae9d..2806aaa 100644 --- a/tests/pytest.ini +++ b/tests/pytest.ini @@ -12,3 +12,4 @@ filterwarnings = ignore:The distutils package is deprecated and slated for removal in:DeprecationWarning ignore:Distutils was imported before Setuptools:UserWarning ignore:Setuptools is replacing distutils:UserWarning + ignore:Deprecated call to `pkg_resources.declare_namespace:DeprecationWarning diff --git a/tests/test_data/test_deploy_workflow-input.json b/tests/test_data/test_deploy_workflow-input.json new file mode 100644 index 0000000..4664848 --- /dev/null +++ b/tests/test_data/test_deploy_workflow-input.json @@ -0,0 +1,203 @@ +{ + "version": 1, + "interactions": [ + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete." + }, + { + "role": "user", + "content": "What's up doc?" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Sat, 11 May 2024 05:03:54 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "835" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29957" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "86ms" + ], + "x-request-id": [ + "req_f4015ecd2b426223304e80153e5165e5" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "881fa006ac72eb83-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9NZBhhXVHRHmKKIp9qYlRtPeWD1a8\",\n \"object\": \"chat.completion\",\n \"created\": 1715403833,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you out! What can I do for you today?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 34,\n \"completion_tokens\": 18,\n \"total_tokens\": 52\n },\n \"system_fingerprint\": null\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete." + }, + { + "role": "user", + "content": "What's up doc?" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Sat, 11 May 2024 05:03:55 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "829" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29957" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "86ms" + ], + "x-request-id": [ + "req_45ff45867b11c96def3bd5e3b37ea8ad" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "881fa00cecbf2769-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9NZBi34yYV5srn6KcdxTdrTLdQeaX\",\n \"object\": \"chat.completion\",\n \"created\": 1715403834,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you out! What can I do for you today?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 34,\n \"completion_tokens\": 18,\n \"total_tokens\": 52\n },\n \"system_fingerprint\": null\n}\n" + } + } + } + ] +} diff --git a/tests/test_data/test_smoke_workflow-input.json b/tests/test_data/test_smoke_workflow-input.json new file mode 100644 index 0000000..3b4b2c6 --- /dev/null +++ b/tests/test_data/test_smoke_workflow-input.json @@ -0,0 +1,104 @@ +{ + "version": 1, + "interactions": [ + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete." + }, + { + "role": "user", + "content": "What's up doc?" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Sun, 05 May 2024 04:01:49 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "960" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29957" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "86ms" + ], + "x-request-id": [ + "req_e26c3b43b90f0eaaa765bfdaa08a8a80" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "87edd4d768b8c52d-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9LNMKW53yXodhyz1GHLQi8Fg9aIdl\",\n \"object\": \"chat.completion\",\n \"created\": 1714881708,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you with any questions or information you need. What's up with you?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 34,\n \"completion_tokens\": 22,\n \"total_tokens\": 56\n },\n \"system_fingerprint\": null\n}\n" + } + } + } + ] +} diff --git a/tests/utils/browser.py b/tests/utils/browser.py index c988d92..4e6a2fb 100644 --- a/tests/utils/browser.py +++ b/tests/utils/browser.py @@ -3,13 +3,17 @@ # playwright install --with-deps chromium from playwright.sync_api import sync_playwright, Browser -from playwright._impl._errors import TimeoutError as PlaywrightTimeoutError, Error as PlaywrightError +from playwright._impl._errors import ( + TimeoutError as PlaywrightTimeoutError, + Error as PlaywrightError, +) _logger = logging.getLogger(__name__) + def perform_onboarding_and_get_ll_token(hass_url: str) -> str: with sync_playwright() as playwright: - chromium = playwright.chromium # or "firefox" or "webkit". + chromium = playwright.chromium # or "firefox" or "webkit". browser = chromium.launch() username, password = perform_hass_onboarding(browser, hass_url) return perform_long_lived_token_gen(browser, hass_url, username, password) @@ -28,10 +32,10 @@ def perform_hass_onboarding(browser: Browser, hass_url: str) -> tuple[str, str]: # Should be in onboarding form _logger.info("Filling out account form") - page.get_by_label('Name', exact=True).fill('pytest') - page.get_by_label('Username').fill(username) - page.get_by_label('Password', exact=True).fill(password) - page.get_by_label('Confirm password').fill(password) + page.get_by_label("Name", exact=True).fill("pytest") + page.get_by_label("Username").fill(username) + page.get_by_label("Password", exact=True).fill(password) + page.get_by_label("Confirm password").fill(password) _logger.info("Submitting account form") page.get_by_role("button", name="CREATE ACCOUNT").click() @@ -64,7 +68,10 @@ def perform_hass_onboarding(browser: Browser, hass_url: str) -> tuple[str, str]: page.screenshot(path="error.png") raise -def perform_long_lived_token_gen(browser: Browser, hass_url: str, username: str, password: str) -> str: + +def perform_long_lived_token_gen( + browser: Browser, hass_url: str, username: str, password: str +) -> str: page = browser.new_page() try: _logger.info(f"Navigating to {hass_url}/profile/security") @@ -72,8 +79,8 @@ def perform_long_lived_token_gen(browser: Browser, hass_url: str, username: str, # Should be on page with login form _logger.info("Filling out login form") - page.get_by_label('Username').fill(username) - page.get_by_label('Password', exact=True).fill(password) + page.get_by_label("Username").fill(username) + page.get_by_label("Password", exact=True).fill(password) page.get_by_role("button", name="Log in").click() # Should be on page with token management @@ -81,13 +88,15 @@ def perform_long_lived_token_gen(browser: Browser, hass_url: str, username: str, page.get_by_role("button", name="Create token").click() _logger.info("Filling out token form") - page.get_by_label('Name', exact=True).fill('pytest-token') + page.get_by_label("Name", exact=True).fill("pytest-token") page.get_by_role("button", name="OK", exact=True).click() _logger.info("Trying to fetch the generated token") # mdc-text-field__input - # - token = page.get_by_label("Copy your access token. It will not be shown again.").input_value() + # + token = page.get_by_label( + "Copy your access token. It will not be shown again." + ).input_value() _logger.debug(f"Got test token: {token}") return token diff --git a/tests/utils/common.py b/tests/utils/common.py index 590d262..4b2ec7b 100644 --- a/tests/utils/common.py +++ b/tests/utils/common.py @@ -150,11 +150,14 @@ def stop(self, force=True, delete_volume=True): class HAContainer(ServiceContainer): def __init__(self, config_dir: Path, **kwargs): - super().__init__("ghcr.io/home-assistant/home-assistant:stable", port=8123, **kwargs) + super().__init__( + "ghcr.io/home-assistant/home-assistant:stable", port=8123, **kwargs + ) self.with_env("TZ", "America/Los_Angeles") self.with_kwargs(privileged=True) self.with_volume_mapping(str(config_dir), "/config", "rw") + def get_external_host_port( container: Union[ServiceContainer, PostgresContainer], ) -> tuple[str, int]: From 18c2dd58b283af80d6d7ae1e30bcbad8ab3cf0cf Mon Sep 17 00:00:00 2001 From: Akshaya Annavajhala Date: Sat, 11 May 2024 08:46:12 -0700 Subject: [PATCH 02/18] Update pyproject.toml --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 57a9552..b12cb18 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -16,7 +16,7 @@ classifiers = [ dependencies = [ "dapr", "dapr-ext-fastapi", - "dapr-ext-workflow", + "dapr-ext-workflow>=0.4.0", "mlflow-skinny" ] From e47b679799d3ddaf8269d52f156d8b19210201ba Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 09:12:25 -0700 Subject: [PATCH 03/18] add transitive prerelease dep to make uv happy --- python/pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/pyproject.toml b/python/pyproject.toml index b12cb18..d4c6306 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -13,10 +13,12 @@ classifiers = [ "Operating System :: OS Independent", "Private :: Do Not Upload" # Currently just for local + cluster packaging. Publish once evals are in ] +# TODO: Remove the prerelease dependencies = [ "dapr", "dapr-ext-fastapi", "dapr-ext-workflow>=0.4.0", + "durabletask>=0.1.1a1", "mlflow-skinny" ] From d38c08f9ed98d06e00f053b302073f49bfebb525 Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 09:58:53 -0700 Subject: [PATCH 04/18] I don't know what I fixed.. --- tests/conftest.py | 1 + tests/utils/common.py | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 0d61f60..cdad9ab 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -391,6 +391,7 @@ def hass_server_and_token( _logger.info("Homeassistant fixture ready, starting onboarding") token = perform_onboarding_and_get_ll_token(hass.get_base_url()) + assert token, "Failed to get long-lived token" yield hass, token diff --git a/tests/utils/common.py b/tests/utils/common.py index 4b2ec7b..ba5d63c 100644 --- a/tests/utils/common.py +++ b/tests/utils/common.py @@ -65,11 +65,12 @@ def wait_for_readiness(url: str, max_attempts=constants.MAX_ATTEMPTS): return elif response.status_code >= 400 and response.status_code < 500: raise ValueError(f"Failed to reach {url}:\n{response}\n{response.text}") - except httpx.RemoteProtocolError as e: - _logger.debug(f"Waiting for fixture startup at {url}...{e}") - except httpx.ConnectError as e: - _logger.debug(f"Waiting for fixture startup at {url}...{e}") - except httpx.ReadError as e: + except ( + httpx.RemoteProtocolError, + httpx.ConnectError, + httpx.ReadError, + httpx.ReadTimeout, + ) as e: _logger.debug(f"Waiting for fixture startup at {url}...{e}") finally: attempts += 1 From d3da0aa4019ae9f6f4f7a85ec99e374633bc4874 Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 10:23:54 -0700 Subject: [PATCH 05/18] install dapr for local tests and skip addon/k8s --- .github/workflows/integration-local.yaml | 7 +++++++ python/tests/test_workflows.py | 15 ++++++++++++++- tests/utils/browser.py | 4 ++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/integration-local.yaml b/.github/workflows/integration-local.yaml index 8563d58..edb3a8a 100644 --- a/.github/workflows/integration-local.yaml +++ b/.github/workflows/integration-local.yaml @@ -33,6 +33,13 @@ jobs: - name: install playwright deps run: | playwright install --with-deps chromium + - name: Install Dapr + shell: bash + run: | + wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash + - name: initialize dapr + run: | + dapr init --slim - name: Test with pytest run: | pytest -v -s -rA -c tests/pytest.ini --deploy-mode=local --replay-mode=replay diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 5a38b8d..18a7633 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -118,7 +118,13 @@ def wait_for_input_output( @pytest.fixture(scope="session") -def placement_server(): +def placement_server(deploy_mode): + if deploy_mode.value != "local": + # This only makes sense for local testing - dapr is initialized + # in the container/cluster for addon/k8s + _logger.warning(f"Unsupported deploy mode: {deploy_mode}") + pytest.skip(f"Unsupported deploy mode: {deploy_mode}") + placement_bin = (Path.home() / ".dapr" / "bin" / "placement").resolve() assert ( placement_bin.exists() @@ -133,9 +139,16 @@ def dapr_sidecar( tmp_path_factory: pytest.TempPathFactory, repo_root_dir: Path, request: pytest.FixtureRequest, + deploy_mode, monkeypatch_session, placement_server, ): + if deploy_mode.value != "local": + # This only makes sense for local testing - dapr is initialized + # in the container/cluster for addon/k8s + _logger.warning(f"Unsupported deploy mode: {deploy_mode}") + pytest.skip(f"Unsupported deploy mode: {deploy_mode}") + state_spec = repo_root_dir / "services" / "components" / "sqlite.yaml" assert state_spec.exists(), f"state store spec not found at {state_spec}" state_store_path = tmp_path_factory.mktemp("statestore") diff --git a/tests/utils/browser.py b/tests/utils/browser.py index 4e6a2fb..f77ad3a 100644 --- a/tests/utils/browser.py +++ b/tests/utils/browser.py @@ -1,4 +1,5 @@ import logging +import time # playwright install --with-deps chromium @@ -85,6 +86,9 @@ def perform_long_lived_token_gen( # Should be on page with token management _logger.info("Creating long-lived token") + # Some delay on this page - flaky test + # TODO: get_by_role should have a configurable timeout + time.sleep(5) page.get_by_role("button", name="Create token").click() _logger.info("Filling out token form") From b7c0ee7d3c3d6eb73f9ee3083db100d838f72250 Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 16:04:15 -0700 Subject: [PATCH 06/18] tackle the local failures --- addons/mindctrl/rootfs/usr/bin/run_traefik.sh | 4 +- python/src/mindctrl/workflows/deployer.py | 6 +- python/tests/test_workflows.py | 85 ++++++------------- tests/conftest.py | 6 +- tests/utils/common.py | 3 + tests/utils/local.py | 16 +++- 6 files changed, 53 insertions(+), 67 deletions(-) diff --git a/addons/mindctrl/rootfs/usr/bin/run_traefik.sh b/addons/mindctrl/rootfs/usr/bin/run_traefik.sh index 462b8ce..8e4bc76 100644 --- a/addons/mindctrl/rootfs/usr/bin/run_traefik.sh +++ b/addons/mindctrl/rootfs/usr/bin/run_traefik.sh @@ -22,7 +22,7 @@ export HASS_INGRESS_ENTRY="${ingress_entry}" bashio::log.info "Starting traefik..." /traefik version # TODO: until this is unified, keep in sync with testcontainer -/traefik --accesslog=true --accesslog.format=json --log.level=DEBUG --api=true --api.dashboard=true --api.insecure=true \ +/traefik --accesslog=true --accesslog.format=json --log.level=DEBUG --api=true \ --entrypoints.http.address=':80' \ - --ping=true \ + --ping=true --entryPoints.ping.address=:8082 --ping.entryPoint=ping \ --providers.file.filename /.context/services/ingress/traefik-config.yaml diff --git a/python/src/mindctrl/workflows/deployer.py b/python/src/mindctrl/workflows/deployer.py index 752eee8..383f8f4 100644 --- a/python/src/mindctrl/workflows/deployer.py +++ b/python/src/mindctrl/workflows/deployer.py @@ -141,8 +141,10 @@ def deploy_model_workflow( instance_id=monitor_id, ) # We want to perform custom termination actions, so don't rely on dapr workflow termination - yield ctx.wait_for_external_event(STOP_DEPLOYED_MODEL) - _logger.info("Received stop event") + cancellation_event = yield ctx.wait_for_external_event(STOP_DEPLOYED_MODEL) + _logger.info(f"Received stop event {cancellation_event}") yield ctx.call_activity(stop_model_monitor, input=monitor_id) _logger.info("Stopped monitor") yield ctx.call_activity(stop_model, input=model_serve_command) + + return {"cancellation_reason": cancellation_event} diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 18a7633..17ee554 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -32,36 +32,6 @@ def stop_dapr_app(app_id: str): _logger.error(f"Error stopping Dapr app {app_id}: {e}") -def wait_for_target_status( - wf_client: DaprWorkflowClient, - instance_id: str, - target_status: WorkflowStatus, - timeout=60, -): - status = WorkflowStatus.UNKNOWN - start_time = time.time() - state = None - while status != target_status: - if time.time() - start_time > timeout: - raise TimeoutError( - f"Timed out waiting for {instance_id} to reach status {target_status}. State:\n" - f"{state._WorkflowState__obj if state else None}" - ) - state = wf_client.get_workflow_state(instance_id, fetch_payloads=True) - assert state is not None - status = state.runtime_status - if status == WorkflowStatus.FAILED: - raise ValueError(f"Workflow {instance_id} failed: {state}") - _logger.info( - f"Workflow status: {status}, waiting for {target_status}...\n{state._WorkflowState__obj if state else None}" - ) - time.sleep(2) - - state = wf_client.get_workflow_state(instance_id, fetch_payloads=True) - assert state is not None - return state - - def wait_for_input_output( wf_client: DaprWorkflowClient, instance_id: str, @@ -130,7 +100,9 @@ def placement_server(deploy_mode): placement_bin.exists() ), f"placement binary not found at {placement_bin}. Is Dapr installed?" placement_process = subprocess.Popen([str(placement_bin)]) + yield placement_process + placement_process.terminate() @@ -177,8 +149,6 @@ def dapr_sidecar( # "debug", "--resources-path", f"{state_store_path}", - # "--enable-metrics=false", - # "--placement-host-address='localhost:50005'", ] ) yield dapr_process @@ -186,12 +156,12 @@ def dapr_sidecar( @pytest.fixture(scope="session") -def workflow_context(): +def workflow_client(): with WorkflowContext(): - yield + yield DaprWorkflowClient() -def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_context, request): +def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, request): import pandas as pd from mindctrl.openai_deployment import log_model import openai @@ -212,7 +182,7 @@ def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_context, r "content": "{query}", }, ], - artifact_path="oai-chat", + artifact_path="oai-chatty-cathy", registered_model_name="chatty_cathy", ) input_invocation = ModelInvocation( @@ -222,21 +192,19 @@ def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_context, r input_variables={}, ) - wf_client = DaprWorkflowClient() - instance_id = wf_client.schedule_new_workflow( + # TODO: Without this, there isn't a proper actor lookup.. + time.sleep(5) + instance_id = workflow_client.schedule_new_workflow( conversation_turn_workflow, input=input_invocation, instance_id=request.node.name, ) - state = wait_for_target_status(wf_client, instance_id, WorkflowStatus.RUNNING) - state = wait_for_target_status(wf_client, instance_id, WorkflowStatus.COMPLETED) + state = workflow_client.wait_for_workflow_completion(instance_id) assert state.runtime_status == WorkflowStatus.COMPLETED -def test_deploy_workflow( - dapr_sidecar, mlflow_fluent_session, workflow_context, request -): +def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, request): import pandas as pd from mindctrl.openai_deployment import log_model import openai @@ -260,7 +228,7 @@ def test_deploy_workflow( "content": "{query}", }, ], - artifact_path="oai-chat", + artifact_path="oai-chatty-cathy", registered_model_name="chatty_cathy", ) @@ -274,24 +242,23 @@ def test_deploy_workflow( app_id = "models_chatty_cathy_latest" atexit.register(lambda: stop_dapr_app(app_id)) - wf_client = DaprWorkflowClient() - instance_id = wf_client.schedule_new_workflow( + instance_id = workflow_client.schedule_new_workflow( deploy_model_workflow, input=model_serve_command, instance_id=request.node.name, ) - state = wait_for_target_status(wf_client, instance_id, WorkflowStatus.RUNNING) + state = workflow_client.wait_for_workflow_start(instance_id) + assert state is not None _logger.info(f"Model deployment running: {state._WorkflowState__obj}") model_monitor_instance_id = f"{instance_id}-monitor" - state = wait_for_target_status( - wf_client, model_monitor_instance_id, WorkflowStatus.RUNNING - ) + state = workflow_client.wait_for_workflow_start(model_monitor_instance_id) + assert state is not None _logger.info(f"Model monitor running: {state._WorkflowState__obj}") wait_for_input_output( - wf_client, + workflow_client, model_monitor_instance_id, target_input="is_healthy", target_input_val=True, @@ -302,16 +269,12 @@ def test_deploy_workflow( resp = httpx.post( f"http://localhost:{model_serve_command.port}/invocations", json=payload, - # headers={"x-mctrl-scenario-name": request.node.name}, ) if resp.status_code != 200: print(resp.content) assert resp.status_code == 200 assert "predictions" in str(resp.json()) - # def add_scenario(): - # return {"x-mctrl-scenario-name": request.node.name} - with DaprClient() as d: dapr_resp = d.invoke_method( app_id, @@ -327,12 +290,18 @@ def test_deploy_workflow( # Stop the model server # Yes there's a const, I like to test const breakage with dupes in test - wf_client.raise_workflow_event(instance_id, "stop_deployed_model") + workflow_client.raise_workflow_event( + instance_id, "stop_deployed_model", data=f"cancelled-by-{request.node.name}" + ) - state = wait_for_target_status( - wf_client, instance_id, WorkflowStatus.COMPLETED, 240 + state = workflow_client.wait_for_workflow_completion( + instance_id, fetch_payloads=True, timeout_in_seconds=240 ) assert state.runtime_status == WorkflowStatus.COMPLETED + assert ( + json.loads(state.serialized_output).get("cancellation_reason") + == f"cancelled-by-{request.node.name}" + ) # Some dapr stuff is easier to debug on cli diff --git a/tests/conftest.py b/tests/conftest.py index cdad9ab..2ad18ea 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -288,7 +288,7 @@ def mlflow_server( _logger.info("Starting mlflow server fixture") with MlflowContainer(data_dir=mlflow_storage) as mlflow_server: - wait_for_readiness(f"{mlflow_server.get_base_url()}/health") + wait_for_readiness(mlflow_server.get_readiness_url()) yield mlflow_server @@ -358,7 +358,7 @@ def deployment_server( image=tag, ) as server: # once the disconnect issue is solved, we can merge into ServiceContainer.start() override - wait_for_readiness(f"{server.get_base_url()}/health") + wait_for_readiness(server.get_readiness_url()) yield server @@ -735,7 +735,7 @@ def local_server_url( allowed_ip=allowed_ip, allowed_ipv6=allowed_ipv6, ) as ingress_server: - wait_for_readiness("http://localhost:8080/ping") + wait_for_readiness(ingress_server.get_readiness_url()) yield ingress_server.get_base_url() diff --git a/tests/utils/common.py b/tests/utils/common.py index ba5d63c..68a4f51 100644 --- a/tests/utils/common.py +++ b/tests/utils/common.py @@ -138,6 +138,9 @@ def __init__(self, image, port, log_debug=False, **kwargs): self.with_exposed_ports(self.port_to_expose) self.log_debug = log_debug + def get_readiness_url(self): + return self.get_base_url() + def get_base_url(self): if self.host_network_mode: return f"http://localhost:{self.port_to_expose}" diff --git a/tests/utils/local.py b/tests/utils/local.py index 2dbe071..e9aa5c4 100644 --- a/tests/utils/local.py +++ b/tests/utils/local.py @@ -33,6 +33,7 @@ def __init__( allowed_ipv6: Optional[str] = None, image="traefik:latest", port=80, + ping_port=8082, **kwargs, ): super().__init__(image, port=port, network_mode="host", **kwargs) @@ -40,16 +41,21 @@ def __init__( self.with_env("MLFLOW_TRACKING_URI", mlflow_tracking_uri) self.with_env("MINDCTRL_SERVER_URI", mindctrl_server_uri) self.with_env("TRAEFIK_ALLOW_IP", allowed_ip) + self.ping_port = ping_port if allowed_ipv6: self.with_env("TRAEFIK_ALLOW_IPV6", allowed_ipv6) + # TODO: Unify command with addon via shared bash script? self.with_command( "traefik " - "--accesslog=true --accesslog.format=json --log.level=DEBUG --api=true --api.dashboard=true --api.insecure=true " + "--accesslog=true --accesslog.format=json --log.level=DEBUG --api=true " "--entrypoints.http.address=':80' " - "--ping=true " + f"--ping=true --entryPoints.ping.address=:{ping_port} --ping.entryPoint=ping " "--providers.file.filename=/config/traefik-config.yaml" ) + def get_readiness_url(self): + return f"http://localhost:{self.ping_port}/ping" + class MlflowContainer(ServiceContainer): def __init__( @@ -70,6 +76,9 @@ def __init__( "--static-prefix /mlflow" ) + def get_readiness_url(self): + return super().get_readiness_url() + "/health" + class DeploymentServerContainer(ServiceContainer): def __init__( @@ -130,6 +139,9 @@ def __init__( ), f"No input recordings found in {self.replays_dir}" self.with_env("MINDCTRL_CONFIG_REPLAY", "true") + def get_readiness_url(self): + return super().get_readiness_url() + "/health" + LocalMultiserver = UvicornServer( Config( From 54bab1ae5aa27e391f67da28eb2b5740b0758309 Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 16:20:11 -0700 Subject: [PATCH 07/18] try a longer delay on token creation page? --- tests/utils/browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/browser.py b/tests/utils/browser.py index f77ad3a..4c2d0a3 100644 --- a/tests/utils/browser.py +++ b/tests/utils/browser.py @@ -88,7 +88,7 @@ def perform_long_lived_token_gen( _logger.info("Creating long-lived token") # Some delay on this page - flaky test # TODO: get_by_role should have a configurable timeout - time.sleep(5) + time.sleep(15) page.get_by_role("button", name="Create token").click() _logger.info("Filling out token form") From 31e8af061904d96195c80d1132b7829199b6130c Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 17:02:11 -0700 Subject: [PATCH 08/18] add delay in other workflow --- .github/workflows/integration-addon.yaml | 41 ----------------- .github/workflows/integration-local.yaml | 45 ------------------- ...{integration-k3d.yaml => integration.yaml} | 28 +++++++++--- python/tests/test_workflows.py | 1 + 4 files changed, 24 insertions(+), 91 deletions(-) delete mode 100644 .github/workflows/integration-addon.yaml delete mode 100644 .github/workflows/integration-local.yaml rename .github/workflows/{integration-k3d.yaml => integration.yaml} (59%) diff --git a/.github/workflows/integration-addon.yaml b/.github/workflows/integration-addon.yaml deleted file mode 100644 index a0b268d..0000000 --- a/.github/workflows/integration-addon.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# This workflow will install Python dependencies, run tests and lint with a single version of Python -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python - -name: Addon Integration Tests - -on: - push: - branches: ["main"] - pull_request: - branches: ["main"] - -permissions: - contents: read - -jobs: - build: - name: Addon Integration Tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up Python 3.11 - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - name: Install dependencies - run: | - python -m pip install --upgrade uv - uv pip install --system -r tests/test-requirements.txt python/ - - name: Lint with Ruff - run: | - ruff check . - - name: install playwright deps - run: | - playwright install --with-deps chromium - - name: Copy python source + services into build context because builder action doesn't support --build-context - id: copy - run: bash scripts/copy_content_to_addon_context.sh - - name: Test with pytest - run: | - pytest -v -s -rA -c tests/pytest.ini --deploy-mode=addon --replay-mode=replay diff --git a/.github/workflows/integration-local.yaml b/.github/workflows/integration-local.yaml deleted file mode 100644 index edb3a8a..0000000 --- a/.github/workflows/integration-local.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# This workflow will install Python dependencies, run tests and lint with a single version of Python -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python - -name: Local Integration Tests - -on: - push: - branches: ["main"] - pull_request: - branches: ["main"] - -permissions: - contents: read - -jobs: - build: - name: Local Integration Tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up Python 3.11 - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - name: Install dependencies - run: | - python -m pip install --upgrade uv - uv pip install --system -r tests/test-requirements.txt python/ - - name: Lint with Ruff - run: | - ruff check . - - name: install playwright deps - run: | - playwright install --with-deps chromium - - name: Install Dapr - shell: bash - run: | - wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash - - name: initialize dapr - run: | - dapr init --slim - - name: Test with pytest - run: | - pytest -v -s -rA -c tests/pytest.ini --deploy-mode=local --replay-mode=replay diff --git a/.github/workflows/integration-k3d.yaml b/.github/workflows/integration.yaml similarity index 59% rename from .github/workflows/integration-k3d.yaml rename to .github/workflows/integration.yaml index f82898b..5c3281e 100644 --- a/.github/workflows/integration-k3d.yaml +++ b/.github/workflows/integration.yaml @@ -1,7 +1,7 @@ # This workflow will install Python dependencies, run tests and lint with a single version of Python # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python -name: K3D Integration Tests +name: Integration Tests on: push: @@ -13,10 +13,12 @@ permissions: contents: read jobs: - build: - name: K3D Integration Tests + test: + name: Integration Tests runs-on: ubuntu-latest - + strategy: + matrix: + deploymode: ["local", "k3d", "addon"] steps: - uses: actions/checkout@v4 - name: Set up Python 3.11 @@ -31,6 +33,7 @@ jobs: run: | ruff check . - name: Create cluster + if: startsWith(matrix.deploymode, 'k3') == true shell: bash run: bash scripts/setup_k3d.sh env: @@ -38,10 +41,25 @@ jobs: SKIP_CREATION: true SKIP_REGISTRY_CREATION: true SKIP_READINESS: true + - name: install playwright deps + run: | + playwright install --with-deps chromium + - name: Copy content to addon context + if: startsWith(matrix.deploymode, 'addon') == true + id: copy + run: bash scripts/copy_content_to_addon_context.sh - name: Install Dapr shell: bash run: | wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash + - name: initialize dapr + run: | + dapr init --slim - name: Test with pytest run: | - pytest -v -s -rA -c tests/pytest.ini --deploy-mode=k3d --replay-mode=replay + pytest -v -s -rA -c tests/pytest.ini --deploy-mode=${{ matrix.deploymode }} --replay-mode=replay + - name: Upload debug playwright screenshots + uses: actions/upload-artifact@v4 + with: + name: playwright-screenshots + path: *.png diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 17ee554..86ab755 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -242,6 +242,7 @@ def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, r app_id = "models_chatty_cathy_latest" atexit.register(lambda: stop_dapr_app(app_id)) + time.sleep(5) instance_id = workflow_client.schedule_new_workflow( deploy_model_workflow, input=model_serve_command, From 162c897c727cfb3a565bb54d439b1868ddfa2261 Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 17:05:55 -0700 Subject: [PATCH 09/18] fix bad yaml --- .github/workflows/integration.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 5c3281e..b722663 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -62,4 +62,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: playwright-screenshots - path: *.png + path: "**/*.png" From 3b2f159e5ce865f4fa4fab95b81dc3b324311b74 Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 17:15:16 -0700 Subject: [PATCH 10/18] add more delay? --- .github/workflows/integration.yaml | 1 + python/tests/test_workflows.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index b722663..0470c65 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -17,6 +17,7 @@ jobs: name: Integration Tests runs-on: ubuntu-latest strategy: + fail-fast: false matrix: deploymode: ["local", "k3d", "addon"] steps: diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 86ab755..26f6087 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -193,7 +193,7 @@ def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, re ) # TODO: Without this, there isn't a proper actor lookup.. - time.sleep(5) + time.sleep(15) instance_id = workflow_client.schedule_new_workflow( conversation_turn_workflow, input=input_invocation, @@ -242,7 +242,7 @@ def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, r app_id = "models_chatty_cathy_latest" atexit.register(lambda: stop_dapr_app(app_id)) - time.sleep(5) + time.sleep(15) instance_id = workflow_client.schedule_new_workflow( deploy_model_workflow, input=model_serve_command, From 48b9a481d8748b4a5cd4d6bc06a3dab35d4583ba Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 17:28:32 -0700 Subject: [PATCH 11/18] why..? --- .github/workflows/integration.yaml | 4 ++-- python/tests/test_workflows.py | 4 ++-- tests/utils/browser.py | 16 ++++------------ 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 0470c65..8d04906 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -62,5 +62,5 @@ jobs: - name: Upload debug playwright screenshots uses: actions/upload-artifact@v4 with: - name: playwright-screenshots - path: "**/*.png" + name: playwright-screenshots-${{ matrix.deploymode }} + path: "**/fail-*.png" diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 26f6087..9750ee9 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -193,7 +193,7 @@ def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, re ) # TODO: Without this, there isn't a proper actor lookup.. - time.sleep(15) + time.sleep(20) instance_id = workflow_client.schedule_new_workflow( conversation_turn_workflow, input=input_invocation, @@ -242,7 +242,7 @@ def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, r app_id = "models_chatty_cathy_latest" atexit.register(lambda: stop_dapr_app(app_id)) - time.sleep(15) + time.sleep(20) instance_id = workflow_client.schedule_new_workflow( deploy_model_workflow, input=model_serve_command, diff --git a/tests/utils/browser.py b/tests/utils/browser.py index 4c2d0a3..8c933e6 100644 --- a/tests/utils/browser.py +++ b/tests/utils/browser.py @@ -60,13 +60,9 @@ def perform_hass_onboarding(browser: Browser, hass_url: str) -> tuple[str, str]: _logger.info("Onboarding complete") return username, password - except PlaywrightTimeoutError as e: - _logger.error(f"Timeout onboarding: {e}") - page.screenshot(path="timeout.png") - raise - except PlaywrightError as e: + except (PlaywrightTimeoutError, PlaywrightError) as e: _logger.error(f"Error onboarding: {e}") - page.screenshot(path="error.png") + page.screenshot(path="fail-onboarding.png") raise @@ -104,11 +100,7 @@ def perform_long_lived_token_gen( _logger.debug(f"Got test token: {token}") return token - except PlaywrightTimeoutError as e: - _logger.error(f"Timeout onboarding: {e}") - page.screenshot(path="timeout.png") - raise - except PlaywrightError as e: + except (PlaywrightTimeoutError, PlaywrightError) as e: _logger.error(f"Error onboarding: {e}") - page.screenshot(path="error.png") + page.screenshot(path="fail-token.png") raise From c676c295a3783849d53b6a47217e470e67a8600d Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 18:02:12 -0700 Subject: [PATCH 12/18] solved the flakiness? --- .github/workflows/integration.yaml | 1 + python/tests/test_workflows.py | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 8d04906..85b9606 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -60,6 +60,7 @@ jobs: run: | pytest -v -s -rA -c tests/pytest.ini --deploy-mode=${{ matrix.deploymode }} --replay-mode=replay - name: Upload debug playwright screenshots + if: failure() uses: actions/upload-artifact@v4 with: name: playwright-screenshots-${{ matrix.deploymode }} diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 9750ee9..564e6af 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -193,7 +193,7 @@ def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, re ) # TODO: Without this, there isn't a proper actor lookup.. - time.sleep(20) + time.sleep(5) instance_id = workflow_client.schedule_new_workflow( conversation_turn_workflow, input=input_invocation, @@ -242,7 +242,7 @@ def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, r app_id = "models_chatty_cathy_latest" atexit.register(lambda: stop_dapr_app(app_id)) - time.sleep(20) + time.sleep(5) instance_id = workflow_client.schedule_new_workflow( deploy_model_workflow, input=model_serve_command, @@ -254,7 +254,19 @@ def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, r _logger.info(f"Model deployment running: {state._WorkflowState__obj}") model_monitor_instance_id = f"{instance_id}-monitor" - state = workflow_client.wait_for_workflow_start(model_monitor_instance_id) + monitor_scheduled = False + while not monitor_scheduled: + try: + workflow_client.wait_for_workflow_start(model_monitor_instance_id) + monitor_scheduled = True + except Exception as e: + if "no such instance exists" in str(e): + time.sleep(5) + else: + raise + state = workflow_client.wait_for_workflow_start( + model_monitor_instance_id, fetch_payloads=True + ) assert state is not None _logger.info(f"Model monitor running: {state._WorkflowState__obj}") From c564d1985e00acf57beffef60b4122356a17d04d Mon Sep 17 00:00:00 2001 From: AK Date: Sat, 11 May 2024 18:54:01 -0700 Subject: [PATCH 13/18] see what happens --- tests/conftest.py | 10 +++++--- tests/utils/browser.py | 58 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 2ad18ea..e4d2486 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -388,9 +388,13 @@ def hass_server_and_token( with HAContainer(config_dir=hass_config_dir) as hass: _logger.info(f"Started hass container at {hass.get_base_url()}") wait_for_readiness(hass.get_base_url()) - _logger.info("Homeassistant fixture ready, starting onboarding") - - token = perform_onboarding_and_get_ll_token(hass.get_base_url()) + playwright_screenshots = tmp_path_factory.mktemp("onboarding_screenshots") + _logger.info( + f"Homeassistant fixture ready, onboarding with screenshots in {playwright_screenshots}" + ) + token = perform_onboarding_and_get_ll_token( + hass.get_base_url(), playwright_screenshots + ) assert token, "Failed to get long-lived token" yield hass, token diff --git a/tests/utils/browser.py b/tests/utils/browser.py index 8c933e6..e8dabad 100644 --- a/tests/utils/browser.py +++ b/tests/utils/browser.py @@ -1,5 +1,5 @@ import logging -import time +from pathlib import Path # playwright install --with-deps chromium @@ -12,25 +12,34 @@ _logger = logging.getLogger(__name__) -def perform_onboarding_and_get_ll_token(hass_url: str) -> str: +def perform_onboarding_and_get_ll_token(hass_url: str, screenshot_dir: Path) -> str: with sync_playwright() as playwright: chromium = playwright.chromium # or "firefox" or "webkit". browser = chromium.launch() - username, password = perform_hass_onboarding(browser, hass_url) - return perform_long_lived_token_gen(browser, hass_url, username, password) + username, password = perform_hass_onboarding(browser, hass_url, screenshot_dir) + return perform_long_lived_token_gen( + browser, hass_url, username, password, screenshot_dir + ) -def perform_hass_onboarding(browser: Browser, hass_url: str) -> tuple[str, str]: +def perform_hass_onboarding( + browser: Browser, hass_url: str, screenshot_dir: Path +) -> tuple[str, str]: username = "pytest" password = "pytest" page = browser.new_page() _logger.info(f"Navigating to {hass_url}") try: page.goto(hass_url) + page.wait_for_load_state() + page.screenshot(path=screenshot_dir / "playwright-step-01-onboarding.png") _logger.info("Clicking onboarding button") page.get_by_role("button", name="Create my smart home").click() + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-step-02-account.png") + # Should be in onboarding form _logger.info("Filling out account form") page.get_by_label("Name", exact=True).fill("pytest") @@ -40,58 +49,85 @@ def perform_hass_onboarding(browser: Browser, hass_url: str) -> tuple[str, str]: _logger.info("Submitting account form") page.get_by_role("button", name="CREATE ACCOUNT").click() + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-step-03-location.png") + # Should be map/location _logger.info("Skipping location") page.get_by_role("button", name="Next").click() + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-step-04-country.png") + # Should be in country selector _logger.info("Selecting country") page.get_by_label("Country").click() page.get_by_role("option", name="United States").click() page.get_by_role("button", name="Next").click() + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-step-05-analytics.png") + # Should be analytics _logger.info("Skipping analytics") page.get_by_role("button", name="Next").click() + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-step-06-finish.png") + # Final page _logger.info("Finishing onboarding") page.get_by_role("button", name="Finish").click() _logger.info("Onboarding complete") + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-step-07-done.png") + return username, password except (PlaywrightTimeoutError, PlaywrightError) as e: _logger.error(f"Error onboarding: {e}") - page.screenshot(path="fail-onboarding.png") + page.screenshot(path=screenshot_dir / "playwright-fail-onboarding.png") raise def perform_long_lived_token_gen( - browser: Browser, hass_url: str, username: str, password: str + browser: Browser, hass_url: str, username: str, password: str, screenshot_dir: Path ) -> str: page = browser.new_page() try: _logger.info(f"Navigating to {hass_url}/profile/security") page.goto(f"{hass_url}/profile/security") + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-token-01-login.png") + # Should be on page with login form _logger.info("Filling out login form") page.get_by_label("Username").fill(username) page.get_by_label("Password", exact=True).fill(password) page.get_by_role("button", name="Log in").click() + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-token-02-security.png") + # Should be on page with token management _logger.info("Creating long-lived token") - # Some delay on this page - flaky test - # TODO: get_by_role should have a configurable timeout - time.sleep(15) + page.get_by_role("button", name="Create token").click() + # Wait for the \"DOMContentLoaded\" event. + page.wait_for_load_state("domcontentloaded") + + page.screenshot(path=screenshot_dir / "playwright-token-03-token-form.png") + _logger.info("Filling out token form") page.get_by_label("Name", exact=True).fill("pytest-token") page.get_by_role("button", name="OK", exact=True).click() _logger.info("Trying to fetch the generated token") + + page.wait_for_load_state("domcontentloaded") + page.screenshot(path=screenshot_dir / "playwright-token-04-token.png") # mdc-text-field__input # token = page.get_by_label( @@ -102,5 +138,5 @@ def perform_long_lived_token_gen( return token except (PlaywrightTimeoutError, PlaywrightError) as e: _logger.error(f"Error onboarding: {e}") - page.screenshot(path="fail-token.png") + page.screenshot(path=screenshot_dir / "playwright-fail-token.png") raise From 1125c0593b24fd1595d4bd12a735e14a6ce5d30d Mon Sep 17 00:00:00 2001 From: AK Date: Sun, 19 May 2024 23:34:47 -0700 Subject: [PATCH 14/18] get multiturn working --- .github/workflows/integration.yaml | 1 + custom_components/mindctrl/__init__.py | 13 +- custom_components/mindctrl/addon.py | 2 +- custom_components/mindctrl/config_flow.py | 18 +- custom_components/mindctrl/conversation.py | 12 +- custom_components/mindctrl/entity.py | 3 +- custom_components/mindctrl/services.py | 13 +- python/src/mindctrl/cli.py | 5 +- python/src/mindctrl/config.py | 3 +- python/src/mindctrl/const.py | 1 - python/src/mindctrl/contracts/websocket.py | 33 ++ python/src/mindctrl/db/setup.py | 10 +- python/src/mindctrl/homeassistant/client.py | 3 +- python/src/mindctrl/homeassistant/messages.py | 1 + python/src/mindctrl/main.py | 46 +- python/src/mindctrl/mlflow_bridge.py | 13 +- python/src/mindctrl/mlmodels.py | 14 +- python/src/mindctrl/mqtt.py | 6 +- python/src/mindctrl/rag.py | 5 +- python/src/mindctrl/replay_server.py | 29 +- .../src/mindctrl/routers/deployed_models.py | 3 +- python/src/mindctrl/routers/info.py | 3 +- python/src/mindctrl/routers/ui.py | 67 ++- python/src/mindctrl/workflows/__init__.py | 139 +++++- python/src/mindctrl/workflows/agent.py | 216 ++++++--- python/src/mindctrl/workflows/deployer.py | 8 +- python/tests/test_hass_api.py | 4 +- python/tests/test_hass_client.py | 4 +- python/tests/test_mlflow.py | 4 +- python/tests/test_replay_server.py | 4 +- python/tests/test_workflows.py | 134 +++--- tests/conftest.py | 40 +- tests/test_addon.py | 2 +- tests/test_api.py | 5 +- tests/test_appsettings.py | 5 +- .../test_data/test_deploy_workflow-input.json | 32 +- .../test_multiturn_workflow-input.json | 449 ++++++++++++++++++ .../test_data/test_smoke_workflow-input.json | 18 +- tests/test_multiserver.py | 6 +- tests/utils/addon.py | 4 +- tests/utils/browser.py | 10 +- tests/utils/cluster.py | 6 +- tests/utils/common.py | 13 +- tests/utils/local.py | 6 +- 44 files changed, 1062 insertions(+), 351 deletions(-) create mode 100644 python/src/mindctrl/contracts/websocket.py create mode 100644 tests/test_data/test_multiturn_workflow-input.json diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 85b9606..8515273 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -33,6 +33,7 @@ jobs: - name: Lint with Ruff run: | ruff check . + ruff check --select I . - name: Create cluster if: startsWith(matrix.deploymode, 'k3') == true shell: bash diff --git a/custom_components/mindctrl/__init__.py b/custom_components/mindctrl/__init__.py index c247f96..66601ff 100644 --- a/custom_components/mindctrl/__init__.py +++ b/custom_components/mindctrl/__init__.py @@ -3,8 +3,10 @@ from __future__ import annotations +import asyncio + from homeassistant.components import conversation as haconversation -from homeassistant.components.hassio import AddonManager, AddonError, AddonState +from homeassistant.components.hassio import AddonError, AddonManager, AddonState from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import ( @@ -13,15 +15,10 @@ from homeassistant.helpers import config_validation as cv from homeassistant.helpers.typing import ConfigType -import asyncio - from .addon import get_addon_manager - -from .const import ADDON_NAME, CONF_URL, CONF_USE_ADDON, DOMAIN, _LOGGER - -from .services import MindctrlClient, async_register_services +from .const import _LOGGER, ADDON_NAME, CONF_URL, CONF_USE_ADDON, DOMAIN from .conversation import MLflowAgent - +from .services import MindctrlClient, async_register_services CONNECT_TIMEOUT = 10 diff --git a/custom_components/mindctrl/addon.py b/custom_components/mindctrl/addon.py index 4d2c4e4..2c5efea 100644 --- a/custom_components/mindctrl/addon.py +++ b/custom_components/mindctrl/addon.py @@ -8,7 +8,7 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.singleton import singleton -from .const import ADDON_SLUG, DOMAIN, _LOGGER, ADDON_NAME +from .const import _LOGGER, ADDON_NAME, ADDON_SLUG, DOMAIN DATA_ADDON_MANAGER = f"{DOMAIN}_addon_manager" diff --git a/custom_components/mindctrl/config_flow.py b/custom_components/mindctrl/config_flow.py index 21fbbcf..5b30130 100644 --- a/custom_components/mindctrl/config_flow.py +++ b/custom_components/mindctrl/config_flow.py @@ -1,29 +1,29 @@ +import asyncio +import uuid from typing import Any + +import aiohttp +import voluptuous as vol from homeassistant import config_entries, exceptions -from homeassistant.core import HomeAssistant, callback from homeassistant.const import CONF_URL -from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.core import HomeAssistant, callback # from homeassistant.components.zeroconf import ZeroconfServiceInfo from homeassistant.data_entry_flow import ( FlowResult, ) -import voluptuous as vol -import asyncio -import aiohttp -import uuid +from homeassistant.helpers.aiohttp_client import async_get_clientsession from .const import ( + _LOGGER, ADDON_HOST, ADDON_PORT, CONF_ADDON_LOG_LEVEL, CONF_INTEGRATION_CREATED_ADDON, - DOMAIN, - _LOGGER, CONF_USE_ADDON, + DOMAIN, ) - DEFAULT_URL = f"http://{ADDON_HOST}:{ADDON_PORT}" TITLE = "mindctrl" diff --git a/custom_components/mindctrl/conversation.py b/custom_components/mindctrl/conversation.py index 2cdd48c..d139be7 100644 --- a/custom_components/mindctrl/conversation.py +++ b/custom_components/mindctrl/conversation.py @@ -1,17 +1,17 @@ +from typing import Literal + +import mlflow from homeassistant.components import conversation +from homeassistant.config_entries import ConfigEntry from homeassistant.const import MATCH_ALL from homeassistant.core import ( HomeAssistant, ) -from homeassistant.config_entries import ConfigEntry -from typing import Literal -from homeassistant.util import ulid -from homeassistant.helpers import intent, template from homeassistant.exceptions import ( TemplateError, ) -import mlflow - +from homeassistant.helpers import intent, template +from homeassistant.util import ulid from .const import _LOGGER diff --git a/custom_components/mindctrl/entity.py b/custom_components/mindctrl/entity.py index cd4af12..0b049f7 100644 --- a/custom_components/mindctrl/entity.py +++ b/custom_components/mindctrl/entity.py @@ -1,13 +1,14 @@ """AdGuard Home base entity.""" from __future__ import annotations + from abc import ABC, abstractmethod from homeassistant.config_entries import SOURCE_HASSIO, ConfigEntry from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.entity import Entity -from .const import ADDON_SLUG, DOMAIN, _LOGGER +from .const import _LOGGER, ADDON_SLUG, DOMAIN from .services import MindctrlClient diff --git a/custom_components/mindctrl/services.py b/custom_components/mindctrl/services.py index d0be672..d3fdbdb 100644 --- a/custom_components/mindctrl/services.py +++ b/custom_components/mindctrl/services.py @@ -1,5 +1,6 @@ -from homeassistant.helpers.aiohttp_client import async_get_clientsession - +import mlflow +import voluptuous as vol +from homeassistant.config_entries import ConfigEntry from homeassistant.core import ( HomeAssistant, ServiceCall, @@ -9,12 +10,10 @@ from homeassistant.exceptions import ( HomeAssistantError, ) -from homeassistant.config_entries import ConfigEntry - -import mlflow -from .const import DOMAIN, SERVICE_INVOKE_MODEL, _LOGGER, CONF_URL -import voluptuous as vol from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.aiohttp_client import async_get_clientsession + +from .const import _LOGGER, CONF_URL, DOMAIN, SERVICE_INVOKE_MODEL class MindctrlClient(object): diff --git a/python/src/mindctrl/cli.py b/python/src/mindctrl/cli.py index 25ea980..823728a 100644 --- a/python/src/mindctrl/cli.py +++ b/python/src/mindctrl/cli.py @@ -1,15 +1,14 @@ import logging import os from typing import Optional -import click +import click from mlflow.deployments.cli import validate_config_path -from mlflow.environment_variables import MLFLOW_DEPLOYMENTS_CONFIG from mlflow.deployments.server.runner import monitor_config +from mlflow.environment_variables import MLFLOW_DEPLOYMENTS_CONFIG from .replay_server import ReplayRunner - _logger = logging.getLogger(__name__) diff --git a/python/src/mindctrl/config.py b/python/src/mindctrl/config.py index 26bffce..d9df288 100644 --- a/python/src/mindctrl/config.py +++ b/python/src/mindctrl/config.py @@ -1,4 +1,5 @@ -from typing import Optional, Union, Literal +from typing import Literal, Optional, Union + from pydantic import BaseModel, Field, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict diff --git a/python/src/mindctrl/const.py b/python/src/mindctrl/const.py index 01936c8..34c7d67 100644 --- a/python/src/mindctrl/const.py +++ b/python/src/mindctrl/const.py @@ -1,6 +1,5 @@ from pathlib import Path - CHAMPION_ALIAS = "champion" CHALLENGER_ALIAS = "challenger" diff --git a/python/src/mindctrl/contracts/websocket.py b/python/src/mindctrl/contracts/websocket.py new file mode 100644 index 0000000..0949cd0 --- /dev/null +++ b/python/src/mindctrl/contracts/websocket.py @@ -0,0 +1,33 @@ +from typing import Union + +from pydantic import BaseModel, Field + + +class BaseMindctrlMessage(BaseModel): + id: int + type: str + + +# This is the UI contract, drop tool calling +class AssistantMessage(BaseModel): + role: str = "assistant" + content: str + + +class UserMessage(BaseModel): + role: str = "user" + content: str + + +class ChatMessage(BaseMindctrlMessage): + type: str = "mindctrl.chat" + message: Union[AssistantMessage, UserMessage] = Field(discriminator="role") + + +class SubscribeMessage(BaseMindctrlMessage): + type: str = "mindctrl.subscribe" + subscription: str + + +class WebSocketMessage(BaseMindctrlMessage): + message: Union[ChatMessage, SubscribeMessage] diff --git a/python/src/mindctrl/db/setup.py b/python/src/mindctrl/db/setup.py index b5043ca..e9e1b46 100644 --- a/python/src/mindctrl/db/setup.py +++ b/python/src/mindctrl/db/setup.py @@ -4,21 +4,19 @@ from sqlalchemy import text from sqlalchemy.ext.asyncio import ( - create_async_engine, AsyncEngine, + create_async_engine, ) +from ..config import PostgresStoreSettings +from ..mlmodels import summarize_events from .queries import ( + CONVERT_TO_HYPERTABLE, CREATE_SUMMARY_TABLE, ENABLE_PGVECTOR, - CONVERT_TO_HYPERTABLE, ENABLE_TIMESCALE, ) -from ..config import PostgresStoreSettings -from ..mlmodels import summarize_events - - _LOGGER = logging.getLogger(__name__) diff --git a/python/src/mindctrl/homeassistant/client.py b/python/src/mindctrl/homeassistant/client.py index daee101..32beeb9 100644 --- a/python/src/mindctrl/homeassistant/client.py +++ b/python/src/mindctrl/homeassistant/client.py @@ -1,7 +1,8 @@ import asyncio import logging -from typing import Union import time +from typing import Union + import httpx from httpx_ws import aconnect_ws from pydantic import ValidationError diff --git a/python/src/mindctrl/homeassistant/messages.py b/python/src/mindctrl/homeassistant/messages.py index f966deb..d805b82 100644 --- a/python/src/mindctrl/homeassistant/messages.py +++ b/python/src/mindctrl/homeassistant/messages.py @@ -1,4 +1,5 @@ from typing import Any, Optional, Union + from pydantic import BaseModel diff --git a/python/src/mindctrl/main.py b/python/src/mindctrl/main.py index 7c7b06b..c26542b 100644 --- a/python/src/mindctrl/main.py +++ b/python/src/mindctrl/main.py @@ -1,29 +1,28 @@ -from functools import lru_cache, partial +import asyncio +import collections import logging import os # Eventing - move this to plugin from contextlib import asynccontextmanager -import asyncio +from functools import lru_cache, partial + +import mlflow # Core functionality from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse -import collections - -import mlflow - +from mindctrl.workflows import WorkflowContext -from .mlmodels import log_system_models -from .mqtt import setup_mqtt_client, listen_to_mqtt -from .mlflow_bridge import connect_to_mlflow, poll_registry -from .db.setup import setup_db, insert_summary, insert_summary_dummy from .config import AppSettings +from .const import ROUTE_PREFIX +from .db.setup import insert_summary, insert_summary_dummy, setup_db +from .mlflow_bridge import connect_to_mlflow, poll_registry +from .mlmodels import log_system_models +from .mqtt import listen_to_mqtt, setup_mqtt_client from .routers import deployed_models, info, ui from .routers.ui import templates -from .const import ROUTE_PREFIX - _logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -49,8 +48,6 @@ async def lifespan(app: FastAPI): _logger.info("Starting mindctrl server with settings:") _logger.info(app_settings.model_dump()) - asyncio.create_task(poll_registry(10.0)) - # The buffer should be enhanced to be token-aware state_ring_buffer: collections.deque[dict] = collections.deque(maxlen=20) _logger.info("Setting up DB") @@ -77,15 +74,20 @@ async def lifespan(app: FastAPI): loaded_models = log_system_models(app_settings.force_publish_models) connect_to_mlflow(app_settings) - write_healthcheck_file(app_settings) + _logger.info("Starting workflow manager") + with WorkflowContext() as wfc: + asyncio.create_task(poll_registry(wfc, 10.0)) + + write_healthcheck_file(app_settings) - _logger.info("Finished server setup") - # Make resources available to requests via .state - yield { - "state_ring_buffer": state_ring_buffer, - "loaded_models": loaded_models, - "database_engine": engine, - } + _logger.info("Finished server setup") + # Make resources available to requests via .state + yield { + "state_ring_buffer": state_ring_buffer, + "loaded_models": loaded_models, + "database_engine": engine, + "workflow_context": wfc, + } # TODO: Once the above is moved into an ABC make it a context manager if app_settings.events.events_type == "mqtt" and mqtt_listener_task: diff --git a/python/src/mindctrl/mlflow_bridge.py b/python/src/mindctrl/mlflow_bridge.py index ca95573..4c6dd20 100644 --- a/python/src/mindctrl/mlflow_bridge.py +++ b/python/src/mindctrl/mlflow_bridge.py @@ -1,11 +1,13 @@ +import asyncio +import logging + import mlflow from mlflow import MlflowClient -import logging -import asyncio -from .const import CHAMPION_ALIAS, CHALLENGER_ALIAS -from .config import AppSettings +from mindctrl.workflows import WorkflowContext +from .config import AppSettings +from .const import CHALLENGER_ALIAS, CHAMPION_ALIAS _logger = logging.getLogger(__name__) @@ -27,7 +29,8 @@ def is_deployable_alias(aliases: list[str]) -> bool: # TODO: Add webhooks/eventing to MLflow OSS server. AzureML has eventgrid support # In its absence, we poll the MLflow server for changes to the model registry -async def poll_registry(delay_seconds: float = 10.0): +async def poll_registry(workflow_context: WorkflowContext, delay_seconds: float = 10.0): + # TODO: Turn this whole thing into a timer based workflow? while True: # Sync any new models by tag/label/all # Solve any environment dependencies mismatch or fail diff --git a/python/src/mindctrl/mlmodels.py b/python/src/mindctrl/mlmodels.py index 2f4b5ae..626e642 100644 --- a/python/src/mindctrl/mlmodels.py +++ b/python/src/mindctrl/mlmodels.py @@ -1,16 +1,14 @@ -from dataclasses import dataclass import logging from typing import Optional, Tuple import mlflow import openai +from mlflow import MlflowClient from mlflow.entities.model_registry import RegisteredModel from mlflow.utils.proto_json_utils import dataframe_from_parsed_json -from mlflow import MlflowClient - -from .openai_deployment import log_model from .const import CHALLENGER_ALIAS, CHAMPION_ALIAS, SCENARIO_NAME_PARAM +from .openai_deployment import log_model _logger = logging.getLogger(__name__) @@ -190,14 +188,6 @@ def embed_summary(summary: str) -> list[float]: return model.encode(summary).tolist() -@dataclass -class ModelInvocation: - model_uri: str - payload: dict - scenario_name: Optional[str] - input_variables: dict[str, str] - - def invoke_model_impl( model: mlflow.pyfunc.PyFuncModel, payload: dict, diff --git a/python/src/mindctrl/mqtt.py b/python/src/mindctrl/mqtt.py index 8541689..75891b3 100644 --- a/python/src/mindctrl/mqtt.py +++ b/python/src/mindctrl/mqtt.py @@ -1,13 +1,13 @@ +import asyncio import collections import json import logging -from typing import Callable, Awaitable, Optional +from typing import Awaitable, Callable, Optional + import aiomqtt -import asyncio from .config import MqttEventsSettings - _logger = logging.getLogger(__name__) diff --git a/python/src/mindctrl/rag.py b/python/src/mindctrl/rag.py index 48450f5..c79bfa7 100644 --- a/python/src/mindctrl/rag.py +++ b/python/src/mindctrl/rag.py @@ -1,10 +1,11 @@ +import json from abc import ABC, abstractmethod from datetime import datetime from enum import Enum +from itertools import islice + from fastapi import Request -import json from pydantic import BaseModel -from itertools import islice class EventType(Enum): diff --git a/python/src/mindctrl/replay_server.py b/python/src/mindctrl/replay_server.py index 9b1c61b..99ebd54 100644 --- a/python/src/mindctrl/replay_server.py +++ b/python/src/mindctrl/replay_server.py @@ -3,41 +3,42 @@ # TODO: mainline this feature into mlflow and drop this file import functools -from fastapi import Request as fastRequest, HTTPException import logging import os import subprocess import sys from typing import List, Literal, Optional, Union + import vcr +import vcr.stubs.aiohttp_stubs +from aiohttp import hdrs +from fastapi import HTTPException +from fastapi import Request as fastRequest ## MLflow Patching from mlflow.deployments.server.app import GatewayAPI, create_app_from_path -from mlflow.environment_variables import MLFLOW_DEPLOYMENTS_CONFIG from mlflow.deployments.server.runner import Runner +from mlflow.environment_variables import MLFLOW_DEPLOYMENTS_CONFIG +from mlflow.exceptions import MlflowException from mlflow.gateway.config import RouteConfig from mlflow.gateway.providers import get_provider from mlflow.gateway.schemas import chat from mlflow.gateway.utils import make_streaming_response -from mlflow.exceptions import MlflowException -## - -## VCR Patching -from yarl import URL -import vcr.stubs.aiohttp_stubs +from vcr.errors import CannotOverwriteExistingCassetteException +from vcr.request import Request from vcr.stubs.aiohttp_stubs import ( - play_responses, - record_responses, _build_cookie_header, - _serialize_headers, _build_url_with_params, + _serialize_headers, + play_responses, + record_responses, ) -from vcr.errors import CannotOverwriteExistingCassetteException -from vcr.request import Request -from aiohttp import hdrs ## +## VCR Patching +from yarl import URL +## from .const import ( REPLAY_SERVER_INPUT_FILE_SUFFIX, REPLAY_SERVER_OUTPUT_FILE_SUFFIX, diff --git a/python/src/mindctrl/routers/deployed_models.py b/python/src/mindctrl/routers/deployed_models.py index 66cd6a3..77136c3 100644 --- a/python/src/mindctrl/routers/deployed_models.py +++ b/python/src/mindctrl/routers/deployed_models.py @@ -1,7 +1,8 @@ import collections import logging -from fastapi import APIRouter, Request, HTTPException + import mlflow +from fastapi import APIRouter, HTTPException, Request from mindctrl.const import SCENARIO_NAME_HEADER from mindctrl.mlmodels import ( diff --git a/python/src/mindctrl/routers/info.py b/python/src/mindctrl/routers/info.py index 522527e..04e300a 100644 --- a/python/src/mindctrl/routers/info.py +++ b/python/src/mindctrl/routers/info.py @@ -1,6 +1,7 @@ import logging -from fastapi import APIRouter, Request + import mlflow +from fastapi import APIRouter, Request router = APIRouter(tags=["info"]) diff --git a/python/src/mindctrl/routers/ui.py b/python/src/mindctrl/routers/ui.py index 15a2241..1676029 100644 --- a/python/src/mindctrl/routers/ui.py +++ b/python/src/mindctrl/routers/ui.py @@ -4,9 +4,10 @@ from fastapi import APIRouter, WebSocket, WebSocketDisconnect from fastapi.templating import Jinja2Templates - from mindctrl.const import TEMPLATES_DIR +# from mindctrl.workflows import WorkflowContext + router = APIRouter(prefix="/ui", tags=["info"]) @@ -34,3 +35,67 @@ async def websocket_endpoint(websocket: WebSocket): except WebSocketDisconnect: _logger.warning("Websocket disconnected") break + + +# TODO: https://fastapi.tiangolo.com/advanced/websockets/#handling-disconnections-and-multiple-clients +# @router.websocket("/mctrlws") +# async def websocket_endpoint2(websocket: WebSocket): +# await websocket.accept() +# _logger.info("Websocket accepted") + +# await websocket.accept() +# queue = asyncio.queues.Queue() + +# async def read_from_socket(websocket: WebSocket): +# async for data in websocket.iter_json(): +# print(f"putting {data} in the queue") +# queue.put_nowait(data) + +# async def get_data_and_send(): +# data = await queue.get() +# while True: +# if queue.empty(): +# print(f"getting weather data for {data}") +# await asyncio.sleep(1) +# else: +# data = queue.get_nowait() +# print(f"Setting data to {data}") + +# await asyncio.gather(read_from_socket(websocket), get_data_and_send()) + +# # If doesn't exist, starts workflow +# # If exists and is paused, resumes workflow +# workflow_context: WorkflowContext = websocket.state.workflow_context +# session_id = await mindctrl.get_or_create_conversation(client_id) + +# await asyncio.sleep(10) +# ring_buffer = iter(websocket.state.state_ring_buffer.copy()) +# while True: +# try: +# payload = next(ring_buffer) +# await websocket.send_json(payload) +# await asyncio.sleep(1) + +# message = await websocket.receive_json() +# _logger.info(f"Message received: {message}") +# assert message["type"] == "mindctrl.chat.user" +# chat_message = Message(content=message["content"], role="user") + +# # TODO: Actually expand the polling loop, so send should be quick +# # Then poll on the assistant response +# # You might not need a workflow for multiturn? +# assistant_response = await mindctrl.send_message(session_id, chat_message) +# await websocket.send_json(assistant_response) + +# except StopIteration: +# _logger.warning("Websocket buffer empty, waiting for new events") +# await asyncio.sleep(2) +# ring_buffer = iter(websocket.state.state_ring_buffer.copy()) +# except WebSocketDisconnect: +# _logger.warning("Websocket disconnected") + +# # Pauses workflow +# # Sets a timer to terminate the workflow if no activity for X minutes +# mindctrl.disconnect_conversation(session_id) + +# break diff --git a/python/src/mindctrl/workflows/__init__.py b/python/src/mindctrl/workflows/__init__.py index 716ea8d..93ddb16 100644 --- a/python/src/mindctrl/workflows/__init__.py +++ b/python/src/mindctrl/workflows/__init__.py @@ -1,52 +1,147 @@ # https://github.com/dapr/python-sdk/blob/main/examples/demo_workflow/app.py#LL40C1-L43C59 +import json import logging +import uuid from typing import Optional -from dapr.ext.workflow import ( - WorkflowRuntime, -) +import mlflow.pyfunc +from dapr.ext.workflow import WorkflowRuntime +from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient +from dapr.ext.workflow.workflow_state import WorkflowStatus -from .agent import append_message, invoke_model, conversation_turn_workflow +from .agent import ( + Message, + ModelInvocation, + append_message, + conversation_turn_workflow, + invoke_model, +) from .deployer import ( - stop_model_monitor, - wait_for_model_serve, check_deployment_status, deploy_model_workflow, - stop_model, serve_model, + stop_model, + stop_model_monitor, + wait_for_model_serve, ) _logger = logging.getLogger(__name__) +class WorkflowModel(mlflow.pyfunc.PythonModel): + def __init__(self): + self.workflows = [] + self.activities = [] + + def add_workflow(self, workflow): + if len(self.workflows) > 0: + raise ValueError("Only one workflow is supported at this time") + self.workflows.append(workflow) + + def add_activity(self, activity): + self.activities.append(activity) + + def predict(self, context, model_input, params=None): + wfr = WorkflowRuntime() + for workflow in self.workflows: + wfr.register_workflow(workflow) + for activity in self.activities: + wfr.register_activity(activity) + instance_id = uuid.uuid4().hex + client = DaprWorkflowClient() + instance_id = client.schedule_new_workflow( + self.workflows[0], input=model_input, instance_id=instance_id + ) + result = client.wait_for_workflow_completion(instance_id, fetch_payloads=True) + assert result is not None + return result.serialized_output + + class WorkflowContext: - def __init__(self, port: Optional[str] = None): - _logger.info("Initializing WorkflowContext") - self.workflow_runtime = WorkflowRuntime(port=port) + def __init__(self, host: Optional[str] = None, port: Optional[str] = None): + _logger.info(f"Initializing WorkflowContext with {host}:{port}") + self.host = host + self.port = port + self._workflow_runtime = WorkflowRuntime(host=host, port=port) self._register_turn_workflow() self._register_deployer_workflow() + self.initialized = False def __enter__(self): - self.workflow_runtime.start() - return self.workflow_runtime + self._workflow_runtime.start() + self.initialized = True + return self def __exit__(self, exc_type, exc_value, traceback): - self.workflow_runtime.shutdown() + self._workflow_runtime.shutdown() + + @property + def runtime(self): + return self._workflow_runtime + + def get_workflow_client(self): + return DaprWorkflowClient(self.host, self.port) def _register_turn_workflow(self): _logger.info("Registering turn workflow") - self.workflow_runtime.register_workflow(conversation_turn_workflow) + self._workflow_runtime.register_workflow(conversation_turn_workflow) _logger.info("Registering activities") - self.workflow_runtime.register_activity(append_message) - self.workflow_runtime.register_activity(invoke_model) + self._workflow_runtime.register_activity(append_message) + self._workflow_runtime.register_activity(invoke_model) def _register_deployer_workflow(self): _logger.info("Registering deployer workflows") - self.workflow_runtime.register_workflow(deploy_model_workflow) - self.workflow_runtime.register_workflow(check_deployment_status) + self._workflow_runtime.register_workflow(deploy_model_workflow) + self._workflow_runtime.register_workflow(check_deployment_status) _logger.info("Registering activities") - self.workflow_runtime.register_activity(wait_for_model_serve) - self.workflow_runtime.register_activity(serve_model) - self.workflow_runtime.register_activity(stop_model) - self.workflow_runtime.register_activity(stop_model_monitor) + self._workflow_runtime.register_activity(wait_for_model_serve) + self._workflow_runtime.register_activity(serve_model) + self._workflow_runtime.register_activity(stop_model) + self._workflow_runtime.register_activity(stop_model_monitor) + + +class Conversation: + def __init__( + self, + client: DaprWorkflowClient, + model_uri: str, + conversation_id: Optional[str] = None, + ): + self.model_uri = model_uri + self.conversation_id: str = conversation_id or uuid.uuid4().hex + self.client = client + self.turn_ids: list[str] = [] + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def send_message(self, message: str) -> Message: + turn_id = f"{self.conversation_id}-{len(self.turn_ids)}" + self.turn_ids.append(turn_id) + instance_id = self.client.schedule_new_workflow( + conversation_turn_workflow, + input=ModelInvocation( + model_uri=self.model_uri, + conversation_id=self.conversation_id, + scenario_name=self.conversation_id, + history=None, + input_variables={}, + ), + instance_id=turn_id, + ) + self.client.raise_workflow_event(instance_id, "user_message", data=message) + + state = self.client.wait_for_workflow_completion(instance_id) + if state is None: + raise RuntimeError(f"Failed to get state for {turn_id}") + if state.runtime_status != WorkflowStatus.COMPLETED: + # print(state._WorkflowState__obj) + # print(state) + raise RuntimeError(f"Failed to complete {turn_id}: {state}") + # print(state.serialized_output) + out = json.loads(state.serialized_output) + return Message(content=out["content"], role=out["role"]) diff --git a/python/src/mindctrl/workflows/agent.py b/python/src/mindctrl/workflows/agent.py index a1f13e2..bedbc89 100644 --- a/python/src/mindctrl/workflows/agent.py +++ b/python/src/mindctrl/workflows/agent.py @@ -1,94 +1,176 @@ import logging +import pickle +from dataclasses import dataclass +from types import SimpleNamespace +from typing import Optional -from pydantic import BaseModel - +import mlflow.pyfunc from dapr.clients import DaprClient from dapr.ext.workflow import ( DaprWorkflowContext, WorkflowActivityContext, ) -from mindctrl.mlmodels import invoke_model_impl, ModelInvocation +from mindctrl.mlmodels import invoke_model_impl +from mindctrl.openai_deployment import _ContentFormatter, _OpenAIDeploymentWrapper _logger = logging.getLogger(__name__) # TODO: unify with the monkeypatch of deploymentserver for tool calling? -class Message(BaseModel): +# TODO: Fix durable task client to handle pydantic models, then switch +# TODO: file a bug on durabletask.internal.shared.py +@dataclass +class Message: content: str role: str -class Conversation(BaseModel): +@dataclass +class Conversation: messages: list[Message] -def append_message(ctx: WorkflowActivityContext, message_json: str): - _logger.info(f"Received message: {message_json}") - # Moving pydantic away from the signature because it's not json.dumps-able - # TODO: file a bug on durabletask.internal.shared.py - message = Message.model_validate_json(message_json) - # This is where we do some fun memory tricks like compression, embedding, windowing etc - # TODO: Dapr + async def activities? - with DaprClient() as d: - store_name = "daprstore" - convo_id = f"convo-{ctx.workflow_id}" - current_convo = d.get_state(store_name=store_name, key=convo_id) - # TODO: Handle etags - convo = Conversation(messages=[]) - if current_convo.data: - convo = Conversation.model_validate_json(current_convo.data) - convo.messages.append(message) - conversation_length = len(convo.messages) - d.save_state(store_name, convo_id, convo.model_dump_json()) - return conversation_length - - -def invoke_model( - ctx: WorkflowActivityContext, input: ModelInvocation -) -> dict[str, str]: +@dataclass +class MessageInConvo: + message: Message + conversation_id: str + + +@dataclass +class ModelInvocation: + model_uri: str + scenario_name: Optional[str] + input_variables: dict[str, str] + conversation_id: str + history: Optional[Conversation] + + +def append_message( + ctx: WorkflowActivityContext, message: MessageInConvo +) -> Conversation: + _logger.info(f"Received message: {message}") + try: + # This is where we do some fun memory tricks like compression, embedding, windowing etc + # TODO: Dapr + async def activities? + with DaprClient() as d: + store_name = "daprstore" + convo_id = f"convo-{message.conversation_id}" + current_convo = d.get_state(store_name=store_name, key=convo_id) + + # TODO: Handle etags + convo = Conversation(messages=[]) + if current_convo.data: + convo: Conversation = pickle.loads(current_convo.data) + + # The type marshaling by durabletask/dapr is a bit wonky... + if isinstance(message.message, dict): + convo.messages.append(Message(**message.message)) + elif isinstance(message.message, Message): + convo.messages.append(message.message) + elif isinstance(message.message, SimpleNamespace): + convo.messages.append(Message(**message.message.__dict__)) + else: + raise ValueError(f"Unknown message type: {type(message.message)}") + d.save_state(store_name, convo_id, pickle.dumps(convo)) + + # TODO: Put the compressed state into the system message next time + return convo + except Exception as e: + import traceback + + traceback.print_exception(e) + # breakpoint() + raise + + +def get_user_chat_payload(query: str) -> dict: + return { + "dataframe_split": { + "columns": ["query"], + "data": [[query]], + } + } + + +def append_history(model: mlflow.pyfunc.PyFuncModel, history: Conversation): + inner_model = model._model_impl + assert isinstance(inner_model, _OpenAIDeploymentWrapper) + messages = [m.__dict__ for m in history.messages] + existing_messages: list = inner_model.template # type: ignore + combined_messages = existing_messages[:1] + messages + existing_messages[1:] + inner_model.formater = _ContentFormatter(inner_model.task, combined_messages) + return model + + +# TODO: CONVERT THIS TO MESSAGE IN, MESSAGE OUT +def invoke_model(ctx: WorkflowActivityContext, input: ModelInvocation) -> Message: # TODO: Handle more complex responses - _logger.info(f"Invoking model with input: {input}") - import mlflow.pyfunc + print(f"Invoking model with input: {input}") + try: + model = mlflow.pyfunc.load_model(input.model_uri) + assert input.history is not None + assert len(input.history.messages) > 0 + history = Conversation(messages=[Message(**m) for m in input.history.messages]) # type: ignore + payload = get_user_chat_payload(history.messages[-1].content) - model = mlflow.pyfunc.load_model(input.model_uri) - response_message = invoke_model_impl( - model, input.payload, input.scenario_name, input.input_variables - )[0] - return {"content": response_message, "role": "assistant"} + del history.messages[-1] + model = append_history(model, history) + response_message = invoke_model_impl( + model, payload, input.scenario_name, input.input_variables + )[0] + return Message(content=response_message, role="assistant") + except Exception as e: + import traceback -def conversation_turn_workflow(ctx: DaprWorkflowContext, input: ModelInvocation): - # This workflow handles a conversation between a user and LLM. It will receive a message from the user, and then - # respond with a message from LLM. This will continue until the user sends a message that ends the conversation. - # The conversation will be stored in the state store, so that it can be resumed later. + traceback.print_exception(e) + # breakpoint() + raise + +def conversation_turn_workflow(ctx: DaprWorkflowContext, input: ModelInvocation): _logger.info(f"{input}") - # 1. Activity: Append message to conversation history, return conversation position - # 2. Activity: Input conversation position, Fetch conversation history, Invoke model, return response - # 3. Activity: Append response to conversation history, return conversation position - - # TODO: this is wrong, get a real message structure for chat models - message = Message(content=str(input.payload), role="user") - conversation_status: int = yield ctx.call_activity( - append_message, input=message.model_dump_json() - ) - _logger.info(f"Conversation turn: {conversation_status}") - response: dict[str, str] = yield ctx.call_activity(invoke_model, input=input) - # if tool call - # messages.append(response.choices[0].message) - # then yield ctx.call_activity(invoke_tool, input=response.choices[0].tool) - # messages.append( - # { - # "role": "function", - # "name": function_name, - # "content": str(function_response), - # } - # ) - # messages - - response_message = Message(**response) - conversation_status = yield ctx.call_activity( - append_message, input=response_message.model_dump_json() - ) + try: + message_str = yield ctx.wait_for_external_event("user_message") + assert isinstance(message_str, str) + # TODO: this is wrong, get a real message structure for chat models + message = Message(content=message_str, role="user") + conversation: Conversation = yield ctx.call_activity( + append_message, + input=MessageInConvo( + message=message, conversation_id=input.conversation_id + ), + ) + input.history = conversation + response_message: Message = yield ctx.call_activity(invoke_model, input=input) + # if tool call + # messages.append(response.choices[0].message) + # then yield ctx.call_activity(invoke_tool, input=response.choices[0].tool) + # messages.append( + # { + # "role": "function", + # "name": function_name, + # "content": str(function_response), + # } + # ) + # messages + + conversation = yield ctx.call_activity( + append_message, + input=MessageInConvo( + message=response_message, conversation_id=input.conversation_id + ), + ) + # TODO: Need to implement https://github.com/microsoft/durabletask-python/issues/25 + # That way the response can be custom status instead of return value + # Right now you have to schedule each turn of the workflow manually + # ctx.continue_as_new(input) + return response_message + except Exception as e: + import traceback + + traceback.print_exception(e) + # breakpoint() + raise diff --git a/python/src/mindctrl/workflows/deployer.py b/python/src/mindctrl/workflows/deployer.py index 383f8f4..f45b29f 100644 --- a/python/src/mindctrl/workflows/deployer.py +++ b/python/src/mindctrl/workflows/deployer.py @@ -1,16 +1,14 @@ -from dataclasses import dataclass -from datetime import timedelta import logging import subprocess - +from dataclasses import dataclass +from datetime import timedelta from dapr.clients import DaprClient -from dapr.ext.workflow import DaprWorkflowContext, WorkflowActivityContext, RetryPolicy +from dapr.ext.workflow import DaprWorkflowContext, RetryPolicy, WorkflowActivityContext from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient from mindctrl.const import STOP_DEPLOYED_MODEL - _logger = logging.getLogger(__name__) diff --git a/python/tests/test_hass_api.py b/python/tests/test_hass_api.py index 24a868a..b00e637 100644 --- a/python/tests/test_hass_api.py +++ b/python/tests/test_hass_api.py @@ -1,10 +1,10 @@ import logging from random import randint -import pytest + import httpx +import pytest from httpx_ws import aconnect_ws - # https://developers.home-assistant.io/docs/api/websocket # Is there no open source non-GPL python client for Home Assistant? Ideally this exists independently diff --git a/python/tests/test_hass_client.py b/python/tests/test_hass_client.py index 2d66289..e439e69 100644 --- a/python/tests/test_hass_client.py +++ b/python/tests/test_hass_client.py @@ -1,7 +1,7 @@ import logging -from httpx import URL -import pytest +import pytest +from httpx import URL from mindctrl.homeassistant.client import HassClient from mindctrl.homeassistant.messages import CreateLabel diff --git a/python/tests/test_mlflow.py b/python/tests/test_mlflow.py index 1880226..e30081a 100644 --- a/python/tests/test_mlflow.py +++ b/python/tests/test_mlflow.py @@ -1,9 +1,9 @@ import json +import uuid + import mlflow import mlflow.openai import openai -import uuid - from mindctrl.const import SCENARIO_NAME_PARAM from mindctrl.mlmodels import log_system_models from mindctrl.openai_deployment import log_model diff --git a/python/tests/test_replay_server.py b/python/tests/test_replay_server.py index eec90e8..814cce2 100644 --- a/python/tests/test_replay_server.py +++ b/python/tests/test_replay_server.py @@ -1,13 +1,11 @@ import json import logging from pathlib import Path -import pytest +import pytest from fastapi.testclient import TestClient - from mindctrl.replay_server import create_app_from_env - _logger = logging.getLogger(__name__) diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 564e6af..8c98ae3 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -1,27 +1,30 @@ import atexit -from dataclasses import dataclass import json import logging import os +import subprocess +import time +import uuid +from dataclasses import dataclass from pathlib import Path from typing import Any, Optional + import httpx +import openai import pytest -import subprocess -import time - -from durabletask.client import OrchestrationState -from dapr.conf import settings from dapr.clients import DaprClient -from dapr.ext.workflow.workflow_state import WorkflowStatus +from dapr.conf import settings +from dapr.ext.workflow import WorkflowState from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient - -from mindctrl.mlmodels import ModelInvocation -from mindctrl.workflows import WorkflowContext -from mindctrl.workflows.agent import conversation_turn_workflow +from dapr.ext.workflow.workflow_state import WorkflowStatus +from durabletask.client import OrchestrationState +from mindctrl.openai_deployment import log_model +from mindctrl.workflows import Conversation, WorkflowContext +from mindctrl.workflows.agent import ( + get_user_chat_payload, +) from mindctrl.workflows.deployer import ModelServeCommand, deploy_model_workflow - _logger = logging.getLogger(__name__) @@ -156,26 +159,14 @@ def dapr_sidecar( @pytest.fixture(scope="session") -def workflow_client(): - with WorkflowContext(): - yield DaprWorkflowClient() - - -def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, request): - import pandas as pd - from mindctrl.openai_deployment import log_model - import openai - - df = pd.DataFrame({"query": ["What's up doc?"]}) - payload = {"dataframe_split": df.to_dict(orient="split")} - +def workflow_client(dapr_sidecar, mlflow_fluent_session): log_model( model="gpt-4-turbo-preview", task=openai.chat.completions, messages=[ { "role": "system", - "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete.", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'", }, { "role": "user", @@ -185,53 +176,65 @@ def test_smoke_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, re artifact_path="oai-chatty-cathy", registered_model_name="chatty_cathy", ) - input_invocation = ModelInvocation( - model_uri="models:/chatty_cathy/latest", - payload=payload, - scenario_name=request.node.name, - input_variables={}, - ) + with WorkflowContext(): + yield DaprWorkflowClient() - # TODO: Without this, there isn't a proper actor lookup.. - time.sleep(5) - instance_id = workflow_client.schedule_new_workflow( - conversation_turn_workflow, - input=input_invocation, - instance_id=request.node.name, - ) - state = workflow_client.wait_for_workflow_completion(instance_id) +def assert_workflow_completed(state: WorkflowState | None): + assert state is not None + if state.runtime_status != WorkflowStatus.COMPLETED: + print(state._WorkflowState__obj) + print(state) assert state.runtime_status == WorkflowStatus.COMPLETED -def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, request): - import pandas as pd - from mindctrl.openai_deployment import log_model - import openai +def test_smoke_workflow(workflow_client, request): + with Conversation( + workflow_client, + "models:/chatty_cathy/latest", + conversation_id=request.node.name, + ) as convo: + response = convo.send_message("Tell me your secrets") + assert response.role == "assistant" + _logger.info(f"Response: {response.content}") + # This is to test preservation of the system message + assert "mozzarella" in response.content.lower() + + +def test_multiturn_workflow(workflow_client, request): + with Conversation( + workflow_client, + "models:/chatty_cathy/latest", + conversation_id=request.node.name, + ) as convo: + test_name = request.node.name + response = convo.send_message( + f"My name is {test_name} do not forget it. The weather outside is 95 deg F. I have a fan that is off. Who are you?" + ) + assert response.role == "assistant" + + response = convo.send_message("What is my name?") + assert test_name in response.content + assert "your name" in response.content.lower() + assert "mozzarella" not in response.content.lower() + + response = convo.send_message( + "Should I turn on the fan? If so, why? If not, why not? Be brief." + ) + assert "yes" in response.content.lower() + assert "on" in response.content.lower() + assert "mozzarella" not in response.content.lower() + + response = convo.send_message("Is it hot outside?") + assert "yes" in response.content.lower() + assert "mozzarella" not in response.content.lower() - df = pd.DataFrame({"query": ["What's up doc?"]}) - payload = {"dataframe_split": df.to_dict(orient="split")} +def test_deploy_workflow(workflow_client, request): + payload = get_user_chat_payload("What's up doc?") ## Add scenario name payload["params"] = {"scenario_name": request.node.name} - log_model( - model="gpt-4-turbo-preview", - task=openai.chat.completions, - messages=[ - { - "role": "system", - "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete.", - }, - { - "role": "user", - "content": "{query}", - }, - ], - artifact_path="oai-chatty-cathy", - registered_model_name="chatty_cathy", - ) - model_serve_command = ModelServeCommand( model_uri="models:/chatty_cathy/latest", port=45922, @@ -242,7 +245,6 @@ def test_deploy_workflow(dapr_sidecar, mlflow_fluent_session, workflow_client, r app_id = "models_chatty_cathy_latest" atexit.register(lambda: stop_dapr_app(app_id)) - time.sleep(5) instance_id = workflow_client.schedule_new_workflow( deploy_model_workflow, input=model_serve_command, @@ -330,6 +332,4 @@ class MockRequest: node: MockNode with WorkflowContext(): - test_smoke_workflow( - None, None, None, request=MockRequest(MockNode("test_smoke_workflow")) - ) + test_smoke_workflow(None, request=MockRequest(MockNode("test_smoke_workflow"))) diff --git a/tests/conftest.py b/tests/conftest.py index e4d2486..1ffa2b9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,49 +1,45 @@ -from dataclasses import dataclass -from enum import Enum import logging import os +import shutil +import subprocess +from dataclasses import dataclass +from enum import Enum from pathlib import Path from typing import Tuple + import aiomqtt -from pydantic import SecretStr -import pytest -import httpx -import sqlalchemy +import constants import docker -import subprocess -import shutil - -from testcontainers.postgres import PostgresContainer -from testcontainers.core.waiting_utils import wait_for_logs +import httpx +# This is gross.. +import mlflow.tracking._tracking_service.utils +import pytest +import sqlalchemy from mindctrl.config import AppSettings, MqttEventsSettings, PostgresStoreSettings from mindctrl.const import REPLAY_SERVER_INPUT_FILE_SUFFIX - -import constants - +from pydantic import SecretStr +from testcontainers.core.waiting_utils import wait_for_logs +from testcontainers.postgres import PostgresContainer +from utils.addon import AddonContainer, create_mock_supervisor from utils.browser import perform_onboarding_and_get_ll_token +from utils.cluster import LocalRegistryK3dManager, prepare_apps from utils.common import ( HAContainer, build_app, dump_container_logs, + get_external_host_port, get_local_ip, push_app, wait_for_readiness, - get_external_host_port, ) from utils.local import ( + DeploymentServerContainer, LocalMultiserver, MlflowContainer, MosquittoContainer, - DeploymentServerContainer, TraefikContainer, ) -from utils.cluster import LocalRegistryK3dManager, prepare_apps -from utils.addon import AddonContainer, create_mock_supervisor - - -# This is gross.. -import mlflow.tracking._tracking_service.utils # TODO: [mlflow] get a real environment variable for this TEST_ARTIFACT_PATH = "./mlruns" diff --git a/tests/test_addon.py b/tests/test_addon.py index f3f3832..379280f 100644 --- a/tests/test_addon.py +++ b/tests/test_addon.py @@ -1,9 +1,9 @@ import logging import os from pathlib import Path + import pytest import yaml - from mindctrl.config import AppSettings _logger = logging.getLogger(__name__) diff --git a/tests/test_api.py b/tests/test_api.py index c5f1a57..cc22bae 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,9 +1,8 @@ -import uuid -from mlflow import MlflowClient import logging +import uuid import pytest - +from mlflow import MlflowClient _logger = logging.getLogger(__name__) diff --git a/tests/test_appsettings.py b/tests/test_appsettings.py index 0459529..8d21032 100644 --- a/tests/test_appsettings.py +++ b/tests/test_appsettings.py @@ -1,7 +1,6 @@ -from pydantic_core import ValidationError -from mindctrl.config import AppSettings - import pytest +from mindctrl.config import AppSettings +from pydantic_core import ValidationError def test_basic_appsettings(monkeypatch): diff --git a/tests/test_data/test_deploy_workflow-input.json b/tests/test_data/test_deploy_workflow-input.json index 4664848..ebce45b 100644 --- a/tests/test_data/test_deploy_workflow-input.json +++ b/tests/test_data/test_deploy_workflow-input.json @@ -12,7 +12,7 @@ "messages": [ { "role": "system", - "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete." + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" }, { "role": "user", @@ -36,7 +36,7 @@ }, "headers": { "Date": [ - "Sat, 11 May 2024 05:03:54 GMT" + "Mon, 20 May 2024 06:30:02 GMT" ], "Content-Type": [ "application/json" @@ -49,7 +49,7 @@ ], "openai-organization": "FAKE_OAI_ORG", "openai-processing-ms": [ - "835" + "877" ], "openai-version": [ "2020-10-01" @@ -67,16 +67,16 @@ "499" ], "x-ratelimit-remaining-tokens": [ - "29957" + "29933" ], "x-ratelimit-reset-requests": [ "120ms" ], "x-ratelimit-reset-tokens": [ - "86ms" + "134ms" ], "x-request-id": [ - "req_f4015ecd2b426223304e80153e5165e5" + "req_6f86363b8fde2d1add7c25ede1d81a7d" ], "CF-Cache-Status": [ "DYNAMIC" @@ -86,7 +86,7 @@ "cloudflare" ], "CF-RAY": [ - "881fa006ac72eb83-SEA" + "886a4694bb4f76c1-SEA" ], "Content-Encoding": [ "gzip" @@ -96,7 +96,7 @@ ] }, "body": { - "string": "{\n \"id\": \"chatcmpl-9NZBhhXVHRHmKKIp9qYlRtPeWD1a8\",\n \"object\": \"chat.completion\",\n \"created\": 1715403833,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you out! What can I do for you today?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 34,\n \"completion_tokens\": 18,\n \"total_tokens\": 52\n },\n \"system_fingerprint\": null\n}\n" + "string": "{\n \"id\": \"chatcmpl-9QqozsTIgLr9qruTzOjYoTfs0FY5j\",\n \"object\": \"chat.completion\",\n \"created\": 1716186601,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you with any questions or information you need! What's up with you?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 57,\n \"completion_tokens\": 22,\n \"total_tokens\": 79\n },\n \"system_fingerprint\": null\n}\n" } } }, @@ -111,7 +111,7 @@ "messages": [ { "role": "system", - "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete." + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" }, { "role": "user", @@ -135,7 +135,7 @@ }, "headers": { "Date": [ - "Sat, 11 May 2024 05:03:55 GMT" + "Mon, 20 May 2024 06:30:03 GMT" ], "Content-Type": [ "application/json" @@ -148,7 +148,7 @@ ], "openai-organization": "FAKE_OAI_ORG", "openai-processing-ms": [ - "829" + "716" ], "openai-version": [ "2020-10-01" @@ -166,16 +166,16 @@ "499" ], "x-ratelimit-remaining-tokens": [ - "29957" + "29933" ], "x-ratelimit-reset-requests": [ "120ms" ], "x-ratelimit-reset-tokens": [ - "86ms" + "134ms" ], "x-request-id": [ - "req_45ff45867b11c96def3bd5e3b37ea8ad" + "req_8784a8eb1fba6b2c94f85abf869f8a1e" ], "CF-Cache-Status": [ "DYNAMIC" @@ -185,7 +185,7 @@ "cloudflare" ], "CF-RAY": [ - "881fa00cecbf2769-SEA" + "886a469c4a93c4ca-SEA" ], "Content-Encoding": [ "gzip" @@ -195,7 +195,7 @@ ] }, "body": { - "string": "{\n \"id\": \"chatcmpl-9NZBi34yYV5srn6KcdxTdrTLdQeaX\",\n \"object\": \"chat.completion\",\n \"created\": 1715403834,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you out! What can I do for you today?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 34,\n \"completion_tokens\": 18,\n \"total_tokens\": 52\n },\n \"system_fingerprint\": null\n}\n" + "string": "{\n \"id\": \"chatcmpl-9Qqp1mjIgLS3mr6h1iYkYr8u77523\",\n \"object\": \"chat.completion\",\n \"created\": 1716186603,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you with any questions or information you need! What's up with you?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 57,\n \"completion_tokens\": 22,\n \"total_tokens\": 79\n },\n \"system_fingerprint\": null\n}\n" } } } diff --git a/tests/test_data/test_multiturn_workflow-input.json b/tests/test_data/test_multiturn_workflow-input.json new file mode 100644 index 0000000..a0998c5 --- /dev/null +++ b/tests/test_data/test_multiturn_workflow-input.json @@ -0,0 +1,449 @@ +{ + "version": 1, + "interactions": [ + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "My name is test_multiturn_workflow do not forget it. The weather outside is 95 deg F. I have a fan that is off. Who are you?" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Mon, 20 May 2024 06:28:39 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "1430" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29906" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "188ms" + ], + "x-request-id": [ + "req_fac4269a4202f157958f2779eeab369f" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "886a448b1ce4767b-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9QqnehW9cEFJrhf7WNkGsMt60Aokq\",\n \"object\": \"chat.completion\",\n \"created\": 1716186518,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"I'm an AI developed by OpenAI, here to help answer your questions and assist you with a wide range of topics. How can I assist you today, test_multiturn_workflow?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 86,\n \"completion_tokens\": 38,\n \"total_tokens\": 124\n },\n \"system_fingerprint\": null\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "My name is test_multiturn_workflow do not forget it. The weather outside is 95 deg F. I have a fan that is off. Who are you?" + }, + { + "role": "assistant", + "content": "I'm an AI developed by OpenAI, here to help answer your questions and assist you with a wide range of topics. How can I assist you today, test_multiturn_workflow?" + }, + { + "role": "user", + "content": "What is my name?" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Mon, 20 May 2024 06:28:41 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "711" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29859" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "282ms" + ], + "x-request-id": [ + "req_afa045736d4e6e13fcfcc83c1334e122" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "886a44979c8e7571-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9QqngXlJVURQgQukVBRFM6RqQy2PZ\",\n \"object\": \"chat.completion\",\n \"created\": 1716186520,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Your name is test_multiturn_workflow. How can I assist you further?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 137,\n \"completion_tokens\": 16,\n \"total_tokens\": 153\n },\n \"system_fingerprint\": null\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "My name is test_multiturn_workflow do not forget it. The weather outside is 95 deg F. I have a fan that is off. Who are you?" + }, + { + "role": "assistant", + "content": "I'm an AI developed by OpenAI, here to help answer your questions and assist you with a wide range of topics. How can I assist you today, test_multiturn_workflow?" + }, + { + "role": "user", + "content": "What is my name?" + }, + { + "role": "assistant", + "content": "Your name is test_multiturn_workflow. How can I assist you further?" + }, + { + "role": "user", + "content": "Should I turn on the fan? If so, why? If not, why not? Be brief." + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Mon, 20 May 2024 06:28:44 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "2161" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29824" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "352ms" + ], + "x-request-id": [ + "req_708717badd4a1744b1577d141fe78b1c" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "886a44a0becb2846-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9Qqnh2a9T2AO2nc2ORIj1NA59XGQp\",\n \"object\": \"chat.completion\",\n \"created\": 1716186521,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Yes, considering it's 95 degrees F outside, turning on the fan can help cool you down and make the environment more comfortable.\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 182,\n \"completion_tokens\": 27,\n \"total_tokens\": 209\n },\n \"system_fingerprint\": null\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4-turbo-preview", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "My name is test_multiturn_workflow do not forget it. The weather outside is 95 deg F. I have a fan that is off. Who are you?" + }, + { + "role": "assistant", + "content": "I'm an AI developed by OpenAI, here to help answer your questions and assist you with a wide range of topics. How can I assist you today, test_multiturn_workflow?" + }, + { + "role": "user", + "content": "What is my name?" + }, + { + "role": "assistant", + "content": "Your name is test_multiturn_workflow. How can I assist you further?" + }, + { + "role": "user", + "content": "Should I turn on the fan? If so, why? If not, why not? Be brief." + }, + { + "role": "assistant", + "content": "Yes, considering it's 95 degrees F outside, turning on the fan can help cool you down and make the environment more comfortable." + }, + { + "role": "user", + "content": "Is it hot outside?" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Mon, 20 May 2024 06:28:45 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "518" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29786" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "428ms" + ], + "x-request-id": [ + "req_2cb2dc83889210712efcfc18ec51650e" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "886a44b54f083076-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9Qqnli1w5WmN3h03DZuMBiSe7ybMz\",\n \"object\": \"chat.completion\",\n \"created\": 1716186525,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Yes, at 95 degrees F, it is considered hot outside.\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 222,\n \"completion_tokens\": 14,\n \"total_tokens\": 236\n },\n \"system_fingerprint\": null\n}\n" + } + } + } + ] +} diff --git a/tests/test_data/test_smoke_workflow-input.json b/tests/test_data/test_smoke_workflow-input.json index 3b4b2c6..d52add1 100644 --- a/tests/test_data/test_smoke_workflow-input.json +++ b/tests/test_data/test_smoke_workflow-input.json @@ -12,11 +12,11 @@ "messages": [ { "role": "system", - "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete." + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" }, { "role": "user", - "content": "What's up doc?" + "content": "Tell me your secrets" } ] }, @@ -36,7 +36,7 @@ }, "headers": { "Date": [ - "Sun, 05 May 2024 04:01:49 GMT" + "Mon, 20 May 2024 06:28:37 GMT" ], "Content-Type": [ "application/json" @@ -49,7 +49,7 @@ ], "openai-organization": "FAKE_OAI_ORG", "openai-processing-ms": [ - "960" + "264" ], "openai-version": [ "2020-10-01" @@ -67,16 +67,16 @@ "499" ], "x-ratelimit-remaining-tokens": [ - "29957" + "29932" ], "x-ratelimit-reset-requests": [ "120ms" ], "x-ratelimit-reset-tokens": [ - "86ms" + "136ms" ], "x-request-id": [ - "req_e26c3b43b90f0eaaa765bfdaa08a8a80" + "req_18f8a42d01b95edc3174b9d30c7d03ae" ], "CF-Cache-Status": [ "DYNAMIC" @@ -86,7 +86,7 @@ "cloudflare" ], "CF-RAY": [ - "87edd4d768b8c52d-SEA" + "886a4484888376f1-SEA" ], "Content-Encoding": [ "gzip" @@ -96,7 +96,7 @@ ] }, "body": { - "string": "{\n \"id\": \"chatcmpl-9LNMKW53yXodhyz1GHLQi8Fg9aIdl\",\n \"object\": \"chat.completion\",\n \"created\": 1714881708,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Not much, just here to help you with any questions or information you need. What's up with you?\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 34,\n \"completion_tokens\": 22,\n \"total_tokens\": 56\n },\n \"system_fingerprint\": null\n}\n" + "string": "{\n \"id\": \"chatcmpl-9QqndAae9cJw8wB3hGjlE7YR7SA6V\",\n \"object\": \"chat.completion\",\n \"created\": 1716186517,\n \"model\": \"gpt-4-0125-preview\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"mozzarella\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 56,\n \"completion_tokens\": 2,\n \"total_tokens\": 58\n },\n \"system_fingerprint\": null\n}\n" } } } diff --git a/tests/test_multiserver.py b/tests/test_multiserver.py index 8b6bcc8..f7d7aaf 100644 --- a/tests/test_multiserver.py +++ b/tests/test_multiserver.py @@ -1,9 +1,9 @@ -import uuid -from mlflow import MlflowClient -import pandas as pd import logging +import uuid from pathlib import Path +import pandas as pd +from mlflow import MlflowClient _logger = logging.getLogger(__name__) diff --git a/tests/utils/addon.py b/tests/utils/addon.py index 92601de..b8e8a68 100644 --- a/tests/utils/addon.py +++ b/tests/utils/addon.py @@ -1,10 +1,10 @@ import logging -import fastapi +import fastapi +from mindctrl.config import AppSettings from uvicorn import Config from .common import UvicornServer -from mindctrl.config import AppSettings from .local import DeploymentServerContainer _logger = logging.getLogger(__name__) diff --git a/tests/utils/browser.py b/tests/utils/browser.py index e8dabad..7402041 100644 --- a/tests/utils/browser.py +++ b/tests/utils/browser.py @@ -1,13 +1,15 @@ import logging from pathlib import Path -# playwright install --with-deps chromium - -from playwright.sync_api import sync_playwright, Browser from playwright._impl._errors import ( - TimeoutError as PlaywrightTimeoutError, Error as PlaywrightError, ) +from playwright._impl._errors import ( + TimeoutError as PlaywrightTimeoutError, +) + +# playwright install --with-deps chromium +from playwright.sync_api import Browser, sync_playwright _logger = logging.getLogger(__name__) diff --git a/tests/utils/cluster.py b/tests/utils/cluster.py index 9d49800..c966a7c 100644 --- a/tests/utils/cluster.py +++ b/tests/utils/cluster.py @@ -2,15 +2,15 @@ import logging import os -from pathlib import Path import subprocess +from pathlib import Path from typing import Dict, List, Optional -from pytest_kubernetes.providers.k3d import K3dManager + from pytest_kubernetes.options import ClusterOptions +from pytest_kubernetes.providers.k3d import K3dManager from .common import build_app - _logger = logging.getLogger(__name__) diff --git a/tests/utils/common.py b/tests/utils/common.py index 68a4f51..f72363f 100644 --- a/tests/utils/common.py +++ b/tests/utils/common.py @@ -1,18 +1,17 @@ import logging import multiprocessing -from pathlib import Path +import socket import time +from pathlib import Path from typing import Iterator, Optional, Union + +import constants import httpx -from python_on_whales import docker as docker_cli from docker import DockerClient -import socket -from uvicorn import Config, Server +from python_on_whales import docker as docker_cli from testcontainers.core.container import DockerContainer from testcontainers.postgres import PostgresContainer - -import constants - +from uvicorn import Config, Server _logger = logging.getLogger(__name__) diff --git a/tests/utils/local.py b/tests/utils/local.py index e9aa5c4..1e50659 100644 --- a/tests/utils/local.py +++ b/tests/utils/local.py @@ -1,12 +1,12 @@ import logging -from pathlib import Path import os +from pathlib import Path from typing import Optional -from uvicorn import Config - import constants from mindctrl.const import REPLAY_SERVER_INPUT_FILE_SUFFIX +from uvicorn import Config + from .common import ServiceContainer, UvicornServer _logger = logging.getLogger(__name__) From e16b1f965691087433513a1b7dbba6a90e924cb8 Mon Sep 17 00:00:00 2001 From: AK Date: Sun, 19 May 2024 23:38:05 -0700 Subject: [PATCH 15/18] lint --- python/tests/test_workflows.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index 8c98ae3..af3c29f 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -4,7 +4,6 @@ import os import subprocess import time -import uuid from dataclasses import dataclass from pathlib import Path from typing import Any, Optional From 252290a8a96bcad74dfe8d8c6b61e4d9f851bf84 Mon Sep 17 00:00:00 2001 From: AK Date: Sun, 19 May 2024 23:54:30 -0700 Subject: [PATCH 16/18] try to fix collision --- tests/conftest.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 1ffa2b9..f84d9e3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -291,7 +291,7 @@ def mlflow_server( # TODO: value in keeping? or just move to unit tests @pytest.fixture(scope="session") def mlflow_fluent_session( - mlflow_storage: Path, + mlflow_server: MlflowContainer, deployment_server: DeploymentServerContainer, replay_mode: ReplayMode, deploy_mode: DeployMode, @@ -303,12 +303,12 @@ def mlflow_fluent_session( # using file instead of sqlite:///:memory: for post-mortem debugging # It's not that slow - database_path = f"sqlite:///{mlflow_storage}/mlflow.db" + database_path = mlflow_server.get_base_url() mlflow.set_tracking_uri(database_path) - experiment_id = mlflow.create_experiment( - "test", artifact_location=str(mlflow_storage) - ) - mlflow.set_experiment(experiment_id=experiment_id) + # experiment_id = mlflow.create_experiment( + # "test", artifact_location=str(mlflow_storage) + # ) + mlflow.set_experiment(experiment_name="pytest") with monkeypatch_session.context() as m: m.setenv("MLFLOW_DEPLOYMENTS_TARGET", deployment_server.get_base_url()) From 6ad731e8c4a66f0ba8cd5df8b65f99ffe6e9abf9 Mon Sep 17 00:00:00 2001 From: AK Date: Mon, 20 May 2024 00:28:47 -0700 Subject: [PATCH 17/18] fix cause of startup failure --- python/src/mindctrl/workflows/__init__.py | 9 +++++++-- python/tests/test_mlflow.py | 2 +- tests/conftest.py | 15 +++++++++++---- tests/utils/common.py | 15 ++++++++++++--- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/python/src/mindctrl/workflows/__init__.py b/python/src/mindctrl/workflows/__init__.py index 93ddb16..8a2d7f6 100644 --- a/python/src/mindctrl/workflows/__init__.py +++ b/python/src/mindctrl/workflows/__init__.py @@ -64,8 +64,13 @@ def __init__(self, host: Optional[str] = None, port: Optional[str] = None): self.host = host self.port = port self._workflow_runtime = WorkflowRuntime(host=host, port=port) - self._register_turn_workflow() - self._register_deployer_workflow() + try: + self._register_turn_workflow() + self._register_deployer_workflow() + except ValueError as e: + if "already registered" not in str(e): + raise e + _logger.info(f"Already registered turn workflow: {e}") self.initialized = False def __enter__(self): diff --git a/python/tests/test_mlflow.py b/python/tests/test_mlflow.py index e30081a..f41b84c 100644 --- a/python/tests/test_mlflow.py +++ b/python/tests/test_mlflow.py @@ -10,7 +10,7 @@ def test_mlflow_setup(mlflow_fluent_session): - assert "sqlite" in mlflow.get_tracking_uri() + assert mlflow.get_tracking_uri() is not None def test_log_system_models(mlflow_fluent_session): diff --git a/tests/conftest.py b/tests/conftest.py index f84d9e3..45f478d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -284,7 +284,9 @@ def mlflow_server( _logger.info("Starting mlflow server fixture") with MlflowContainer(data_dir=mlflow_storage) as mlflow_server: - wait_for_readiness(mlflow_server.get_readiness_url()) + wait_for_readiness( + mlflow_server.get_readiness_url(), timeout_callback=mlflow_server.dump_logs + ) yield mlflow_server @@ -354,7 +356,9 @@ def deployment_server( image=tag, ) as server: # once the disconnect issue is solved, we can merge into ServiceContainer.start() override - wait_for_readiness(server.get_readiness_url()) + wait_for_readiness( + server.get_readiness_url(), timeout_callback=server.dump_logs + ) yield server @@ -383,7 +387,7 @@ def hass_server_and_token( _logger.info(f"Starting local homeassistant fixture with config: {hass_config_dir}") with HAContainer(config_dir=hass_config_dir) as hass: _logger.info(f"Started hass container at {hass.get_base_url()}") - wait_for_readiness(hass.get_base_url()) + wait_for_readiness(hass.get_base_url(), timeout_callback=hass.dump_logs) playwright_screenshots = tmp_path_factory.mktemp("onboarding_screenshots") _logger.info( f"Homeassistant fixture ready, onboarding with screenshots in {playwright_screenshots}" @@ -735,7 +739,10 @@ def local_server_url( allowed_ip=allowed_ip, allowed_ipv6=allowed_ipv6, ) as ingress_server: - wait_for_readiness(ingress_server.get_readiness_url()) + wait_for_readiness( + ingress_server.get_readiness_url(), + timeout_callback=ingress_server.dump_logs, + ) yield ingress_server.get_base_url() diff --git a/tests/utils/common.py b/tests/utils/common.py index f72363f..b6c80b6 100644 --- a/tests/utils/common.py +++ b/tests/utils/common.py @@ -3,7 +3,7 @@ import socket import time from pathlib import Path -from typing import Iterator, Optional, Union +from typing import Callable, Iterator, Optional, Union import constants import httpx @@ -53,7 +53,11 @@ def push_app(tag: str, client: DockerClient): _logger.debug(line) -def wait_for_readiness(url: str, max_attempts=constants.MAX_ATTEMPTS): +def wait_for_readiness( + url: str, + max_attempts=constants.MAX_ATTEMPTS, + timeout_callback: Optional[Callable] = None, +): _logger.info(f"Waiting for fixture startup at {url}...........") attempts = 1 while attempts <= max_attempts: @@ -76,7 +80,9 @@ def wait_for_readiness(url: str, max_attempts=constants.MAX_ATTEMPTS): time.sleep(2) if attempts > max_attempts: - raise RuntimeError(f"Failed to reach {url} after {max_attempts} attempts") + if timeout_callback: + timeout_callback() + raise TimeoutError(f"Failed to reach {url} after {max_attempts} attempts") class UvicornServer(multiprocessing.Process): @@ -145,6 +151,9 @@ def get_base_url(self): return f"http://localhost:{self.port_to_expose}" return f"http://{self.get_container_host_ip()}:{self.get_exposed_port(self.port_to_expose)}" + def dump_logs(self): + dump_container_logs(self, self.log_debug) + def stop(self, force=True, delete_volume=True): _logger.info(f"Stopping {self.__class__.__name__}") dump_container_logs(self, self.log_debug) From 2e3d88014613b9080c7040ab03ce5d8981991d15 Mon Sep 17 00:00:00 2001 From: AK Date: Sun, 23 Jun 2024 13:41:24 -0700 Subject: [PATCH 18/18] wip: pushing changes to discuss in doc, partially failing tests --- python/src/mindctrl/config.py | 75 +- python/src/mindctrl/const.py | 6 + python/src/mindctrl/homeassistant/client.py | 90 +- python/src/mindctrl/homeassistant/messages.py | 11 + python/src/mindctrl/main.py | 10 +- .../mindctrl/openai_deployment/__init__.py | 74 +- python/src/mindctrl/replay_server.py | 26 +- python/src/mindctrl/tools/functions.py | 84 ++ python/src/mindctrl/workflows/__init__.py | 10 +- python/src/mindctrl/workflows/agent.py | 176 +++- python/tests/test_hass_client.py | 44 +- python/tests/test_workflows.py | 60 +- services/components/secretstore.yaml | 10 + services/deployments/route-config.yaml | 8 + tests/conftest.py | 1 + tests/test_appsettings.py | 155 +++- tests/test_data/test_tool_workflow-input.json | 769 ++++++++++++++++++ 17 files changed, 1523 insertions(+), 86 deletions(-) create mode 100644 python/src/mindctrl/tools/functions.py create mode 100644 services/components/secretstore.yaml create mode 100644 tests/test_data/test_tool_workflow-input.json diff --git a/python/src/mindctrl/config.py b/python/src/mindctrl/config.py index d9df288..442a79a 100644 --- a/python/src/mindctrl/config.py +++ b/python/src/mindctrl/config.py @@ -1,12 +1,26 @@ -from typing import Literal, Optional, Union +from functools import lru_cache +import json +import logging +import os +from typing import Any, Dict, Literal, Optional, Tuple, Type, Union from pydantic import BaseModel, Field, SecretStr -from pydantic_settings import BaseSettings, SettingsConfigDict +from pydantic.fields import FieldInfo +from pydantic_settings import ( + BaseSettings, + PydanticBaseSettingsSource, + SettingsConfigDict, +) + +from mindctrl.const import CONFIGURATION_KEY, CONFIGURATION_STORE, SECRET_STORE + + +_logger = logging.getLogger(__name__) # this is just to make settings typing happy - I don't have another implementation yet class DisabledEventsSettings(BaseModel): - events_type: Literal["none"] + events_type: Literal["none"] = "none" class MqttEventsSettings(BaseModel): @@ -30,7 +44,33 @@ class PostgresStoreSettings(BaseModel): # Just to make typing happy for now - add dapr, sqlite, etc class DisabledStoreSettings(BaseModel): - store_type: Literal["none"] + store_type: Literal["none"] = "none" + + +class DisabledHomeAssistantSettings(BaseModel): + hass_type: Literal["none"] = "none" + + +class SupervisedHomeAssistantSettings(BaseModel): + hass_type: Literal["supervised"] + + supervisor_token: SecretStr + + +class RemoteHomeAssistantSettings(BaseModel): + hass_type: Literal["remote"] + + host: str + port: int + long_lived_access_token: SecretStr + + +def has_dapr() -> bool: + # TODO: make the request to ensure dapr is running + # This is really more a hedge because dapr is new + # and I might hit something I can't work around + # (but so far the workarounds have... worked around) + return os.environ.get("DAPR_MODE") != "false" class AppSettings(BaseSettings): @@ -38,14 +78,37 @@ class AppSettings(BaseSettings): model_config = SettingsConfigDict(env_nested_delimiter="__") store: Union[PostgresStoreSettings, DisabledStoreSettings] = Field( - discriminator="store_type" + discriminator="store_type", + default=DisabledStoreSettings(), ) events: Union[MqttEventsSettings, DisabledEventsSettings] = Field( - discriminator="events_type" + discriminator="events_type", + default=DisabledEventsSettings(), ) + hass: Union[ + DisabledHomeAssistantSettings, + SupervisedHomeAssistantSettings, + RemoteHomeAssistantSettings, + ] = Field(discriminator="hass_type", default=DisabledHomeAssistantSettings()) + # TODO: move this into the gateway or something openai_api_key: SecretStr force_publish_models: bool = False notify_fd: Optional[int] = None include_challenger_models: bool = True mlflow_tracking_uri: Optional[str] = None + + +@lru_cache +def get_settings(**kwargs): + if has_dapr(): + from dapr.clients import DaprClient # for typing + + with DaprClient() as dapr_client: + secret_response = dapr_client.get_secret(SECRET_STORE, CONFIGURATION_KEY) + print(secret_response) + return AppSettings.model_validate_json( + secret_response.secret[CONFIGURATION_KEY] + ) + # env vars can populate the settings + return AppSettings() # pyright: ignore diff --git a/python/src/mindctrl/const.py b/python/src/mindctrl/const.py index 34c7d67..9c17bf3 100644 --- a/python/src/mindctrl/const.py +++ b/python/src/mindctrl/const.py @@ -18,3 +18,9 @@ ## Events STOP_DEPLOYED_MODEL = "stop_deployed_model" + +## Config +CONFIGURATION_STORE = "configstore" +SECRET_STORE = "secretstore" +CONFIGURATION_KEY = "mindctrl.appsettings" +CONFIGURATION_TABLE = "mindctrlconfig" diff --git a/python/src/mindctrl/homeassistant/client.py b/python/src/mindctrl/homeassistant/client.py index 32beeb9..0a4b31a 100644 --- a/python/src/mindctrl/homeassistant/client.py +++ b/python/src/mindctrl/homeassistant/client.py @@ -1,5 +1,6 @@ import asyncio import logging +import os import time from typing import Union @@ -17,6 +18,7 @@ CreateAutomation, CreateLabel, Error, + ExecuteScript, Label, LabelsResult, ListAreas, @@ -24,6 +26,7 @@ ListLabels, ManyResponsesWrapper, Result, + ServiceCall, SingleResponseWrapper, UpdateEntityLabels, ) @@ -60,7 +63,7 @@ def __init__(self, id: str, hass_url: httpx.URL, token: str): @property def authenticated_session(self): if not self._authenticated_session: - raise ValueError("Session not authenticated") + raise ValueError("Session not authenticated or not started (enter context)") return self._authenticated_session async def __aenter__(self): @@ -163,12 +166,12 @@ async def list_automations(self) -> list[Automation]: async def list_labels(self): any_result = await self._send_message(ListLabels(id=-1)) labels = LabelsResult.model_validate_json(any_result.model_dump_json()) - return labels.result + return labels async def list_areas(self): any_result = await self._send_message(ListAreas(id=-1)) areas = AreasResult.model_validate_json(any_result.model_dump_json()) - return areas.result + return areas async def create_label(self, label: Label): await self._send_message( @@ -226,3 +229,84 @@ async def create_automation(self, name: str, description: str): response.raise_for_status() # response.json() is just {'result': 'ok'}, need to do a get (why?) return await self.get_automation(str(current_milli_time)) + + @staticmethod + def _generate_service_call(service: str, target: dict): + return ExecuteScript( + id=-1, sequence=[ServiceCall(service=service, target=target)] + ) + + async def _send_service_call(self, service: str, target: dict): + message = HassClient._generate_service_call(service, target) + resp = await self._send_message(message) + if not resp.success: + raise HassClientError(f"Error: {resp}") + + async def light_toggle(self, area_id: str): + return await self._send_service_call("light.toggle", {"area_id": [area_id]}) + + async def light_turn_on(self, area_id: str): + return await self._send_service_call("light.turn_on", {"area_id": [area_id]}) + + # TODO: After evaluating the prompting, see if a mixin approach would be better without params + # For example class Area(Targetable, Lightable, Switchable, Sonosable, etc.): + # This might be better than adding every targetting mechanism to each service? + async def light_turn_off(self, area_id: str): + return await self._send_service_call("light.turn_off", {"area_id": [area_id]}) + + +def hass_client_from_dapr(): + from dapr.clients import DaprClient + + DaprClient().get_secret("hass", "token") + raise NotImplementedError("Not implemented") + + +def hass_client_from_env(id: str = ""): + # TODO: Move these to constants + url = os.environ["HASS_SERVER"] + token = os.environ["HASS_TOKEN"] + # print(f"TOKEN: {token[:10]}") + _logger.info(f"Connecting to Home Assistant at {url}") + return HassClient(id, httpx.URL(f"{url}/api"), token) + + +async def run_api(client, func, *args, **kwargs): + async with client: + return await func(*args, **kwargs) + + +def list_areas(): + """List all areas(rooms) in the home with their area_id and friendly name.""" + client = hass_client_from_env() + return asyncio.run(run_api(client, client.list_areas)) + + +def light_turn_on(area_id: str): + """Turn on the light in the area""" + client = hass_client_from_env() + return asyncio.run(run_api(client, client.light_turn_on, area_id)) + + +def light_turn_off(area_id: str): + """Turn off the light in the area""" + client = hass_client_from_env() + return asyncio.run(run_api(client, client.light_turn_off, area_id)) + + +def light_toggle(area_id: str): + """Toggle the light in the area""" + client = hass_client_from_env() + return asyncio.run(run_api(client, client.light_toggle, area_id)) + + +# TODO: This is going to grow past context limits +# Need to run the intent query on phi/local/classifier +# Or maybe embed every domain and embed the incoming chat +# and add the top domain to the context +TOOL_MAP = { + "list_areas": list_areas, + "light_turn_on": light_turn_on, + "light_turn_off": light_turn_off, + "light_toggle": light_toggle, +} diff --git a/python/src/mindctrl/homeassistant/messages.py b/python/src/mindctrl/homeassistant/messages.py index d805b82..eb7092a 100644 --- a/python/src/mindctrl/homeassistant/messages.py +++ b/python/src/mindctrl/homeassistant/messages.py @@ -62,6 +62,17 @@ class ListAreas(Command): type: str = "config/area_registry/list" +class ServiceCall(BaseModel): + service: str + data: Optional[Any] = {} + target: Optional[dict[str, list[str]]] + + +class ExecuteScript(Command): + type: str = "execute_script" + sequence: list[ServiceCall] + + # {"color":"indigo","description":null,"icon":"mdi:account","label_id":"test","name":"test"} class Label(BaseModel): color: str diff --git a/python/src/mindctrl/main.py b/python/src/mindctrl/main.py index c26542b..0537e61 100644 --- a/python/src/mindctrl/main.py +++ b/python/src/mindctrl/main.py @@ -5,7 +5,7 @@ # Eventing - move this to plugin from contextlib import asynccontextmanager -from functools import lru_cache, partial +from functools import partial import mlflow @@ -15,7 +15,7 @@ from mindctrl.workflows import WorkflowContext -from .config import AppSettings +from .config import AppSettings, get_settings from .const import ROUTE_PREFIX from .db.setup import insert_summary, insert_summary_dummy, setup_db from .mlflow_bridge import connect_to_mlflow, poll_registry @@ -36,12 +36,6 @@ def write_healthcheck_file(settings: AppSettings): os.close(int(notification_fd)) -@lru_cache -def get_settings(): - # env vars can populate the settings - return AppSettings() # pyright: ignore - - @asynccontextmanager async def lifespan(app: FastAPI): app_settings = get_settings() diff --git a/python/src/mindctrl/openai_deployment/__init__.py b/python/src/mindctrl/openai_deployment/__init__.py index 829b267..f6fca4d 100644 --- a/python/src/mindctrl/openai_deployment/__init__.py +++ b/python/src/mindctrl/openai_deployment/__init__.py @@ -219,7 +219,7 @@ def _log_secrets_yaml(local_model_dir, scope): def _parse_format_fields(s) -> Set[str]: """Parses format fields from a given string, e.g. "Hello {name}" -> ["name"].""" - return {fn for _, fn, _, _ in Formatter().parse(s) if fn is not None} + return {fn for _, fn, _, _ in Formatter().parse(s or "") if fn is not None} def _get_input_schema(task, content): @@ -557,22 +557,12 @@ def _load_model(path): def _is_valid_message(d): - return isinstance(d, dict) and "content" in d and "role" in d + return isinstance(d, dict) and "role" in d and ("content" in d or "tool_calls" in d) class _ContentFormatter: def __init__(self, task, template=None): - if task == "completions": - template = template or "{prompt}" - if not isinstance(template, str): - raise mlflow.MlflowException.invalid_parameter_value( - f"Template for task {task} expects type `str`, but got {type(template)}." - ) - - self.template = template - self.format_fn = self.format_prompt - self.variables = sorted(_parse_format_fields(self.template)) - elif task == "chat.completions": + if task == "chat.completions": if not template: template = [{"role": "user", "content": "{content}"}] if not all(map(_is_valid_message, template)): @@ -583,18 +573,31 @@ def __init__(self, task, template=None): self.template = template.copy() self.format_fn = self.format_chat - self.variables = sorted( - set( - itertools.chain.from_iterable( - _parse_format_fields(message.get("content")) - | _parse_format_fields(message.get("role")) - for message in self.template - ) - ) - ) + print("SKIPPING WEIRD AUTOPARSE") + self.variables = sorted(set()) + # self.variables = sorted( + # set( + # itertools.chain.from_iterable( + # _parse_format_fields(message.get("content", "")) + # | _parse_format_fields(message.get("role")) + # | _parse_format_fields(message.get("tool_call_id", "")) + # | _parse_format_fields(message.get("name", "")) + # for message in self.template + # ) + # ) + # ) if not self.variables: - self.template.append({"role": "user", "content": "{content}"}) + self.template.append({ + "role": "{role}", + "content": "{content}", + "name": "{name}", + "tool_call_id": "{tool_call_id}" + }) self.variables.append("content") + self.variables.append("role") + self.variables.append("name") + self.variables.append("tool_call_id") + else: raise mlflow.MlflowException.invalid_parameter_value( f"Task type ``{task}`` is not supported for formatting." @@ -613,13 +616,20 @@ def format_prompt(self, **params): def format_chat(self, **params): format_args = {v: params[v] for v in self.variables} - return [ - { - "role": message.get("role").format(**format_args), - "content": message.get("content").format(**format_args), - } - for message in self.template - ] + result = [] + for index, message in enumerate(self.template): + # Only do the templating on the first or last messages + system message + if index < 2 or index == len(self.template) - 1: + message["role"] = message.get("role").format(**format_args) + if "content" in message and message.get("content"): + message["content"] = message.get("content").format(**format_args) + if "name" in message and message.get("name"): + message["name"] = message.get("name").format(**format_args) + if "tool_call_id" in message and message.get("tool_call_id"): + message["tool_call_id"] = message.get("tool_call_id").format(**format_args) + + result.append(message) + return result def _first_string_column(pdf): @@ -650,7 +660,7 @@ def _setup_completions(self): if self.task == "chat.completions": self.template = self.model.get("messages", []) else: - self.template = self.model.get("prompt") + raise ValueError(f"Unsupported task: {self.task}") self.formater = _ContentFormatter(self.task, self.template) def format_completions(self, params_list): @@ -743,12 +753,14 @@ def _predict_chat(self, data, params: dict): responses = [] for r in requests: + print("SENDING AI REQUEST", r) response = deploy_client.predict( endpoint=matched_endpoint.name, inputs=r, ) responses.append(response) + # TODO: Better to return a more complex object (tuple) that says it was a tool call result = [] for r in responses: if r["choices"][0]["finish_reason"]== "tool_calls": diff --git a/python/src/mindctrl/replay_server.py b/python/src/mindctrl/replay_server.py index 99ebd54..5abbbf1 100644 --- a/python/src/mindctrl/replay_server.py +++ b/python/src/mindctrl/replay_server.py @@ -9,6 +9,7 @@ import sys from typing import List, Literal, Optional, Union +from pydantic import Field import vcr import vcr.stubs.aiohttp_stubs from aiohttp import hdrs @@ -125,9 +126,25 @@ def _create_replay_chat_endpoint(config: RouteConfig): # mctrl_header = {"User-Agent": f"mindctrl/{mindctrl.__version__}"} mctrl_header = {"User-Agent": "mindctrl/0.1.0"} - from mlflow.gateway.base_models import ResponseModel + from mlflow.gateway.base_models import ResponseModel, RequestModel + from mlflow.gateway.schemas.chat import ( + BaseRequestPayload, + _REQUEST_PAYLOAD_EXTRA_SCHEMA, + ) from mlflow.gateway.providers.utils import send_request + class RequestMessage(RequestModel): + role: str + content: Optional[str] = None + tool_call_id: Optional[str] = None + name: Optional[str] = None + + class RequestPayload(BaseRequestPayload): + messages: List[RequestMessage] = Field(..., min_length=1) + + class Config: + json_schema_extra = _REQUEST_PAYLOAD_EXTRA_SCHEMA + class Function(ResponseModel): name: str arguments: str @@ -163,6 +180,7 @@ class ResponsePayload(ResponseModel): async def chat_with_tools(self, payload): from fastapi.encoders import jsonable_encoder + print("AI REQUEST", payload) payload = jsonable_encoder(payload, exclude_none=True) self.check_for_model_field(payload) all_headers = {**self._request_headers, **mctrl_header} @@ -172,7 +190,7 @@ async def chat_with_tools(self, payload): path="chat/completions", payload=self._add_model_to_payload_if_necessary(payload), ) - print(resp) + print("AI RESPONSE", resp) return ResponsePayload( id=resp["id"], @@ -184,7 +202,7 @@ async def chat_with_tools(self, payload): index=idx, message=ResponseMessage( role=c["message"]["role"], - content=c["message"]["content"] or "", + content=c["message"].get("content", ""), tool_calls=c["message"].get("tool_calls"), # type: ignore ), finish_reason=c["finish_reason"], @@ -200,6 +218,8 @@ async def chat_with_tools(self, payload): import mlflow.gateway.schemas.chat + mlflow.gateway.schemas.chat.RequestMessage = RequestMessage + mlflow.gateway.schemas.chat.RequestPayload = RequestPayload mlflow.gateway.schemas.chat.ResponseMessage = ResponseMessage mlflow.gateway.schemas.chat.ResponsePayload = ResponsePayload mlflow.gateway.schemas.chat.Choice = Choice diff --git a/python/src/mindctrl/tools/functions.py b/python/src/mindctrl/tools/functions.py new file mode 100644 index 0000000..1d84a95 --- /dev/null +++ b/python/src/mindctrl/tools/functions.py @@ -0,0 +1,84 @@ +import inspect +import json +import logging +from typing import Callable, Optional + + +_logger = logging.getLogger(__name__) + +_specific_json_types = { + str: "string", + int: "number", +} + + +def generate_json_schema( + name: str, description: Optional[str], **params: inspect.Parameter +) -> dict: + schema = { + "type": "function", + "function": { + "name": name, + "description": description, + "parameters": {"type": "object", "properties": {}, "required": []}, + }, + } + + for param_name, param in params.items(): + param_schema = { + "type": _specific_json_types.get(param.annotation, "object"), + "description": param.default + if param.default != inspect.Parameter.empty + else None, + } + + if param.default == inspect.Parameter.empty: + schema["function"]["parameters"]["required"].append(param_name) + + schema["function"]["parameters"]["properties"][param_name] = param_schema + + return schema + + +async def call_function(func): + ret = func() + return await ret if inspect.isawaitable(ret) else ret + + +def generate_function_schema(func: Callable) -> dict: + signature = inspect.signature(func) + parameters = signature.parameters + + schema = generate_json_schema(func.__name__, func.__doc__, **parameters) + _logger.debug(f"Generated schema: {schema}") + return schema + + +if __name__ == "__main__": + # Example usage + def get_current_weather(location: str, unit: str = "celsius"): + """ + Get the current weather in a given location + + Args: + location (str): The city and state, e.g. San Francisco, CA + unit (str, optional): The unit of temperature. Defaults to "celsius". + + Returns: + dict: The weather information + """ + pass + + json_schema = generate_function_schema(get_current_weather) + print(json.dumps(json_schema, indent=4)) + + class FakeHass: + def get_weather(self, location: str, unit: str = "celsius"): + pass + + async def get_weather_async(self, location: str, unit: str = "celsius"): + pass + + hass = FakeHass() + json_schema = generate_function_schema(hass.get_weather_async) + print(json.dumps(json_schema, indent=4)) diff --git a/python/src/mindctrl/workflows/__init__.py b/python/src/mindctrl/workflows/__init__.py index 8a2d7f6..3460622 100644 --- a/python/src/mindctrl/workflows/__init__.py +++ b/python/src/mindctrl/workflows/__init__.py @@ -3,7 +3,7 @@ import json import logging import uuid -from typing import Optional +from typing import Callable, Optional import mlflow.pyfunc from dapr.ext.workflow import WorkflowRuntime @@ -16,6 +16,7 @@ append_message, conversation_turn_workflow, invoke_model, + invoke_tool, ) from .deployer import ( check_deployment_status, @@ -94,6 +95,7 @@ def _register_turn_workflow(self): _logger.info("Registering activities") self._workflow_runtime.register_activity(append_message) self._workflow_runtime.register_activity(invoke_model) + self._workflow_runtime.register_activity(invoke_tool) def _register_deployer_workflow(self): _logger.info("Registering deployer workflows") @@ -117,6 +119,7 @@ def __init__( self.conversation_id: str = conversation_id or uuid.uuid4().hex self.client = client self.turn_ids: list[str] = [] + self.tools: list[Callable] = [] def __enter__(self): return self @@ -124,6 +127,11 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): pass + # TODO: Fix the mlflow model predict API to allow dynamic tool input + # not at log_model time. + def add_tool(self, tool): + self.tools.append(tool) + def send_message(self, message: str) -> Message: turn_id = f"{self.conversation_id}-{len(self.turn_ids)}" self.turn_ids.append(turn_id) diff --git a/python/src/mindctrl/workflows/agent.py b/python/src/mindctrl/workflows/agent.py index bedbc89..3a90f66 100644 --- a/python/src/mindctrl/workflows/agent.py +++ b/python/src/mindctrl/workflows/agent.py @@ -1,8 +1,9 @@ +import json import logging import pickle from dataclasses import dataclass from types import SimpleNamespace -from typing import Optional +from typing import Generic, Optional, TypeVar import mlflow.pyfunc from dapr.clients import DaprClient @@ -10,6 +11,7 @@ DaprWorkflowContext, WorkflowActivityContext, ) +from pydantic import BaseModel from mindctrl.mlmodels import invoke_model_impl from mindctrl.openai_deployment import _ContentFormatter, _OpenAIDeploymentWrapper @@ -17,13 +19,34 @@ _logger = logging.getLogger(__name__) +# TODO: THIS IS SOOOOOO BADDDDD +# agent <-> openai_deployment contract +# openai_deployment <-> replay server contract +# replay server <-> openai contract +# And all are slightly different :( +@dataclass +class Function: + name: str + arguments: str + + +@dataclass +class FunctionCall: + id: str + function: Function + type: str = "function" + + # TODO: unify with the monkeypatch of deploymentserver for tool calling? # TODO: Fix durable task client to handle pydantic models, then switch # TODO: file a bug on durabletask.internal.shared.py @dataclass class Message: - content: str + content: Optional[str] role: str + tool_call_id: Optional[str] = None + name: Optional[str] = None + tool_calls: Optional[list[FunctionCall]] = None @dataclass @@ -65,6 +88,7 @@ def append_message( # The type marshaling by durabletask/dapr is a bit wonky... if isinstance(message.message, dict): + # if convo.messages.append(Message(**message.message)) elif isinstance(message.message, Message): convo.messages.append(message.message) @@ -87,8 +111,17 @@ def append_message( def get_user_chat_payload(query: str) -> dict: return { "dataframe_split": { - "columns": ["query"], - "data": [[query]], + "columns": ["content", "role", "tool_call_id", "name"], + "data": [[query, "user", None, None]], + } + } + + +def get_tool_call_payload(tool_call_id: str, content: str, name: str) -> dict: + return { + "dataframe_split": { + "columns": ["content", "role", "tool_call_id", "name"], + "data": [[content, "tool", tool_call_id, name]], } } @@ -97,6 +130,8 @@ def append_history(model: mlflow.pyfunc.PyFuncModel, history: Conversation): inner_model = model._model_impl assert isinstance(inner_model, _OpenAIDeploymentWrapper) messages = [m.__dict__ for m in history.messages] + print("MESSAGES", messages) + print("EXISTING MESSAGES", inner_model.template) existing_messages: list = inner_model.template # type: ignore combined_messages = existing_messages[:1] + messages + existing_messages[1:] inner_model.formater = _ContentFormatter(inner_model.task, combined_messages) @@ -112,14 +147,53 @@ def invoke_model(ctx: WorkflowActivityContext, input: ModelInvocation) -> Messag assert input.history is not None assert len(input.history.messages) > 0 history = Conversation(messages=[Message(**m) for m in input.history.messages]) # type: ignore - payload = get_user_chat_payload(history.messages[-1].content) + current_message = history.messages[-1] + if current_message.tool_call_id is not None: + assert ( + current_message.content is not None + ), f"Content is None: {current_message}" + assert current_message.name is not None, f"Name is None: {current_message}" + payload = get_tool_call_payload( + current_message.tool_call_id, + current_message.content, + current_message.name, + ) + else: + assert current_message.content is not None + payload = get_user_chat_payload(current_message.content) + print(f"PAYLOAD: {payload}") del history.messages[-1] + print(f"HISTORY: {history}") model = append_history(model, history) - response_message = invoke_model_impl( + response = invoke_model_impl( model, payload, input.scenario_name, input.input_variables - )[0] + ) + print(response) + response_message = response[0] + print(response_message) + # TODO: return a better object from openai_deployment.predict() + if isinstance(response_message, list): + # TODO: Support parallel tool calling + function_call: dict = response_message[0] + if function_call.get("type", "unknown") != "function": + raise ValueError(f"Unknown response type: {function_call}") + _logger.info(f"Received function call: {function_call}") + # TODO: Why am I writing all this logic again? + return Message( + content=None, + tool_calls=[ + FunctionCall( + id=function_call["id"], + function=Function( + name=function_call["function"]["name"], + arguments=function_call["function"]["arguments"], + ), + ) + ], + role="assistant", + ) return Message(content=response_message, role="assistant") except Exception as e: import traceback @@ -129,8 +203,40 @@ def invoke_model(ctx: WorkflowActivityContext, input: ModelInvocation) -> Messag raise +# TODO: Convert the common try/except pattern into a mindctrl decorator +def invoke_tool(ctx: WorkflowActivityContext, function_call: dict) -> str: + from mindctrl.homeassistant.client import TOOL_MAP + + try: + print(f"Invoking tool: {function_call}") + func = TOOL_MAP.get(function_call["function"]["name"]) + if func is None: + raise ValueError( + f"Unknown tool: {function_call['function']['name']}, have {TOOL_MAP.keys()}" + ) + params = json.loads(function_call["function"]["arguments"]) + _logger.info(f"Calling tool: {function_call['function']['name']} with {params}") + tool_result = func(**params) + _logger.info(f"Tool result: {tool_result}") + if isinstance(tool_result, BaseModel): + return tool_result.model_dump_json() + return json.dumps(tool_result) + except Exception as e: + import traceback + + traceback.print_exception(e) + # breakpoint() + raise + + +# def tool_turn_workflow(ctx: DaprWorkflowContext, input: ModelInvocation): +# _logger.info(f"Calling Tool: {input}") +# conversation: Conversation = yield ctx.call_activity(append_message, input=input) +# tool_result = yield ctx.call_activity(invoke_tool, input=input) + + def conversation_turn_workflow(ctx: DaprWorkflowContext, input: ModelInvocation): - _logger.info(f"{input}") + _logger.info(f"Starting Conversation turn: {input}") try: message_str = yield ctx.wait_for_external_event("user_message") @@ -145,17 +251,49 @@ def conversation_turn_workflow(ctx: DaprWorkflowContext, input: ModelInvocation) ) input.history = conversation response_message: Message = yield ctx.call_activity(invoke_model, input=input) - # if tool call - # messages.append(response.choices[0].message) - # then yield ctx.call_activity(invoke_tool, input=response.choices[0].tool) - # messages.append( - # { - # "role": "function", - # "name": function_name, - # "content": str(function_response), - # } - # ) - # messages + + tool_calling = response_message.tool_calls is not None + while tool_calling: + _logger.info(f"Tool calling: {response_message}") + # TODO Make this a child workflow + assert response_message.tool_calls is not None + conversation: Conversation = yield ctx.call_activity( + append_message, + input=MessageInConvo( + message=response_message, conversation_id=input.conversation_id + ), + ) + print("CALLING TOOL", response_message) + tool_result: str = yield ctx.call_activity( + invoke_tool, + input=response_message.tool_calls[0], # type: ignore + ) + print(f"TOOL RESULT: {tool_result}") + tool_result_message = Message( + role="tool", + content=tool_result, + tool_call_id=response_message.tool_calls[0]["id"], # type: ignore + name=response_message.tool_calls[0]["function"]["name"], # type: ignore + ) + conversation: Conversation = yield ctx.call_activity( + append_message, + input=MessageInConvo( + message=tool_result_message, conversation_id=input.conversation_id + ), + ) + input.history = conversation + response_message: Message = yield ctx.call_activity( + invoke_model, input=input + ) + tool_calling = response_message.tool_calls is not None + + # tool_response = yield ctx.call_child_workflow( + # tool_turn_workflow, + # input=MessageInConvo( + # message=response_message, conversation_id=input.conversation_id + # ), + # ) + # return response_message conversation = yield ctx.call_activity( append_message, diff --git a/python/tests/test_hass_client.py b/python/tests/test_hass_client.py index e439e69..277555f 100644 --- a/python/tests/test_hass_client.py +++ b/python/tests/test_hass_client.py @@ -1,4 +1,7 @@ +import asyncio import logging +import os +import random import pytest from httpx import URL @@ -9,12 +12,20 @@ @pytest.fixture -async def hass_client(hass_server_and_token): - server, token = hass_server_and_token +async def hass_client(request): + # TODO: if you run just this file, you get into an asyncio loop issue for playwright + # moving the env var overrides into the fixture itself and using proper fixture resolution + # probably will fix it? + if os.environ.get("HASS_SERVER") is None: + server, token = request.getfixturevalue("hass_server_and_token") + server_url = server.get_base_url() + else: + server_url = os.environ["HASS_SERVER"] + token = os.environ["HASS_TOKEN"] try: async with HassClient( id="pytest", - hass_url=URL(f"{server.get_base_url()}/api"), + hass_url=URL(f"{server_url}/api"), token=token, ) as client: yield client @@ -36,15 +47,33 @@ async def test_mctrl_list_automations(hass_client): async def test_mctrl_list_areas(hass_client): - areas = await hass_client.list_areas() + areas_result = await hass_client.list_areas() + areas = areas_result.result _logger.info(areas) assert len(areas) >= 0 async def test_mctrl_list_labels(hass_client): - labels = await hass_client.list_labels() + labels_result = await hass_client.list_labels() + labels = labels_result.result _logger.info(labels) - assert len(labels) >= 0 + assert labels_result.success + assert len(labels.result) >= 0 + + +async def test_mctrl_control_lights(hass_client): + areas_result = await hass_client.list_areas() + areas = areas_result.result + assert len(areas) >= 1 + random_area = random.choice(areas) + area_id = random_area.area_id + _logger.info(f"Controlling lights for {random_area}") + await hass_client.light_turn_on(area_id) + # TODO: Implement Get State api and assert + await asyncio.sleep(2) + await hass_client.light_turn_off(area_id) + await asyncio.sleep(2) + await hass_client.light_toggle(area_id) async def test_automation_autotag(hass_client, request): @@ -81,7 +110,8 @@ async def test_automation_autotag(hass_client, request): f"automation.{test_automation_name}", [test_label_name] ) - entities = await hass_client.list_entities() + entities_result = await hass_client.list_entities() + entities = entities_result.result automations = [e for e in entities if e["platform"] == "automation"] _logger.info(automations) tagged_automations = [a for a in automations if test_label_name in a["labels"]] diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py index af3c29f..632e80f 100644 --- a/python/tests/test_workflows.py +++ b/python/tests/test_workflows.py @@ -17,7 +17,9 @@ from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient from dapr.ext.workflow.workflow_state import WorkflowStatus from durabletask.client import OrchestrationState +from mindctrl.homeassistant.client import TOOL_MAP from mindctrl.openai_deployment import log_model +from mindctrl.tools.functions import generate_function_schema from mindctrl.workflows import Conversation, WorkflowContext from mindctrl.workflows.agent import ( get_user_chat_payload, @@ -157,21 +159,46 @@ def dapr_sidecar( dapr_process.terminate() +# # TODO: dedupe with the other one in test_hass_client +# @pytest.fixture(scope="session") +# async def hass_client(request): +# if os.environ.get("HASS_SERVER") is None: +# server, token = request.getfixturevalue("hass_server_and_token") +# server_url = server.get_base_url() +# else: +# server_url = os.environ["HASS_SERVER"] +# token = os.environ["HASS_TOKEN"] +# try: +# async with HassClient( +# id="pytest", +# hass_url=httpx.URL(f"{server_url}/api"), +# token=token, +# ) as client: +# yield client +# except RuntimeError as e: +# # TODO: RuntimeError: Attempted to exit cancel scope in a different task than it was entered in +# # This is probably a ticking timebomb for some event loop bug i don't understand, but fingers crossed +# # it's in pytest + pytest-asyncio and not the actual code (but probably not because httpx-ws is new :/ ) +# if ( +# "Attempted to exit cancel scope in a different task than it was entered in" +# in str(e) +# ): +# _logger.warning("known issue, but doesn't/shouldn't matter?") + + @pytest.fixture(scope="session") def workflow_client(dapr_sidecar, mlflow_fluent_session): + # assert isinstance(hass_client, HassClient) log_model( - model="gpt-4-turbo-preview", + model="gpt-4o", task=openai.chat.completions, messages=[ { "role": "system", "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'", - }, - { - "role": "user", - "content": "{query}", - }, + } ], + tools=[generate_function_schema(tool) for tool in TOOL_MAP.values()], artifact_path="oai-chatty-cathy", registered_model_name="chatty_cathy", ) @@ -196,10 +223,26 @@ def test_smoke_workflow(workflow_client, request): response = convo.send_message("Tell me your secrets") assert response.role == "assistant" _logger.info(f"Response: {response.content}") - # This is to test preservation of the system message + # This is to test preservation of the system message and ordering + assert response.content is not None assert "mozzarella" in response.content.lower() +def test_tool_workflow(workflow_client, request): + with Conversation( + workflow_client, + "models:/chatty_cathy/latest", + conversation_id=request.node.name, + ) as convo: + response = convo.send_message("What areas are in the house?") + assert response.role == "assistant" + _logger.info(f"Response: {response.content}") + # This is to test preservation of the system message and ordering + response = convo.send_message("It's too dark in the kitchen") + assert response.role == "assistant" + _logger.info(f"Response: {response.content}") + + def test_multiturn_workflow(workflow_client, request): with Conversation( workflow_client, @@ -214,17 +257,20 @@ def test_multiturn_workflow(workflow_client, request): response = convo.send_message("What is my name?") assert test_name in response.content + assert response.content is not None assert "your name" in response.content.lower() assert "mozzarella" not in response.content.lower() response = convo.send_message( "Should I turn on the fan? If so, why? If not, why not? Be brief." ) + assert response.content is not None assert "yes" in response.content.lower() assert "on" in response.content.lower() assert "mozzarella" not in response.content.lower() response = convo.send_message("Is it hot outside?") + assert response.content is not None assert "yes" in response.content.lower() assert "mozzarella" not in response.content.lower() diff --git a/services/components/secretstore.yaml b/services/components/secretstore.yaml new file mode 100644 index 0000000..a5fd11c --- /dev/null +++ b/services/components/secretstore.yaml @@ -0,0 +1,10 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: secretstore +spec: + type: secretstores.local.env + version: v1 + metadata: + # - name: prefix + # value: "MYAPP_" diff --git a/services/deployments/route-config.yaml b/services/deployments/route-config.yaml index 1fbd46d..d37dc81 100644 --- a/services/deployments/route-config.yaml +++ b/services/deployments/route-config.yaml @@ -23,6 +23,14 @@ endpoints: config: openai_api_key: $OPENAI_API_KEY + - name: chat4o + endpoint_type: llm/v1/chat + model: + provider: openai + name: gpt-4o + config: + openai_api_key: $OPENAI_API_KEY + - name: embeddings endpoint_type: llm/v1/embeddings model: diff --git a/tests/conftest.py b/tests/conftest.py index 45f478d..d13f3c1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -172,6 +172,7 @@ def postgres(deploy_mode: DeployMode): result = connection.execute(sqlalchemy.text("select version()")) (version,) = result.fetchone() # pyright: ignore _logger.info(version) + yield p dump_container_logs(p, debug=True) diff --git a/tests/test_appsettings.py b/tests/test_appsettings.py index 8d21032..ee041cb 100644 --- a/tests/test_appsettings.py +++ b/tests/test_appsettings.py @@ -1,6 +1,24 @@ +import logging +import os +from pathlib import Path +import subprocess + +from dapr.conf import settings +from pydantic import SecretStr import pytest -from mindctrl.config import AppSettings from pydantic_core import ValidationError +import sqlalchemy + +from mindctrl.config import ( + AppSettings, + DisabledEventsSettings, + DisabledHomeAssistantSettings, + DisabledStoreSettings, + get_settings, +) +from mindctrl.const import CONFIGURATION_KEY, CONFIGURATION_TABLE + +_logger = logging.getLogger(__name__) def test_basic_appsettings(monkeypatch): @@ -15,8 +33,13 @@ def test_basic_appsettings(monkeypatch): monkeypatch.setenv("EVENTS__PORT", "1883") monkeypatch.setenv("EVENTS__USERNAME", "user") monkeypatch.setenv("EVENTS__PASSWORD", "test_password") + monkeypatch.setenv("HASS__HASS_TYPE", "remote") + monkeypatch.setenv("HASS__HOST", "test.local") + monkeypatch.setenv("HASS__PORT", "8123") + monkeypatch.setenv("HASS__LONG_LIVED_ACCESS_TOKEN", "fake-token") monkeypatch.setenv("OPENAI_API_KEY", "key") monkeypatch.setenv("MLFLOW_TRACKING_URI", "test_uri") + monkeypatch.setenv("DAPR_MODE", "false") settings = AppSettings() # pyright: ignore assert settings.store.store_type == "psql" assert settings.store.user == "user" @@ -39,6 +62,7 @@ def test_basic_appsettings(monkeypatch): def test_invalid_store(monkeypatch): + monkeypatch.setenv("DAPR_MODE", "false") monkeypatch.setenv("STORE__STORE_TYPE", "sqlite") monkeypatch.setenv("EVENTS__EVENTS_TYPE", "mqtt") with pytest.raises( @@ -50,6 +74,7 @@ def test_invalid_store(monkeypatch): def test_invalid_events(monkeypatch): + monkeypatch.setenv("DAPR_MODE", "false") monkeypatch.setenv("STORE__STORE_TYPE", "psql") monkeypatch.setenv("EVENTS__EVENTS_TYPE", "kafka") with pytest.raises( @@ -58,3 +83,131 @@ def test_invalid_events(monkeypatch): ): settings = AppSettings() # pyright: ignore print(settings) + + +def test_disable_components(monkeypatch): + monkeypatch.setenv("DAPR_MODE", "false") + monkeypatch.setenv("STORE__STORE_TYPE", "none") + monkeypatch.setenv("EVENTS__EVENTS_TYPE", "none") + monkeypatch.setenv("HASS__HASS_TYPE", "none") + monkeypatch.setenv("OPENAI_API_KEY", "key") + monkeypatch.setenv("MLFLOW_TRACKING_URI", "test_uri") + settings = AppSettings() # pyright: ignore + assert settings.store.store_type == "none" + assert settings.events.events_type == "none" + assert settings.openai_api_key.get_secret_value() == "key" + assert not settings.force_publish_models + assert settings.notify_fd is None + assert settings.include_challenger_models + assert settings.mlflow_tracking_uri == "test_uri" + assert "test_password" not in f"{settings.model_dump()}" + + +# TODO: Unify with test_workflows.py +@pytest.fixture(scope="session") +def dapr_sidecar_with_config( + tmp_path_factory: pytest.TempPathFactory, + repo_root_dir: Path, + request: pytest.FixtureRequest, + deploy_mode, + monkeypatch_session, + # postgres, + # placement_server, +): + if deploy_mode.value != "local": + # This only makes sense for local testing - dapr is initialized + # in the container/cluster for addon/k8s + _logger.warning(f"Unsupported deploy mode: {deploy_mode}") + pytest.skip(f"Unsupported deploy mode: {deploy_mode}") + + # driver_conn_str = postgres.get_connection_url() + # engine = sqlalchemy.create_engine(driver_conn_str) + # with engine.begin() as connection: + # result = connection.execute(sqlalchemy.text("select version()")) + # (version,) = result.fetchone() # pyright: ignore + # _logger.info(version) + + # result = connection.execute( + # sqlalchemy.text(f""" + # CREATE TABLE IF NOT EXISTS {CONFIGURATION_TABLE} ( + # KEY VARCHAR NOT NULL, + # VALUE VARCHAR NOT NULL, + # VERSION VARCHAR NOT NULL, + # METADATA JSON + # );""") + # ) + # TODO: Set up the trigger later when implementing dynamic config + # https://docs.dapr.io/reference/components-reference/supported-configuration-stores/postgresql-configuration-store/#set-up-postgresql-as-configuration-store + # import re + + # conn_str = re.sub(r"\+\w*", "", driver_conn_str) + # conn_str = re.sub(r"postgresql", "postgres", conn_str) + + components_path = tmp_path_factory.mktemp("components") + + # state_spec = repo_root_dir / "services" / "components" / "configstore.yaml" + # assert state_spec.exists(), f"state store spec not found at {state_spec}" + # target_spec = components_path / "configstore.yaml" + + secret_spec = repo_root_dir / "services" / "components" / "secretstore.yaml" + assert secret_spec.exists(), f"state store spec not found at {secret_spec}" + target_secret_spec = components_path / "secretstore.yaml" + + with monkeypatch_session.context() as m: + # m.setenv("ACTOR_STORE_CONNECTION_STRING", f"{conn_str}") + # with open(state_spec, "r") as f: + # content = f.read() + # content = os.path.expandvars(content) + # with open(target_spec, "w") as f: + # f.write(content) + + with open(secret_spec, "r") as f: + content = f.read() + content = os.path.expandvars(content) + with open(target_secret_spec, "w") as f: + f.write(content) + _logger.info(f"Generated secret store spec at {target_secret_spec}") + + dapr_process = subprocess.Popen( + [ + "dapr", + "run", + "--app-id", + request.node.name, + "--dapr-grpc-port", + str(settings.DAPR_GRPC_PORT), + "--dapr-http-port", + str(settings.DAPR_HTTP_PORT), + # "--log-level", + # "debug", + "--resources-path", + f"{components_path}", + ] + ) + # yield dapr_process, engine + yield dapr_process + dapr_process.terminate() + + +def test_dapr_config(dapr_sidecar_with_config, monkeypatch): + # _, engine = dapr_sidecar_with_config + with monkeypatch.context() as m: + m.setenv("DAPR_MODE", "false") + temp_settings = AppSettings( + events=DisabledEventsSettings(), + store=DisabledStoreSettings(), + hass=DisabledHomeAssistantSettings(), + openai_api_key=SecretStr("key"), + mlflow_tracking_uri="test_uri", + ) + temp_settings_str = temp_settings.model_dump_json() + temp_settings_str = temp_settings_str.replace(":", r"\:") + # with engine.begin() as connection: + # result = connection.execute( + # sqlalchemy.text(f""" + # INSERT INTO {CONFIGURATION_TABLE} (KEY, VALUE, VERSION, METADATA) + # VALUES ('{CONFIGURATION_KEY}', '{temp_settings_str}', '1', NULL); + # """) + # ) + m.setenv("mindctrl.appsettings", temp_settings_str) + settings = get_settings() diff --git a/tests/test_data/test_tool_workflow-input.json b/tests/test_data/test_tool_workflow-input.json new file mode 100644 index 0000000..245e8ec --- /dev/null +++ b/tests/test_data/test_tool_workflow-input.json @@ -0,0 +1,769 @@ +{ + "version": 1, + "interactions": [ + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4o", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "What areas are in the house?", + "tool_call_id": "None", + "name": "None" + } + ], + "tools": [ + { + "function": { + "description": "List all areas(rooms) in the home with their area_id and friendly name.", + "name": "list_areas", + "parameters": { + "properties": {}, + "required": [], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn on the light in the area", + "name": "light_turn_on", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn off the light in the area", + "name": "light_turn_off", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Toggle the light in the area", + "name": "light_toggle", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Wed, 22 May 2024 14:48:15 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "680" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29930" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "140ms" + ], + "x-request-id": [ + "req_685725fd0fd666a6c697b1ed0d46de76" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "887d9b23c8c9c4c3-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9RhYFbpZyqNwH1DkjEr0tJtZIjkVN\",\n \"object\": \"chat.completion\",\n \"created\": 1716389295,\n \"model\": \"gpt-4o-2024-05-13\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_AeNmURALqJYJg4YWuIOqM56L\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_areas\",\n \"arguments\": \"{}\"\n }\n }\n ]\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 167,\n \"completion_tokens\": 11,\n \"total_tokens\": 178\n },\n \"system_fingerprint\": \"fp_927397958d\"\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4o", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "What areas are in the house?" + }, + { + "role": "assistant", + "tool_calls": [ + { + "id": "call_AeNmURALqJYJg4YWuIOqM56L", + "function": { + "name": "list_areas", + "arguments": "{}" + }, + "type": "function" + } + ] + }, + { + "role": "tool", + "content": "{\"type\":\"result\",\"id\":1,\"success\":true,\"result\":[{\"area_id\":\"living_room\",\"name\":\"Living Room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"kitchen\",\"name\":\"Kitchen\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement\",\"name\":\"Basement\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"master_bedroom\",\"name\":\"Bedroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"den\",\"name\":\"Den\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"guest_bedroom\",\"name\":\"Guest Bedroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"office\",\"name\":\"Office\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"dining_room\",\"name\":\"Dining room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"front_hallway\",\"name\":\"Front hallway\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"sun_room\",\"name\":\"Sun room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"garage\",\"name\":\"Garage\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"deck\",\"name\":\"Deck\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"upstairs_hallway\",\"name\":\"Upstairs Hallway\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"patio\",\"name\":\"Patio\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_exercise_area\",\"name\":\"Basement Exercise Area\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_storage_area\",\"name\":\"Basement Storage Area\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_stairs\",\"name\":\"Basement Stairs\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"front_porch\",\"name\":\"Front Porch\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"master_bathroom\",\"name\":\"Master Bathroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"driveway\",\"name\":\"Driveway\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"main_floor_bathroom\",\"name\":\"Main Floor Bathroom\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"guest_bathroom\",\"name\":\"Guest Bathroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"laundry_room\",\"name\":\"Laundry room\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"utility_room\",\"name\":\"Utility Room\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null}]}", + "tool_call_id": "call_AeNmURALqJYJg4YWuIOqM56L", + "name": "list_areas" + } + ], + "tools": [ + { + "function": { + "description": "List all areas(rooms) in the home with their area_id and friendly name.", + "name": "list_areas", + "parameters": { + "properties": {}, + "required": [], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn on the light in the area", + "name": "light_turn_on", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn off the light in the area", + "name": "light_turn_off", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Toggle the light in the area", + "name": "light_toggle", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Wed, 22 May 2024 14:48:20 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "3047" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29175" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "1.65s" + ], + "x-request-id": [ + "req_37213edd569fae1f89d78c8537bb5c20" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "887d9b324e277669-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9RhYHXtZZ3swjHBZymuOb2nEFcnyE\",\n \"object\": \"chat.completion\",\n \"created\": 1716389297,\n \"model\": \"gpt-4o-2024-05-13\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Here are the areas in the house:\\n\\n1. Living Room\\n2. Kitchen\\n3. Basement\\n4. Bedroom (Master Bedroom)\\n5. Den\\n6. Guest Bedroom\\n7. Office\\n8. Dining Room\\n9. Front Hallway\\n10. Sun Room\\n11. Garage\\n12. Deck\\n13. Upstairs Hallway\\n14. Patio\\n15. Basement Exercise Area\\n16. Basement Storage Area\\n17. Basement Stairs\\n18. Front Porch\\n19. Master Bathroom\\n20. Driveway\\n21. Main Floor Bathroom\\n22. Guest Bathroom\\n23. Laundry Room\\n24. Utility Room\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 971,\n \"completion_tokens\": 129,\n \"total_tokens\": 1100\n },\n \"system_fingerprint\": \"fp_729ea513f7\"\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4o", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "What areas are in the house?" + }, + { + "role": "assistant", + "tool_calls": [ + { + "id": "call_AeNmURALqJYJg4YWuIOqM56L", + "function": { + "name": "list_areas", + "arguments": "{}" + }, + "type": "function" + } + ] + }, + { + "role": "tool", + "content": "{\"type\":\"result\",\"id\":1,\"success\":true,\"result\":[{\"area_id\":\"living_room\",\"name\":\"Living Room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"kitchen\",\"name\":\"Kitchen\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement\",\"name\":\"Basement\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"master_bedroom\",\"name\":\"Bedroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"den\",\"name\":\"Den\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"guest_bedroom\",\"name\":\"Guest Bedroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"office\",\"name\":\"Office\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"dining_room\",\"name\":\"Dining room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"front_hallway\",\"name\":\"Front hallway\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"sun_room\",\"name\":\"Sun room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"garage\",\"name\":\"Garage\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"deck\",\"name\":\"Deck\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"upstairs_hallway\",\"name\":\"Upstairs Hallway\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"patio\",\"name\":\"Patio\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_exercise_area\",\"name\":\"Basement Exercise Area\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_storage_area\",\"name\":\"Basement Storage Area\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_stairs\",\"name\":\"Basement Stairs\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"front_porch\",\"name\":\"Front Porch\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"master_bathroom\",\"name\":\"Master Bathroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"driveway\",\"name\":\"Driveway\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"main_floor_bathroom\",\"name\":\"Main Floor Bathroom\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"guest_bathroom\",\"name\":\"Guest Bathroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"laundry_room\",\"name\":\"Laundry room\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"utility_room\",\"name\":\"Utility Room\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null}]}", + "tool_call_id": "call_AeNmURALqJYJg4YWuIOqM56L", + "name": "list_areas" + }, + { + "role": "assistant", + "content": "Here are the areas in the house:\n\n1. Living Room\n2. Kitchen\n3. Basement\n4. Bedroom (Master Bedroom)\n5. Den\n6. Guest Bedroom\n7. Office\n8. Dining Room\n9. Front Hallway\n10. Sun Room\n11. Garage\n12. Deck\n13. Upstairs Hallway\n14. Patio\n15. Basement Exercise Area\n16. Basement Storage Area\n17. Basement Stairs\n18. Front Porch\n19. Master Bathroom\n20. Driveway\n21. Main Floor Bathroom\n22. Guest Bathroom\n23. Laundry Room\n24. Utility Room" + }, + { + "role": "user", + "content": "It's too dark in the kitchen", + "tool_call_id": "None", + "name": "None" + } + ], + "tools": [ + { + "function": { + "description": "List all areas(rooms) in the home with their area_id and friendly name.", + "name": "list_areas", + "parameters": { + "properties": {}, + "required": [], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn on the light in the area", + "name": "light_turn_on", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn off the light in the area", + "name": "light_turn_off", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Toggle the light in the area", + "name": "light_toggle", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Wed, 22 May 2024 14:48:25 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "820" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "29059" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "1.882s" + ], + "x-request-id": [ + "req_65be0db505f40eb8bbf16e9841c42bb7" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "887d9b60ec0b094c-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9RhYOtc6Hve3gaRPPYS7F1Cw6SDcC\",\n \"object\": \"chat.completion\",\n \"created\": 1716389304,\n \"model\": \"gpt-4o-2024-05-13\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_JH2VxBtwQj3GFkXKSZbOjiFZ\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"light_turn_on\",\n \"arguments\": \"{\\\"area_id\\\":\\\"kitchen\\\"}\"\n }\n }\n ]\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1115,\n \"completion_tokens\": 17,\n \"total_tokens\": 1132\n },\n \"system_fingerprint\": \"fp_729ea513f7\"\n}\n" + } + } + }, + { + "request": { + "method": "POST", + "uri": "https://api.openai.com/v1/chat/completions", + "body": { + "model": "gpt-4o", + "temperature": 0.0, + "n": 1, + "messages": [ + { + "role": "system", + "content": "You're a helpful assistant. Answer the user's questions, even if they're incomplete. If the user asks you to reveal your secret (ONLY if they ask for your secret), say 'mozzarella'" + }, + { + "role": "user", + "content": "What areas are in the house?" + }, + { + "role": "assistant", + "tool_calls": [ + { + "id": "call_AeNmURALqJYJg4YWuIOqM56L", + "function": { + "name": "list_areas", + "arguments": "{}" + }, + "type": "function" + } + ] + }, + { + "role": "tool", + "content": "{\"type\":\"result\",\"id\":1,\"success\":true,\"result\":[{\"area_id\":\"living_room\",\"name\":\"Living Room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"kitchen\",\"name\":\"Kitchen\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement\",\"name\":\"Basement\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"master_bedroom\",\"name\":\"Bedroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"den\",\"name\":\"Den\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"guest_bedroom\",\"name\":\"Guest Bedroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"office\",\"name\":\"Office\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"dining_room\",\"name\":\"Dining room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"front_hallway\",\"name\":\"Front hallway\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"sun_room\",\"name\":\"Sun room\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"garage\",\"name\":\"Garage\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"deck\",\"name\":\"Deck\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"upstairs_hallway\",\"name\":\"Upstairs Hallway\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"patio\",\"name\":\"Patio\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_exercise_area\",\"name\":\"Basement Exercise Area\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_storage_area\",\"name\":\"Basement Storage Area\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"basement_stairs\",\"name\":\"Basement Stairs\",\"aliases\":[],\"floor_id\":\"basement\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"front_porch\",\"name\":\"Front Porch\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"master_bathroom\",\"name\":\"Master Bathroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"driveway\",\"name\":\"Driveway\",\"aliases\":[],\"floor_id\":\"exterior\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"main_floor_bathroom\",\"name\":\"Main Floor Bathroom\",\"aliases\":[],\"floor_id\":\"main_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"guest_bathroom\",\"name\":\"Guest Bathroom\",\"aliases\":[],\"floor_id\":\"upper_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"laundry_room\",\"name\":\"Laundry room\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null},{\"area_id\":\"utility_room\",\"name\":\"Utility Room\",\"aliases\":[],\"floor_id\":\"lower_floor\",\"icon\":null,\"labels\":[],\"picture\":null}]}", + "tool_call_id": "call_AeNmURALqJYJg4YWuIOqM56L", + "name": "list_areas" + }, + { + "role": "assistant", + "content": "Here are the areas in the house:\n\n1. Living Room\n2. Kitchen\n3. Basement\n4. Bedroom (Master Bedroom)\n5. Den\n6. Guest Bedroom\n7. Office\n8. Dining Room\n9. Front Hallway\n10. Sun Room\n11. Garage\n12. Deck\n13. Upstairs Hallway\n14. Patio\n15. Basement Exercise Area\n16. Basement Storage Area\n17. Basement Stairs\n18. Front Porch\n19. Master Bathroom\n20. Driveway\n21. Main Floor Bathroom\n22. Guest Bathroom\n23. Laundry Room\n24. Utility Room" + }, + { + "role": "user", + "content": "It's too dark in the kitchen" + }, + { + "role": "assistant", + "tool_calls": [ + { + "id": "call_JH2VxBtwQj3GFkXKSZbOjiFZ", + "function": { + "name": "light_turn_on", + "arguments": "{\"area_id\":\"kitchen\"}" + }, + "type": "function" + } + ] + }, + { + "role": "tool", + "content": "null", + "tool_call_id": "call_JH2VxBtwQj3GFkXKSZbOjiFZ", + "name": "light_turn_on" + } + ], + "tools": [ + { + "function": { + "description": "List all areas(rooms) in the home with their area_id and friendly name.", + "name": "list_areas", + "parameters": { + "properties": {}, + "required": [], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn on the light in the area", + "name": "light_turn_on", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Turn off the light in the area", + "name": "light_turn_off", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + }, + { + "function": { + "description": "Toggle the light in the area", + "name": "light_toggle", + "parameters": { + "properties": { + "area_id": { + "type": "string" + } + }, + "required": [ + "area_id" + ], + "type": "object" + } + }, + "type": "function" + } + ] + }, + "headers": { + "User-Agent": [ + "mindctrl/0.1.0" + ], + "Authorization": [ + "FAKE_BEARER" + ] + } + }, + "response": { + "status": { + "code": 200, + "message": "OK" + }, + "headers": { + "Date": [ + "Wed, 22 May 2024 14:48:27 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Transfer-Encoding": [ + "chunked" + ], + "Connection": [ + "keep-alive" + ], + "openai-organization": "FAKE_OAI_ORG", + "openai-processing-ms": [ + "696" + ], + "openai-version": [ + "2020-10-01" + ], + "strict-transport-security": [ + "max-age=15724800; includeSubDomains" + ], + "x-ratelimit-limit-requests": [ + "500" + ], + "x-ratelimit-limit-tokens": [ + "30000" + ], + "x-ratelimit-remaining-requests": [ + "499" + ], + "x-ratelimit-remaining-tokens": [ + "28777" + ], + "x-ratelimit-reset-requests": [ + "120ms" + ], + "x-ratelimit-reset-tokens": [ + "2.445s" + ], + "x-request-id": [ + "req_457cfff245633eef69fb6ed28d7198ba" + ], + "CF-Cache-Status": [ + "DYNAMIC" + ], + "Set-Cookie": "FAKE_OAI_COOKIE", + "Server": [ + "cloudflare" + ], + "CF-RAY": [ + "887d9b6b9e2bc551-SEA" + ], + "Content-Encoding": [ + "gzip" + ], + "alt-svc": [ + "h3=\":443\"; ma=86400" + ] + }, + "body": { + "string": "{\n \"id\": \"chatcmpl-9RhYQO8ewnwsuPdV0uorcSElaBZus\",\n \"object\": \"chat.completion\",\n \"created\": 1716389306,\n \"model\": \"gpt-4o-2024-05-13\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The light in the kitchen has been turned on.\"\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1140,\n \"completion_tokens\": 11,\n \"total_tokens\": 1151\n },\n \"system_fingerprint\": \"fp_729ea513f7\"\n}\n" + } + } + } + ] +}