From 35468e5d7f609b0472c0ba635aaacf136e592547 Mon Sep 17 00:00:00 2001 From: Gabriel Pettier Date: Mon, 17 Feb 2020 16:39:54 +0100 Subject: [PATCH] import splittergrid as a flower --- CHANGELOG | 4 +- README.md | 64 ++- captures/bt-lr.png | Bin 0 -> 8849 bytes captures/bt-rl.png | Bin 0 -> 9064 bytes captures/lr-bt.png | Bin 0 -> 10318 bytes captures/lr-tb.png | Bin 0 -> 10456 bytes captures/resize.png | Bin 0 -> 9351 bytes captures/rl-bt.png | Bin 0 -> 10011 bytes captures/rl-tb.png | Bin 0 -> 10090 bytes captures/tb-lr.png | Bin 0 -> 8853 bytes captures/tb-rl.png | Bin 0 -> 8745 bytes kivy_garden/flower/__init__.py | 22 - kivy_garden/flower/_version.py | 1 - kivy_garden/flower/tests/test_import.py | 7 - kivy_garden/splittergrid/__init__.py | 377 ++++++++++++++++++ kivy_garden/splittergrid/_version.py | 1 + kivy_garden/splittergrid/tests/test_import.py | 8 + 17 files changed, 435 insertions(+), 49 deletions(-) create mode 100644 captures/bt-lr.png create mode 100644 captures/bt-rl.png create mode 100644 captures/lr-bt.png create mode 100644 captures/lr-tb.png create mode 100644 captures/resize.png create mode 100644 captures/rl-bt.png create mode 100644 captures/rl-tb.png create mode 100644 captures/tb-lr.png create mode 100644 captures/tb-rl.png delete mode 100644 kivy_garden/flower/__init__.py delete mode 100644 kivy_garden/flower/_version.py delete mode 100644 kivy_garden/flower/tests/test_import.py create mode 100644 kivy_garden/splittergrid/__init__.py create mode 100644 kivy_garden/splittergrid/_version.py create mode 100644 kivy_garden/splittergrid/tests/test_import.py diff --git a/CHANGELOG b/CHANGELOG index f3854b0..14f435c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -v0.1.0 Initial release +v1.0.0 Initial release ====================== -Added the demo flower project. +Extracted the widget from ncis, and fixed some orientation values. diff --git a/README.md b/README.md index 7f897b4..05c57e2 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,69 @@ -kivy-garden demo flower -======================== +SplitterGrid +============ -[![Github Build Status](https://github.com/kivy-garden/flower/workflows/Garden%20flower/badge.svg)](https://github.com/kivy-garden/flower/actions) +[![Github Build Status](https://github.com/kivy-garden/splittergrid/workflows/Garden%20flower/badge.svg)](https://github.com/kivy-garden/flower/actions) -A kivy garden flower that shows how to add flowers. +A GridLayout-like widget, that allows the user to manually change the relative +sizes of each collumn and row. If the widget is resized, the preferences will +be conserved relalively (a column resized to 10% of the total width will stay +10% of the total width). As with GridLayout, either a number column or a number +of rows must be set, if both are set, then `cols` is used. -See https://kivy-garden.github.io/flower/ for the rendered flower docs. +It also allows setting the order of filling through the `orientation` property, +all the modes you could hope for are implemented: -Please see the garden [instructions](https://kivy-garden.github.io) for how to use kivy garden flowers. +tb-lr, top to bottom, left to right, which means the first column +will be filled from top to bottom, then the second column, etc. +![tb-lr](captures/tb-lr.png) -CI --- +bt-lr: bottom to top, left to right +![bt-lr](captures/bt-lr.png) -Every push or pull request run the [GitHub Action](https://github.com/kivy-garden/flower/actions) CI. -It tests the code on various OS and also generates wheels that can be released on PyPI upon a -tag. Docs are also generated and uploaded to the repo as well as artifacts of the CI. +tb-rl: top to bottom, right to left +![tb-rl](captures/tb-rl.png) +bt-rl, bottom to top, right to left +![bt-rl](captures/bt-rl.png) -TODO -------- +lr-tb: left to right, top to bottom +![lr-tb](captures/lr-tb.png) + +lr-bt: left to right, top to bottom +![lr-bt](captures/lr-bt.png) + +rl-tb: right to left, top to bottom +![rl-tb](captures/rl-tb.png) + +rl-bt: rigth to left, bottom to top +![rl-bt](captures/rl-bt.png) + +The margin between each cell can be dragged by the user, resizing the +corresponding row or column (or both, if you drag from an intersection). +`min_col_width` and `min_row_height` allowing to set constraints on user +interaction. On desktop, the mouse cursor is set to arrows indicating the +possibility of resizing when hovering a margin. + +![resizing](captures/resize.png) + +This layout doesn't use `size_hint` or `size_hint_min` and `size_hint_max` +properties of its children. + +The module can be ran standalone and will display a basic demonstration of the +layout. -* add your code Contributing --------------- +------------ Check out our [contribution guide](CONTRIBUTING.md) and feel free to improve the flower. License ---------- +------- This software is released under the terms of the MIT License. Please see the [LICENSE.txt](LICENSE.txt) file. How to release -=============== +============== See the garden [instructions](https://kivy-garden.github.io/#makingareleaseforyourflower) for how to make a new release. diff --git a/captures/bt-lr.png b/captures/bt-lr.png new file mode 100644 index 0000000000000000000000000000000000000000..ec08f9bc643cebf888400513ea98d728633c6135 GIT binary patch literal 8849 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 literal 0 HcmV?d00001 diff --git a/captures/bt-rl.png b/captures/bt-rl.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7fbe3033e992a86f2c3cac779a16ab67dac94c GIT binary patch literal 9064 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 literal 0 HcmV?d00001 diff --git a/captures/lr-bt.png b/captures/lr-bt.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1dd9059d2611664b724b06d0a4908b5785a370 GIT binary patch literal 10318 zcmeHtcQl;q-u9%)L=X{)-lB`%!yrU2BRUbiMel922w`iZW<-w?f*^>9GHgU|(W4BT z(QAh2?Yr%L&N}Bid!O~b?|J|G*7vM6i}lPrbI)_%zx(=K<%xI#S0Kcv#D_p2gi4CC znh?mPWbhJzUIu5}BF1yTpBpZU2JR3D(btRDrPmLLs2~t}h?1qdiC@Wub6B6)% zlk;RJ>)e07BR(M^;SMW&cz8Iv_B+OV<}}LWq}i!jL`0-+Lkm*mxSnWoYa(`^wO%WudaLlnkw=mxss3{LscoY}?bf`T1>YyJ!22=Mw%0KQg?hDKdNyw-+AKKZ4>8 z{W64x^Uvz9f03<`g2Hq(&6*s;$q14TgaYsFbREG zQjK046XA4$KJyb4zs5FeYiqwzWhv=~K)&3A^<$$+{{6~Xw6wHbtZ{L6Hbdh~ELd72 zFuApE3;0bG%#h^)#n9UqtKTs>)iY@k7X?8s^v7AV z4^YNXa^CMOkY`J65xfQ{LdmRKxkHzJ^|Vii-jTy~y?zjlaq92s`J~T@JMkV!&PM*? zo-})KopE$k>gtO%Enaf!CElnd-^Q6TYY7PCPONLqv#5Jq%F4<)*vl!L-Nt46-^(q~ zXf&3`wsIUFA75ET#Zj2*8d`vW5!zhiz68&N`K}DU!;!(&)I94ja&mI_qFy1VTV`EU zR8;Kk*Ypc$87nF(BBP>gdfu1`Qm!mZkQ2~K1=i>0GEx)8HoCy!a9i7z`Od@@Q3W${ z7GkKNkPwB6vhqn_P*9N6HNzz0=86yF4w;exh#pd`@AQV(Eg~ZM`?tjqB9t*JD=X~m z?0j0PD68adPu!eb<`VmIh8cNc=e%3Z#KeR-cRDySGdFh;D_^L4c%#Q1yy`F;8ykFN zeZ9R_2BTQqFFEgJ9F;A|+w7`PNlE0tZ`B-AJtT=7A2~tWiDu-SC=$st&n8XmlNq~| ztc9{dV)aq)a=i^uzL{ile3@QXrJ;Bs9@NpqGL{BN+54_6Zlct*zIWKJSsD<%l7aP8 zSsLV9=+WK|5??kNFdzPzJCR-J`f}Qe!W(`0zueaUX7}fkoEHwQd?+e%tHa=h%6bTec-?&IvN~K?TPr3euTV3gkG>DbKZ0jMt>&1HDr1_ug{I zR@$Hw9F^0T*_x$Hzr_@ript8d4+eKK&VRJrvaz;yn)>3p)RzGYVPRoG`Gb+6#cqRT zXTq3C5W2qJe|x@jLic@oIfBk!QcZp%-t5ils$E*|9@uA6`%~`YE0x(|HcGmvA2vO6UlhFMZ0|&I^Q!!nWA{#Rq~Eq^oWI%(`Jmw^p~LXv&_uQ z($doW{Cogitx~naxFU8?EAe;8~I-&nY7F^xfTeIwlhq`!f6%dnhzWH@w6dm`EaIm%>|SmtR!g zF@6!&wrVt4G|Z>F74ah_dL)-gDf@kD&2PE8*Qw_A+2| zerVRDa)f$lzvVD3n33Y*V(-l<+j4zcpWiMKc5C(BqB8kt8r)VNPN-(GLEVmOIi zYqZSdd^Vg800B&ll@$NBj69qncZ)b`M~LodyJh-LyFQw=*@j;?7S_MNdvO?)j8@r? zjgF3LdW8(UkI~cC{>WM9y=A(0)}RbE`0OwqO7?d6)Lb2g`+B&uw6?aUU~T-x zMLHpGYHF&XK~hE$4o8lyz1z}v7@ofK^^XzkVryz@VkP#zg9g@cx@RZ@-J#j&O82pF zoMO%Lcbi{IbE>u7T^&giaVENYS$P=LqBVaC*aEIHibh5mLo3mJ^S+YA&`+N~>uPKJ zppDadg@evc7!{DJ2NP97@U7I*cVXp-SlRo-K`a)#)030kysB1K3&B^e_gL@b$VK&~ zKYTnia_Z`Ju-v3PoTrosWjH-O#mDT5;n;PbJc-N7QiuAkyi1n1{#;${jH&hP&y;we z`@!ezaOs+~sO#LFf8W{rGsQds7737u+G9$Jz2(3Q5>taC?#Flh`s%}wMn-n_2ynW2)+H#Y zaa8Adc!dTkkkrm=&OWXK&AKgl3$WI|I>wOy)N?5`3{Ys}EdW^vKfiX9LF>x9q@+nG z)P#dDKEj4vo;cJUfGf;*d+?nKmM1+mb=9jbDl(Gu-c1@b01Fff1-8iS>@1F~ud9oL zn>&-wB5dG!Uhcjrug}Q=4v9p*=_gv6p9fzFI(G_EA)Y+!#?{MeYHDo>2_%g(;81V6 z#~k{R(_T2OKs}3Apw%bSyABf)5;6>1pbO}G$jr=a9obp2?pDKXT;H(+yPyIV{3*}4 z^$ZOSdtN0bCJqe^p^bTH9@p>^SO}+KoV@+~{CZxwySp2pc70$T1Pjf)(Ia+Tpl{<{ zzLeN0+f+);9BF>BoR4nGK-*nC{23H(y!>^?AJ&*&!Rb!jUcpI&?yl(Bsb`DCePV>l z@RH|YO+)=fNOjU9sENWun%)jF7s{g+p0Iu0sh37siFqyD##M(*-{q25lPaP~rDR<; zLf!FBB7wZU@}E^D$ItVLjXl7WeRmcer|SVx?PlD`LaY`VR9eTV2JVjNQHeNdzsDk1wvPPu)I(+~@`;lTj6A9lf z^!~(#m#2!>)O&O#r=gJ%W@hGmSWA6;V^7F_^uyDt)mAc-;g4|U=qe1I?|l6H{Jc%3 zFAF211%MvOtgYNwNzELHTpt@_dC=fYCViV-j^N?p zsh-?O6Lu5}IQsccC7F$ip4slhG>-{0H4#9tV*n=K@?;jGCyqba4gm@Q&>ED<`32|R za1J^?><@C{Px-{5$&kC386OX%&B0jX*$5VwF5$PgJdkT;WrctDtzx8*kdUW`$B9cr zrzPO5wMR@*lDT_*yggGj?&rAJpeMeR1B_bqj72qvw05^7nAzqP5j3Pqz zJw*o2?)MR-p*RG3pmS%bUp-AY#>#*h|H*3Y_xGBbnotInWNxtKD%c_m;2Cxf4tZO7 z+uaT=oSkRLsbuIwNI(uF)2AZI%fHAcaD}A zQc+TF)-2H;apRC2TwF24{GhU`X9E4!MoV;ycbl%$4cD>}o~+wQsi>*xEYEd#DkkI^ z)p-FxF38Vc>=l{u5Tyo}4Aio{{<*iex4Zi~IoXgC)zi~6bGBD4TfX*N5p5J95z*%N za>gTfb#-;HmQA=2jf{*!;{b~b*x$quv^??kbf5-{Ko@kv zr}nt9{pYvGw>-VP&K7ur%Eui5RpjL1k#hO%#i(4NG-^T5*w?BhjPQ7Gqt0zX86bg| z*Iq~G?$^QXK)%>^i*o(tWA~9;azV}t+>x(Z%(D7zD#r!6lpVFegoCOa$W^G~mX&z; z@S%WB--oiY^P{!0bD&pOod=-{#Q#Ze|>GFcS( zw()GYOvG_Qke{M=QTD)kb7kd5c#D8_&o6Mwn6|vUJlW?bcHmZMXlNuPB%YGx&=!v< zLn&&ASt4@)bZ$8(VdJcPU0j|d0Q}^}tjUwYYn~UOkU$5iBNfgc~B^3l_jVK&@x<8`_#xy3|@qzKw|7hL{+^=hm zBD;P$7|alJhtOpi#mA4YbXTm6m9d8UAFUKPH=ceTy<51tS+}()TKevt+?tGb>&^+F zcgb9apB*QKrHL;p*3hunQ={lJfHUz+f=dp=Ij?rfVThKE`l{$ouWCf`p{pN+j*BI0v=NrI03iHFQ*tC=5oe zF5^l~79sn*i(i`9Uy{zEdQw0@fa_k==&mY(Qo`lnUqN?=Sqwa+Mn*>yRE~d;G2BsGuEAKDUbsIYNzK0O^wOojVh0e&Zxejn$@T*| za-eiPV2m8y6=Q1>UhDeK&RYj66AqtWzI-`2sF~I)FTF+30)6SSIaQO$s%~8CVSDmQ zOG^v%Uk#1;R`cxKeHYQG!NI|a2{ABDXUzr%20&ebeZWf@i}$En)S#U(Da z;3T*IVL@KrS5-a(lo9tBC>h_(g16pbW~wZS-3xa1_E9x1Zfv^}CXevP zRs)6(v^F7?Fo2=w`q^%P5^!-jf=v%D1Ze380F8zyJnSw9(;^b>gsBY+!&^Y;F)5%p z4Juq_n_WcLJ;cf~|Dn7GoT|%A8mG7R>0mxjA}$LG>TX%|7If-MNS+;FL*sy8hocsN zjw%Jb1;_%*k@ra&em3O!wY3vl`%=K|;_N;Ho}5XQ-AG@CxX=gp=GLk5i#wQ`Gncb} zGOy1`60!ch99uPJT!+Z-wSK_Cfmq7$hSByXn*{p)TppNoZZwLhvbP_eZckB9)bL9e z^Rx>LJUcr*uB)xBt*c8*O||Y#wGvLN`lGd{rTJlFL^fv{8w&~wfOIS@TtOK+Wv`Q3 zp3qF%Rq5*J(1?4f4p5RRl>>)7%{ISc zg{PArvb|4EPWB!%@*Wu;W<%fK)$B1Pw=zl!;AuKo>`fDKU+igX1Foxv&c8}+&xagl z241a^cR{1r1iR(6aWaCPMQQMs4NHeNKe5a|OYXOxTt%y!o4`$&u5mADHTV53`1&Vq z1?HRgIC;ql!f(;(ni;Jcq3~bHgvP~dbu5d2o%8R#zI=h~{}9{H)}9Wx?f9Eq99biF zfF=N*!9`PMLTMr=cdfg^Z-0|{CLF(D}}ZE|c(0ovKw z37C@TJ(a8Qf}IG~Owph-|9}AWXw`cT5t04!cG}4bt8TzgRG?-Jxq#*PY;nsi3oXMg?s{@#n3U{Bm1lpcbfV-u<%V z`^sy1P1)I*r-k?R>(|$bsCmv&SQJ~Z;3@2&u4(VUYwVhWoKrzMx0fpmyc+m%WWB%xaVPzz8@z^gK z?Zjj3N(n#^+t_cz=m_v^SB*$pfmZY(iNt%j{_VQP(i*dn!e6Xb}lZ!{P}5O@ADDdfnH5bO^pU^3E)CwW7bP9WvH3K zsDrS2mZXGrBo4OaRd@aR^+Mk+siSmvphkK~6RpM<+>Gjd;+K3c)O(vHf6cSf&!0cP zxyj1P3IGpeA!1=}X5?)S!gZKUP?2wLE-fxraIWEemdU$bnUNQdJk``RC%Af3gPVbSnpz-bH0v#@H9F#P+MG32>z{(lXa7g z8S?1*e-uJlYn#!iOY9DRFsPJgX#^Mo0-~ai(`&(hC5esVl|lB=Afk|v2MDl9qPaHe z_3J8!@rtaIdDa}Z&%gUsuG9sd8XT^o)ZNKEz=g{f>sL)*1e8Xh3s`pp6&wH zZD*9M4AjG4Dqh6JaDNlICJi5&YfB#hciXG(w39VUHN9-^ww|*SF#dqdx_YRVDeU+Z z2%J)*x*V*>8Bnu^Xhc<~<(#ka+8}B2?_%~#z_C{>aIAfhv=UEsb@OE+*#nJwEcrok zF`I@01qm$Fpc5?J4RW)Yi~qB;vwiRw-#zj;X$6jUMl^5}qdUm8fN90>b!}IkwLeQr z3Md?u)obIjxps5FOhe;9=>v<$fV3581R-HzmS&{|;4Y@aZ4ihf@Y|?~+Q%zxfSpUS zRQnwoX13U$6*S**8?-4U8=Hc$wUYPmeb!2JDYM`ev?M^fj9{Y@d)ySusw!endsDl02@20-*UAFpusBV6i2 zo$u`x{irHA2tNjn4gx4C#>4>!c&PIth!0#u0ZK(L=M6kp1>h3eR;H_~J325hFf^3w z$*>B7X3+O+Q&$o@IDz?On<&OgXE(Kb zbO<^=aK*_3ZW2Qv*MD9-3&8PV8NnE74!jHC)sMbh7gt1&N%%$IIqR+4}54!hz3Tbg_qW%4S zd!tugBuiYuQnLSFl>R>;O6A|_#igg$o44XuPjW$%?$UdL+9mLPS^W_ zRI9=Nuwr!Kefx?B5L-1Er;w%}U?Xi|>c*CKY>kqX0kZxn7e>fu{ZlBM?cJ)i4#K>? zo*t0>=3<;o8UxWYTT(th-VQ!M!+}(_1WIYv<@<_|dC86W7y$_c5* zVbrsb0mv2bXvh?J6PTXheefn%^_00FN8lHi(~nO}baZq;d(m=?>B`sl@)GW@z+f-~ zO0n&UAVU&0{PaiEyT&01c9ZwkG-hPvZU*U9X;L|{HnJGth3J?+`h@;dK#CN5I2C#7kcpSxPFnw11qImgbuo3kTeFzb8fDMuK?) z(<_v%I#rgU2y{|da%<)>-&Vyut+yv3Sbzl1U_wVlk zcy@Jn7nhU-0C^31ctgPPg;@N*Qr*-w9pP3crK8!NtA}tr8AUTQGte8=)OvxH|EW|? z2iz`L4{`5J@bJhj*pC;WN-UdRUIULC020PgrZ=vl4X7kBzZ*V9fU|yj*&YO)#&6Yi zw7VvC@}mXY9%~O)+b44iSo>>hl}}56?Ev6gEtD#ngM&jK1rl|h!%f)wh@J^^D5v3P z)q!1bFJ#=$;+WV)L_p7vB~D08#O@+oIZ@Db_|hG9m@BXwkB$%}_8K}Mz_*B%_zW~E zSa}q2v%kVx?eLHJM0Mne|B#wUi7^_nv)CK_=+Vl>w^FxP{VAVitCjyk`$jc?`P3Xd zQoy+1g@ctf6P46VPaB7saXff%i(1rFIE{?!smEeZ%GH`$Itl%VR6$!3hCD$2!|IIp z|3YT22)$hVAIi)w_Du7@#-OoMBjvIM#2!drrT|%es+U~^$bhW;gny>jJBV58Jx!r${%+u^aJ<$oBcOda&ixjELX4R{e#;w8r?=U0YG!m@v8 S>84(2NF_PAY^jXt%l`wQctdOe literal 0 HcmV?d00001 diff --git a/captures/lr-tb.png b/captures/lr-tb.png new file mode 100644 index 0000000000000000000000000000000000000000..5a18997fee598b5ecc31c2dd989271686f8402cc GIT binary patch literal 10456 zcmeHtcT`jBo_3A}Q4vrfjFV4aQi+2 z@kbo|T%kMwuh`z0ISKz9eXOA4j6hJ=?f?7{%}>pOKyV@yZ{K|2k+?AAd+))@?vY=l z{=)Wr;w{QhC7iIoK}N2i(iM7ngFBP6v4{FFnXm756)o%HV~yhae3+e)-m&pbbgv_c z+8PWjSBM1{yM%7rch*;`96HXQ^0cDVvR_KAS_XZU=h+Z*`}L)vwKRg5m{|cnD#9*Mu=}%F|%_8InjTj9?6rUCihzr$Rg>B6KJaA~(=~ zAWpnSA#NNrXF_!RQ!mwU#3Ur>>FFiJ#=c*wK3qzNqv}50d?}$d)0OK6mpPNZ1y!w; z!GXH7gxtJxG+L$D)4YO=+t`0ct z5sh|Di*;F;nTNgR1Ta%Q{LItO$An95Pn|y9_fbbfOY7SFh@f7{{6vh=1^?|ajy=jt zEzQl}@=a=wU#fh(v(mS>;P6Bv``){gI4Z$}_;_agK&#_m{uA%rZO`QPJCutalA{69 z(b4w!t?IoU((cZd17YQ1^s&RtqpYU|Srj8b8EI*122>lCJ|0!ryG`rg!NA7G_UhFu zi$c%GkMCt~KDGHQeDAiLTs=uwW|`&S_Ap{s$ef8cwW4C{OF+yp{vMX&+d*vArcFfS z*xD97mWnrE4)qSxkx`VGnD}c^%hPki|LE!66&39<7nUO@?@k7OR3COYyE$;*YK7y# zpV3XEwFsyDdU9poTz&s}M2E4}aCPly>@^2NeSKE8&I?4`z=E{P^gS)DzUfCW2QYu1 zKFNmE%ibhW)lxoxJlma}b|(TO;cmYiefsq2Bvng8Lrjx-YTDWj&W^8Nzjk+vd}&h9 z*45SZ^V^NOsIlxN#YWiL*{uzt!IzX!9C+5L)%N)_FA~Wr<0r{B#ZOhc?o+k7xtW6G z=jHw7MUaw`qLak>)1pyf@?+yoZ@Dd)+R3U}g;?w*MyfBJ6^2+fRaI35g_p4?98!Wc zywI|JNm6ZpaIiE%wVi{5td0}w>+9p==J)}XMwDrwNvM2U*Nm;T^{Y}R3k&#yf-%Z; za`ZMD%(X%mg=O#F8S@f-q?2om-x&u{pOot)t=;i?c5GBEJe*;Q_9m?dCSvl=12igp zOdFk%=B|VG#4yNRj(0nB^Vimn3u`Q`tho*~#S8UGCr;XTGt%j>EY#GyUZhhx=$Wr6 zwW$tA2>iOC@qStoBBH7t-s@6K2!t6kthv=wmuc+0<*>sIXN@2#i!2a^yuEZC-kWIBiDT!d1I3<-DRoR2u5)qbpv?zNdn+)X``=N5px$+0DV`0}Or>1gBu8X!^ z7C579XgKUmB1}1zRqgF=y*NTM>_cwlvt2uOl8ORv+rRYf5!Tw^<+lr}iLpsZa3p`O zuC9iMhr_n9?#g5elh2*If6KyRvPa8k|IN0xHh3T2oWoWdVzp*EMwN`OCctdau!*OC zJJa(Sx4i6vMoEZ^%hDJKYT4M>%u8ZdR#tLzb9J>+{=oKC_-?@mtajYGNqbv8-3)Dg zdtqS#CM_u`DJ3W+FPmwHG3@a1Go|`@V~r6xC32#;7MtQzvd?Rbr%gC%DZ`32O}gH3 zVfzL;I%umN^|i!ZQA-p%$*pri@yqw`##ZAdva+8B%bX)vuP-IA#Hu6t`R7Uo>~lVT zeBhjBV;-k^t>vNVtmrX|)_76Z+3xak@!aF;nhzg7)YR-@ai}yAj&oc1mf?Dx&qT*< z@kc$WdT+PC(6VPRk9q$N8OP1WSC}Zd%F4=6C=@KOWm{rr`58@D7ncVQ9@q|*129Pa z`tzV}Oj_i1=gDc8@|~@xLERJ7)Td-W@kFOc#L9V^on)N5a5pyJrso4J@%XRN zTHU_XtC*>Z-&d;zIhdaR!-o&1qqz#_&!0yUe-4(t-F8x4oz20Xl074+|9;vHX8MX{ zn?ht%TwMRqkP2nf=g*HThQtIz4!c$CWM^T-eK%cHRKj|T-}7C$LVm@A`3j8EF0*%+ z(!?*t)xgFBpt;t_$hlRNh!)VR_9L`UX?RuGm@_pxs;H>IUG4D$rUfk+sV$&5K3j$& zln|pV=~7N!9(6T7e9DvF?NO_%tLtSdjfW3QEZf=BI>j7@D^K&N)_pGC>)=xUTW{8kTxmnGV%EtFW_s%8zLl z7Zug%5*g-ZXM^9+To09P9b!)wIPy;cz~5m)C<>KQGamH{cX3(uZLD2loe$}j&g7zp zRlLVVqLUEgxR_wPC{TzMGu1`K$PrS6#RD{NFl*xpi5j2K$aAm8O06&|n5i8<85KfE zs+f=vt%|B6D+3jUwUWq9T1j>qZlZ9l(Ep@O*GTx{fgzDdYaWs(Zz*B>Um^a);-iOaw+IJxQdE+k^}!+B?fFIbsoD zQoQbG&S^x)K0W^T`soJ8X6@+XmV|4U1O>yxBmVe|n|G^#v)|p*Bf1%XCgeO1PgZ_@ zhiSpR4vAW!=bVY+uCvpfX;W=UEWQ(Ub+@y+;$mVfh2y5DrD!Qdu3o(=Dtdy7DzwV! zzaTaFZ7L^ud3h6)(e=f#nRTJlwL;R#*s3Z&UgEK1$0`jS)YNDWxASxPqjX>gdM=H> z)M+4BcFoMs&81m5-I&(sI(qcz$-=v6R8Xzs>bwqS>f&^g3FC{J?~lde6B4-dSUEV7 z6BFS}%rMf_3WauBxriqT2nd|iYHMjR*Xf;b>b%SzXu??7uMaE`g_2HgHx{~=e=F!^ z>h#)H8dKy=%D>EJuZ;rr<>H9XZv07F<2Q)3G1p;dWgYk2?b8W$neQ;^#J?D(7m!z} z&S8sZ=9!j~3^@sM_tyVF(cZv*Lt{KA;{d<|ICg*4(g1s@+s%E$X(Qc-J*Spux*Ee+ z@a9dCH8nSL`R^;**)2Gr6(U{scGe!<4{iSP^h4= z0o|g{GcMHB)IUe6pNv%b^4UHhAeHal{g{)p1-ed_W+s+}{zORq5(qtwtgfD(o}Klv z2zAx7skJy1QP9tWL|D_!eV7}pewv7*r>6&eXqP01_ShIy`D}d2P&V>elmo(PGK-Kp z!@;pP=-i%>p8iq4?914q51@yV!~X4*l*FAUTR_NZ4*Z}`EiL_OQ!Kr++*LrvvAQjG z*%fGKswJ~?%e23}prWLvHd11zXT>~SL8_{-?H7Jg^C!8oH{+rpAl$WU?&Qfa|0Z5G*ueciHmmwh`HJoOQ7LzS;9DeI2R22OVEs56)tE*+=YqIDlRXnLE zUZe!o7{87$i#Q2Gq?H}Ccb^`e>B{0!iLb+b{4$_9Q;Ou`dPa*gu6e#V))B zhrNjA!mV*vrgE@V!2vIXWj_ZTXQ1TLGH}(jQmQ}_#gp1>uWtEB%i(jrIL7^!9!7o} z6AfW3j~+cDm5zlomLU?OqHa^hN&9X}kSYru$K(t9x4*xju`!6EurD1Agp*0HDw0PV zdCm^twIP%VxD9MfW~;?Ofmsl&eR@t#4v-T}wz+UdX6CT(+R*LjxiLPr7$A4Me%$$G zS4&IF`}gl#TU!I|oKu{odq@AG<_4wb#zf4(z`#*1Z1wKu>cRk1V2Z7RBiIc&SnI_X~suq%K3_#x%JYGn|`Y_8)s5v}zQYe;z1mv@{&P((x|Ju53n z4IiD>x<%9%jA=3t4luF~@bju=ARc)3v~jFJ8ySBlqvRD3QNq=Q?=>%U8B#H!p`qCt zS-sue+prl&VCcgH?~veNmvU`S2}?b_fw2gg-LJ6aHmB1JeqVf*9y!acgt@$m-aG>q zKgQ-6ZI9@m^Yc`P4rpZFJu1~bx8msNSkSRv9~>O4tEVR+AyF)NTgsv^j`md5jSIo4 zhFBW5^hQb@^w#F)ImPmoUOo8skLXL@-$(m`rR(qS&&bHg&dvrQQD0xbKND>DDHa1x z+V$lwH4^OA!NI|zq9VDFGvGGryN_Dv>kkUx2Ty4nLHWN<_S?+HVoAGOq+~Hi(}xdx zw>QYZg#)o(k5XDKh;40#1h3*&i>>LjhzDO&mHJ?!`u4qKyVP1svdqX7nN7kCDWAti zD{J%Ukq+9R*oK~K9JZF%RFZp9o`NQR#80BpF)S<$=8g|Dbq#p^@#rU&gsVrNKVBMd z`tX4-H{^a#b2LBC-PrvXiXZiTa6X$l?2W4406AQ>Az$2TaQ(LW$GrWkx182)egLnQ z6p^oQEiNH(&Gzd%SNeGM>NV{$#-j+A{|Uf>t9YL%dm5!Nopj;yfY_^z;UHYg*kXqZ z&q*EhiyC7QymTbW)7bcFrlL*cxs9D&EBm)x!DkyCMZzw|{O>4wGwC-)UuF*Dqsu&? zPDe0wFfuZ#W8g_rjd}h0HJq~6N)61^*4CC3yIS4rFLNtRO-*hU1_9nl+1!j&Abo+? zUp`_EYXHYvS}JB^;dbP}GYp1ZoJK5-LBd_2l1{W@iG!9%(5Pr{^Z@i{GhORBim-bA zmmJMInw`Y^6`6F$7- zw>MfF1ZfGkAH{WU?zH^;$J^_REHnDZPGgAkOHNA3_B&*5KB91=Ba#Si7fFD~G5;NGCr1kco`rA4bBm1}_Q9vLGLIqCR{DB3AOHcl>{nTfQXUtxEgYGg!JxqzI#68f2kB_g?kW|<%O~lP}M@ZsaX1?U=;cc|1Pz;WZRf`QQWHK2>Uo(a? z7Ai#%(S3&A3qJxt8(z8u^grxera$szZ>Q$P5r7Jd37d}Qd_n{+@j~sYnB$MS`T6;w z3U@pn@9yH#-PfmZcN&6P&_di)IXahZN&1cz1;MKN|qFZZFWf)FE> z6fi={NjzW7AAI0UPMkO)*&f8+mUx|9_v-XAsz3jnA~P#1RhZ0O1%+4%_n&XL?|d3L zHVbS&8E3G6?M!m10E>l9k3B#9U2<*CleK7hA1H8ocnSR7*SW*Stu zSsR2aX`>A)Jr=h})lWdnX5cg2(29{RGoKheeJNxW?CtG!baYUtiMT74MR{_X5c7e= z(!<+}#@(fn{PnbV;=MVHO+3kdZ+C~!R(avL=8G3E{9pf4L`~aUs1KVTYA8Q?`oc%u z;@P)q(${^~^T9oaO>O+#zw8V9D^2Tz0sO`7{}3&Yj68)#K~$mWcb&(3rAO;17tnL% z{J?z)BHV&o@xFzHg}eJTu5;YnwF_=zrN}d17gn<{Ub7%RfzrV4erRcF;lX&A)&`!C z+1tLt<-ZZo>zX|}la);U#J5$n52;sTyR*3>ovilCE;|Xu+6aFZ4UjoxA5t&uy*hvJ z2=#mYgYQ9(`wtsEG%#TEJASI2d~BgtD=IHfFwmsAxf!&SnF#Y#Yl8cax>t;4s~qCy zN13kKvvPrm;Q5ghyT^E9m$BFUq3< z0Dmmk?7Q=Lqkl+nU> zE1MuyHC8FEDMm6gGkTJjkmg@l=lgfv(d5h<8>jS8(l&QijmuXPejHFZmW-r*?-NRFpD~;$l54Jwq24W zt!-J)8qn20d-lxADR`{ZSV%!5_2~2Oiyna%yV|)RupYc^N_W+a2|A|;E)9>r7C$p^ zH9_F~`G9zD(cskS6)(_3XRE|!T*?9V)6>t{G)Tc5j*O5NJV%Nuo>7L1RN)15h^i#&78%aT!^ z)?Xt_l}*ZP8N#JBY+`Kew2L@-Y3c5T(`*DF@P>wl%*;%fm`*KKWo2S}d$KSp*btkQ z=3YJWWc}A@Z*T9*+9QnmzvVoMjTQAQ*;w<{;^maMv6$5JWRMkWhTVPN`1%K*|{!yY;5f9 z+qXmZ*Vx9OBmsp2(QZb@`5(=3adAjuxxS!yL#+^%+0}&O$BqT!TBgWMR20YDrfJpb zc3{PC2~%>hHg+!lU_DEDpq<>g{jwR?;>b$GxhxA3h19f2FA-no z@H$_or3B{8P`)3ABm$C1w(p6Dya{I$M{c@xRHW9wpK&j~r7?Dh5M+7z03y`-@BH^q zgtOE1J0rOdAKkoJ^HHa;7i;uncYEX4k|oB|;#-mRXpqeIuiALgM|8QjeYscc3$%Y$ zlH0(9MZj5YiaZZvVm_1o+Qb{1o4eBrN^l5x=Yv+(M-y)~Wo11mM2hJ1ylOzd@iHp0?XRZ+>NCvg`CxAy%u?cxM)C9U zd3kw(OJ~aIDfih}g8a5>{YMBh4B-uCt&!auDJ{KQHidyWNTI8#T@? z|Hi6cs^Mh(Hp52xrH^lx35#65PlE0IFvk`20I-#e`%hL>nwG5m?9R5_foFdL`tA=* zh3`RIK0z&Bl!!8g(I z-Kat4V6hH%b_AEQ-)^~Ly(mPwcC}5Y1p--Elv{l5mp;jR4PUwnPJMTG*DCN`xB#~l z$^W&n5Th5g3E6Rfcox7iC@OOKmk#~xsD+vc#`6lLbN<-9Rj>a1Q>RW*aslfy%J^0C z219@d1~iQ%LcTxN5LP&_0N@NpwXok74$8-mAJdn-`llHK@b-B-J3D)P zMSA*pE`C@z?(TkI0NTL=(^oDi>aSXsS3dipqs~nS?JAzsZ@aqT6XUDLyv?o=nLar= zd8vBa32swdT0l={X42LCZn(0u7&HWcMX`l@#T3 z`vdXzmf#u(nFF*0iP{50Q5HFM^-cyOpPOBuH(s)XdoC#{0m}wyEm8-UURvtWj*-%3 z$e_?c8+lGdgE}OEG=y>t)XB`u%xKpFQF&`Erc7V(ZPV=$Y>^=S=FABrWrn_0Pcc*TQKK2T3FDN9KOqMWc50~d&LnayhZ~Ue!_7CD&O*{+LsKU zix0{w*x3mXaXAlj&-(j-2qIOI!+YtoXQB3;63Z(nPzM!P|2xZO5Y#WV?z#Ye3nQtc zshQ!b{y`T6J@lsVLYdow?u6=XMjbR$;Khpr`cky_v~> zCo&ys(+&qlc@zAAWjiLfBf+=mZ19gpjwkagUU!V_zN9N|Y-~gs6rDOW`hrIK<+|P{ zrYja=tkliJW2r;hcZ(~Wm zyhKQ~RorRbpsq7g$vanY>!A1Z@p#OI-}(4tFJmgN6YHHWD<{QBvG9<|{&CM?(ppz{ z1#j@dg9kgu=^7m&Nz1%_`cTc-B30{lfo?8DBNyH(&V3N1QH=DFHga%q5IIezVP6!QA;C}7$08_eI&dyIWa-cz`(Ed;-UO3p{QsXU>|xGcA&r#dOpka;XAsjZ%w?- z88cH;KbaOtLgYTzo4fx}g)iPE3Fm_ZEzq12ZY(@#}l*wULkaPUtdayYCy@K}hQ#VF{V8VEMDx)T?;9 z8M7O~uf2zVS2AA%5GXsVK1c|Iuxy@{PyI>qElYI@#-t# za}DkGM*679&#FhJ*VNQ>tk;6~D07}-zwUIdlKHUw6Q@EP&c0%yq`6rsgLrRjEfy9# zUfk6NJSErdEEbCp5rX_qLp`A}{*6~e0I4ZM3P=O2IRT=M3vaFa@(h@JGvAMhwBhD| z)Q9Y68}Q%+AHll55P9ty9@GgAw*<1tpH?wa&>#rcHUG$Aorsx08o{U+{!aeK0+YG>SlP{j~v#6K(WRnKRGEMB+U3`RDzS z`lY{c4DaT*h~Uh#L4x&lcl$G7t~<*|ro(E3>z7rKmk%6R$Rw58ejPTeQy?^cS~LI3 ze&x!QWRD-OPOx0v23hJ)JIU}Z+H)gpd3?W!8O37DCgUOa$u+7To+4jVe{o;OLWmKw zA1Wz8lRIQjBLEaIMgGr@p7#N4{TYL<@@}E~Bp`)NQj-F~{U6oL9WDz`qS&NeKA#e{ z9~6^SP*aPLB}HrU5uKczaD|0Oxh@fw?|Ybl7lRta9l95f#UE42PYh}Ox$lJU=g}$5 zMZ!v?Z}b_FZ@l)_s`pfO*36@(e4!D7cm^J`_~BVqPymgMZiVorYJT$|%YXCt@5@Xw zns9@?y=N8$1iT1-;7OtgH7dW^`PY`Oyyu?Vc`dPxNPm`i~l(g7n!(^o-h{r?5HpD zh?#`B7&!2U}nNVae7_{DoM$T=DtbH*qB5EF!l zf}*URb9zW(QsQL(abvw%^0&s?Ff1j39S}jz$MMUI3zV+#EKGN(H_T#n^~l)bZK{g| zLnvBp@dMdRo^(_ckh*bGOPuv*{Cf~C&kp+SZ$bE-e!8rYfOvxqnwJy9)p`55Dtj)y*oOt9~VcwY#1zlk*_@2 zJP2?$;!)MUQTUA8U5l~e)ioQ#kWRTmk=o1jC4hx9vNym$jj{niA>XD|V zrms0U;h~}Q+f}49XGVD&&1hi& zx_o>lJUo2p`kJH?;RePh+qeXd!Q*>-7l(>8 zhh1e)kZtjjLw0JsuqR$}&j>+2ohYS*JblS`62klm3wcQfPDSP>BqVekFKJV6fi?c4 z#*-OAaM9!0LGTyG^qh=5`ozoqVff=ypa$|BJl@hCU#jZjvb89$0IGrG^2o@@I6t4Q zFBsKrCasC$_|r*8moEF?KtfmOA+qpYt~@(GE>>#AZ9X~(1m3OrHkXIxko~0~6QyOo zL1wSQnoPx1U>5DD?WMIL`0EXsQ;=tCu963=Hl!pc(z<7fJ9gfuA-8|JAyBcgv2k(M zx0&zT)I4Om#zcuIcU|qzeWaITJbP4cZ*PAg^y;l!+F(c=nK@I##A;7ppUCao+n$w& zrXN3kl(cAhpPZbWBu%Esoo>d|F!jP9yRV@^LGCs8&70U+$HB$TnSlrQ(%|WV=b%WT z7_tSS1cJ7ik2QArWX5TU^ly{lwuFv*_Mi2_@F_qfx? z-A3m(0{MU4bWMoJIJkG|k}09H#CPdwI;oM2(p6zmehKfJXaBSPCwtZTWtpH&|F@_p zy3l$$O0o#348p)5*sPKqUH!1Br6m^TGzV6?tgNg){MHBaM~^~7LwPTR$|V)sjn}lt zOR!M~^(QHLdV1R1ulk*nZn7WVAri1y>|T{-&^jtQT6%Zp3vs%Q-saBZ0SgC0yKr1v zrf#+n6Qyc2k3B4YZ*!4efPy;8Y~ouHI^t&w(B!7TsjEet`Ze~GJ(wzl{yEU_p$dS^5^mMNE+f0;sJU4eaGQr*I z>+5-Wd6UwTB-hv)+^1V(MB)}Fo8OV(^t??h1(+x}K^3g`5QqVRE$4+9n*6$FvobT! zM%;tBtxeu~(*AnXg0<1DVzlGKt84F`?XJ%P9ITj1c=FfBTa=17)mO0mNI5Ij~_x}CW)kdgw!JtW*b1)kLc>~oF6%~b(IV#W3 z*WNC{Vz6T2WnQ0WpxGS!7cX862nYaJx45`y{-h+Sq@*M(%Lc5hVfJP{qbY+#`^X28 z=dp50Vy-KnZaARFEUsbjsuZUabpnxvB0opILuwSlmF^ENk~!zbWyIQS3+ zXLEBiz+EvuKZ^Q>hRW3j765h`85wjESSqk|;4ZtRPV?S-i=uKAM2TF7k=!XPItV)E zGUj#m0*`)~b2fI0&Jv6&R5awZxiGN5zh77=Qh`W}kN2AC;LN@2EBUo|u45Sswtj6@ z!r4A+m4F8qTv=U!iE=C>=I?+V633PCjc48w zR#sX{w$E_?2E(;?T+-5rY~8c()GzIOAN6MH0SbJH>3Mql^y$+IUvlwrgB&RRbpLVU z&VqB<&|+%(r`daL9>^Ib2cBoibWF#z^n)lVy?Np{DgD#r|ISnYek!A66N1I_-Ml%kfG#oS zD==h}+6!g?0zsC8rddl>5?3~YOo3l~!19{lRy774*V2(r!~yD=)?4(~HCP4B>&o4T0 zle4?Nv>514)6~<|EgeDT-W>`1@Zp2F!?Zrn1q|L}261~8WkOaIYI_7zclQZf2_nvV(&!dB_npVSTlM7Jj*y!l! z$Ox}94Gdt~Man<`4%qdMPf*dSC+qG9b;0y0S{JuQJ#5X*e*rQwG%`BPndr4S@QUVY+s;{G470ox|v0R~&0{>8gT`q2Y zEJQ13+5R!+{rkGSh1H2hYbz_eSaE%YH%zoFEE1mEE4)U9b#-+gC0ugK%Rk1>TbNPS zK7R593UgFi;P9vE>hJIG>x)iIta{W)ovkbJeDFJ1xu&I0Z)jc|>^jLcNo@_&mvWuM z5zhq3rFDZ+JTc8zH6au}(Vi%CRC`V)%e1Ppv~+hiEit;Lz{skuv5{Wxn#RZCC%A-- zdHlR%DH`FfyrAW`oD{?!0>t~mdYTVw_p4@MeJ=S5{MN-CP{1r*;wruTcU9 zTU%TEZkRn_NNcKjmWF*V|hFNV#JoIy!oLd;8U^R~Z@H;S+UK3giWb>J)BZ z;o@RrDLA2C>z#esMi&E<77`f6#l;oFS>Lv+2P3?9rWzU=G-VESFnC;?C_g{HEdXfq zpwdT@IG>ej^5fSE>1zq?ch$WcEsDMk*cfK(o*7f<xmDIHXs zgrAqE5^hoexb3~a4R&`Z+hia>1pA4G2M->YRC?~DC3+7Q*_vu-gv)Vaz4CK&R}1h6 zBcL@iF_nYA5AOc7Py2oNe4KQd`^MZ#x7MmE;iT@8p`oFt^w`1H7}Pxjp8iJRvPGuo z_3LR#Nl7Uw@(UcIGmbDhrEQXn*gS3&x8qA5MM<2ClaoE`7Vs4xVNNRFc3Lo4z~iWd z1ca8>Ly@>!LPFquhO>&xHF|wW`9UCh5!*!h%U9$S6dIb|UM950IBYH$#A*nHDNF$R z;EVSYl4}CwIM~}O?6JAf`9(1;C8h0y;6x+T=lwEn*WBE^tGgReDKkAiu~*OZw20}B z2|pm{reLAPTb)6^2ch-FKWWa!%F+ zoMq%QrjZ~m(2vf}IzAXAnj*#Qe!h(K(Wg%W1>!W{7aVVH_qu>%O``D>q?qlP9R9_# z{5u!???~~}r)M9e+=A`e6c@>&rg!gfr=RA3Uo&p^Gth=)Lacpa_1=qafoO{nqzl7n zbb!SGa6?L)Qbj|HTYCWms&7@SUR8gp9jB18q$Kkju<5fZ_+=Tw&4Y!-x98;KoRE=c zI1|wPI3ywhy*#t*(zv{3TH)S1>qxz=5~lDjGVxdP#O)m%QUrZo+wo+Nc=Gi!ZE_TQ0-*w7>$<>0iX+}HNL0EvIWGwl?O@|A zcsLKHIz4UCSm5(#9`-Nmfg_FY784}^5~D(!;Ly;snyjEmO^hDP*!tpMOXaQ##ZN+o3trH6=- z@j0Asiz8KaN+a_OlH6aZjgVY>4N-pVU_8CGCkkL6_?@`xa~r#@t*r-pTSGR5i9Uxr zE912hQkx(2Pg`W;dxvn2ZnI8Y0QKS%5-L5mmQs)F$TG7R=DqJ4rf?aV@&5gL!AA`X zqZMT-DJkjc%~k~(9|Z2SJYhMgx(lo=aDYW)-Zy3G1{`C0t)4%9T5JK(BKLk=mJj2e_%GRb$j7Rck%Uv;}I;p{|{#!6u3XDkQA`4pIp$+t;t#+Y=E5 zhKo5SWp&{WqVH8KfTSlR`iu??aJ8~djQ|5SB7J{7LN^lq=FOX$ni_z_z@p^l4|f3N zsjFKEoN2c1-mg&p5a6!V;zZPwv{)rwwZ4hB>~%%q=db$vYjWQe-DX;$riPe(Q3x~4 zd)$mS^)WFry6GH!bmkNZ+wTJwkL>&`59*CJ{1q?T&d!cX$_qk!{Nxrf?VQYhBn@0g z=k`5^_b%vyq9O-YbW~JVXXhOXWep9awRNri#d|kIL^i`jM~fY2;SV05`VEju%F1pB z8+d%S(H3whv~nNDg5&4Ic}*)N_qQwemW;kVtOlOngb&}*c7N0aL|(WAskp?%vA(`k z{Cs|X{y8?-73Uj~fScKNy$nDtZWrD6m3^qRRdk}DuuzCnTVKD}Wf=hwE-uaktc5sY z?;IP#{|%GiD;o2nArE)=KxFvZ5?~@A3{+KAMuAOxDB!w2(+Tw8>v)PuvxWZL+1XkD zNFc%ZC369g9PDoV3b+JrGSLtQj40R#6sJhiG!t_GKL|#=5dd$+s=#o8>3+~eacODk zN<`c)9Scibe0;VJcYyL$E+GFy`74=LV4caz@8H_nq!MTE0;oSlvbVKNa6^oaJtBel z|CN{c6aEP4por!ur@(vmAUU4pK$D|lSL8s16|@kj5G4^lA<3?J#SaQR5Qq!eUPK{z zu$$}a_wtrYMvzrw{H=%(9XLHD85_0YjNl^yrdG>*-OTf%+B#+ieY1|vPEJ(YT%WaW zs9npVsBma?FZSU$9< z%Z<8U;Om;OwRb>EEk8xvkz~hdDPB^#DkX{Ys2E-8H#n0(_+lmV_H`59%@O%Y!qBR^ z?;KpYtqmJ)ee|EC)*$W%HtF^Ie+$ZLyY;g41%Yy0=?2o@0sy@EsrMC?ecuompXrz< zKt79^*S&TlPPF~^KVH2vdE}O z$0Z3*8XO!PbL&ZXz4@wp1v$u@?SB4u7 zhPCb$huKA=@EZ)^KWKhacDwH~r{}CYK^9_1>;_reMM|4$^{Cs6Fju0ni{|m&| znw@^f<_A0@klESU*&xvNk=|R#mpNRG0Gqq%p-TpyRQb2>+TI&GLgo*E0Mcc9WgJAe zoMD_1eEEjiK*tnm>Vbgw%jz`!rDBPS9J4?(KneR(Xj7FV)-0-aa$wW6S76*S-oqB{?|~&gATD-u3ma6jgvg7F!wZ$y}VSXfxN8$=z< z=1(KX%)&A>IJib6x-9f3^;)H=$2tG13ts6+7ovmREhQv)$epYvN@BEbIKtwwQ_P>m zTPBLL_*om{0l|YTOux$83pnj=O&Q*m0;AIU|AQT4=~5McJ0XU|M)SVArq0dJe*}U- zz{!QSV|+k>cLJx<+4&ZYPV2R5vm`p;q!a_UUlf){U;%=PJRf9mAMWa+gF;QUv_SKt z-u`28^$bm^8u4&%SyWh$8t6rtgLUl+ zgpBQIIXEgjwnEtE!dE4as>z`|CZ)#;3WQ&n%uH1^HOfSZbEIxi^hk|m{<8u@->R_B z`cJp0O?ikrp435iG5Anst4I*lx`S*M80`xZO;jNL15A*akx}Zovj&XcciXYbj~`hB zIJkdIGmJZNG(djYZ8Em2PGJk7#Ly-gMNE~@9O$R+*ztR zI_%I!saV`*<}#`Pau8Gz$Y#ySOYWp~)5_H_Ht9z{NY|k|V$X;Et0A*eB3xbOlW>~T zad&sWbH{hUrX8dLSggd0NeZ^D!*?W!xGk_*%2#U6f&}%lV)#c8-45hGc?PQnoq`CN z!(vD3779)fR$A-n;THz-L5dq69W4TqXQ`F%-#NVbx3ux=*QX$D1jGp1LqJ>rx9kCQ9gra~m!;vk-prug*9pxy9D12H%hR4! zPfw4rG<7rrBnqIOIS(F$KPL67=C9l~|6yBsO+EH~Y%F(w#5WKg0>gKBu;-S5-V(nC zkv(qr{Eyw)nb<(Px9C5xD>-tLQ{ZppDw_Pzpl{JxaXfPD|Akw_u#;PR7(~UKBaGZL zMd1rT7Xjul63Q!KI`D}j98 z5zmDHIeTD!0NBG=spXo!nboSOr~suPz$6L03DBSZkH~(s?HX42)A&_KqENz4b3GvL zadvSDjUz6t7dRg96ueIVH8BC2S5VKDJHO*CQv_nPyZf?!hQ#@17!NNmh?W!yZE>Q> zXD`J~&M*tvN_hq?(K!u*39)uE1vC;t7^9RbUdNaUNZJx zBC6>N_OE=`7ySIKTer5B$87TlybpH>AdZsR?0*F1$T|suoZ>zHE`WIuDzQ?R|JV`P z4t{?&RQTNdNx27@fQ%}y`CquUl&G1V?w9jgY2D`;8GZH^i%9(6Dx$^X+X0}92nz=! zkonz-wlIiRS5wpBMuE;)(yT~an~jL7bFHebX(pP+9ApB_%=gr{s^+X`cMYs)wSlex zV-?w=a8rsS+Ne*!-a9Q1RMA&`8MQe2MX15WttIS%o^HL$+%SpQd->o%~&0fBAj zdA~|-6u8%`3+wM1!tBwdm=Xt8&?mn;aW+;hb+$VVD&>BAUnqUnhb{HLP2BOcM{MSL z(vRsNJ)P7421CUpdLifo&v3c>Y&X6uxU8oLC&kN~{rU4Rkbr@Nrp$Sf?rLv*sRh@+ zSUNRGjFW+af`XZunVXxNhld2G|3vYS>D{&y0V_y@iubeDvvnqO2*T*UnY%NIa~dO+ z4Be^f+BX=0C}ZI9`^d)|#w=_FT)nB!ffHy`Jq`JX-9xafv>SG04(ai$|NSw^Nqj-a zKRlc|UZdz~=jV`+Gh9bqU-2nTIGi3gO2TF7N>!qa7pNBhNRX;?hH%F5g@%QBO@xW^ znUv~0cyKIW7IMD>gnM{}tm@ z3>b7}0%$zj>Q|&d7CDs|-$mbJH%ZmaL?8EI)3dVPgoRP51Fg-6o(CKSycT#Q_X=qV zi9PTgjL+9lDc-u6uO(!PrmBRkJ$d7~O8B4pz-GkWG9jM+pL%8IW^FB|IxQYGhO298 zUiU8tYHK`rV*>=W7!Zd1p@p_;-ts^uQ?FdhFBOxr*C=zy`3t_4-!6(A)(4i;tTs@V z!w$4UTUu03tPQg%S2%nC-NXVz-u*XUSR3t+^8x7e`c+^`BqWT|b#xgufbh}=}#YJWR@ei?kT P2%;>naW6;i;j8}zw8{}B literal 0 HcmV?d00001 diff --git a/captures/rl-bt.png b/captures/rl-bt.png new file mode 100644 index 0000000000000000000000000000000000000000..8c71fe8e97af979041a0b3475116c985c4f6d503 GIT binary patch literal 10011 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 B-{$|IqW(oG^_1`0f3nfPGEfii zwdB!nbAQB^G(^uQIkvofK}LgOsJoQ%)FCh3D$-x26ZJmXTMI3I?BAk$uzJ{c@bQF> OgQcWyU;vmznko87di70os5 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 Q9TA?QteQ*#;;H|C07p0?MF0Q* literal 0 HcmV?d00001 diff --git a/captures/tb-lr.png b/captures/tb-lr.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c609fee0d75846f6a770e207371a860a2b355b GIT binary patch literal 8853 zcmeHtc{J4h-}jWtBwG@)<{~BrWnTu_DLZ4|v+r9Yge-9(dq#GREhB^^gv2B!*+SL{ ziLo{zJNHMw-}Rj5cb~53e(v9Mp8xLeF~>RMGoSgauk9^XS6hvWf|&vWflz6vE9*lb zCmw^BDD)(FCoiTZ1N=Jct#0ZEflzlGzfPp{Q?o!ImmwO;3Wj%cRwg|(%|{N%zx%DY zv5ecW+~k~j@a<^7am1 zKYk@qI!L#n&}vw@PcsJIwsFDw9uKgHgJK>Q7Q^F8Fo z7Og#`AQ&nP>688YW?#@{m6dWnGf|zh4G*|Z=!aj9Jkmg<`uh3`%bvd`dg{_MddhbD zAc_KG_Yz)+G-{?JcAK$v8z;mbx;?!;vNah%IM^brc}wo@?uKrbTgPHveF%73S$Wu> z6uPmyRJC_-SnJe_^7k(a8MwiP;EL2)BXx3wO+R3Sa?0;d(_G*kd1kskn18sjGoRnO z{!ym&aI>oPM+kzwH%~S=C@5$^Os{|~f>N$|XJ^M*^d|J|1I5@hHa504oA1^~yCZH@ z&8W5Jt&$%hjZICFZI?TJh*_{c>Q=M20z4Y}`|%`_Pf}-EdV1aS=id9lR)=Jlb= z@_O_t<)bHZY3-8*NsMc=M@_+7tC~9G&e34{UA$i0?`uY~7ZYVxp$`-hy%!WKEgCSJ zAKs{cXTG$rGb7}VG&16uLiCS~nORuuH}r}n8XM43|_K$|^eYpf0$!&j$Oi4*u z8LyY$T__}pgdOb>@(%gVa!s_lb#AdviMSlspy-QVw} zSBm;6u+7rq5)zEmG3UYV8vFVAafEJjwpF1a1qQM7T*tdz$YSvDGT8rsZ}anBn%5)1 zp$N&$&reeRgF`0v_=K2<;-KKnY}l32bCE9ZedWoAK=`|bua;o3v9xp)59lNwLLeqC zXpQTpX!-r`O3}14-jWm)6z<~Yd<4?%Epsi>YF`;aS=xX=3o+u!o6iU=xe{k5$vW&S z2Z6Y>(JH>S@={WY93&Ra;)IdN$hI$;B2GNKycrxW_2c~f{BCY;D=3-Mbt05p8Uw|* zGCtuHByUkN= zZEZ!7wY9aNQAFEiHX$kz%G-5jA##MiKHY(~xw$#V+CV!yMYIFeH?$|XC=L!g2cc+M zx&&1LhI6MUS$Xloz3UnrSu>J}g|oI&+Ns=n^aeXShRF0;$=Xp(wG}Kj4g-aA}eZFohADh{swb>hLQ>^ zq$ z1O4C(ehn59d8IAnXuce#!V{>~2@U9IQ$Q6KJ6`WacTg`WhCu9B|F31Z?=5+6`}=ftb@lcWZjBl^zUJ9nV`+0HD>XT% zGHukhEu0~KP5TyMb^tTsDZ%-*jhq9{$Cv7`vrrOy$IGl%vN2yN!>dHz&e!uVJAiKSRfk7PRQAS25&8=IvBHIcS*b~lj zTJMdG z-9bD1gq=K^6AIh;d^_pjE3bSCH*tBiHf(n=U-Z=i#r5mg zN&D-)@*90h2?+`P&KqD~02zhl5;Yv|+XlaZQt6tSn(FB(K&AW_bZ5Q-2nY^ta$NdI zs|d~+oZ(iMVDfn^HZd_VPd+Sk#}1X?AKKqLIMWP)G)DjTxgAIV z%_v$VQbabvTnLBJmC>R!m%M&&g-1~xMvozSLXVN=jgJK%7gq{YD_iMm+}rinus991 z?wSuitXeFB{Bdu=U(2t?{n5KFIwXkq<)+iPQY4vp;Z%5uWE%HXdW!2&v@z{^y1F*C zqr$Sq=1O{xoJFNYMAEuT8l|M90A+*g6dCJs13l+0iI9=W-bm@P7jBqbotUt2MS0Vy z_<$Xxr?{d8`-Q_6f{bEKOlKpmfgb#i{!sjL$hD`pH$Xb~)3P0XJg%g)R75uZA;#Uf zBwJC7BaA||a`L?_4G?(0dx&rUcOEJ%!eY-vwuv}>)YR4%lppY{H#RaF9v&WBK^>#L zYHHD~3_(Cct7CO;c$%Mg5pwxn2fLf%*$Ihbx2sLU!j9g&xxr0m8tQFpYpbQz1Dctl ziwjYC^TENvF)=Y|p)Idoym;~Q<;$l}|4i)VyH0r_L6s~Vatlh@JDB#q8x)ikp>iea zagSs9P-D>MVvzz*9Hw_ZJ2$u3QU3mR=ab3*TMo)@x%N8_ib&M5W{U3W?*6fN0O#ap zPB4QrP&7(uqaE_*4Muk(Xy5vkGp$Iu~^p5%pON+S7Rh#JX5s6Rkc*^ zym{i?n~HK{^?W$pM4TO>w>0=>mLBqst*rt*Zi$6|pugvASw`g8p!6kyNkb{oi`u%u z_in2|AeR3<)%lk=Wj>wRKK=QH%V1k1xh#8s2;72BOfBS+CVj9(S;i#ymv6i?ue72{jCtJb`3|uhdRwTXx zhH5(Kls~NQvR@<;1CI{23??kpTmR||(7@kuOC?T3_%FgZPgPkr;67S|oAyTRE!WQX z=C`6&m>p!E-W$+&^N37Zep0VKA8TayNH(_j~scv{1mFrWHn*=|;En_Te{d z?%p+tJXaw~+3r5^iqso+DAMVZnHR76kFj9Hz*yc+f1hrT>3sKYCMK1;tA>>jZd7|` zWXAYbd*i{+aZ5pCE2}B6N`Ah+f>y6T_xD#nf1XSX3`afeBl}mnaDJUGe(0L1+R)Gt zmE5$}vX^db<>KYl+ugnUv%VF8S$N6AVX`}S?ko*gED?$Q+l|l~(HawYR5GL0U0a~G z+})RpGprhyDx02;^0DjNK4k|8>*?Y`Tv&LVl{K(E0NTe9<~T_+>Trg04-`>NvW00U zwJw#C$Hm8wkBw>P%T11tmmdtBw|DX1`7vh#e~DTd+vddAXqTpy1b@Dve};G>17GJh zQVA6D>gwu4O^DFXQaw1s-V%`XJzk-Hp`oEcL5}(n)7Sl6Q$TR zB_*Ymm6fcXaLy=EF)^HVYEd*6TUb~K_R~6)310&cAASp&#UD2?GLmuEpjY2Q&^RQd zdDMN_(P%8$Vdqns0l39GwxClnF)^MC$f|PnRR14eyNc?Glh17>|X@OvvyvM!?Znn@dQTE=~MQs1Qv(r9W-o$<5SeR)01Z;wP{af z&1j|;>B2f_6 zzawLz30z!OHkW8>Pw&tqJW21myKQjIcSUtI@OMxR-cx4;E@Lx@g_$`=o0pB_3KA*C zM42b$=LnqWP71228R(CfFNZzr4RmGNucdNZHu@7M8vKA}Fb{p+IZN8Pw=_~!KkDxP zi9H^-ySGPv=FA@{?|(#|`>k!r*;vOF7Z=yn)v2hc_}?>%wSDX?$_zbaqWC9ajV7jj zaBz?w&d1pS98bmYP`NQLm9QQ?Q2ooxaIw7;9rDyGsHU_tnOLk<)z;!rIR>VGJSv8G z+|njBH8l@gPHt{)Mg}A08RF-S2ewS*LqHryM@Oep3knGV`oD1Dg1`Ij+iRLeMrgvC z(^<}b=TCOkx_v!9HSl#re)lkA6m8<{!d;WZG;R%goMEUO5;-UN(OrB{uL+CAz`AR4 zZc3$clMp(c26R9ATaZ_yec=qVfpU`u0}ruSFlP+RieQqG=&7yV%=#&BxXYPX(*2~& zJ7R2>h5zLLgI|co&$)VdZ0_9SNh3CIP00jpIK$`%zBKZ;#a`f*L#gULQezL~=1S|2 zZlC_XcK}dk@8?Q3FrWFNiZpPuR|?EFWt&6plXcJKUXKqv5P-}P4*an8Fmy( zRoO&`INY9c{xGMiOFE_POEo8JGLT!^X9DboQ#y zSFT*Sc=4j8rRDA0w`XT(!*3K|vE8n9C3}th9s5*v)t`Y_3|ahCrm4f1a7sba`^%dY zE;Ubt3&8Fd-gXbqn7D@glAETIta3oWfBtN;ubawkiY9)}{o&{_@#7bQE5pBD;v}7H2u&JrTP1Z*i zwfK+L0a{0{rpCtgo|BDvdF%p0jfxX@Ml9Kr=6fUvA2yVQKRlPUNj`2m*t|M++7v7x zP|s>=ou58Ea%8lW689L}7&iCne_^>>Y6FzMA{o4{h51>Ns)CV)#l-M1YIlP;HD%>d z`3m#s(IY@Y&7^lMnR)6wmwp+GTNPE}OO-0g4HiIaqY@rI^bZJd^KQ84JXoUD-rk-e zWc?A0;oTS68zILXXH^7`SufX{z)4%F{wNgBlpR-`ohY-`R}ySqCsjzaPM6QvkB-k9j8X`f+BO7+O|D)Xm?cwfjZz>=+RdDH_T6*gLtfk-C zV-_RdrE=#Y0)>elK@#qtzibATHAwkPY_e?p+vi{8yrLnpXG7Gp`R_4WGVzv!JvZGG zq99Wo<~u?t&Tb&32JXjN3X3~aI}nY5v33^MWMN=G5IP1cHE^{*QVbR2W+fG9o#R9_ zQWc-jDnWfDSx=unEuJkfXwWD|uM(?TC?Xg>^L1g5M4yPRqk(SbhQ0;(K5!5ZP?eYz#5sGyVZ|heVS{_q>(BJ0D5(z0dTy4{O4KH_Pv(PrIB%WacS2ioZZ2}0Wfwc z>h?Qr4<0-KdOz1KcwZ#JFaPpGE<#83Fqus z+XCD~B)U*Aq|@4oXIB_40RRSA42uJb9fd+?9YAI{Vo*(!8j+evWYtLU<|0y${@1AD zae!gS$;s2Gfr|Ku$DcbB`3r_04!HtE0}4TdJR>6`yXRYM>{)5?5L+f5et!JgR&7+W zv#4ve32fn;q$xTuPsd^DoFcT-#~%Uj)JWxyv*VM`$6|e1oy4<=Pc4z)+Z;@_i&-^N z@8*@xUOl_xOu*7BNioEe5c#WDT~v`n4<4M>qp$LMrvAG;C*k4=h(Fc8mF8A6TX0E8 z)YsK*uIC@U#=s&YBf%Zg2zZE5wY8ldt}vJ18}03`nII4dqoZ9u7A3stR@5==Yg;2j zLjZxjLPO<32QJG#cV1Cl00Ql|na5>eP7Zthj2IPKTO)D>( zgSX_?KZukYRgAs#VChF4rw1TfJ9hoX#v^n144{fnhQG-TnChxALtOaq3TOdjxzU|~ z03B`Z!+H6moyoP(Eu2tj|8bIPTOr@$oe_HogN- zXD3c)Z}Ok&UGLMo1QsESSC{cM=%vd3!96jz zVUSI9y4EEoC2`20G_&I!b1*P+8g_Rtuh#jzV34(?^BW&8G2pe^ePkev1G597UUuhe zTCB(z-~_K$CJqh)Sly!o!qKSvORtb6^DztmE88CfT12F!cRz^qzNoJU=Uu@3rG1d< zrAYRI7IJKPxw)B{w6t_dNeLZqooPTqgeEj6;O0wF>hg4h=?{3jdl zOioU&wH_UUJ?J&I4!Hw(geOgb&=kX7(DW~MAb2*=W7smj)vRTECLUaRlF~OWV$15y z+9D5 z0}bR9$i{Sk+Rf`9XYD|(0_6d0n0-%{7!dPE+nw_IuXWh8`pEpZ?&Iu68~k`Vi)w2J z=X?Wy1w#JP$D}Xc%&0f%z9|74VU|=C3A+ZvhaNL~l(8x%3kE4fUF_kG=Cs+C+ zbxa0_5qJy?lt#}X{}X9l-D^JFr3(7DF(DJmNz$sjnr5f>G?yn@Acv_1b%B!`L@oz? zuM?kQ`Jjq?Ti_~)(ZzOnttyhM=-mbQhUYa!OC=i6t3;Z*DCyBB&gz?L>Cp$~m6oAQ z(OfC&e4IF+oXb#ATqd{16Wu>Kqa;}qBO*>__n?VaCz<0gAb|&-!0=@i{+FkyH>+UQ z)Fk^KSMfit;x~oJLDBc9<Dj<|)DkUWaKn5_EQ0x8=WiPwKefS-+Qdd!TvMJ*#DnH)Q&p_0zJl z{$*eOjxA8g0O0GC7sw+o9|rQHC%Oy2BzMt3aYI8OFc{S)ALe`or0=hSNax;Su+99( z+^A##o>**S$lgz2PgV%6NAFG?i|yX`fPp~C3Fx1~o;jmG_xJZfY);t!CIOrsqmb1- zP=)|X{Si^4IOQ^w98?~BzrM#D-3FMGtsqSRoYv(xh-dr5=w{|Pe%*lD} zJJ*dCFb5u4L7`2eg+!$YW!vi@&~MyV2r2-H5x`GbSy__OF*_>!d_zX_ShHlrDp+8W z(Jb5$d9c$PW@TY<59}RSUZ55==v5SGg=K{*o`4bv+0f9CfPerv1fYyS5-|fcj3d|4 zPoM0?vy<3mZ$htUYJ$AV`d$ic4WK-K>!2%4Y-|T@G@;4a*(?+fRskh-b!l{?G<8k~ z-QQ)02?~0;xygj=`g?hK%@mItDT zoc2LM(nJA6m(;YhTGt^gpemr;Tfr`5=4k^Cfvuj1$I*pxm^wK*%~1JcV5)_B0wb19 z5*^ILAlL*cnvm7&?d96u0smVH>TEdK-_;$^gEml3P#a;0SHYK;Wd91YGzg7vYus<& z=ECcze~ZIxY;Ine8mXnvz$2}#bp~0opq&4?=)iM`r4r-TkPiG|KhPTE`T2R<(x$$j z-^{BeiG|aUKC$22*Z(@{b^0T!ufB&xqXG6w`$9W|Hl=mbue!4Hn6kxjj`dHE)IdrU z3Mz$B^sdLsD8QA_4vDk$D*ZM_W4iPYW?vZ^0shIGcfnes=hV4VZ>syS@L{J0-L`p!KbOZqrsnSItfb=3o2_U`qvMGvybcg~bNbfBeX#yKj z1B4DrCn6<4C_?B(zJ+_AbI*6iKHqo7x&Pg9-!U>6;|*EKT5GO3pXWE<7+t9P#q-SP zNk~X8YTQ-1PeSs`OYjmUKLhTZW%wQr{!qBzHT5DPq55$8`XybEiiL!PokT-L(ZK)J z>QtB(3;y`rcl^->=g1prN*@v<=x(6SF8FG;UwwekyLhRBi8In?wKTpOJy>dcp%f)y zmgQ@zHtrppQmH5CqDlVx`Xgbp1?>kzLJuAD-sDGBC&WM3_6fJ|}~$bcIsN^1Ae5QRD%(V6poiz+}_P>`1fWjD2R$C zwP^fW;I2Yew^)N=3z~Uyg`7iSzf&$&Xz^Rcq*a^KRw$zNV(8<4^@G zia(ogk!0FTNsJ=m^^vH&{F=A4xVZQg1_mfnmWic0c|$_GvGwT$rIui|3$K3%*P>FMb; zwR~pg=5cXxt>2%B1RoQu!Uz?01_;(g@`R4BUqbd~qVw|dWc=2G=aSXagirP`3dq1^ z{<6>GINZr{SyicwTt9VTNlB-(WSQJWlHbhRh{0}dBGYDP{`GDO(VxF`y0s&dlNO?k z+^1Vz+|baFD1UHwp9$>rc&*e&^3!d{7t(W`z6%FSmUaI*JBSYD1w1~zir*~)1cQso z^*{d4<_SGl6r+4Y2QSI*r6{FXehND<;Tje-5|VOB!Tgtev0dj*p7+=Z^6_c>mCUSe_Opp<Kc)->VIUR>}@KqK%A#=57G}VXqn&2SnEHs|JA8d5nd1lbnmTQ} zuvlzoXAFxiN~p=Ak}y(5l+{sOrEGuMWA_4kQ$m8?&mH_^OG_kfy=XSi=BbSkL)^qF z8yj1KO#QoelMWJ4Ev;v{FP}CPFt>|lWMr@ez$+}|2gD;oeQ)| z_6n$?^U&zetG+ChPj_))Cwm*S;dg$cNl8!NUd&5uoN`s9nGV1sdV8VL@cRuhJ$6KY zSsx#tb5xL*+1ZIMVVj-2Wu>JLsZVxWPgW=DbmA!r`%}<_{Pi1w4qKkX%RcuaoOjoz zqLPjecd@8@sT#5Ab^eYo}eRj2IH2Q30o3T~M&C7JUdR|_{FBRro z$X#I5BYKfYWb4WCdYAISkC!jX9#Dr^JwH&Zx>I4vdr|?@(9lp-RW&vq866$n z+p8ZTRFsyYOoWWed_XWYH#gJK(Vgt~g-r(&dxF*)c$b2VA4o9Ec`x?YJi^HDXM1{i z6%`gPDC~4LU2~fH`P<|4aEtTBqlCG0rlO3pfm@5Cqc1mgX-M_xRrM@t?cxUHfb#xNhro9&{)*D?U z^w1+E7qN|vjTc!YWj8+1MbSjs#N;VB8bJ~?Q}T0ia(1VK+`PTtl$WoZQ`igdv|V0V zF$l8cFRE)Hyd6;aY*{4QQCe1JZf2HnRYCsdO;z$_?xoa6i}e&roObs1)U49^N5R|6 zpC>0L7Zw)Q*4D0_xaGu5A5>1L(HRCIN{Jn@ad8vltbAw*v`Ht}NOHt3I2N-OiGN_+%enUug(c z(a@5&^s28678My8sjaQ;H|e1cgTX>Vj`xZ9)RtXCLi6r)S#hz0tLt?>zT(Qt>9;Nu z6K<{A8#u4$f1k@yUx$F8prC*NIfr@zB*q28#^&ngcGBY(N(52=;|Q;Cg>>daL3S9je?lUgG#&_-F9G)#Lb%-JqueaLUOjI zJNv;`L@X@=UUu3#Iy>jDMDb{(9DwcT-4MpixDStvu*84b>K2ew(UbLB&=O^|2rw}< zHPzPcNx@Y;e!)&&q?4Txl!7VL&a$|E1!l!Wl*LUb^s31)(@X{{ICl(q zx3QBbi}8^7d_DFdAN@VX}`op*F_sGeB$wzwyNMd8*J{MIJt=H|M%DvX>!?6|m8e0D5&?fcY* zRI%Q3zU#?_E3T9EHJjET)_j|8xlX=JPF7T3O}=YuZEfxDE=qsCLbkrTy1KB??)YGv zCp9Kv{B{C?Kwx2FiU|twc>MUWi;Ih%-X+!%fg6-`RME|rRegBz09mB9sFa+XwxT`- zhg#mi!$*c$0 zNBaA9C)+@b1Ox&X?d#^IXWoF+jT?%XToKB4a4G|3*|PiW z&quf0)n-K4*DBGgCd|^B9z@W*M+vctV9zVk_#<`Z*7e~qI4oX`ixrJUbraw5#m1y@ zk)OeMctcW>5=ScTiKcNSlVdzekoU(sQ17a%UzeN1l3*DL_Fh`w=3nomL3t4JhPNdy zLv@=_)w$#1zmV*e|3?98c`u@S#(iZRP52N)$E$-3KH9)|d3ruP>9nhL8AHu~pJ@jQ z^>UNtMR?hOBU*m%Yh*O_)wSj2uI_FFr$BzR#cJT<;lseiZBK(GH2>vR@4qfPgOii* zdmM2-ww=4mUEiPdR>-)C?V#l)TVOK;9f&yM zLZzgn#Ky)}R#w*3)NE{cRE?M$8p3K!$T zu~sHBg3i z-Q4=RyN{-KTZ(q_*{}6G8Rq}3UPwzz7Zw)Yue+ixn$;7Pbj8x&#@*fB*?Fblg=Hh5 zvZ>fql8xc?3rg7quU~g{a*_$!akjFuiuKLm=wiM4@M@+CXYw6(YqXgmf>R}0P2jvQD{#?;I<<-t!Zm$^Jc%T*x0IX=9>MlHx|(XDJM3qW6nmsT!fXC z=LpUB#9%21^q}PpCvD8ps$1A$uV0I}f`Wpa+|=l(l$2C)ncMvKugylPn~~)x6e>42 zg2r>MBYE`G%*@Qr&QAWirZN;E4U=F7g^Zj7%zRC->Rs;6b9Tdi!q%hA%*?bz-VzQh zst@1fzwxcBU5iKm(WAW1v=k?nVNQ+vr)$pLGA{*5I5-H*8+eH{Er{leweNieo(t41qy9zCQ|_k?a3`iz5y{6n*Y zrLwJQf?8h8#s(QAjMk)CcpwMt@JT#R|cHNZi^MGih z<8m3#KcS`Ihr{v)__RHE$d%Y>*rP-xvnpP{X6NEkUgf_Q&8;!x?r&$uliZXGzVj%*8H`6rNC+1f zmq(Sz_5bn}X4jtD07XAS*xnE3NyN}mk`)yd@jD1`d~lF36N00iMm}8>L*l`gtgHy# zB>cknLK#0d_u-Pt;cjbXL0v~-nV=H=m8G}(G$^AapwB4(DjuLW$4v!woaXQOAi9Uc~(npQMQCh&q; zm?;POnLc97QAii68&y8wke}yk3J*YDQN5AuNvil&Dj`9cc5|cAkm9K)H|>nn_0RhE zSWMwy)@eRvlqjL04d(=ncaUM^U}yeNkwA1IPzA;eMg~CuIb>h{w*kUGdJFM_Z!e@F z317Y#)lImFGERq`9M57B&z%Xs{8s;yT`eerK)?Qaj;gz_Pmo0iA?-6Hs*%DLx;OKt z?>ZV@{(v{ccrkwft5-I{Pl1|h@}pDQS;vWBH+vB>ek-FM-@mq9emj)k&=5fQQjvW3 z!;HJo^pDX;iNc|K{mRs1&TqG%!t?M`gOE6&oM-&ns4Dg33o1W9KQ}kGtjx*T**Q3P zlCW)LXlN<~pMT36a%MSJEiamiRoZuDRC@w{B}RqQ4;QkVA#QJwVY4h`+5|md%ZpYM zQU7SktI!eA_H`gn9rNi^T66^avs}K|Z=MsW^1t{5G*2fdC#Pear{4tt-I;t%4h`!Z z_Zi&1HZcB&k!VFzl0_aLAJ;@@-EwR3UP__0)pXT4AT_%E)MlAL!1>Q!MDwQbG_E#H zGoOlH$5wQCS=mIjjk1o8PQ=9a*UF|fPicf(^EP~(PA~kY#=)r@j!NI|S zfg3k(rg!)vMo}>AsootLT%s5>$N5Y+KaU$*`D@gtBWAm^?U2%5G{(6qEP14F~+ z{e>(?9qy^EFMd;!nZ?8ZEZ8|GwjW{P!r)LCS6LbcaXv0+Zz0qUs5ArT)gD?qR{lzJ zaBPf8Ci@wF-$9~rZpU5f)zlumqvE`vNu@&8X*}`(bxapjc3~SN)&1z5) zGBcSY!%NGapH-9!Iq;sG*m50z(>d=6JmU?3XSB&6k6n^#ESBWzG4*Qxak(m?gDZvZ_88|sd_gP_+_1%;Y9*{nwhk9&o2dbP~ z*Ub5F9ktn zWPqUcI0qyoNYVOUiK_EPhPAb|9#$EYWXez|6a?f=L8%Q{gFdcWiBWbDq0Coa<~@sPiNfzaiZ3wHg@O`|Drl z=R4H)a)pmjQ!sRF)nw&h+#W=}cF;;FaqZ z^&YdIx*`$KqKVb%dXGnHYGkZvb_HeJ3qn_u6*e-HK?q|hua9%)CsRAp6_ zo2@PP+V;nSf&wriu>IZ^WgkSfq#!$i&GOlOa~uBPjBag7oYlS-#Tc&^_Yvj0I$p2% ziTG|}6^TF;*vXO1doI3u^{QTx2aCeaH-;Wd_Yr@VjWK861`B0nWw4Ym7;vcj$Dz^; zAvTPk9@f-PtpWK^9|>qtyxQ!C52UPdEuxgE85v6({=xFu{17T2_|7AH&g;?NPSCVn zx}ZdkMR~sy5(G&&Kt8!u#}sY~zsVf$J$xN2)*+iZUVuEa!m(*O&ZyABj!cqxW06T_kqEDzk!tEYS;VN{|@*qG&s5+-99ir zzU;?WzmZ_E^8WomBbI(q(Pu-O7#E;{{?9hXyn@(R=Mr$Hz-ivlm zHwOX9t*;}84mKrQv2j~ zEnu*MP{$Ds+#~Nn!nKm0c;;WQAFzF=U;r?o&t=9SU%#_lNBB)Y7Au%b(pCMtUN?VN zQ(o@elX-J$Y6^rZ08C+4L91vHAiM2qO)E4CJN`g8(o5SZe?vHlY;w|)l7+JLq>2Cr z(Sxx827aW;Cg5anzqaMU^AWyQdz@{-S8K}@gj-ulTEfW`sabu#6L`>e4V zNRSDvxL2hgG;C~aTxZk%lo#pG`4%?S=ySNUT5BRSJ3Gq@eRX$f+L&4+h3cyOwAdsv#V~;H;^KhljcO#8|EU z;lTle8$RF%fUYk@tbVj#{h@1auDKE25|<8#yN*`pG&LPYQp@j+wEoxzG~9Iz_0hV2 zKqL5I>5pk`o>cu`*yvF}z@?~oA90#Wsl(poI zlx|7yE80nB`K?cDlP|5TcmuC+N{q%=cRD*Yp4yn1nccg0?@Q%_iT-|f0O1h9n+~3`(bI!G_V7;Lfi)yv3^rD zwR3oM^zK;n%|9#HH}n5@1?!T3LrXfdwKU}6Hq`WZi01`Xb?h(@i4O`2Dski`S)}{V z#2eoQXMLWwTwNJ$Z*!1qq8LvFecZxL75Kb^L}tgaF3gnbiBea*gb9sxA~YXSq!6mEH1o%vsf@juF8Xoe=;h9o>_@=-QQ?O_6xz#+IYmdHjR^ur19#|XT|4&HdCYU~yG_v$)5J>zVhS{#1_m}Zu_9r! zEI3_{z>-?qnYe+eT}HVr=}L*+@w6>mebBC}QU@qlFw^Mu$A-3@FuG&BUZSdv{_95g_-fne&KT3@~tuLe-O zHz<}LS-_xWWo2O}hd9t{IL#$Jw{VjvSe%)-R`RtAi8(Ex&9b=NWw7Lv5-G$;$tD-* z?d+@-z(*dz7aR8?FZgTtIUXJ!kYip>9#^tiR{7c5&K1T3ofk#ZimQ@^u(ApZ3W@`n zjINyfNh$gGj(v#C}NRxUR+wzV`Gm0qz*oi7t@`vh749D?`6TvO@pKh~v(ELoYE z&(&r(W-$~TWRc-Co8RI@XqDc&;gGSn%O&Nr*D(q|JX~Erc^>p9OGbr`a1H zX_35rTVrf_2|Hke8*ob5Idy~(DhyICNKIWGbf2%dg?)?ReW(z&=9L|^QiGv_NYPM5 zr^<&LYQpEo#!R2utbyJHXwvAcF6GC_A0}89HH>IbiJiJA^)G*OQSMT~tK;a=YT)4z zG=O!p?)sKWboTaI*4k+Ub?WQ81G?|V=%Q4fgB6)T#DXR7?Z4_}=&U8YaTuw509FT7 z;7|Y~9U7b2gJ}a1c3S%Sseq^jF?VvGa;~@_=D43t3W<#SoBTOu+#1X4>xl?V9VEJ4 z&&oU7Ko7Y!a}uu(rD%g_E+*D(rbQsS&}ZE4Hm+C{_Ow& literal 0 HcmV?d00001 diff --git a/kivy_garden/flower/__init__.py b/kivy_garden/flower/__init__.py deleted file mode 100644 index 2edf377..0000000 --- a/kivy_garden/flower/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Demo flower -============ - -Defines the Kivy garden :class:`FlowerLabel` class which is the widget provided -by the demo flower. -""" - -from kivy.uix.label import Label - -__all__ = ('FlowerLabel', ) - -from ._version import __version__ - - -class FlowerLabel(Label): - """A :class:`~kivy.uix.label.Label` based class that shows - The text `"Demo flower"`. - """ - - def __init__(self, **kwargs): - super(FlowerLabel, self).__init__(**kwargs, text='Demo flower') diff --git a/kivy_garden/flower/_version.py b/kivy_garden/flower/_version.py deleted file mode 100644 index e9856f7..0000000 --- a/kivy_garden/flower/_version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = '0.1.1.dev0' diff --git a/kivy_garden/flower/tests/test_import.py b/kivy_garden/flower/tests/test_import.py deleted file mode 100644 index 6b2a138..0000000 --- a/kivy_garden/flower/tests/test_import.py +++ /dev/null @@ -1,7 +0,0 @@ -import pytest - - -def test_flower(): - from kivy_garden.flower import FlowerLabel - label = FlowerLabel() - assert label.text == 'Demo flower' diff --git a/kivy_garden/splittergrid/__init__.py b/kivy_garden/splittergrid/__init__.py new file mode 100644 index 0000000..3bbb27e --- /dev/null +++ b/kivy_garden/splittergrid/__init__.py @@ -0,0 +1,377 @@ +""" +Demo flower +============ + +Defines the Kivy garden :class:`FlowerLabel` class which is the widget provided +by the demo flower. +""" + +from ._version import __version__ + +from kivy.core.window import Window +from kivy.uix.layout import Layout +from kivy.properties import ( + ListProperty, NumericProperty, OptionProperty, BooleanProperty +) + +from math import ceil + +__all__ = ['SplitterGrid'] + + +class SplitterGrid(Layout): + """A grid where you can manually resize rows and columns using + touch, supports all possible filling order (see `orientation`), and + constraining the number of cols or rows (the other will be + automatically computed). + """ + cols = NumericProperty(0) + ':attr:cols is a NumericProperty and allows setting the number of columns' + rows = NumericProperty(0) + ':attr:rows is a NumericProperty and allows setting the number of rows' + margin = NumericProperty(10) + ':attr:margin is a NumericProperty and allows setting the space between each column/row.' + + col_ratios = ListProperty() + ':attr:col_ratios is a ListProperty containing the current list of relative sizes in the order of columns' + row_ratios = ListProperty() + ':attr:row_ratios is a ListProperty containing the current list of relative sizes in the order of rows' + + min_col_width = NumericProperty(40) + ':attr:min_col_width is a NumericProperty and sets the minimum width of any column' + min_row_height = NumericProperty(40) + ':attr:min_row_height is a NumericProperty and sets the minimum height of any row' + + orientation = OptionProperty( + 'lr-tb', + options=[ + 'tb-lr', 'bt-lr', 'tb-rl', 'bt-rl', + 'lr-tb', 'lr-bt', 'rl-tb', 'rl-bt' + ] + ) + ':attr:orientation is an OptionProperty and sets the filling order of the grid.' + + override_cursor = BooleanProperty(True) + + __events__ = ('on_resize_start', 'on_resize_complete') + + def __init__(self, **kwargs): + super(SplitterGrid, self).__init__(**kwargs) + self._resize_count = 0 + self.bind( + pos=self.do_layout, + size=self.do_layout, + cols=self.do_layout, + rows=self.do_layout, + col_ratios=self.do_layout, + row_ratios=self.do_layout, + orientation=self.do_layout, + ) + self.bind( + cols=self.on_children, + rows=self.on_children, + ) + + Window.bind(mouse_pos=self.update_cursor) + + def get_rows_cols(self, *args): + if self.cols: + cols = float(self.cols) + rows = ceil(len(self.children) / cols) + + elif self.rows: + rows = float(self.rows) + cols = ceil(len(self.children) / rows) + + else: + return 0, 0 + + return rows, cols + + def update_cursor(self, win, pos): + if not self.override_cursor: + return + + if self._resize_count > 0: + return + + col_row = self.match_col_row(self.to_widget(*pos)) + col = 'col' in col_row + row = 'row' in col_row + + cursor = ( + 'size_all' + if col and row else + 'size_ns' + if row else + 'size_we' + if col else + 'arrow' + ) + Window.set_system_cursor(cursor) + + def on_children(self, *args): + rows, cols = self.get_rows_cols() + + while rows > len(self.row_ratios): + self.row_ratios.append(1) + while rows < len(self.row_ratios): + self.row_ratios.pop() + + while cols > len(self.col_ratios): + self.col_ratios.append(1) + while cols < len(self.col_ratios): + self.col_ratios.pop() + + def on_touch_down(self, touch): + if super(SplitterGrid, self).on_touch_down(touch): + return True + + result = self.match_col_row(touch.pos) + if result: + touch.ud['{}_col'.format(id(self))] = result.get('col') + touch.ud['{}_row'.format(id(self))] = result.get('row') + touch.grab(self) + self.dispatch('on_resize_start', touch) + return result + + def match_col_row(self, pos): + result = {} + if self.collide_point(*pos): + rows, cols = self.get_rows_cols() + margin = self.margin + width = self.internal_width + height = self.internal_height + + x, y = self.pos + + sum_col_ratios = sum(self.col_ratios) + sum_row_ratios = sum(self.row_ratios) + + col_ratios = self.col_ratios + for i, col in enumerate(col_ratios): + x += width * col / sum_col_ratios + if x < pos[0] < x + margin: + result['col'] = i + break + x += margin + + row_ratios = self.row_ratios + for i, row in enumerate(row_ratios): + y += height * row / sum_row_ratios + if y < pos[1] < y + margin: + result['row'] = i + break + y += margin + return result + + def on_touch_move(self, touch): + if touch.grab_current is not self: + return super(SplitterGrid, self).on_touch_move(touch) + + col = touch.ud.get('{}_col'.format(id(self))) + row = touch.ud.get('{}_row'.format(id(self))) + width = self.internal_width + height = self.internal_height + + min_col_width = self.min_col_width + min_row_height = self.min_row_height + + orientation = self.orientation.split('-') + + col_ratios = self.col_ratios + row_ratios = self.row_ratios + + sum_col_ratios = sum(col_ratios) + sum_row_ratios = sum(row_ratios) + + result = False + + if col is not None: + dx = touch.dx + col_pos = ( + self.x + + self.margin * col + + sum( + (width * c / sum_col_ratios) + for c in col_ratios[:col + 1] + ) + ) + + if (dx < 0 and touch.x < col_pos) or (dx > 0 and touch.x > col_pos): + + width_1 = width * (col_ratios[col] / sum_col_ratios) + dx + width_2 = width * (col_ratios[col + 1] / sum_col_ratios) - dx + + total_width = width_1 + width_2 + width_1 = max(min_col_width, width_1) + width_2 = total_width - width_1 + + width_2 = max(min_col_width, width_2) + width_1 = total_width - width_2 + + # assume the sum of ratios didn't change + col_ratios[col] = sum_col_ratios * width_1 / width + col_ratios[col + 1] = sum_col_ratios * width_2 / width + self.col_ratios = col_ratios + + result = True + + if row is not None: + dy = touch.dy + row_pos = self.y + self.margin * row + sum((height * r / sum_row_ratios) for r in row_ratios[:row + 1]) + if (dy < 0 and touch.y < row_pos) or (dy > 0 and touch.y > row_pos): + height_1 = height * (row_ratios[row] / sum_row_ratios) + dy + height_2 = height * (row_ratios[row + 1] / sum_row_ratios) - dy + + total_height = height_1 + height_2 + height_1 = max(min_row_height, height_1) + height_2 = total_height - height_1 + + height_2 = max(min_row_height, height_2) + height_1 = total_height - height_2 + + # assume the sum of ratios didn't change + row_ratios[row] = sum_row_ratios * height_1 / height + row_ratios[row + 1] = sum_row_ratios * height_2 / height + self.row_ratios = row_ratios + result = True + + if result: + return True + + return super(SplitterGrid, self).on_touch_move(touch) + + def on_touch_up(self, touch): + if touch.grab_current is not self: + return super(SplitterGrid, self).on_touch_up(touch) + + col = touch.ud.get('{}_col'.format(id(self))) + row = touch.ud.get('{}_row'.format(id(self))) + if col is not None or row is not None: + touch.ungrab(self) + self.dispatch('on_resize_complete', touch) + return True + return super(SplitterGrid, self).on_touch_up(touch) + + @property + def internal_width(self): + rows, cols = self.get_rows_cols() + sum_cols = sum(self.col_ratios) + sum_margins_cols = self.margin * (cols - 1) + return self.width - sum_margins_cols + + @property + def internal_height(self): + rows, cols = self.get_rows_cols() + sum_rows = sum(self.row_ratios) + sum_margins_rows = self.margin * (rows - 1) + return self.height - sum_margins_rows + + def do_layout(self, *args): + if not (self.cols or self.rows) or not (self.row_ratios and self.col_ratios): + return + + i = 0 + children = self.children[::-1] + + sum_col_ratios = sum(self.col_ratios) + sum_row_ratios = sum(self.row_ratios) + + y = self.y + width = self.internal_width + height = self.internal_height + + margin = self.margin + + orientation = self.orientation.split('-') + if 'tb' in orientation: + row_ratios = self.row_ratios[::-1] + else: + row_ratios = self.row_ratios + + if 'rl' in orientation: + col_ratios = self.col_ratios[::-1] + else: + col_ratios = self.col_ratios + + if orientation[0] in ('bt', 'tb'): + ratios_d1 = col_ratios + ratios_d2 = row_ratios + d1, d2 = 'yx' + + elif orientation[0] in ('lr', 'rl'): + ratios_d1 = row_ratios + ratios_d2 = col_ratios + d1, d2 = 'xy' + + initial_pos = { + 'x': self.x if 'lr' in orientation else self.right, + 'y': self.y if 'bt' in orientation else self.top + } + pos = {k: v for k, v in initial_pos.items()} + for r1 in ratios_d1: + pos[d1] = initial_pos[d1] + if not ratios_d2: + continue + for r2 in ratios_d2: + w = children[i] + i += 1 + w.width = width * (r2 if d1 == 'x' else r1) / sum_col_ratios + w.height = height * (r1 if d1 == 'x' else r2) / sum_row_ratios + w.pos = ( + pos['x'] - (w.width if 'rl' in orientation else 0), + pos['y'] - (w.height if 'tb' in orientation else 0) + ) + pos[d1] += ( + (margin + w.width) * (-1 if 'rl' in orientation else 1) + if d1 == 'x' else + (margin + w.height) * (-1 if 'tb' in orientation else 1) + ) + if i >= len(children): + return + pos[d2] += ( + (margin + w.height) * (-1 if 'tb' in orientation else 1) + if d2 == 'y' else + (margin + w.width) * (-1 if 'rl' in orientation else 1) + ) + + def on_resize_start(self, touch): + self._resize_count += 1 + + def on_resize_complete(self, touch): + self._resize_count -= 1 + + +EXAMPLE = ''' +BoxLayout: + orientation: 'vertical' + BoxLayout: + size_hint_y: None + height: dp(48) + Spinner: + id: spinner + text: 'lr-tb' + values: + [ + 'tb-lr', 'bt-lr', 'tb-rl', 'bt-rl', + 'lr-tb', 'lr-bt', 'rl-tb', 'rl-bt' + ] + + SplitterGrid: + id: grid + cols: 5 + orientation: spinner.text or 'lr-tb' +''' + + +if __name__ == '__main__': + from kivy.base import runTouchApp + from kivy.factory import Factory as F + from kivy.lang import Builder + + root = Builder.load_string(EXAMPLE) + for i in range(25): + root.ids.grid.add_widget(F.Button(text=f'{i}')) + + runTouchApp(root) diff --git a/kivy_garden/splittergrid/_version.py b/kivy_garden/splittergrid/_version.py new file mode 100644 index 0000000..7e49527 --- /dev/null +++ b/kivy_garden/splittergrid/_version.py @@ -0,0 +1 @@ +__version__ = '1.0' diff --git a/kivy_garden/splittergrid/tests/test_import.py b/kivy_garden/splittergrid/tests/test_import.py new file mode 100644 index 0000000..351c50c --- /dev/null +++ b/kivy_garden/splittergrid/tests/test_import.py @@ -0,0 +1,8 @@ +import pytest + + +def test_flower(): + from kivy_garden.splittergrid import SplitterGrid + grid = SplitterGrid(cols=5) + assert grid.cols = 5 + assert grid.orientation ='lr-tb'