pax_global_header00006660000000000000000000000064130605664450014523gustar00rootroot0000000000000052 comment=0544e1352d59c24230bb95bd6ba151823c0dde8e d3-brush-1.0.4/000077500000000000000000000000001306056644500131545ustar00rootroot00000000000000d3-brush-1.0.4/.eslintrc000066400000000000000000000001411306056644500147740ustar00rootroot00000000000000parserOptions: sourceType: module env: browser: true extends: "eslint:recommended" d3-brush-1.0.4/.gitignore000066400000000000000000000001001306056644500151330ustar00rootroot00000000000000*.sublime-workspace .DS_Store build/ node_modules npm-debug.log d3-brush-1.0.4/.npmignore000066400000000000000000000000361306056644500151520ustar00rootroot00000000000000*.sublime-* build/*.zip test/ d3-brush-1.0.4/LICENSE000066400000000000000000000027031306056644500141630ustar00rootroot00000000000000Copyright 2010-2016 Mike Bostock All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. d3-brush-1.0.4/README.md000066400000000000000000000317351306056644500144440ustar00rootroot00000000000000# d3-brush Brushing is the interactive specification a one- or two-dimensional selected region using a pointing gesture, such as by clicking and dragging the mouse. Brushing is often used to select discrete elements, such as dots in a scatterplot or files on a desktop. It can also be used to zoom-in to a region of interest, or to select continuous regions for [cross-filtering data](http://square.github.io/crossfilter/) or live histograms: [Mona Lisa Histogram](http://bl.ocks.org/mbostock/0d20834e3d5a46138752f86b9b79727e) The d3-brush module implements brushing for mouse and touch events using [SVG](https://www.w3.org/TR/SVG/). Click and drag on the brush selection to translate the selection. Click and drag on one of the selection handles to move the corresponding edge (or edges) of the selection. Click and drag on the invisible overlay to define a new brush selection, or click anywhere within the brushable region while holding down the META (⌘) key. Holding down the ALT (⌥) key while moving the brush causes it to reposition around its center, while holding down SPACE locks the current brush size, allowing only translation. Brushes also support programmatic control. For example, you can listen to [*end* events](#brush-events), and then initiate a transition with [*brush*.move](#brush_move) to snap the brush selection to semantic boundaries: [Brush Snapping](http://bl.ocks.org/mbostock/6232537) ## Installing If you use NPM, `npm install d3-brush`. Otherwise, download the [latest release](https://github.com/d3/d3-brush/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-brush.v1.min.js) or as part of [D3 4.0](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: ```html ``` [Try d3-brush in your browser.](https://tonicdev.com/npm/d3-brush) ## API Reference # d3.brush() [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L131 "Source") Creates a new two-dimensional brush. # d3.brushX() [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L123 "Source") Creates a new one-dimensional brush along the *x*-dimension. # d3.brushY() [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L127 "Source") Creates a new one-dimensional brush along the *y*-dimension. # brush(group) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L142 "Source") Applies the brush to the specified *group*, which must be a [selection](https://github.com/d3/d3-selection) of SVG [G elements](https://www.w3.org/TR/SVG/struct.html#Groups). This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call). For example, to render a brush: ```js svg.append("g") .attr("class", "brush") .call(d3.brush().on("brush", brushed)); ``` Internally, the brush uses [*selection*.on](https://github.com/d3/d3-selection#selection_on) to bind the necessary event listeners for dragging. The listeners use the name `.brush`, so you can subsequently unbind the brush event listeners as follows: ```js group.on(".brush", null); ``` The brush also creates the SVG elements necessary to display the brush selection and to receive input events for interaction. You can add, remove or modify these elements as desired to change the brush appearance; you can also apply stylesheets to modify the brush appearance. The structure of a two-dimensional brush is as follows: ```html ``` The overlay rect covers the brushable area defined by [*brush*.extent](#brush_extent). The selection rect covers the area defined by the current [brush selection](#brushSelection). The handle rects cover the edges and corners of the brush selection, allowing the corresponding value in the brush selection to be modified interactively. To modify the brush selection programmatically, use [*brush*.move](#brush_move). # brush.move(group, selection) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L189 "Source") Sets the active *selection* of the brush on the specified *group*, which must be a [selection](https://github.com/d3/d3-selection) or a [transition](https://github.com/d3/d3-transition) of SVG [G elements](https://www.w3.org/TR/SVG/struct.html#Groups). The *selection* must be defined as an array of numbers, or null to clear the brush selection. For a [two-dimensional brush](#brush), it must be defined as [[*x0*, *y0*], [*x1*, *y1*]], where *x0* is the minimum *x*-value, *y0* is the minimum *y*-value, *x1* is the maximum *x*-value, and *y1* is the maximum *y*-value. For an [*x*-brush](#brushX), it must be defined as [*x0*, *x1*]; for a [*y*-brush](#brushY), it must be defined as [*y0*, *y1*]. The selection may also be specified as a function which returns such an array; if a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. The returned array defines the brush selection for that element. # brush.extent([extent]) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L521 "Source") If *extent* is specified, sets the brushable extent to the specified array of points [[*x0*, *y0*], [*x1*, *y1*]], where [*x0*, *y0*] is the top-left corner and [*x1*, *y1*] is the bottom-right corner, and returns this brush. The *extent* may also be specified as a function which returns such an array; if a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. If *extent* is not specified, returns the current extent accessor, which defaults to: ```js function extent() { var svg = this.ownerSVGElement || this; return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; } ``` This default implementation requires that the owner SVG element have defined [width](https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute) and [height](https://www.w3.org/TR/SVG/struct.html#SVGElementHeightAttribute) attributes rather than (for example) relying on CSS properties or the viewBox attribute; SVG provides no programmatic method for retrieving the [initial viewport size](https://www.w3.org/TR/SVG/coords.html#ViewportSpace). Alternatively, consider using [*element*.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). (In Firefox, [*element*.clientWidth](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth) and [*element*.clientHeight](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight) is zero for SVG elements!) The brush extent determines the size of the invisible overlay and also constrains the brush selection; the brush selection cannot go outside the brush extent. # brush.filter([filter]) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L525 "Source") If *filter* is specified, sets the filter to the specified function and returns the brush. If *filter* is not specified, returns the current filter, which defaults to: ```js function filter() { return !event.button; } ``` If the filter returns falsey, the initiating event is ignored and no brush gesture is started. Thus, the filter determines which input events are ignored. The default filter ignores mousedown events on secondary buttons, since those buttons are typically intended for other purposes, such as the context menu. # brush.handleSize([size]) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L529 "Source") If *size* is specified, sets the size of the brush handles to the specified number and returns the brush. If *size* is not specified, returns the current handle size, which defaults to six. This method must be called before [applying the brush](#_brush) to a selection; changing the handle size does not affect brushes that were previously rendered. # brush.on(typenames, [listener]) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L533 "Source") If *listener* is specified, sets the event *listener* for the specified *typenames* and returns the brush. If an event listener was already registered for the same type and name, the existing listener is removed before the new listener is added. If *listener* is null, removes the current event listeners for the specified *typenames*, if any. If *listener* is not specified, returns the first currently-assigned listener matching the specified *typenames*, if any. When a specified event is dispatched, each *listener* will be invoked with the same context and arguments as [*selection*.on](https://github.com/d3/d3-selection#selection_on) listeners: the current datum `d` and index `i`, with the `this` context as the current DOM element. The *typenames* is a string containing one or more *typename* separated by whitespace. Each *typename* is a *type*, optionally followed by a period (`.`) and a *name*, such as `brush.foo` and `brush.bar`; the name allows multiple listeners to be registered for the same *type*. The *type* must be one of the following: * `start` - at the start of a brush gesture, such as on mousedown. * `brush` - when the brush moves, such as on mousemove. * `end` - at the end of a brush gesture, such as on mouseup. See [*dispatch*.on](https://github.com/d3/d3-dispatch#dispatch_on) and [Brush Events](#brush-events) for more. # d3.brushSelection(node) [<>](https://github.com/d3/d3-brush/blob/master/src/brush.js#L118 "Source") Returns the current brush selection for the specified *node*. Internally, an element’s brush state is stored as *element*.\_\_brush; however, you should use this method rather than accessing it directly. If the given *node* has no selection, returns null. Otherwise, the *selection* is defined as an array of numbers. For a [two-dimensional brush](#brush), it is [[*x0*, *y0*], [*x1*, *y1*]], where *x0* is the minimum *x*-value, *y0* is the minimum *y*-value, *x1* is the maximum *x*-value, and *y1* is the maximum *y*-value. For an [*x*-brush](#brushX), it is [*x0*, *x1*]; for a [*y*-brush](#brushY), it is [*y0*, *y1*]. ### Brush Events When a [brush event listener](#brush_on) is invoked, [d3.event](https://github.com/d3/d3-selection#event) is set to the current brush event. The *event* object exposes several fields: * `target` - the associated [brush behavior](#brush). * `type` - the string “start”, “brush” or “end”; see [*brush*.on](#brush_on). * `selection` - the current [brush selection](#brushSelection). * `sourceEvent` - the underlying input event, such as mousemove or touchmove. d3-brush-1.0.4/d3-brush.sublime-project000066400000000000000000000002711306056644500176310ustar00rootroot00000000000000{ "folders": [ { "path": ".", "file_exclude_patterns": [ "*.sublime-workspace" ], "folder_exclude_patterns": [ "build" ] } ] } d3-brush-1.0.4/img/000077500000000000000000000000001306056644500137305ustar00rootroot00000000000000d3-brush-1.0.4/img/mona-lisa.jpg000066400000000000000000003434601306056644500163240ustar00rootroot00000000000000JFIFHH ICC_PROFILE applmntrRGB XYZ 8acspAPPLAPPL-appldescPbdscmcprtd#wtptrXYZgXYZbXYZrTRC aarg vcgt 0ndin 4>chad t,mmod (bTRC gTRC aabg aagg descDisplaymluc" hrHRkoKRnbNOidhuHUcsCZdaDKukUAaritITroROnlNLheILesESfiFIzhTWviVNskSKzhCNruRUfrFRmscaESthTHesXLdeDEenUSptBRplPLelGRsvSEtrTRjaJPptPTiMactextCopyright Apple Inc., 2016XYZ XYZ q9gXYZ a#XYZ # curv #(-26;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Kmparaff Y vcgtndin6@UL% PT@333333sf32 rrqmmod~C  !"$"$C"h "!2B1R#AQbra3q$W7Cu%456UstSV&Dd'ETvFce G !1"A2QaqBS#34Rrb$56cs&T ?=5WfZR4U}K2fWfZ_a+li)QU/c~z?3y?I@bN\[&&B\đjpJ m0 I qDDWZ$ݟQS*U B~(/ݠof6?f|v_svlizȝY ;{DD-J ֵ;vr. X6d(BYD;MWx\#©ѦvK}gq,]>~uoU{gpJp*TR@ *TR@ *TR@ *TR@ *TR@ *TR@ *TR@ *v_`{1x giƚ\5QFmĥ1TAqm%vs)=#jˈ]UeDdY gv'b.m|w}0?f.Yeh;t%"JG׋֋RkըzCR{#]yUKm]G{W'@[ w=KyS`au8yVϯ6Aq8B+1+«{]`XY_3}vn6Gsr +* ǝ<-\F֛3Vۛ$R%ojRaF~m;-6԰.GG֘u+-/O ZvEں dȋ8**qEqDv W)W1?1_E*UO'<ōkn.Z&_ab۠I dBQh[$~M.i3 @DCnɯ5jQ@}AMBǻ)6,MF\Ԟ 2___B9ɡyfa hPp\7-Q Q I%Sn)U]ƼO=|c=5R |'fJҥ9q9#d&dRc=5Vc~z? 2___K1kK+[J=?H/ɯ{/kԥ5O{%oGXߞ$|c=5R |'fJң,oO>FK1kK)>M3[kiQ7s#%5O{%o&dR9pd |'fJ___ZT|e2G>M3[/ɯ{/kԭm*>2#d&dRc=5Vc~z? 2___K1kK+[J=?H/ɯ{/kԥ5O{%oGXߞ$|c=5R |'fJң,oO>FK1kK)>M3[kiQ7s#%5O{%o&dR9pd |'fJ___ZT|e2G>M3[/ɯ{/kԭm*>2#d&dRc=5Vc~z? 2___K1kK+[J=?H/ɯ{/kԥ5O{%o8v3eٮ\n:v3ild.R4OCV=3UqԾTn-\c^ILB̉r{܇ Wm6پs]Mx:iQ<<.]$}c=5R |'fJy򚭊dH8mʢ/|3B^Zbx5wK fb6V&TE{3ܒuٿ]M_l?a{?5y$џ'gzYg9p*xj*IIV{:SRk{']gPû5h$n4%NR^Ȃ9wvaiԕ(ꩴMM sZe*pTb^ɷo~?N[m~$Uby#kl6)mfŐ"" `lUV\IQW&y"Sm;3K )e+gzU5r;y]/}S#qpo&?\ vQTgf6MeJ?P0h\ vl?݃(Tw?YoŸ/G@>Me/7aGң>-|??l?݃)}`>O[n a7a@F8d(+Wh%w-[FNw0Wm7/=&c66!/jiq5jʍ89J7M%}z]R:QR$ioZT]y`- .[Z\16ۛn,G%\:|c\{Zc>7p*2PRyU/SҬ؏>=#*Rq:}qK "ByTqCqY'JdTE^E3BxUݚҽݝ^q|k 'a{a[^a׭EZ&EP3ghyJ=b}'۝?8s<%t5^)%ͽI#_")Tkƫj-&iy;* O0my˖-ЍUSS'QQx4Ydoe|?yͼdݩp4"m<ܗ.9Y>%w]M,n]WOnj'kEזo+ztU_ڼp>ݙCaN8ei lZH+륆Pc<#p"o 퉨5@rd.h# ?rTk}>T^t'o{^ߢJf卶ݾv7Œq.,q`jKH)YL.s7v5|.av\',:T)#z͎M"\"i>!n-\/bt+W{@\]6ݘbϝj #'o'P`Y4DT^5]s*n[b=qV.j\Z)w$%+?%+}'NU,ޗ)lԫ[剧jU5.!D5.h=+]&Ļ`>pw'ctM$6A IE5AZU}kW5u[}:*ZXEupճ*|+ 9 fƗ]p+ 1G{+@Ed-828c.m_M4:U8XUwiѹY'{c;w-۸WIUCQ$Uo>T۫k7onlyLȈ""*ueB2vu#R I_c&T}d{CxvXjSì+ݷKyu^j _gQKBYb>m]]~pzM@huW1!"AL)]*~ p]:W{n~'`M BSNn+[${[mc@bDΛ8ᙙ)*f͛fݷnhYkƈ]ll_51PVEM4M4RJ\*TPJ*TPJ*TPJ*TPJ*TPJ*{;;Gw/#aj?}ĿB2>J~?bJ*TPJf{|-W={> | 0:$ ꁋ͚e+vbx?cگ-kqF5$k_߲Uj:9ɸIEy'ݽQRJgԅJ*TRJ*TRJ*TRJQ[an]q՛1tׁAC!g<8g\Gcqp]h8յVr*\F("su<5j6{DhZ9tz]NJc81.cz04pE$PT4D\ēX/^To\#_{U]/;G{svb͠[h*@._*{kbvpl{iv2.%&" BZ.dYpYSq>{&/toY+6^ HJwU4ҩU}bK]4ye=N63ږx*T鴛iIݫ8+`>Rl[q7緶qqE62pJ*&eu -};41՞"j h @̨b|:ͭ5t3p̈TTUU{caqN\YS՗M5Z>m,x'VJ9Ti;ҷb].7{6Ŷ)2(n}&DDݚgSx%[î.;ph4UCuUU}}iܜ(Ttt7);7{][mG[PfϭҽOڱbEb,;S!{$DDDDNmg_1l4޿1ŀ|ԚF"hNmJo6M/=}6VNMSmh)o{9m{Ib!;>ơOr[Hd" vUgYag[[7aUr:,TrOY}X%6&[e pk,AF ~Z [8E"DsTE\֏K)}}HԜSQm'_p _/M![,.Y䟑*LkgpprmQ EU3EL_buj;AxR%ͱN+QEALORlbƕ'][ommp7ba»^JZKScaip!{{]w\\\\BDHm""4( pOm'p5QU:5tLǀYn.o9v6%ndA6meUW>)cr6nLm(e5TxF>sQ˥ynKM-eGgٞqW<^I^WmrٻK=Jw[_L#+Yl%\l%\GޙV[Nv1ϴa\m͹!6bf؊R 0RkYc7\bkB8niF7}JV /هntjDq=H w5XN8n>rEm+rqo"!fҮIx*Ig^k&❆GuN+߽ڳ_k6c6,؟gݡaRx0#20텧d ;Vmq fs!DE^sWN2{eoA^QOYwwΑJ˟+CklA$$+{BD^TFS4iR1oU](*0o3(I$C8Y.9pgq1QK_z 85xdV68ڃCwqfW \ mˢ! @<׸Ͷ+^znZl[I5MUUY\_md<1{c }桇^:2sTLFm:wǬuzo[=6vf <p0TiOmE[+z_goRtplNY<׬4ᩚ#*Vv$=ݫ\BN>o*+d)h`agut5of9h"!e<4: 75mZ8H Er^)*wjjxW|m>vrɬm;7M&W/v?cqr]axEֆ<(8 +&|yu,ʕLOkĝ]_~-.B緿:؍#\LT*fS4U>nI.vg޺vn (x"%`bxQn}5]|x %5%GW+٧v]k[V;vs|7x6cb:d +`е%⨩iX [Phn,jዖ_aMt]D1!\9p~Q8qRnC}Gk{Uƪᔢʚk]w_6R;QWX}$V,:OZy2jBۊٖfyV:JMӳnVtץsykc I4E*ױ?1(oK /.j4J@jn&`)ׇdxV j]$W6 "s OJYQ\/f '}emK]q*'͖/wŵ֞ҩVKNkvKyH|ѱޚÞuײfdcp)DNτUNC+rqix_)\D|ZyRUݠp>Y?M@***|d!*Qm]J݋T&a%6\ڼ.y*BEJ.QRKo7ؾٵW?X-tx"@<}Yʻݼ,;9 `v#4 O+[+h"A^Oc;9i\N˫O;]虧1QW=_%wyǵ^W_n>t]:-Iq30l{gƵ}p>Y?M@***|쯄n~^XX1omъ ȇ,$ۮWq{3Y%m$aZRWtAUStU$Jջ AΒQ띻_el]m%OF)fRWh^OV;_m? {-ޭ[on"ru.4II EW9"ǼyB`psۼloEնPQ("ۈ&JRCû=tJ0njͻ= էIJ[ZMo{+6nKvs9 fjW"*7=:p[BJĭ0 :`%̄Ujc M*8f kJ*SHRfk޽ąU#5W&YU)_X]LF۵d^`f%cs[axga.7n$$;zs }R\S΄|7%GPlZ>Wbh46wCut`]0mynشyk^vŌ\<=+38"d to]ql./.]P%AEU\^IЩ p(2v}oHQb.+ l|6w{7RHR@ *T?1`XtnΓjh&**3E\k}6bl'EEF[E%rlvip;pEvFfpd?Pkof|F+wS-9)6I9$wk3TW?C *TR@ *TR| ཈n~mH0-\J&hUT\%|]N\^ׂ1U,<]/W{O_n'5oK)ywfڬƼy<:hqv}.姝Kn#(* Q%Q2Q+(P? ^^+8%i^ovRiL͹HI%Se-:{ Fn]Q3s\5xצ]wyv_3p^e_PZF?ow3Hw`|bgK{WƟaul.M$YUByY8a}ՕNZJҊn/;[/EaciYN[4'x.\eܱro ^>hڨ $!GDUETC,Uxw BTfݒW|+a~lN6mJWBɻ/n#8)wpOȕOs>[ܽl.fj"h9/^vöIټaA2wD4Tӎb扸ǏJ)4wٵo=2>p֝HR֦]󋋵v㶯$í* Qp 3Tx/UΏkWc1ȴŭxŦ'qt88晓r@܊+bݖ23_µ-kv:V3Wvף^In|]k91s+.VkNʴ b+xͻ}~ڛJ(Dk̫޴cqbjY 1jM6H^UTU\sf;.h^y0i%g<$(lp<.٢+Vm"G!RUEq~JlEKֆ)6Ҵ#{^1\MˣVHZ"B (fզ[;Gڦ{;p qzjl#. 6gHDR'^ GuF8BBD[hI[N}Ѩy JCu4sVwLtAnn m!-1pDOocLnD~ΥrF @qGlJDHb4},`%*o) J!(X_+; T"J#"DU%yj#˜Ebݻv-%UW$+^qCÑƫVYjIzc&B0RI{#e&,UVw:hN2qB%˂i/cx5hN 6j6h *UζBmd$E<5 [sdl86`mf$QQ{ҩwяDem~.\;%&TݮgsiU??f}8p==oSS89,eߝb/]9ًLe#%6*$ E[`x[v%qerw.lnpĕ2ݟCAI˥ktSoeb*µ[A.Y$otowg^Xg'ljtQ>'c(A&]V&4h+zFܛWkk%QƻHұ[a`ǛZjw*U}Y\kO`]v Ʈ  mm%l3AB(f+"cB&\Q/ En&\[69̷ vg18fp~i79(N0qsoo:d(KEE^<+\¯U/p|S wI\t5c E_U"vNHtKTf섦Rq[oD-bGqur 6bKjNgE`x]bo\ҲJ8DbH5ﮆ%3iƜpE)˔j>~i}_[d-ELI2Sڌu1|:;T$}UWoݑv®lVA o1UY\ݛM <ظ(]芙e,{{top-tM  g3}V ok`xM - *HDQ3GQϹW&_O_S<#ԫ,d(8}Jœı20`M7ymL@nR&&tf-v1ssl-8[E exfVWd_gv߂YUFRm.W-n|bѡ"/455RNPjEJ 4W֮J*J*TRC^u\A]gޔE|>ḺgIiY #RR\';pR] xUQ9;E;ݭU`WvݫK+P}OE%;ToO4L˚&YmWGh Og?fߔ&ձ!5E?w2ɜy$>0]H_E{iNk >α* /]\۫w*s!_eu%Dz[?!X)HYQ0KE׺c_-`1GBۄ-7ow0 ZRJJ*TRY*ǵ_['ZJSF=b:s6h?OiR_>?` *TR@ gvðݐ6%i{wml 6b 铯 B<ypξzn{~Os[{lirnIH&U5m"+ઔXͿ S%u[悪MZM]]3p2" j$]JBWjq!_p/sqLY%7V! Vn eyBQQTI4^U0Ս Bm-^WYKj|7gJ7Wv^<7B˯RD#"LUL_mGDZ`\jH͓%T,%Q{c3V]9UtG+uSm31N)v^ 4\7[l쏇Uԕgy6ޞmMNX}[;`d.cU\ЕsE^K OQ&\xy/una7M[@j"&#\퐈2=㻚.i](8dŮ=xȾ2XXݖ6ħsnMfe$L;] hC[ ^t%@:5˷ʹ]Gv\ `ɹ [y1*LuLee;^袺[V͘zJZtsE;KqNI>s ĪlnZd THza͆Xh["22kiq!'w٦X$B4SE7 tGuJ @c&&b$WٸCdѺێȶu(DEGҸD#CV&, 9d5HdFR::p[jFTHb:1 ,OpJHE6EUbn2͍JN7Zm7t "Ȣ\ᤕCYAxFDBMm"!-:djA"V t/UND<&ĄH[/UVA+Pǖ)PsIЌ~2s}BB1"; f1rC2JޣoT&f-2D;61r < RCVf`E1֢Hq6[Gh{(;oХi#1-/T=K@-t~u@7PlmiT".okEC}*N B$#\˘26ka|4)Q"ySvȃvJ(kK#t[!EE[e!hMȣӷ1E)1w֥""51n 1v-˛ިp\7 r_TV Pq6, 拚p)ee3"24GiĈvڕD. D;~V+PZmtD@cS!;D6.ǧo/٢\/c\tɸ){xD&!vC5KoK-ȷS@S<c!B8f"ZKˤL4b)1?C i\""(ʈq\K}97v#!ɓD;2(ձ s'-f;7*;2$Bz~* hSmRt/7јU:W  9yOrٍh&DKmHhLIK NRb=D]4JQ'qlQ娄4l B[[~uL/H}ړE (nmU_QIam\Wf-Dw-s Vڑq0 2*eY8ț#.PTj|DH*L2!)n婛N8 2cTv (DÆP`D/m@ިB>;FES%5܋;_:Mb'-W:2BE=UhLbP)Clij Z:ExK4͢!aƜBQkP,euȄrJRaۖ@Q.acMrbDZCm"i2N60&|2i,Ĥ EoNvR!hDqDOU2"@!#m_vrAAmȤ1 Z Z3=ё ɸ.8n|;" H&`ܵvnib؃LKp(U. FDDRƇd7D|S1H >skdᣫ7f")w (Bddn쇢/tթJ|dN.hTlWZME'G"TE>5,1w4¢:@B3L7bٴĉvn5FMHFfn"HHWG؎"wGޡ\-!td^mT)VnJmկtV^Ƚs(9  rK3]I|HG<*Jw2^Ǫ?/N߂<ƒpfREK?яeضBe:5b@(gojp,{V^xNfjÁjr̅T+Tpvn.*ͽU0]!yNIޚ7ݷRJJ*TR@c`F[ڹl6b*K4Z:CI19S]iz}ƻKw`ioq{L?+{f͢yqXiTTe\_muj~JC`W;AcfwaXC6 ]]N]_TS,S!s$wJF"qO+j9E6BJb(h-i؏(^pZb^g@C!#J۸ܮF^^xD(A'e}WU1a7e}Cڬf7kٮݣm-0_QLQUK!\TLi_`~Tz6F{Vyq+DuˆrHv mlIۿ1bLf0V[^zo;sJ&L2"e]\?f؉AA+I_[,{-.֞go #5f#i;_qP{O۞㘛=.nܲo13FZeig͙xU*U`(4Vz]nϹxuCKVWbJm:"J{[ڬ?>mܹj( cr$'vu]jAΣ]L] 'Zbomt\\3gh',b"{>Q{3f7vϾM!uf ͩCPFJƳP{G=nx db-+˹%$U"੖u|xiqiټLElL7E1C^+*};D]s ת'"j%@"Ei䫬,W y֛7S$Hʪ[}qIbc_6폴~7O*NrV7wtUvT:uuc]쵆$N+&㊙**$Uٸ}ŒD^Ueon'fQtZ I]-ѯb3Tjmm*qQSۓLIӑm/G2om6";pvۓ;d1!-DݳW 聓<5Te2ЭuIœ5HK\Gm"h/\ Dc=2?Ͼ,~S/+Zf\he[HniH_-ט:Dwźt..~h-") sK}Է7p ,jS6hE¸9:AQ"DLhjrHٗ&1.X!堺ť(2wJ2nQOMnr-QFIhBruHe/D' {}'gpJQrX 5nۥc.~ ۤ;_*Ӻ"$#1E] u}Z ! o Nl ^߼DLF@0}H\b;<Ȁ G%"c'7d$"#qp2qTHJbDeڛZ nsTF\OIzSLnDF5o ^[Eޞ^ZaA>uKMp`徘R[dQJ#7m`HDHRU^XW0 !!r#ҩneBR@&1wQMd(2/ 7w.mI[dD[ CN!4!b"R f(zD7FGvpi\vԙ9.amrʂ1&8$$2ilDc)2Gu"-Cq{J)m$rC~pï6fRKaQkRC"GH[ՀHire K1^mhyqnvl2pݖS2Z8ȋ5c6"Fr!-~j 6؈DIK}P"ۍLiVk4DB[J;GteBn`MD"[*Pl!=#TnHȉDVFD lGOlD)y~K5-"%!y'(HDF;oOΦ8B"C2ҩLH.PJ5dȾ$"֛[ei 7QoL٥ê. sw >0̊;!mk8H.h4mHl@_O;;!Bj>PO66&b%,[%r`"2Ѧ$A"Y[ht[HC14dC"1mLzQ'cm~*TZ3GXһ'7zީINM~H|+.2/ yF :B,F$25A `ژ0.\S0h"u!JX bDɓ|ݠG)id*drqNYݟ:ك__SPًX,EtؔW$i]aе6x}ݻH=[$N+qvDP BٛukE5w^WRtO&*UObJ*TPJUv}_:ɐf^a^mHU[D\%{q?v\ n -d89axpnRpUS5;puki/^14eҝg)1~Ll*K೷;e7ѴG #RT+5i`/a1X׶7b<jKD2* ndd5̕<|+~[u&N#Qߢ8`1nHJtk}}B)R^¥J*UGvܵ+30"I;=UQeJ^qNnѾ :"RWsYgƼ;\;xKl%1,51)ShHD1-Rm&%'$DC1Om2MT4m^D.nhr&X!vFm7Zr.QF4de !2LHrr7 (Ⱥ~C4չ82!%ޘħԷD}ٹE?0,bZ""1-#"/ҩCHhW2.}㎜t[t$C@zn +:"R?*iH|[i)n53ȁ iw@- ѩqԲ&8B.6R+J䝺nA/q 26Dvsml@ĄBDD+a"`uD])D%- uh_zaӹ! Tа-3)͌`[k`D=$2 pLi;/x6w0iu)kY[E1hnFM9ot 4ЉDGsS@߶1 v#m?li+ȵg4מ ɺ[$Q(#tH%"?7ΨӑdysY}. Dfwl|#S)í"!RU vڷBOf#-aKr u7H{LGur赤&b<"_:EUF\e$l@/!h4]]RTҵɷOqȶwmvKxj\&>U>:'Kh\l'~̴""tޟʡbC/_MxmȎ]{yrH~Ura$h"3&KPa*) E2 F$[&\!tEGlKh*/f]ub7c\+[#4]"xT]̸ 8믩*QYv^7vG̻C+~O AkJ/KҥJYp8ZڒiQqNQGô8|N pSo\։wRJJJ*TP Gl[' f.YK>օ RQ1MbTpsȮ~_w<=l峘e5ήpmS uEPw=XXaL]Fwyۚ%fp]Cuنq#in-6Ƥ 񸈊!"w%~tf$ٯi{I*+T&y,yr$KMSf}0(ld\gA5DyW#ŴtsrBCB83ՐĀvsRp,4 zN`\qvļ#_Vj/i:e1 zD|53n_W$"bд-j{s0jԵn]ܝ Z8 QٷVo4 5 жgڱ2k&QfQ#)HDVYkͻ"WQqsQ2 btģByͱ3gHb=)Ĺ|?ff7%/wt`9tQ[smdEަOY!7ehHempGvsTmd&N@yeUJ$X ]"%p#P6o62pBR"#c-FY iƚwMșmJpyhZrQ]klZRڦY2EÑĹHGǔ%'5!k1._7mȚ"'DHQ#snѢdX'@eCڠ7_"[fج%ӆDk8HG'2=_ꔤbDo4KnX!a7㥴"D=TA4Zcሗ-AnBC-_6m !<۪H"m!9%Q Q!d$[cD"RDȑ 7RT\"1dHcӴȈĢ"=]ED\6DĜy 7(r! +1)~3PM2Oy)@_:+ct4P2*(@"|HTn |>jnmDj"2wgdO)|#O5'.AwšH~}@'P~u`q.j[\zrݷ(N4$&D[.eQW9srb" G"-\|bb[@P{"'pDvw=UoubXh%-6!6ǯuqR.b$~]hKީG\[zj>*ayP6ERM- 76Db^1lBEtf70 DHTcL[rDIǨn'!X;acX[vfГ"e0cQVjB-7彛%UHHȥ)XDHwV|0k,"sTW!H\[e¦E[y|^O6`- >Dy"Q%yC3im x4֔77*{ pxUӔyFe{WbǫogG0׭mI#2w:$:c? 27:rpM9zA 24[|4;Ȅb<=TIՓ2tT7M F^ŷlJ|!~|Q\S,jri6˔ȹGIi!2o4ܢӀ()rc y8hQQ}s"$֫Rq.QB囆LDdmJ;u˖ɶ]tAӖG2!0;J2YҼq+Nm4zDm߈lk p5/ASxb?Unr>vV%"htc\{ Iȋ-vc"TȬ4"c2^e1/Ǘ*/-''LLGmZ7 Ct }-Fl#>8fej[pi:EQ5[yr"N<%e^KVWc!.i`VE"EQbZ:]_yD+sj'7 .Aݿ |ٽB0'o)r.bk#' H˪E?Z4;DFplz&3hDQ(+61H@R^/w0B D#J -퀏lݢ& gID"Oѥu=A)Zڐ,Pڷ-1#"n-zrm vHhHIF 1ZZ&2˗jxn8DvP׏B~mlbDMt6^7 H7Hcw.e]Cؙ)K$4b p88Dg4wW \YZh](,Jttӑ:E9sݦ=6o@C˷4F$`HGMh}\B=40Q#Widm 0C=gHxa#u19$m2D((KZ"qtD R=їWS#`b%)n! #"%3ԓGi!ApATrUtw uD@ m\2P\3TU_A%k[nSPy88-$vudNoĐQưۖ>M'2<X*T e̗՛U;\i"jK>frW}Rj1oy [RQnJ}d*TPJ*TP+G1,]Ħ-|yj쭕c~q DW3JyyL]̷f5SPi_W;[k%iax]VN*O}o:'oRDLMVֱH;zjuQ%(Y)KH!RJx : 5L5D$Z#ە#io )BDտmn}h(T&n-_ؔp 8NmF9tVWޮ[X3vXh0|N |l|/]tFwN $"#.VWa4%SJCZ#NCh$C_7ԭ]+譤\86DZ".T֚n0@5ttjB/: DBF0?K9F[p祜#JJl@GL؉;2F[i'H1a*LaN\BZ1$El|54"`{b;#yt0)x̺ҵ&zmD¼~-/c-6иE&1\f]WDe6 .Q!b)H6mjmFB>*enhteOqttE zhە7#">_Ѫ@/7k@nH;=[&HRJS! Lܛ$ӺDKIHԮ< ;d%1%Ĝ6 #iuTX|qtDȥFx6 FCR8nY 6[B[F9n%+tKVe!ziWͷt$)Yf-Gջp<떉D 21OҦB2z\wq;ǚ#"[JM [HR+sfN:3ˠzћ 237֨Xq=b/߳F 9ZtH/hZndd2y(=8Dmꌌ۷50l:ޠ"er1#U>Bl C(;b2ѫ%q]tN1ݸ@D@d[Hwpn{.æ: Jd1!M6FD%Ӷ.PZv /0"dthsn,HiKo4Gq\0ATHwq(rRp#!2J-p@RxX&_0"heO<&^pbc1 Sۈ >dC#45âb选{* HH0~ mH?UX$^{-ĻkfNܓ4 <%\ӵݲ/]G`[p6iy ,nmɲ&Vv.x[b6"d=#V/v-R5Ԕ:vtm*4dq]-"/7.6ł=Wup(m1"N{.l/3qX"&_dGmgI$Ex&QՔ_HˇktvǛY:,g6٩qp GT$z*sb@#K.Yгn$B/ :GϹp1bK11(*BƹfЁ4DD*KsRm.jeqA)|d4CnR!eK#S0tq"!"UL)xͻCȄc]U &>B%e]Xqsc*Ñ| ;vՑm 4ч)S JB2Oع0#`H b19֚nZin&.@v46qjߴ뭖F%ybsxS6. [Z=ZZ#\O4-^nb"C[1i0| ]!vc$5ɭFtb%Zu;&'HDQzhnbE>R1y!""F5.:/HK524M4;"#X3 6`==\> E!hHn#/ QׂS"o!ꡯ`$Bc2%O|. #e2n Pͦ!):CF#i!hy紹e^fـěsmD:6\ڦF>FBqGS(d&mޗe-*ظA!D$Љ66.e>jg$On>B0ioel Hh\ F-%.Z~F^^Rqf0hJ䄜7e> {ur2.霈#ơlHnIT?DBNwlzG_\2䚛b:` *, s7ͶT[/BZO\A"1ꦼB yDhqh 9p믌a!/w=w"DBD#>{tjO6ȴBD1F?S-h-KH6GޣRZAh.iLQ55[:$DMҌfe#rվCpB>n$[My1"("Wg-v"O0g)x"2y+bwv6D;G/EcXdd$m"˦kE'Kp{g+1f6툼0-2sJ ddP8rj;8  Gxh7`@)m*{y;nFDӰ," W4h A^.؅n~Lݗ1$2$6(@ȼd q=|;]- 'T4&DbNd_-=AvF( H5pkh dQ_Jeab""D\?*=BlBM 0k ^l Chuڙ'muD d^"#k\pZ"2!K dvtz: jHZ:zMei"kRF[1KJhJ[bdf"LzGpեD=r!hZ/7/q(E.VѶۺb'3ݷꔙhD_ze#D Y>Z.$e~PDDCc4KCPL}/ŸUFL[:$;g=;}\ٙ6ȺI%2_jf.&ф&` Zm4 zVf~Hh)bKli28d;D4K5lӮ$c*-qtޞ $e֚ 3CGK|2 B<> wtDB=4@>4`%{O2628ːil~j$.EGvWXpH 1?*鍷MDXxz< "4GlD:K\ԑ@輄Qn[v2*UFW2\+UCn;UKnPȰ!Xt5^ *Q.ZfpB5+$qDeTNw,Dqn ?}_\/q)R^n*TPJ*G2?ݢ[RhQ{Jste^Wus8KnZM[Yq8,\mxХZ+]Aٞ.-$m)&tuoy;qڮ]rl-{Vh35*U<  =+劲?Cѣ JbK+#gxGXW.ƜDcoxU)J͸u)]k^o1m*6!"į])[Y6x1B[~ egaIiifŵ4 )"'UOn6˳n!RܗSujw%?6gUbG~FɭFD;|U#XZNCt;ZZ6bC;AX򓭋"x54ڼM)[F2-;zrtAր-V] Eέg*D֫ͅ]Tw=D$%!"- 뭑F$$r6IƋHwwtʢ" t_lU\ i>N hd!$-MoyDw 4uEu9JE;j$H;n N f#K`Be!IƜzmFS4c^zA2Jd>Q6GEdͶgTț@DQvJ& 2Fu7 K$ڼdm<Wh E:ք zJռy.s}h XF ԇߠ+r6!^ҍKfoǔHTfR*s"B|- R'Ov˶ցjV{MgYځQKkBEz?Vn jsWp<ʡQ6{_bO17JQUj< KwգٳNFfV H!ObEtFm We$*_Z.˶ӍC-r9ޟ c幻 C,?3DH@JCYLy7M5żّݨDAV3P#B">fK1~3JܦD6#~ GtD`;Ȳ%!*\"ImtʺёVr"9f>$`Th&vM"lrչ2#%$1 %2MJ)ܟ6(茤4f#)p -Tq2-&\6ڑm#{Yݲig~$dHyq zA|4 i0nd4j&n[|U ohGV^IJe˷ZX㤑sfBQ)c/;PB#(ĶbNP"cE /H<-LH}m(UY崋G &WwOU]_ZPbF`|T}! D}yA#lQV9fҔ+vO,blVFnZ=7jBA?U|ن6Ή(BHP(WO_mk1'b`C((ċ?S aR3ruld$%!vb"d^Uao;rBir]?\2-m%"9u~\IreH{ yV%?7-01K^j H\ueoN~BBHf\<>*%7p(o7Byî !~ѯ[èMp""GZ:3!Z%,DC|b#8Dm1"6mE-1YV2&#]<(ـrݢtD.R]>]7JDF-n%Qq14lA";/z`"&e˖{GݢdM{DdDDQ20 Cj=ᘂr\.3 #NM0&"ٍZ%"'vݧ\2LnGfcH|523 !hO?}Za8/ِ BJ$e}3hX|YfCC5EA`D<{A6Q(L*).\ nB#1?CFDE"Of̴E|e@2ѡ m"z2a F2-ߣS[1fM4@cE{qn逄AEuuކ=4rZ8n8̣TUb2}"-Rԍ۔A!@=E4@ۓ6fE7Ke._Rkv馛hDJxHL>X6r鹪#=!*uչ9"S9X܉rJ~Fq蘷-c!" ~uX< zFA0GAZIJCĝ|PDyjKpq(b<2O:.E72"1!FiH$o&@mG8CjӚG!G[$*HL"E5LZ Ȋ1TJ$N4ۢ#l-n.P[^&"%#q-20o+Q27 @"#F>&'[鈈;_EdZ "|LuQlDĥQ!R\x-4иĝu҄ %uL #J]""]>nZ6n$r~,RctЄ]5lAVm $A=/P4.@J[lFtԈ"!mmLvJ4 ];{(Ho 5&E#(^"\zvӮ/D;7,wRQ8];R1DtwILyhTQmI!8"!*hbDqECA\z{(ywQpN]2wP`' SDc*x˚-۸ވR-Fϕ "aC,׎5`(D0 uW2B*aYX7#N #/!\ y_+uPiGDRïhrv|Ң{vD%p$KM2IǸT]I'dny4;Y7ɷLeZ462G'Y痪Uڿ/鸮_p8h1uhE&^j8u*aG-S*TV3*TPoiq/+3r6(R$("pO]|[ûC#pV]&Fݠ]U8(;Z3_(׷FUO-mG{累{8ᴕ z[o_TRMt?&8EW74"3<{Ua+ ;]J-{qðZ$zrWkCO? ֲx[~=#ASkk("⊘n̿pc 0< 4ڊ(JI;+.0L1L"یOQEaT Q8pο85JOy=(|23)[[I_m漙FFqȄvnWV.)alWBۍjn j& aM!t.Y6NqbG%O'--H\uHB2i "Ӷj>i J_:TQ#l>zRp n&9s4.OTnH\xsRַwklCCL4q-?*< Cymlz A&mȤ⦸,@.MuB<ԑ!DԈ4`::를sT1l@B"BD'@GLF$W$:nԲO0 l'qs2ǚp!#+gplmz׶F-?Gkm1pni|T?=ё .4m,7p"ًe"wp MR7}#- 1|v %(/Efb@DLDhGvщJ&MEQU/6)hNt1Ӥ-M %$e*mŸ$rKqrrʜɴ4!@#hcRJ^Af܇T XA2Awwޟ"uDDk;o(cBLdN (U#`&vv'yۑ4N)J5?Rw p>iaٸ+zJ&Qf&1Dtㄧ$oTBVQm+i O!ID\ܱB[:h bhrU73Y(5+h҂8<*Ņ$vs#/(d[77m q#trs D*铋H=p$op+V<-./vɠs)%U]Coh I>SܪhEW>b>jm6RwƬa)ikvc9)6Þo-j=׷MᆎO IrFje\q^UKe?cF3_Fb^Ot?n) dXS}=S?'ݨQC qzY)e©^ȟTqs%%)F"է-tOɇbh_'ݥ q=cǢO%QRBb?rn8m*V%PQ,5 ^*6ԣ;O|C+ظELJ;Xvd2OSdT\TsNpB{K^5rW(CKw-NZE3\T!b*9w[RHfI2CD_m=^y %REwU}Ÿy*׉p^-R*&^]^ .¦ȋy+򜤈>NWh-Tkr&i YhE_R!͐)ȋ*._%| y*~IrO(!䨋ia^m6]ʣ ~Na%U* ڡ=qlp[; Q\M>h "iG.rDGtePXp>n-|iC!k]&$&.^o6TpE>lDj;m$4ߛHCJG Ga{7%ćqvjW%8]2(v"'FݣԢp2i2/|^Y2DF:gp J2U1蔆e#-ۣ4)2ψZoS4-4N4!?j,zIЋR)N4K̉ Л>!wRe21/~ڢs:8 Ra"nن] 0-iBC.6B; qj&/LCiϘhhaapgyC?L06B.wU,@-"6R#mיH}ۋuEp),2&LűyGu:R8HȘN2, r066-yDv "6UH6qjRX om 80ʤy8iJ=[#O&2![b?Wq16=e2?}tIp@Q1&"G,wt[tjRO8b"_D.PKUrIr ʙѺ/ vx~*[mTFReh t|RFEʉHb!!+uX8R2f!/wmLʶ-7-9cRDd!;#tL2v![AO1 #s+!z m3]Dg)VjK22"!MxDhx HA}\1+x-ExTue ~/.r2lHJ[ϑlCdc)U"J d蔴vmwЁ0;.wvY`[qG}ڌ'uL-H. KpGeyntLuGxL =)w~MJ mDVJAPĈE2W3򼋮*WKk|$$d[@[ "@U{&2Z0?/p߂l3ݫGlړF.f("*/EOUfL `b%Z,?Quƅt$Ke[*DWaݷ+xmyZ2-Kv2Q5}t{d(N,%u_aoo#R] *TPofom_F]GERQRN-TVuOIֿV?\W+2:|25")9]M/i:P"⛲z-}J*g\va?rK[Ko,&.% 1\HܫVLFt6q{ p|\0\B&w=swioq x궅mJezpH[H"E-X@lD2E)HhB0֠1D^|y;ȺHh"F94kd[yjGCi q%HiؑddWLʹmJQuKu/INa)q^7oJkj/o Z_.G̅q++!/Ti\봟$}nw"0WV! q{SR hm[)_o ȡ+$R!ByQ1m8xKUE3T%BEEDLi+jDUL|MȃqDྵ8 $reV bi49'kxuЉ= hzkԕ&ڡ65lI$TGO\xT`hub̥$_Ɯhc,U@Vd/(̸(JlXDVǿrʟDT{hKSv[lHU2Nuko61?ȕxGsM:mܨ#-6Rmr9Vӳj:8qTV;>'"eȼkSPv  q$L^4]Ձ8hcXhUeZirqx&^ӏJ)4ybJ눤+Ż/uw`W@%EΫu˹+k/͞unf nEU$T0{bRqSkU> Ks Jˎ.5 E(Oen˳(k~*ȆbKNn1W]3#i.)[+6.wwUQTtܢt%m!x|-H:Ygu{Fw{x E%E/Z385U2NJ'ऩC∹*3AB.R.]~J qIuBK"U=ՒfݕzHETϏR^ ΘA;R3N^YGִ8JƯwdyw׉੒IQ$&TLq]떞Eݟ .}KpsYRlX@$j@~k5x£I""Zvk"ߓ\n]!7\I? Y\֮pr"ˤkcץgòN",ëm4[-ư.3c˼oN:\.QM= -IFT1 )D9d#-_fVŸ[t](2 ä/^:ۮ 1n)Tn\:D:mDȈwM.4mbGy|2Dҵdфvǘ*lI1l">Q(T5xief-.B$Q#uNVxŵ<Ј1~\s.9OU3 x</ ZkHݷ2EtCT0GhRD :P(DȋƈyB? ~䈝C}ߪ8/D[d@DR6spOm""$eyGU7nѺ櫂%ȥ)tLc88ӠZC&JmDn@Dzʺ:B|= >;32"۴f [fdQ>Zs[ ze>Egj&7`B31zEOd-6DCR"/KrD"؉2~@p9=Tg LP ;Ah4wx_Jt$~ B1tt"Y>[[q!nLy1 Ăܢ=EUH[q! VYěG5\3T˻,X#K~ L E#NȊYNt6(*Y6nA V){klN &iJT85N&{q <j"'J|*xwygN^'g}_b"Jw *p,C˗EE5%AETLNQ՛{Użt$DiҍlM:rR~(3O,}lZ0K[vnԅIU,=~R_z>G Mv,X<%,z*ъk*TyTRip1u%-}Ζ' TP^M4D1\UMhl&KP`$UUj=dҸ,f{M5<`;V[c Ya&#lnW%U0.1_ϼEybgRG{׫}]$m)J#r]MאUEC0qA}i*ċS tK{F\%W wW2یd\WC>_u]]]m!HK:ӜxhqkiJM_{6˗"q>D7Z@w.B% WqֈHJ>,j% 'hHFٲ"1)/߈Ȇ?Fl'bQLq9f:-/>`)yEp-]<>* rJ;}J@% y[^p[=U/pZ"F_7Rq-uٓh;ӄ̜ui:$:MlJQbBT5|^[ӭf]_A\b$ũ%!sۼd%ݿ R!1 si[]S8  e}ZS1# ѿxmC"'ەD`kRYzS"AMW2N\!2'U{%^^yPZ j^9TjLy/ZğRͶB5Q^Wsb>yx!BENzӇJP\J}._U=ޝgMuo~ڼِQrv \TVYܿ/\Ef޹.D?NCT3L2"!OZp^^H˚w"*c 2U"/bרyeޕ6m>J&(*Yë9q7tCZ~ٴ䧲K*qndKUuiƬrpw>n207D[j.AȐ/*_kF]!2e^*=޵q.7 ,-cdȌєwo.T"'7O`ݴ׌BC)˔7SmZtGOLDK}Z"/:b&{vƍ\uKm0Z21 -ܣSZ"&~hH qL )2Q7c.c4'BPCGl!rGljG3Gi@TЭm&[$fM{\Iei)mD"pIݿI4-0i ;1F:LUx샐22(jo}pDz^ 6wG7Y`J"\Ƙ-e)xyvU Fآd"\Dگ5 җ1C\Y`ir? H"R`1x@ϛm3/ZkL`$N/S.OU۴~)&l Q V>p7D8h\@c(j[pmKP6rU1DWi`uL)DyvGp×"SYk !SY#dZ!Kh3 e%YDB[w f͗"Hd?j4ChGjԛ2FO D"[r:@[\4W2Ba(5bTl7[(TV㺴`&4D<ȭp.>u7nHOVݻpDD -۾2}Y(4;<ٹ9}k̀KsƢ[0WVNrN#2qvn:F$DpёS-Qu\#(m\JP-H\q&#݉Q7"Hm1Ύkn/]8-'"F#(Ur, }ʿTLDF2݀&?瑻/~ipViS Hyŵñ tDZeU[ng&IGlDjݷi7d"1 ծHF&};{\0vn78e~>sؕ{R2 m=Um CGeܽe}~B-Tٜկu?<{_X)TwA+ *UO~TяjطN{Użu]omῦ~8ҥJEJ*TiϺD>9v>[aXumv #Ds$W|'oT% 㫙+eɷ{:42]u0Ǫ'.hM"#m DRDi]=i"#5#!2tA\lqJ$a'Dfb#QjVYsA_&"v$:C1\-3![ͫ2Y ="%R<-GCv6/,ȄC WDzEUJYI,2")Kݨjݏ4NF6Z[Q rЀ;>6Kuu&" h9!~a["n22u{u .z.bSx$IJ^؞_t.Swa?FѴܹw~5ίE쭐ܦi1Yi"Şu݇>b{y4iH{A]#Duo4,~,E8d?|NdX0"W52/FrD%ݗ wEUԟ^4/#"ޡwgUvtr%bl& DzARV Q&I.2J`Xv#.yp˂W@,EEQ➴NVHՅ{egur<('竬;̵xp{&]N!g)rUՓ/붍9Q}^i66 lj *y:FDj[ЭϿA6)RqD (䵞N`r{8/^[ *䍧DN ޕ%f.8(0ת H7J[Ph]3hTI‰p[Rਹ!AD>ګTS.Ujc9]CBOơ}$iK/?AGW?Ǟuhn2Pdl;7S?WΆt\'ג'*qYEI!zօq" FM7v\`d\u sn #b*^hQiH.t-ڦzҢf6f<%E` 3YwKZ欔r <ERUW>Ѫ4f]j]k֭rE_^}բhEE2w4࣒Ѫ)۪#hܴNd@"OWب$2t Й䙢fs]*uYtJUh.Kk$PTϹBd$3,T.tT?s4⨼%Ji'P@{KC@b*H/wW"5LDCH 䊩Q"8eSq%QLP EHRIYK8elGeTgëi] 䫲1-V @eӶ p׼̢&[- =f"b_>]p)wfUgg[8CntޙW+aYj g&B^舗|5;ac"[tb3(71V̀jE-Ƿ׍v/DP ުoqnTh7!n#ʖFZN:n9#Bps䌋#F yi!&t|2|C9Db]1(ԣdĉ(. DD[-@d-\QYK"N]$G}#E ]i%/ߖDR.Z!'m Qv/v`bd̈bKr-۩kp}$oDeEDB8 b!!/xMmcLd\H1膔bd!#_LrLamƘ?}j̮Mf#"1Lm{Č?K5,;'HFf;D퓋~@&-wQmr#=ho[yީRVB"pJ$̈c#H"_7m32Ÿ y.շI."3S7ᨭp̢#>:H%HQ姶L8"Q;JC*BHnDHyHA'60~.o !3" <+vdriBGX21ҡGrmEV.0mi4L A*-DF1 bٷPD]|7˦T;8[0ܶ굺09ƬL&ųIq'.-f] 2.'ͱ /Ѡ/0dRު-wǥhGUYyx8ؑjI" G⥉ Bxͫbu}R!#hKc̭-] <ś}?:vzd[[yG$:Ӑ"\q1@9~Wb$4 F3(G¸u-=>5EuhjV1ȹzJG{o"lB c\8D\#R@H"^D֖v1"R;dEQWNs@"ix4M:[ rMMŸLջBd[o֡\En#!.0-Nܰl,)Djm1+p:w`QWa4DLK#02cӈ[\j*r& d3M 몒8i#WX*Ḓ+ŎxFd?{T:%:##}gL|F;yB5Y:l_m]4Ӻt";GmMIsXbx?,}̺.DW]װ]B#$nYm ٢䊵~Niv0[f[c 9 "L4kϛtkix|;F1̛򻍾3MJ*!1Voʟ1W ]>삸fJ5U|yE\;/ګK Fm' pTJ+hZګ FsI?3gb8>Rmܮ.IKz*U*TP;˳V56W']Y/gEdp@~k@<&{YZ{y%R33!1r՛bdHHD⠞1 (_Tv=A- H@|Gnm!(,bEhuvᦌyHc<ԋ}ɲLcԌ" qы Ȋ=4zB"2 ܓA#me-2c4"C#-[ 1B4U2;N>) "%[l"D$R-T=ܘ͸G*=u#DQlŶoN\!TBx;"B`B!_Lr(N:R(ɇ"55tH~-"Rl. C旊.ٰO-D-˧T+~bVput'$y)f`f"-j:1j;Sވ>-!xFTs )"Þ2h$B%#󣶭x赤;Πlt!UwM!! źM!& ʘ܅lDc]6IĈ4)Hhϳv{/nsX1³AU,2O_Vj9߃5|$ȸvy!$du5`ISHϿV#[8B9/h&PqA4W 6Fӊ_-n\毱) Q$/0DN DEk. Í[vW'L5T/9jm0&YoҦ\x"wVm&E"Vg `Ű$EL_Z!Li8"Q>*E -jXf*F+ziV8zRW"^4n:G<\8kwBGS6׸TUʫt?=B+E?-Di +5TTBKRl TU8z\4m&IТnLwsNR2a$Z|QZ DD,kZu3\,s^U=&Jh @sRΩn4\U2DT7yHeƺY\Y|\ΫL|3EN+Åx؜i<IWW$,Dg^<) feK۷_$ENc us2҉xE|]r-wvHF_6-–J[vxKݾDďF!&5 j@aURh.,ߒuK틏 ӰvcsJ'ed+i|Yc_D&aKUk\`mm%<>,í\j$1"L'NJD$#/D_#lanSTW+lشDEO}馌[O.ō(H#T`c!jzrӘi |:ȈZRDyFIm!Dvw֨mMj"D22Mjb8Ȅ?xwU˗'DeN2Ƿ|4 \wW5z@f]lL6jQf{DG=UR-NN"ՈҦBƈuWM46ÍȈ)2Z||ЙHwx~(ÙD'"<* H"lyDHGc⨭mfbERvE"B<ܵ\~HxvMFE9Hc;izwB"$AU 52eQ7RdtMwh.2b [.Pe#?S؉)J Gr-Hlv_)^ͻ`뭺Q"!"EQ[vy5D' ]WDE"#!5#H}ѫ| 0 }yH4XND$;wQKutr3tbB:M4"Ď;ylV'ZjV]^ڑ9pﶬ .rgl4;/  V['G)s|kzrJ$yi̘B1""!׳|l%fhƚ`ZsF$dr8sQM]^]1""CIrзvFlکf.B`.9T7~qۂ$3tQjg˦q ݴGp'nD[+ho.U \.:m F #RtRF]2T:ȋl$;K;Ӹ`I97VߥVC+B?|td;oLjI/TUlQdbܮ]KDJwܔmt ijUz 6UD?#w 2* ]V!ZNᦽG^I|[jprC"1y=9rQ>MD,>LY%WG. ϱzpv">~h?Pxhد{ci_TRH*Tk0R ;+HHx癧q;nn+>Z5P]6UEUr8f\Vݼ+chDD_ys|{ѶMȜ!ݯջW>9ƥBPڊqRYh\' RRk_wA< ΤvsHl4ڑl6ԓi;v#38֯:oQB-4BR/S?:-2* lZjC"#"b3"v{cjX0u &O!Fp"n،%U8ppwE֛rB- DL bx n-=[鈘k%Vd-0d2U`MB;$B%`ݕӢ%<]؍f{1Ad6RWTǓ=YiшrҨͦDE!꧒D1"#) N&.Ry$0'6oDY8^=C F$ǣ#ywF<2pHcj4mpB.cjFeޢmf . t{Cl"RR(ҐXOkMbԊ%˷pq܀ @G[jm0|%U/ Msڅ-t =zZ'D2tco/n뾐<3aZvqHwUז^>$FRP2y4!jbB<ûUgh֖9>0|=l*e0q='t@F;D18\6-Ǩ~mBˎC;Ev{o m%WRȪq{@⼈wt󭥳ILUW50W ,T8/V >kjT^ς~;e^H7&Qc﹊ Is$l9nhP@EVx\$D8'?974)<6VP6LS*(ɢ\~51Y*"],S(",´-5TQxϻY Ff q=gd^K5qu,^\ɒ!eQQ3Ͻ* *g^ڢ8F]ۻW:DJrqDΡpG$Y"zn)d@OM%RIg0/ZVQ"6Hયrexn o<ڟBŴ9]Ւ.JyI+d 1'pH*fm@N8sUme"]%Dی-mK(Lű:sqA%*4h\R*zY׏*K5DT˿5ʙ**+/TʩmeDχzT) U=Ʀ~cUϹQՕ4;-$B}_QP1ATiԝ颁W>U&5# ir}\xS X㇒>"_/u`gIdo{w/eSbwkm!.ZYSkd+岝qȼR*a ~m?cSe\j7L{h轅^5CR}2A>b .+! r55BQV'6m)թ"ʩNqw_Le^e͹fl\rODѡ^v6)BZ ы<TM |Rƫ\fY QϢZipD s5gnYې?DRQjFW MGwOFٸ*-9K&Rpen:"!-߳S ǜ\:u6!HWHeܵ\" #E/ӔY)w<-4n8N"^z^lݙ>fqGuPjGH%*pӂNH]3b.h侌K;7qH=Ӝ1qnؤ"(Ui4-ǖq.kolFC"4fb"&@ R)SmnIR)~ !2ݻBE4G~df; 2ܐnD/ S&cjW6QB>9IyM<$/Ě.| LДD@DzeD8D !&l$]$UgU) bp.in![x28kӄeEOnD^ a"CBDGKyyhB+cu-<<0.HG/N` RmĆ0,DF;-PJ-0p.wp(sxF7KHGIwm("U%lmODݠmqxfREV y&{+fͯ6"-Y۷us>t-zd$;Ze[&2\JD@EGmH-/I)u6&Hޟ":uȑ#U & }W)MsJr/Yde)}*\^Dg̈DeEo"s|w(?Qy%iƴ#t9Kh5#ddw>l";HlJ4EПmD1mrW_U!hHFd w ;\d2b5#'\BB[vG,6lDHG?V$bBvu!l@]pj"B=^\˦յi2T '܃j&?瑿~ ~%8֊toHۉe*ซLY#) zK2o"X{.eS˔+!\O}%- Jmm}f$"XK%"?CbOJkN)R^fo?|g_fySF=b:ν`9C?fWJ*9RJ>'4Lݹ@^?V?p d@B;e\&JpR16ߺ>[룷F$ #r~5??}ȝiØHDQ[+"[RH{iJd)s }ZQi'qozMZ$RUF&QnnJ^H۹k4J\CR \A9B2՛:1ۺRjuMbDWi &R-\A+?9F;vOP n-ݣ"rD~*m wHyyUj 뭸D$1vƪ y^ї.jE27QB;B;~uHKL1_M LFb.H#.ZoJ"-R[m)m[Cll2Jo\d%DKMxљoHD%^!j]Ą#bQ!L]Ҙ5Uo"ݡt' Ɠ-]iIٖlH$Ґ*..4!J=T.P Q a SPw|گh,7 {ԑ!?(ؙ5\-Ɯ$~.0Un?ȕ΁R5ERRL? hqEqNawbΘ+~ "F_GwMHY޼+ыtDePJM*:7'~~Ϻ:\W"fd/qQ ׃)s<4ֺ5q6FFN"DS?gmGőG4W/= Wdb"BY'JQ nɁN`LΟn (((.K)U擎e>*>?е.DO6 .mEW  誣QN,8~EW'"_Z3UCPP\UExeʛ'rm$)'/8wZp"E'DIry[Y|*m*WDu+jGS!UN:Ǧ機SQ S4BzG0&^I;,^璉F;e-;u%E^aJQ,xxI>iM[RA(1t"bjb&;D k{%Zߕ3hcKK"x]D苬sə6dB-b^":5OcxPGӉ!˺yxO7̄Lgr2ʑ59R"fcFښ.2#*[Ջg&dQmDE?U㹫 R,.錢[ʝj^lm\R @w7UObN;j;Z ABD0EwHir ,S-X!pLD|Dq#B<ΰ6жF˘NBEJȝ'Jb#e-߭P9v;2cޙt1r[Vo:-2D} WĤR"=]?jmD['"bE5gjvt4[FRW'ݼCuQ87ѡF6$$r#;k˧[r|&8eŲRM"(m(UAjB1҄eնVW0N :21!kVMgEy9 āq'&B;zGNn嫔:;j7A  ֦ɸHGzwRNK72#"4&pK/˦ЈKH|RD"[H4xK% qohREؓ^5JB>ZlH=ۣOYѳ|2wQ^WWPih]!-"Eݰ$L;/Rnp1)֩l b-dRɑD(Ƨ1 E#j ::c!T7ۇ!AfX `Z1ݻuHPLJEyk۫CKTd:c{6âR"(Aqr-'d1g(DODz[,!it[GĮ|IdbDE.YF=&Dvtۨq@[q!-Z9n &ёX8.\;Z"6l 5b>StD[b#ީD2xD Gޮus2Vdv kujCpZQjkpJmFMD&~o٠{Mh7BQϛqUzU(5*Qj7f_sg2hI ~jlMlh "=DJ;;s_сg^JZt,h{Aomd7 j6e ӊpZv_c\c}`sR(2lh yDF<\@JEMDpTTm_q)ahܒ+_[uy.px,<4շWiҮkO={Q B\jHwq>5ҫiʔNj-MxTitz^gTmBKw#RZ&N(d2Z1?SWx> CN((PV^]_Kg:*UUa٬];#FPd樊g\Y2gs9~#p,^/ +TvjsFZ1͝f>vzeux"8[rѶ[FCQ-Wd#!(Kj;{;uNJ?_k*jԫYRm{m*Q["\љaU#nڍAyݒtMҶ "2' 'u=eUΔ-mɷ&R GiUL7\]:D؉cջhX"N"!&`#/ܪ-"zc"F)JYrȸ/? t8DfFGb4&1u+i_}x%wr㒐|y@Gވ֝pqX2IƀKwVڵpmtHDe˷j*FCPy>$ۺhGnݿfq@Fe24Hy4w-!/{iRGYuwPMDRjbO6ދBQj)Zn D;Gh7R}sTm+qt|?f7)VJq#qh=ߚ b2vՓ":#0)~>-6-bE2-#Wqf)lmW M!1WVF" c-mH?DW"1-jLА2%*YG!vOby7%CJ] F5\ BnHĝQQ\5"[Keŷ&$9sZ"m5 " {U^Y4;c/վ^Py>˴nrZSȕԪcb B0i}~]Qf*U'r'rI?%R\eU?%v(wVܱFS>ﮍ2msΚ"gH^J9Ս8 n 4@FвLW._l-L2'%;=T>lAEQZD\gh-lM4/^rO]N }V\4ݟ3u|wqqZ7DբjÂ$Wٷ^ĶJR9 \*kW"p^eE࿛*,K3-\QTs$h)MnHPTx_Rrӊ92\W$q$#EL,>m=)(j*"/^j]Bq'QNJH;xݖtbV$VEj5UiI ʊi DG> Ю4EG5EgUˣgSSP WP<`y/Ͻ(d4o4>=C8ChDeyELطVW72TTqx"gjVkDsW5KC1TU|yzӏ V`5˜+U^!\J U;|qU_頟%UZXqªzj4q iTD^ʙf9*Oas.He{%-ƚ#\4TϿ/C"y$qYl[evTv]WťF\_z\-G^͢_6!~*"Ą[z,=j壗+UB^9[Ā=3t"E_Zͬ'O|ŷ⬾t.`xuL nGqU-v.mm!tү+ZX+[qŦU}yp5p:aO&QX=j.$f2"nolq-KQIVgtYJH6,6 -NFAާ[3fm.E)s Ŵjv{(`%"T+؃4DQi;V4jAyzLqc\}%1Y̆DJ##jb@N9HmmϓtHQ-[8 n QA!n1BYQ:7z76|Z'7 HhpBDA!0jLưնBԳ'mL$FW⎰vh%(U \dB(H~Į|䅁-tjT p+QvBGn[12"76Qn-Devť+ \x1(45Cvƪ'uZ'5_9`QF܉"d؈ɖ l٦i\!}mC.A-RMU pHt!vr^h!-sw7f$mW^v!vU;mBCgd[כ mtIŻU!p&F{Fm vB.H,ܑ4@[Oަ8ԭI ҁ-*"%%D.NBCPF-/Oz /8C2H!Cݴ~+.1#u/F!K݄jG nȈDJF4ˁ3iq&8|LGu+=ȵ$e.ÍZHȄh`#! E5mi%[f=!pKh DJVEb"]%Ѣm A -ѪZ]a!!U3r9i9Hw79xhK$RwWDb;1Q(c/MFe}7Ed_Qvq020(F]1- [U~$m!"2J%XfFM:NH7d >lZ'u(mW DcB؎F@DLȼFEMVtbZ ml,,p-q"8򌆽l%-qgu!"/ٺӤM-2Fa?<&(ćޭ+Ei5+М2q E.nRWSqڜI2q] ۦwl\㵀!ڜDAM*"a{h7?'+;Q߿Cb|-܎ 7 FvX+n Y.YK_K"ϲ=g֝6eyIqh8N'wYI7ն_rCb`1^_yw->4F-Cݯ>!lvl!J˻ ߜ **r=^ZѾmAJCI ,h$ J2)٪2#+v ^59S*(x.0u'ҹmxfE-^#:M4$=2"/C&ЉjK "y;deff-}HLJD}ECzeMyЉy"5Y= 61oѫʥ,.ū}WH˛^~1 DyeT) zbSHHif:bokGqQqdČz~JC ˘#R0#oU7hHFG!"檾9;سJ0ʎ*;"!D]_V`.)źl&CĈ?Zmڲ!D2-RԵeBcP]- b1* Fe5I܌F\5gbM<ɭ!!KwYg. urCwnDZMo(K*y7-\t De!y/]d舜%S!m6nd$E!~iT\<Ӛbs G&AD03v\ґrj ǟ-1}!2Q(kHջ$C9FNLm^r"D.-R5̓Cl%S:^`R2?ktȈo^b![} 6De.q%X .}g\NU 4H2~l^ToʹvP]30'_R;3na`⋪ȣ\@yp6TLڢaQL,UOJ24Z_UH+~D^bi6t{-\?}mAG$8uNhZꋙ AK-9XУ9̺&8,3Q3Z̷NDG>2VHw2g pObM7JBk' ˾dIF∊i0I鏊URenH)H,""Uwu ,%T\k޵+n#bQLsUOUK N+TN\4fMEwzl mxgf,dE=KkMN]xa<$H]T;*2 㞬Y{UFYH% _:RH(FsEo>+ܩNnQωwKYBL*$Gw{2>fНM5Us^5wf{STiqT%w^E3U\J#H滗5^9пtd\țW,G4r$祉 Vf*.ZʁMt櫒A9tIeC=tj)LG TT>9"ZSY/vy{Vo&d⒦^\szzN["$D=I BmQsN*s1޹qB%DZa+;H߳L D}Sbfp"Jr&;"!6܈JB0qFQ &ǘoTCi8_z-wTHD2/S\(Ă"%,j"7ۓe}W|z F9 wΥn E-K}&tXR!!vDf!=\߳P-LZ.beT7F;jDEjِD)7 nwmvˢ?YHlyJF|6 'I‘ K̼HQ)n˧X[wê: )<"mxCs|A~sʹ_VY"VgMs]@܂jy;DbtL-"nwIpUa#yS~R);Aõ$SK%]NSRYEؗތw1t>rC6D5v  rBͷuH0.aFr)kj MDMؑun4" ufnEUM>}+=;`~m㭝4 Jd$EͼDj7TiC2ZD D~"wڡiEi8mn<;;K1nG914%MQd.l$BQjHFEȋw\P]v܄X`D ѻ4[jցD;b[cں?D+2bæC.bF$;4ЎX <2P=} -VQT@H"odDOo" Km,hZDJ)Iګw wK:mR!*pK;t+h!r{c*[}[Q UQQ+O3Rߒ=V\k%*dHY j*Lxhpʈd<_o5i+A?De3k-{Q2^7DTrήmME]޴ y6ɘt)Ժ)IgO2U'=d]ʙ^V s<<jy[RIRIYb$iMR"H"ԩ&AN+\UYEMSTU]x%y涍};u|=:śVEf;1E%DD*\4^9ѭJe/RsiT[/"MW"WLD^>ڌ7ohf(jW'{ 2V@IjtGU=YgMpLEEOZ{w3Aκeû.:YCW `[6zk*pNQSS"M\YU%8$#aEeEU8"gOF9oEHMlŅ Ir^=8IJE 2Q2<\%E˹k -:Ř爔45~[EN_"IܹX.U_)t5E+SsFW("*zq*ਪ~- _F4/e$dN}J*h**(j$N @܃|tșLJ9pΎ|VJ;OB"II](= 5C*gI]L%8AS4T*Կ*dKy&Ji*/z.kN4^>a.y]LvQUs_>XIn䓲˒۸6DEEGQ&E-^<.Ƽ"ۻq FF26;e_Vg19LvGR~I*Љo|DE4GhTz1$e{A6 ґD6_nirTC|yu6xb約}(%IiTc@ஐ12.x5jAW"~'tev&LNLB_8hoT'62KjqD "ޙ \")nClu+R%˔cQ2޹KpH1*aoP "D%˸,[lȆ@Q|E.٫Vh|Bb#> nDL\.Rw"C.rF,,AW$ȇhk-'[\%D$1#.v}BbCHeD+֓;rh"{HD2nE%Ww- :# KzjtLGiiss"ƙyhL dZ8ĺy 1效LV搀\Rw<\'!؀QKh]~.&M#,bW 3m"D1~֕+)O6P{WKы`[Z"!QcN6PǻmwhJ#!Vft])|;J?fa1jKB y;;~]Wd-mV]YTxy+È'u. #1VԌ]99a.H TdJ>*ljNuGoUȮ[zf~Z" D auUf;T=ą#oz |+Qjۥx EUǜ{E8 {e?Oc@RTRJ*( "v\ӓDbOm86O>UZTNx]u~WG&!<#*3st&ۤ4WS8]B/,,lB5 ibU9g x\ :6vDwW;O\P#v.9s/KFA/ܨgLɡw)s} x pDt'ia fD@22(G|Ap ._ڢm]lBZd!. jqhHv yUTb3!ʼnfMoR-0ӍR<+1-7oѣ&f&%U~e/YEq"r%dU3Ev*8)Ǘ`"R>u[( -@dC+3mp1DT64["Qe(3!1-1*Qɗ&$(/)HHj=^q-;eVvBnHZ51Z6-w{k <ҝ-L49th\kGnc.~0@/aFBQJC`va^}5w,(1o#I߉6Z1A.]dF"JG{W,q0LWV7DÆ|XmjXu;v7z"*ym(daf&t;ڴ*pR]G*:3`]8a͈m':W-j!n_jgZ 뚯!(k/zѥoX"ZkE2k3l횹Gl!⾪IZ[((D^yIÜjZyu ިkRr8ؚؕ\/2Z}'zPrD'pK|CXR1n&+lq EENi<ӂ%vJ kwQOvxQp^9g=VKUs $ JGo(JD+Ocj"HȈۋ`MrfWKCu:VFL\W8U}j )|CzɽEȀ.Z\7nsDBW#vޮ㤖Ea|$;k:d-FKI~#`<[ÇUhdQ.AD퀗WmF::N]2ܵDbQ r_oPZ |CNx4DL;Gu \q~D;v~@WB1qTh^;"(@KD2ukwyĭ.]"mj |Y`-zoTHF^\]kUք@J5&"POxJBEPL1(7mUF,#1=>EƑ[b"#T]:ܚ06]0B"C<:TbON:$'x]qҋEիs&Xf.|'bE-J \a'4Z6Ew6V/)L>ErmHU2C""~xQKi)l2%)h ?Xk.fۦFm  Z}DCSZT6cg;9Q3.VjDQq-Ǜ ipiǗUh2^v*|L{mF"%6#ӺdA@ě(Cqxnlmtǘir[зۂD%[sRun75X8:!n :qEKfu2.]U Q"2/3d]yKޯ^y4BBց4QuU9Jfdn::q0.hGWn%jnQS0 KXvF;P@(4;j~B밭C4HQ8W2!(]Q6 {L_JŸGƖ9K_iʕ<.FD%m"כtmB$Y5`R(BWLMUЌ˘m 6Mȣ} ;wqyQ.\nZ/G1.b;`X@DCD$3w_>wdHdCZEHDUnѺ֓)hmͣpyt׼#ɱQ=5 !wxvƶ::9f38C,U6_*9zObx_W ljJQOϡ^&jSj^+J*yRJ*U`2H: !̉3TETb4g^`o%v&7KlQf9Uext &Q w`vm21EVAs^?7[ :AB#CCɰisG4Fh_-pƊRS7-ȬI!ezekP"ԙf =i1 .ƚqH J Z<гr0[Wv FG:RD$4yy%Qlb)m\;.b3#w0D@{F- :ycLn|"(UD)FAVl嫤DuIֺ m rb[zJ4u5op'"!)ޚWz]MěH]C]%#8Q{MDe.UݲۈDFCTRYل$V*W=e9JUܰ<2 dIzykɼݥv[ d2ZꝢa~ Q.j'BS|N1M_4 LF;B:@2q.[&ir8w+GiD%Uǝ)Gdt\̽/ R KSd%k=)V꛴-(ǔ5H=x!ѮZAco0(p\4Mk҈ftmI%UEzY$DLw-z<|ņ 2dߕjRmVZAT^9Vk c$4ڹ'wɕ_%ڨ)9V*Z"P**/*fҶ&PQW։U#ʈ˟Z]úFnp,|ٽz?b8iWrbm%=yVpVU,CylQT\/jP$ )4=}aM$o?oz* 5˕xqZ%8AnUcpҊ,W<8gV1Q*ƕA2AERڟjhs?j䪕ΫUIZ-Bݳj &KI D.i$.4C5TSfǾdIET2DA*"mEU\*%RU2rVotSS4\X!Wa>**K$άoAx4T5_*u%ƻT6ԌW$JBҒ*橗<NZ{TqTxR3NL:.XvP}K __ tC*1oeV2%qt¶ms۶ckFqyJ66rM61!)nҧ JZ1ȏkQu9ӶbZEʹh4Fq1>oKm86N DEr]!&5n1zZm m6Ë"; p!/FE!.2ֶ4D%}*eᶄE>oxvMo|Vvn"%/w,J1[HJ#D6H2t"Rp7$"B0JP!Q"f"cB|"ᖯN؏ͨmYm]xJ%OeL1mx6d͹ģY4x]tDW=ِ@DF]Vd3:A+Y);B`&15n\Ю\ VGmD-hz]>=v(CYxGQDG4("qvr%rƢ6_ !#UÓdDD;u!3"1-iٌ\zj!bGE"ͷWȌ{5DW [r.+[wU ĄdMHvP(E-s!)mJXcPf|Q^#6\F{D}D~ڧ2ۋR#/ 1e.ͪ`h)Z̷QuժaƬ̉({բhM'%AHE!5qfQ!-"?^ʴhȱڨQviYVU4hx'rBA~VP;6Y >Dp5?ۇV?s3tR'*TTrzѨjK$ĬP1[3L5?P};h;"P9桮.;P7 usJTfN:" Df4{bijЈ3m/BcEkl$Nw#DA=- Dhn:BE.#.QhlrBCߊ}rձB-NIhLdRQ%ʛ)JC/1{̂IB%C/բ]5n"D&@=D!Uj/ND^'.ݹ!wkR#G2HD$Aѐ-BkSѓC-mͱVۈm9t#$%>VK6hrLЛcZWdĹ*xP""#pޑ[6D-Č·0i6C!ә`D#!Rkv[@Gpve 7uscSߺ7%zZ<ջR`DF3R1/ҧa탄A^ݵ_s鄥,{.MֆM7!duqKNмMw:Gv^o~e>oDȵy2MRsrX>Oo.ЈICU!ӤDؐ@GEB[M|BQ.DDvȋ5ʫYbD!R(Ѫ2&huWΟ{w\$&DHb#/zƞZEr_hA!w+wKt2?v;Ar[MNq/Ѭ5r-^c5B#t̬QR9G~hv f1*XΫs(@S)x-q\6l/E)VϵE|S-_FU82X ibKUrn1?Uu.~tjWMX`Ihe tHvTLK*$\%E'QrETq?&TuzoyG/k 2L]<(j2%ds^=Z;V!*WU6 8 qUDm3 ʹXrl'\\$kFK /2l_rWS%B j@J$)u%f@a2RE*2U"hN4ugmj&h.|3j\[UN"}yuSWW3*ͅ F\%__ų ׂYwf]"J&sܹfI2S,^_B彀Uj+\=iU74$^ =zh9"pUs( Ժ.k>}I\5[@ˏwºH4Z^@HE2% }\VXDy"U_g5DUT]6)?ZZZʌb*/wk׹VTJnK^ەZg>z>jik?Y%nH-HD}蝹䃲/ëĄQ;6{KhR7Hx5[(#%4A j9zꈽQQWC|46%()2 r[a;6DRX/{w5kpQ$6"[ǔH8nC! BbD#wQ{iG7߹r%VLDg wLG%SހDCQNi`-DD?ZmH4nTfd %oBBb"=4m>dBzFCBNH%"ҍoo"^d"BEE{D6PfhxwY&N$!lwQoM U b &zH7UP_ X8[zLf~>]߫R8d yKQ) oʹAp[HyeInz&ӭOR~/Ѡ_;ƭL;~mJ@qrm nW_B]L B)ᩧdMkr nOwqdC#y2iո2oу2_;e-^R(ie#,ݡhvR܍8HKk/p(:pw8F$iRHY>D9DCI Ghj~!B@%Z-4kaٓp1F;d]\6Г4/s4QKR<:d2DyFPWPʛ_ $;+і[̷(Mjn܍[qL?Th Eݸv7mE`Z#/ٕ49W +8ۑND$R-6}"D o/1T^p6"G!ZeMyˢR#i.dW/#7gkTtdGUbض.eRmu`I01yK1 !0"[=U9cdtDn49 $N6vNI}!#aA[Gh˘nSFG|?gR3r_ƴM%)xPmsTtQCBHHj~|ums3Tʁ SԟU}7MHkr~2,OJѭUT\NJ{?=ql-䷾sTA\zJ]x TU=#SLçFdީfn*.y׉s*/TN9"6Fz]xe-[6ҫZhY,c'UG%ώ]ImliF_jwҷCWG<?O|ny){rQT|J ~\kh4UUU?=JnZl.W*SqO$cHE%"xT͹/Z:х& %·Vt3AS*ߖ|r!^%Dg2b-Td2.JڤeSŻޯ1.~ĝp58Vs!3xAHGkQ𖅲 VvT9K|5콡$/~.Ab^2%rGS`IHDۗ"fQS[) L%W':'Ģ!J:Mi5}mCND@"B?T+3vĎRGU=1gln޵q'2!Զ )}*Y fvD.tHDg.js}{tbNoQP%R.qHsqn mJ3sim#C7tJ1M:*9Mژ[GiFD r"" Uۍ nDs1Vww+S]h%!TB- %.mᭇ]zmpDxRld;HGZ1,f[{FB۲"!vR3 Uvޔ@2Ҹ"6G"tw57{ S0/"=18eh|(bBD1\!,56ȔUL;"J$"M jdDIȐՐ+Mg0zJa_rE!"^jZjn]:4DZ{DEVwjOM|5ΰu=FA!qn"=5ȭv6S3V̤D1 #/󆅓"1q}&5H!i7dcJQYC,nYgїXy 1&[L`1i&tD]5_q51#"-/ܨwy`m䌾!)% Rpchg`\kLX CCC(wL F24$YYYиdC0CD14jgfc-i EӪrWv[1J1!] EFE#o22)iT#ػtIJ:RWBZ ]er^hEY0=&8;r:% S'Ց"<+[b4dDB]zq3h'MltHu D!]BT.)}#"ݻb%!ͷˤck9+Knv\m|4B#k/21)Ve9_ %9US"ߺ%Fb15. eZ!-f^s.v[ 3ٯKyyn,-؄P_yhʫ-JL5<Ü 4Ρ1 "1Ӈ*3XPWV!h *YDT_b>$D"_H3~>8|]{gSvVWv*8R]ց\LԮYDO5dgTM yH?7mgXxm-.M8+ZQ~F$鑴CU5w8g߼p5L E7)Kq&Rec۶ }hnE}cշoգ\7 0 6|f6I#T#M# fS/Gwų e˗|B#JE*YHyZdB"%>.ZuŨ>ӱ)̄* z1єvi^@BF?Wάї=˚$vR!&HDM8-Gv괸hYhwO֦>n@Q3\i -FCC\:d.GtF\em9BbBA^6BrP8@EEK6;F;$$*q{+ }wF[<hb@K+qgpd7"^)y \Ӯ[=T+ ){Q]28N<˛@(Uㄏk.گ5DQӿP!,j=Ew7CCt锈V\h/PdS_6ycQ[ꐑurS1wv\!+ ]7QHDwnS7rh.hFnѶD$[U2rjK6NdmI~ZhI)DGmK@On" /v;k}+]r"re{QrvF6~h N rxl}H]%#]2K1|غF$DB2!88[HFFR.hΩ~&"!""UQe$\kݸ]6ݑm!hG,JhFt94$CU8zmEc`$bD$Q^j~^E9K t D;6.)HÈG#:& b@@DR/K*9qmLf4"ҪqfGАޫ함F$&UTTєI!j6fbQ"v5-qeCnZ`u KmF󑖡n)e٢pJd4\ IoZrBFG({.`fD;zhwvemr+@&hd>}}si/J%KOh+7'L()7p "Ҫe Vۖ#)Jp'GN;G%!.A_:lh(n DDEF >Q hqDH=ږ:Z2yu`nGtDD^fDܤnClgҦ=n^i2hƫ DؑmQ* l/g_de"(LIW+7_ D#A0 a |ׂN8NirޯzmCd=AD~VxN]ES@ˍkZ4"D?mvN;^fm{AI n!FFбtn ;O|YFmqolA?NPlwC4[ :B">tuSi"lQ(Rzv.幣iА!". mDH5(QB j G(UC] ϓZC)e*rV>ABӕ6۳tKbk2*rfN:qF1.bY$.m)d,D녻ҳ#H[pJ"Q1"s 6Hc/5z9`'3hKLv腢&Ҁ%O4t]?ұ3 KsFD#Yn-Q'u>m/fOȄH'RTm~IBᄁJ}xr.^)nte$1>p;Vn.PlhTx^WJ9%_X;:n6M{s_kk%+hqhIѠɧ )nMl2h|q#1!j n@$ Kq_7厇DzB24[MQ"!>†dd:R;iD.?:aB;'IG*/ HXnE/MVl)Є" P$5/w $ޞKw) M IƄ#)VyۏyHN>/ԍܸ8 QHcUYIqm1'$r"U(;hCLD6ŷl"1#DN\"-L5 \G0 Ɗ1`GaHƂd'%iD]hF|=;cQډ"/zޅR tjcpbc(VUҖQ<@VBۑ@ej[;1>Tж"rFޛNjȤ"jlp6-"@@D1]pBR[j[n-J6A"|ܴf< \yFE"E!z8q8˘J;#˖E.Z;i@({c`"dMC.R&GA>Z"YȃhĆԝtq@IM񍳂"ի+A"{耔GԖw0'}җZq?CnNB%Ti.)svLӸzel ܗ/?3*}êKyeK -,Pк2WUQT%T$L/zWJubwe|;6CtyKiIߒ4T4r[Ƅ׾⪨s]P(^s31S}UDJEN53*HW/mk w*{+}86t)'u%^2zk~\}=71sDY|Cz&I*LNEEDދגe^ q3$T- =F+rd|iߠ$2QUD\"Wf*o"nԿNExȢjlkv4CUL㸺>\ع_Ab|DPyzcMȓwR9vPiJ<+1N;G('DbRzCq 6 r~kp!@MoRid<ã!Hciϋz_{6"-JΕMDwm*}]64K/jCblۅF%T"b5!U2BtSjbQɱZv⡛.5;i]Ԉ߫Q(bM8 _5#1gu$./Opu&M@e)usUr`7]ۛBEⴷND'"En`NɏI ~1Sh\!p Eպ?Zy!hLZӋ""4A:4ȁHȈH.yP梵GH Cw5KuuTҽČ#ݨS\d(MH>B'"ReS$H)DKj DŽ 5sIօ-#/C_ʼnHDvU*015|bJ"#V6>-MOvʱ6""$eݽ4#& F8 iHRۺ]樉0-ۄyHy:iL.;\13AYn"/֬\[|[e^0߾^2 JWbqs͘wyUV\)00rJ"?Bڙ /CyvBȷc*#N1TNbDj17.:D3mNaUqȈ &Dm',qk N GD5ܸ&L%"e㮖fxJY"qt"=^1WLQLKhZl2%˴GRھl8MeOKtF*UY]E.Mʌ^V6fó.Q檞ϑ$U}Yݘ̵$`F[|U#kرz 7b3NշIhi8뮞$DRb_J\""OPiT-!t-[y56D.- Jۍ@c]R@ZZD@4V,Z-ݿaV$B&ZHFP`ŭ2tHޏٕK|ễ]}چ7^#!yҞFDF.b?Fj"=F#T⸅Lvnj0)n7L!ȼQA] DE.ضbۮm8nL~\[v]pF) SWhC84MttD~J07@d%d"^W&EeTǚV-\˄R5c|yк<ďTnɲ' v!0`'u2!=*.L$d%ջE6OGPKWthfDsn@}DV$$nŦ(Gwҧ[Ojt#D;KLūMpScTDvԙip`q GTJR DM:517kl÷1Nemۻޥqx]:#ϗ1wz=5-םDhF2/M:N$2 Ktp#"D T۹& xj+f!yeR63&HHĊx@lDrB7Zr15dۭ b锹yjp/p |Ud>!4BQ!C#NqDDFB%(S\(G_6'#^*2f.6o$S81e}QYN"qw*خϲ2T$ %ܫܾDUENdΩ٪Qfypϻ?mL6 m;Q> %DU-ؖkj`$.\x~Z,=ݢ rpܩςAhH,Urʼ& vпew*wv*:E^)^5Gnje&y"υ(2_\ꔺ+LQU84&1LT2QÇa,ȇOƕ˜u,eOk{6ݾ#o W2l!BWԿB8$/+5\* \g)q}7{~OzET⊿-S^}=Uy[lޜ*?zdr)fxs/ΈmI2ÌUu=WX~rD1*"Srٸw'䮳>:`8'!6!/*yZeo rkwOcR-T.࿋:˹[hީuQ .Is_]BbdiN&h3kaq0-iNy}QyvE!!ѕLޡ 1_Cj;FDhl):Et$fweţ`P EЌ)e")J2X) n~񦓢DQr rJXv۞yhLHwHzJ/صm.cUVXΉmDd#\?;HDk4枻fJL4DFD`>)D1*!e .q v^ikS<%.b-ĉ ל}2_ ߃8d4⦲jBE'."&DEޫNQWMiړ?⠜q@_(RfB ьF[J`\ 9O!Ʈ,j6DDԈMܐR""3hkD1!Í!7΢RFRVD1. ĄD ݷᩯ-BZ'9P-']mtվA bCoU24fM){M:82 .n^oѡG.j )J<H"q"-yR4Y#hHJDRktgԵRhu'ԝ DzjNݿ[6 %#TU%e)6똚szvKpvKݕ o}{'ULGkKJGpjݻJ IȕcFKh߹&؎:Wv,:j㨂x/ևXX1#"|CUNN& q$*jF N1ǽ~'q NWWVv  j/E-# uu~]B"[sUSh[2b$Љ4Ċ LCQ5b_VޤJB"Cշu>\H2ݦ.y(}3>$ˤ\=_,-1&)oOrF89$6R2@$DMP˪xȺ1rC(:$^HDGݡ| )"nN2!O,J}oecިHWQXXCEQR(#+m5[Q(hExDelғlڄJ[oաt2Pƈ#eC'P7QtO;pDEڄLh[!^Qpdl]E>lv؋\ !CJEBFCt m2ņ'.nQ>^m!)X\ۅ7QDOz{R?@f~lOGLrJkgn>b:{ȏCQ;ApmmBo6ꅷJIJ[ݕMtgui~"#~27m KpKmnnqRƫCD_RI.(IMUD^N5DA\EhFGȘygƵ"*<λ0+\?!.j%u,v0R$d%+/ S3N)>I\T=}yg?u}ޝ"'R__ua1G]);?X>+2B?X7V7ΪZ35:ygLfݵmȫVvˇ"gj״@"/?edx:hYoz܎q%LRUmW/eioqPHjJՙUK<{nzUv)4K0DTúR<?]FXDO뭽FgQ[o&i2VW0ė2ϻPo896G}jܽ#<T˅=IQRrweY˻]5UTET⵳@DUE,^<>ERv-,⪑2>e8Sx'(Y(rGN1Y 戙"wq SSr@])%˅Y?)>(^fJpiDU"?{9dȩh۲$2EU&E։[)ݕN/,QsI5?ꩱ9(./_jl>){ĉEypˇB**'Ц1zવ.jƥ5~*>j(TT%;4Q8_xdy̫T_VjRYR)i۔Nʎ|׏-B$$#;v|Z[DZ|6(K?6LʞJJ|C÷48Cf$;H^"T;|ST>G-÷yLnvt.`Nx QА ce6Ej4PD ]' \*DYehɞK<пp6ΓBf"4;Ji1]Q`\ 1JN.ӄdD2 ;QcJ"$<zamX.nt D;"6"ݗ-TQz&*D,iR)TjlE2}uH%l؇-J2t\#e"t`˶BTj/({*cmd%E ;i=2[#"U"|*HohiT皑(BsnP9 5%j"IsIx&[irs5G(m|"$ >-S#)=BEiw>*YX$BE)xtGljR0-э6;.Xu&`eh L`xjm7GP"==1alEED^8 D\ĵTHu4FQ19xd*`Hf&#C⪥[.s1'"˷T}^i"_F+&㴀ȇ5BpR*UFݫ[|c Knͫ6\ Kh_:EYp{|S%UwW"}?%T-dc^':ETNT~0nG=]hUPk6J$.Y-k;;$GP '=k:xׂgc[[,P[(Q\]׎busd"R!@:n4"Q揇M-n8˘u=UQ=[z$;y)sna7TTd[-$hmݻ--Ln&Qx!jHxDJ#j "G#(z$#^2ț]p] Kr#B>Y@*gsEd;"˖Ar"-ܻfݶ+2-!C\Ǐ2-oST=7KT6ODeڲ@˭F[ywn uulGzi( EȆ1e h=T+Ęh;@Di$N""T-2c/Om.LD}Eͨ9 Mj,c]1HDeRz$ȣ*HٷvrG[1hDc.^9RTr`S =RC[aCjq{ & *Bt2Yq#"rjDA[e&%DXYv'JDD$E;jQtEoqmH.!ݍ6-}KvޢX;}]2HH">Q%OQ"6AK0G[cpu'bD: x4ɴ$'\i.dB$E[7)ێN[/zD&'('LA Hb;D mŠBC. ~mV9t?:{(<yiB|_`M- kD"L|Z$ki?j-EKrcM\;%WuV@Bp".Rh' .hʖ%xw 6u!-n!&;e-isl  ٯy~؈L#.aP}!ḥ張 &x0v1BEz5` 5hG͌h+aj!)=!#D6D;=#CC2S6Cpye(4v>\Kޚgp+Q"*lmz͓,ɜS5L$gR"Ӆ"|Uacl5hin*gEOOñQZ%[kp3/x6dDvɆPBɃn$r*y{6m})ȍDC(Sd´;M݂;}C]8,Vv} ])$|pxd8p.dj\.ؗU+n{̈́JmC<6msr$NeB]IƁD^|{IhuGۘ".B1t~N4꤭GPbДdcDn4dBC(Dj'I`pٙu !U 4 4D3) ܴ҄C1fF# Hv* [ubm 1˓B#-CmlDBQ-їM0WkM8R JZi>R)[D4;",>V@%mKT"ўwї6N[t\"*cI|#ѡ})!.X3wI!pϜeVF1p$l;脝-!U>(dE!jayԷuMTI;v"PnPh|C7A:/x]R2ǫՙWn"\CbDHb#-B6Ŧűѕ(HD"RLM0E6\WNaX(d֗Uf\WgnMAWbjM9drZb]l>&3zTQ\O'W*s-c0D`2UTdLd>⋕p+SLS.a8N?Tx"/zw ֔q۷P|vYa=ë*]U;*>uste Ëܼ5Ԡ2@㹊53k[hq3jC;,iuT#P0E2>J<YjRUَ!(Ж'K[qvq 4R(j˸J91LDenMt;Ѯ! 7E<#$DOzQ/{mfͩHI=Z&R)DBm-a!cSi6cLG5fP {PH DFDUtiքb?:U "L?fiG\ܵQ!hZPiģ:6!el]rFA˛i 2V @$;GmA7$D[h;FvQF[Q1 (eLQ1kOTHH7ce!f"0P\[$DFD$!iAذE(h 5w]0pϘDi`MiFC ܑ>z!tD6e53 ir8r2vHYGhB@\P7c#7lDB"01H@[vDxQp]UZ,.ՓGmJLNۛؐUPg AhJQ(ۋqEU NM&*\xl{|P;j?5slH]JBDHn'9m7"unfr[ `,ҴiJ2/^و##ycCۓ8_V4kv$B&<) zGsnclӜẲ~Ѧ]8MI--Q=n`bF-5##!;Ge(tw9yKQ&"Q'%腭/ ]$H8e?E˪M,Ij 6[%Q:wCDneW2ALS%²-"P͜m&ȢA/hwI4Jh, ̜'bD`?j H%'$\K@3|W.9 2TLl:"N5%f3pN w}lzR(._IҢniS"pJq啘ى27 qj-*ͲM/ F4m) >oUH4B.4#".Rdql lDD/W-6DI>HU+!#"7-ۦDЏV߆snFbW|FNz]{Љ8m:А5␖zmҹшG5Or2#yk".R5 \Oo#1m=4Z!oly:wT@@R3[VL&CRYN:Ӯn8ĹFlBQKŐ}W!X" sT $d;|CƁ% mzHLڸWlhh4Kk\Q,GD;(5;nKy#uW>nך>m.Q%h$NL̊%͢&n1#-WshD}ؔeVu LsG2%[A zHb#-ٴDD"8?1(7 nz_(,i^hd3 %M bep0t ssU9)c"^]!"R\o.gc$EKu-EkϺm:aZAEO)F Ġ#(^5rL6_E^۹pbB64^a1u9HGD|E+Y[9.xHz2Hל]$"%o?[^؋ gkUlw qs'(⊟luS$\O[cFI-X;Fq-FĐ4-RD\sΑ59dY"^̩##zcSԙ%;8**%pJ=W S St.F5S/U=&TX**'?- *"gR#EU(l8. RT􈊫Q{-KW"i`*Xg=oD\EUL=u,V*UAqN w7fQ%w4x:Z(^f7Άrgߐ.YTj pL";.{ּrtEETDχRpATN5GL4ܜ8|^"DN9ˊOx ]$~L4Sl~/戢Ynݝ*w&I(RqUsA$2∔-b*&It]̑O.U).|{^nZ\~RU=eýkD ނ`"DZ} e5T/\$Nh7dY/ JA(%,2ˇqTNN?5@Q^OxJ|!QQsENjERg,^9w滳^4-ܵhx*}\oQ.FyUkܳ^vh"0 2(h&*"Ty4^ &yrqRMU2UxTIDʤs5\;.*% ܦ~H)?//;o.e!κ/nP/e@7) zQ@"iD[vL.)F0c嶥B^!#zU="FLDT;<%E[3eJ2lb[F!nhPb%iUNuE!k5bz]DH]"sP0&BR- sblq(|;eS6d-k"$AN6̉8:b;KźȱJ#g٦ċa.ڎJM9-8;c3.DX?DEO-OfhGL5T#dͱ^NDЌZځh2"/* pz`D!zmɁǘ<1WV`Pm~QB 𖻰#2H4vr#u-6QpEܖARff[y*Xr.I>@B>kwD/-9;6o>YKDc("MFP#[vDc؈4i2jAЈ]41)) YaeL2)Tb4:dE"'d-B ;eS^;F@m  vȄlŲTHE;_tZhDDB;ja;rmԐǤmf)#lj"Rnż(R [ꈠlB\[a5n>dDs锨Bl)r֧۲m ;@!*g ]m /0ll6F"%޲Vř|ʽ95Jb\\S6n[⢭add^R VFC9Ȍ]7n5c2/k¶8. 5ap5o.#"t]"|C51O4h ȹjw H]tᠭD?M [BԮ?xD7"#w|?FQhn:WODy~m f8D"TD ƉCx$) O̜@8 txDRBDH N4#EGQ bZC2U~[" 2P~hDģ! B2 (׻Hc!"@ԓ"DXQM|*U{f{\qr4VEu x:I5Q2JZ#\US\HG)/xRK,xî!yH*U&X8L>mXܮ"}>LRu*H[e%HT_$D Q?Ǘ#0NdVlQԔR6BREN Q3JlX?BqQ;LyԂRO{>(2D@ύU8JNyRMLJ߸*);Je qQ8.!pBJ$isrm T&IkaOږc&K' TCd- we^H"˿.5M"RD^RWhj,V\UV3jvb*-*UCd3-brush-1.0.4/img/snapping.png000066400000000000000000000217311306056644500162610ustar00rootroot00000000000000PNG  IHDR}^ iCCPICC ProfileHT̤Z #k(ҫ@%@P+ ,E\"kAD(v .l ;wwo{\a lQ'#6. @zT3׿mt4S<7)r"7)4sl.]-(+Q.b4i>&2 (lw4: ʖ._-ʮ6:22N!o55l,a:{[9tРçC׬6miCfϝiSQ3a.;piQ3>fEΰhi }~~KIY>3epnJd pVZD/i^$,cFlo\)=J&yH(xa0=tt?i>+'Bl6f8:['T>pO+TBd3PA @bh*R~NCPtF7g)"sa&‘"g¹p .+p3|<ma"^H$#"d R#H҆t!7 ahDa8LVL)ӌ b0߰T:eac<2l>[m^`q8gspF\;7*xS >gGaGE& B10B N"XEl# 'H$C )JZO*!5.ޒd#9'#ɟ( e!ELFSQRT;5MF^>~XȰd2kedee^ee=d˞!R(g %ǖ[#W&wZܸD>C~  > \< hME6ҪhhÊ8ECEbb11%%[hJeJg$tn@g'h4g˜9s>()+')(7*(VaTiQyQ5Q S]z@K5E5g5Z 갺zJ~B}5^j55S5wkբijvkzPbx0%NƘXBG{BP'JgN#].S7Ywn^*zD}~^.1 Z * s Q܌2*n㌙i{M`;2)tiL`Vivǜbac^o>hA`bj;vfignYeJ*jUkku-ZV׶Il6u}w7؏:9$8;a*2C[Wk8~rwv:sg %ͫ7vp2\\JܴnnOuݹ#G=^yZz<.^vrr&+i%f%ge*UW X]Zcڼծ'O[ Emؖ.oeEw69o:g͖}[p Z~zGK~ܖg;p;;ntY[$_[4+xWn,sض^^^IIPI>};})M)(,k,W/Ra?w 5|n_EsAeaO~bTWZ]XFP# s;~d{=\/=h1c ~}"DIɆSʛhMP汖Ik\kmmMXRsFLYϑ坛<{~]Pǒc/ xe<_qrטZ_onצ7Z{{wp[[ݎ};ܻ{}?ău =*~7%ރO"< =/yOOGFY?;3;|/ѫS=;6Zzַ*okپ>ć*k?1?u}<2 KWm=̘EVANNM 8;@MOBK;QB=4Q)K`iCY6ӵ(~| ɉ_fО9ŧCPc[s W"LBOYiTXtXML:com.adobe.xmp 960 500 2GIDATx1Ti9[9[`uIne*HG:p+StNSҙ4v J6:@$:Ig'Ɨ?//?c殯` @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@ ~VjQ3=僧?'rO]Bߟ++ _M/O$Vkrc,//{}4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4h @@4L|'|Qc??hك-ϳx~'dx @@̭׬\tKduqK,eGj\;i:A"nvğjR$3KKؗ~Uēxf V'+aܻ/n>ڋOvDkn%37n*x:cߵjvhzm&E|7V4ZoEbf1>/Kcÿ5 NɧcV"ң*|Fhl5yǞ9ٿ%XFYx݀f|ߎ ,x[*j7=S{z_,Ԇ;o݌z}{tj(}xcK&inlуt}pca~?F0|3d ;FLBa5Յg^6/ vjs/ p/99s& ;sr|ç‹ڤsg ,{{ 2s[w֋z H77= <<>NE/v'n(H|Ӈf'{ A^ Kp5w nF.%hzv}b*\u_Y Aڝm}1hy7LQ:}ӫAљ+ׇ{)>tpk _ލzd3_4*fS7S?vފK99 ndGk<[*W C6?{$7 <&?|E_=x_,95a oI>7G趙s2{[w쏳~NU;|vt> ͫY<'wNwϰ^,'lt~NGgv?sAv>z;|վ:?lO!,褾*G;yjw/[W> 5ݯ>Nvy;{~m?1xmyhMDϭ{}ތT7xfkGᫀݫ6C{3-׋:T)Aq70Zm?e;K'ڟR>WFv({87m~єg޾0읗;?O4vLUT2U?v(9GA8x֙#m`{7Nw/i+t`/<Y>'wSÀ}&Pqʏm>'?=?9ysE/)73vN?~s/¯Q]֛/{Fg18+\B~WXJpc}Bbw;ovm-H$ӹ`.K.&jzJĝT e-:֫Ͽq|}9?Y *˯^w .;q!@dS<z"h =9h14Z`n-Kխx,(8ݺo|_n)_ٚ~mtx?Zr,jÍLg)=h\\Ysx:r99lz}ZvN)q:Vj-638'ߌ΋ևӥdXR@j|q'{[~ ^Jݻ'$VWxm˅ރ{p2Rkk}k||2X2y(Om/fי[KOpM}tY̬lW/Ftg՛R/\ɏ&xijn΂ŠvzZ$ҫ;Y՛m}(m/^/W'|e+_ Jr)Qnl7W YxHխ֙F=^diꤋťQR9v§~s-\4'nvda%~z]IǗF}X*LA{~?L$I5d<ծW3Ty5Wm?'޷ޗs/OWӥĴot;֯~17,8{9xΗAP@*~_(ճg?^DL4z+ɬ]KF B!Xx[떃^oz? wl>37r-|=K'_vic1zS^EtwA;}꿇xlVmvZ%ȇ_p[Z{ebq]ˠwk3xf+V'dslso㗿/qz$㽝OpRә,XY Ciƭ~lvJ?m,%ŕs{bj8ew[R%ZixÏUܛ 4ȝ_7o6^$+F)Pkaz"\\67u_uNc6 'm}7Ssr˞{t)ݎ.I?/>Bl{7' WRe^nWЭBDo^_B_ ZatYnx[(}O;T/ۿ$W0z4sj$7ftV;;66\h @EA=yr^gz0]]5{}R®|m3^>mwN.8V[ d{;'7'鼇o{я.|4 ?q 7sSs]zo}*\厪t sotZAc?l$h]?h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  4hF4h @@h @@m @@  OIENDB`d3-brush-1.0.4/index.js000066400000000000000000000001301306056644500146130ustar00rootroot00000000000000export { default as brush, brushX, brushY, brushSelection } from "./src/brush"; d3-brush-1.0.4/package.json000066400000000000000000000031531306056644500154440ustar00rootroot00000000000000{ "name": "d3-brush", "version": "1.0.4", "description": "Select a one- or two-dimensional region using the mouse or touch.", "keywords": [ "d3", "d3-module", "brush", "interaction" ], "homepage": "https://d3js.org/d3-brush/", "license": "BSD-3-Clause", "author": { "name": "Mike Bostock", "url": "http://bost.ocks.org/mike" }, "main": "build/d3-brush.js", "module": "index", "jsnext:main": "index", "repository": { "type": "git", "url": "https://github.com/d3/d3-brush.git" }, "scripts": { "pretest": "rm -rf build && mkdir build && rollup --banner \"$(preamble)\" -g d3-dispatch:d3,d3-drag:d3,d3-interpolate:d3,d3-selection:d3,d3-transition:d3 -f umd -n d3 -o build/d3-brush.js -- index.js", "test": "tape 'test/**/*-test.js' && eslint index.js src", "prepublish": "npm run test && uglifyjs --preamble \"$(preamble)\" build/d3-brush.js -c -m -o build/d3-brush.min.js", "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3-brush/build/d3-brush.js d3-brush.v1.js && cp ../d3-brush/build/d3-brush.min.js d3-brush.v1.min.js && git add d3-brush.v1.js d3-brush.v1.min.js && git commit -m \"d3-brush ${npm_package_version}\" && git push && cd - && zip -j build/d3-brush.zip -- LICENSE README.md build/d3-brush.js build/d3-brush.min.js" }, "dependencies": { "d3-dispatch": "1", "d3-drag": "1", "d3-interpolate": "1", "d3-selection": "1", "d3-transition": "1" }, "devDependencies": { "eslint": "3", "package-preamble": "0.0", "rollup": "0.41", "tape": "4", "uglify-js": "^2.8.11" } } d3-brush-1.0.4/src/000077500000000000000000000000001306056644500137435ustar00rootroot00000000000000d3-brush-1.0.4/src/brush.js000066400000000000000000000366421306056644500154370ustar00rootroot00000000000000import {dispatch} from "d3-dispatch"; import {dragDisable, dragEnable} from "d3-drag"; import {interpolate} from "d3-interpolate"; import {customEvent, event, mouse, select} from "d3-selection"; import {interrupt} from "d3-transition"; import constant from "./constant"; import BrushEvent from "./event"; import noevent, {nopropagation} from "./noevent"; var MODE_DRAG = {name: "drag"}, MODE_SPACE = {name: "space"}, MODE_HANDLE = {name: "handle"}, MODE_CENTER = {name: "center"}; var X = { name: "x", handles: ["e", "w"].map(type), input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; }, output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } }; var Y = { name: "y", handles: ["n", "s"].map(type), input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; }, output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } }; var XY = { name: "xy", handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type), input: function(xy) { return xy; }, output: function(xy) { return xy; } }; var cursors = { overlay: "crosshair", selection: "move", n: "ns-resize", e: "ew-resize", s: "ns-resize", w: "ew-resize", nw: "nwse-resize", ne: "nesw-resize", se: "nwse-resize", sw: "nesw-resize" }; var flipX = { e: "w", w: "e", nw: "ne", ne: "nw", se: "sw", sw: "se" }; var flipY = { n: "s", s: "n", nw: "sw", ne: "se", se: "ne", sw: "nw" }; var signsX = { overlay: +1, selection: +1, n: null, e: +1, s: null, w: -1, nw: -1, ne: +1, se: +1, sw: -1 }; var signsY = { overlay: +1, selection: +1, n: -1, e: null, s: +1, w: null, nw: -1, ne: -1, se: +1, sw: +1 }; function type(t) { return {type: t}; } // Ignore right-click, since that should open the context menu. function defaultFilter() { return !event.button; } function defaultExtent() { var svg = this.ownerSVGElement || this; return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; } // Like d3.local, but with the name “__brush” rather than auto-generated. function local(node) { while (!node.__brush) if (!(node = node.parentNode)) return; return node.__brush; } function empty(extent) { return extent[0][0] === extent[1][0] || extent[0][1] === extent[1][1]; } export function brushSelection(node) { var state = node.__brush; return state ? state.dim.output(state.selection) : null; } export function brushX() { return brush(X); } export function brushY() { return brush(Y); } export default function() { return brush(XY); } function brush(dim) { var extent = defaultExtent, filter = defaultFilter, listeners = dispatch(brush, "start", "brush", "end"), handleSize = 6, touchending; function brush(group) { var overlay = group .property("__brush", initialize) .selectAll(".overlay") .data([type("overlay")]); overlay.enter().append("rect") .attr("class", "overlay") .attr("pointer-events", "all") .attr("cursor", cursors.overlay) .merge(overlay) .each(function() { var extent = local(this).extent; select(this) .attr("x", extent[0][0]) .attr("y", extent[0][1]) .attr("width", extent[1][0] - extent[0][0]) .attr("height", extent[1][1] - extent[0][1]); }); group.selectAll(".selection") .data([type("selection")]) .enter().append("rect") .attr("class", "selection") .attr("cursor", cursors.selection) .attr("fill", "#777") .attr("fill-opacity", 0.3) .attr("stroke", "#fff") .attr("shape-rendering", "crispEdges"); var handle = group.selectAll(".handle") .data(dim.handles, function(d) { return d.type; }); handle.exit().remove(); handle.enter().append("rect") .attr("class", function(d) { return "handle handle--" + d.type; }) .attr("cursor", function(d) { return cursors[d.type]; }); group .each(redraw) .attr("fill", "none") .attr("pointer-events", "all") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") .on("mousedown.brush touchstart.brush", started); } brush.move = function(group, selection) { if (group.selection) { group .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) .tween("brush", function() { var that = this, state = that.__brush, emit = emitter(that, arguments), selection0 = state.selection, selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), i = interpolate(selection0, selection1); function tween(t) { state.selection = t === 1 && empty(selection1) ? null : i(t); redraw.call(that); emit.brush(); } return selection0 && selection1 ? tween : tween(1); }); } else { group .each(function() { var that = this, args = arguments, state = that.__brush, selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), emit = emitter(that, args).beforestart(); interrupt(that); state.selection = selection1 == null || empty(selection1) ? null : selection1; redraw.call(that); emit.start().brush().end(); }); } }; function redraw() { var group = select(this), selection = local(this).selection; if (selection) { group.selectAll(".selection") .style("display", null) .attr("x", selection[0][0]) .attr("y", selection[0][1]) .attr("width", selection[1][0] - selection[0][0]) .attr("height", selection[1][1] - selection[0][1]); group.selectAll(".handle") .style("display", null) .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); } else { group.selectAll(".selection,.handle") .style("display", "none") .attr("x", null) .attr("y", null) .attr("width", null) .attr("height", null); } } function emitter(that, args) { return that.__brush.emitter || new Emitter(that, args); } function Emitter(that, args) { this.that = that; this.args = args; this.state = that.__brush; this.active = 0; } Emitter.prototype = { beforestart: function() { if (++this.active === 1) this.state.emitter = this, this.starting = true; return this; }, start: function() { if (this.starting) this.starting = false, this.emit("start"); return this; }, brush: function() { this.emit("brush"); return this; }, end: function() { if (--this.active === 0) delete this.state.emitter, this.emit("end"); return this; }, emit: function(type) { customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); } }; function started() { if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent(); } else if (touchending) return; if (!filter.apply(this, arguments)) return; var that = this, type = event.target.__data__.type, mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE), signX = dim === Y ? null : signsX[type], signY = dim === X ? null : signsY[type], state = local(that), extent = state.extent, selection = state.selection, W = extent[0][0], w0, w1, N = extent[0][1], n0, n1, E = extent[1][0], e0, e1, S = extent[1][1], s0, s1, dx, dy, moving, shifting = signX && signY && event.shiftKey, lockX, lockY, point0 = mouse(that), point = point0, emit = emitter(that, arguments).beforestart(); if (type === "overlay") { state.selection = selection = [ [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] ]; } else { w0 = selection[0][0]; n0 = selection[0][1]; e0 = selection[1][0]; s0 = selection[1][1]; } w1 = w0; n1 = n0; e1 = e0; s1 = s0; var group = select(that) .attr("pointer-events", "none"); var overlay = group.selectAll(".overlay") .attr("cursor", cursors[type]); if (event.touches) { group .on("touchmove.brush", moved, true) .on("touchend.brush touchcancel.brush", ended, true); } else { var view = select(event.view) .on("keydown.brush", keydowned, true) .on("keyup.brush", keyupped, true) .on("mousemove.brush", moved, true) .on("mouseup.brush", ended, true); dragDisable(event.view); } nopropagation(); interrupt(that); redraw.call(that); emit.start(); function moved() { var point1 = mouse(that); if (shifting && !lockX && !lockY) { if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; else lockX = true; } point = point1; moving = true; noevent(); move(); } function move() { var t; dx = point[0] - point0[0]; dy = point[1] - point0[1]; switch (mode) { case MODE_SPACE: case MODE_DRAG: { if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; break; } case MODE_HANDLE: { if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; break; } case MODE_CENTER: { if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); break; } } if (e1 < w1) { signX *= -1; t = w0, w0 = e0, e0 = t; t = w1, w1 = e1, e1 = t; if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); } if (s1 < n1) { signY *= -1; t = n0, n0 = s0, s0 = t; t = n1, n1 = s1, s1 = t; if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); } if (state.selection) selection = state.selection; // May be set by brush.move! if (lockX) w1 = selection[0][0], e1 = selection[1][0]; if (lockY) n1 = selection[0][1], s1 = selection[1][1]; if (selection[0][0] !== w1 || selection[0][1] !== n1 || selection[1][0] !== e1 || selection[1][1] !== s1) { state.selection = [[w1, n1], [e1, s1]]; redraw.call(that); emit.brush(); } } function ended() { nopropagation(); if (event.touches) { if (event.touches.length) return; if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! group.on("touchmove.brush touchend.brush touchcancel.brush", null); } else { dragEnable(event.view, moving); view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); } group.attr("pointer-events", "all"); overlay.attr("cursor", cursors.overlay); if (state.selection) selection = state.selection; // May be set by brush.move (on start)! if (empty(selection)) state.selection = null, redraw.call(that); emit.end(); } function keydowned() { switch (event.keyCode) { case 16: { // SHIFT shifting = signX && signY; break; } case 18: { // ALT if (mode === MODE_HANDLE) { if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; mode = MODE_CENTER; move(); } break; } case 32: { // SPACE; takes priority over ALT if (mode === MODE_HANDLE || mode === MODE_CENTER) { if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; mode = MODE_SPACE; overlay.attr("cursor", cursors.selection); move(); } break; } default: return; } noevent(); } function keyupped() { switch (event.keyCode) { case 16: { // SHIFT if (shifting) { lockX = lockY = shifting = false; move(); } break; } case 18: { // ALT if (mode === MODE_CENTER) { if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; mode = MODE_HANDLE; move(); } break; } case 32: { // SPACE if (mode === MODE_SPACE) { if (event.altKey) { if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; mode = MODE_CENTER; } else { if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; mode = MODE_HANDLE; } overlay.attr("cursor", cursors[type]); move(); } break; } default: return; } noevent(); } } function initialize() { var state = this.__brush || {selection: null}; state.extent = extent.apply(this, arguments); state.dim = dim; return state; } brush.extent = function(_) { return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent; }; brush.filter = function(_) { return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; }; brush.handleSize = function(_) { return arguments.length ? (handleSize = +_, brush) : handleSize; }; brush.on = function() { var value = listeners.on.apply(listeners, arguments); return value === listeners ? brush : value; }; return brush; } d3-brush-1.0.4/src/constant.js000066400000000000000000000001101306056644500161220ustar00rootroot00000000000000export default function(x) { return function() { return x; }; } d3-brush-1.0.4/src/event.js000066400000000000000000000001771306056644500154270ustar00rootroot00000000000000export default function(target, type, selection) { this.target = target; this.type = type; this.selection = selection; } d3-brush-1.0.4/src/noevent.js000066400000000000000000000003121306056644500157530ustar00rootroot00000000000000import {event} from "d3-selection"; export function nopropagation() { event.stopImmediatePropagation(); } export default function() { event.preventDefault(); event.stopImmediatePropagation(); }