From 81c0c4329be2ef86b0f74e53d2d929aee22f5433 Mon Sep 17 00:00:00 2001
From: josdejong coming soon...
+ Vis.js comes with a flexible DataSet, which can be used to hold and
+ manipulate unstructured data and listen for changes in the data.
+ The DataSet is key/value based. Data items can be added, updated and
+ removed from the DatSet, and one can subscribe to changes in the DataSet.
+ The data in the DataSet can be filtered and ordered, and fields (like
+ dates) can be converted to a specific type. Data can be normalized when
+ appending it to the DataSet as well.
+
+ The following example shows how to use a DataSet.
+
+ A DataSet can be constructed as:
+
+ After construction, data can be added to the DataSet using the methods
+
+ The parameter
+ The data in a DataSet can be manipulated using the methods
+
+ Add a data item or an array with items.
+
+ After the items are added to the DataSet, the DataSet will
+ trigger an event
+ The method will throw an Error when an item with the same id
+ as any of the added items already exists.
+
+ Update a data item or an array with items.
+
+ The provided properties will be merged in the existing item.
+ When an item does not exist, it will be created.
+
+ After the items are updated, the DataSet will
+ trigger an event
+ Remove a data item or an array with items.
+
+ The argument
+ The method ignores removal of non-existing items, and returns an array
+ containing the ids of the items which are actually removed from the
+ DataSet.
+
+ After the items are removed, the DataSet will
+ trigger an event
+ Clear the complete DataSet.
+
+ After the items are removed, the DataSet will
+ trigger an event
+ Data can be retrieved from the DataSet using the method A single item can be retrieved by its id: A selection of items can be retrieved by providing an array with ids: All items can be retrieved by simply calling
+ Items can be filtered on specific properties by providing a filter
+ function. A filter function is executed for each of the items in the
+ DataSet, and is called with the item as parameter. The function must
+ return a boolean. All items for which the filter function returns
+ true will be emitted.
+
+ The DataSet contains functionality to format data retrieved via the
+ method
+ Where
+ The following example demonstrates formatting properties and filtering
+ properties from items.
+
+ DataSet supports the following data types:
+
+ One can subscribe on changes in a DataSet.
+ A subscription can be created using the method
+ Subscribe to an event.
+
+ Unsubscribe from an event.
+
+ The following events are available for subscription:
+
+ The callback functions of subscribers are called with the following
+ parameters:
+
+ where the parameters are defined as
+
+ All code and data is processed and rendered in the browser.
+ No data is sent to any server.
+
+ A DataView offers a filtered and/or formatted view on a
+ DataSet.
+ One can subscribe on changes in a DataView, and easily get filtered or
+ formatted data without having to specify filters and field types all
+ the time.
+
+ The following example shows how to use a DataView.
+
+ A DataView can be constructed as:
+
+ where:
+
+ Data of the DataView can be retrieved using the method
+ Data of a DataView can be filtered and formatted again, in exactly the
+ same way as in a DataSet. See sections
+ Data Filtering and
+ Data Formatting for more
+ information.
+
+ One can subscribe on changes in the DataView. Subscription works exactly
+ the same as for DataSets. See the documentation on
+ subscriptions in a DataSet
+ for more information.
+
+ All code and data is processed and rendered in the browser.
+ No data is sent to any server.
+ DataSet documentation
- Contents
+
+
+
+
+ Overview
+
+ Example
+
+
+// create a DataSet
+var options = {};
+var data = new vis.DataSet(options);
+
+// add items
+// note that the data items can contain different properties and data formats
+data.add([
+ {id: 1, text: 'item 1', date: new Date(2013, 6, 20), group: 1, first: true},
+ {id: 2, text: 'item 2', date: '2013-06-23', group: 2},
+ {id: 3, text: 'item 3', date: '2013-06-25', group: 2},
+ {id: 4, text: 'item 4'}
+]);
+
+// subscribe to any change in the DataSet
+data.subscribe('*', function (event, params, senderId) {
+ console.log('event', event, params);
+});
+
+// update an existing item
+data.update({id: 2, group: 1});
+
+// remove an item
+data.remove(4);
+
+// get all ids
+var ids = data.getIds();
+console.log('ids', ids);
+
+// get a specific item
+var item1 = data.get(1);
+console.log('item1', item1);
+
+// retrieve a filtered subset of the data
+var items = data.get({
+ filter: function (item) {
+ return item.group == 1;
+ }
+});
+console.log('filtered items', items);
+
+// retrieve formatted items
+var items = data.get({
+ fields: ['id', 'date'],
+ convert: {
+ date: 'ISODate'
+ }
+});
+console.log('formatted items', items);
+
+
+
+
+ Construction
+
+
+var data = new vis.DataSet(options)
+
+
+ add
and update
, as described in section
+ Data Manipulation.
+ options
is optional and is an object which can
+ contain the following properties:
+
+
+
+
+
+
+ Name
+ Type
+ Default value
+ Description
+
+
+ fieldId
+ String
+ "id"
+
+ The name of the field containing the id of the items.
+
+ When data is fetched from a server which uses some specific
+ field to identify items, this field name can be specified
+ in the DataSet using the option
+ fieldId
.
+ For example CouchDB uses the field
+ "_id"
to identify documents.
+
+
+ convert
+ Object.<String, String>
+ none
+
+ An object containing field names as key, and data types as
+ value. By default, the type of the properties of items are left
+ unchanged. Item properties can be normalized by specifying a
+ field type. This is useful for example to automatically convert
+ stringified dates coming from a server into JavaScript Date
+ objects. The available data types are listed in section
+ Data Types.
+
+ Data Manipulation
+
+ add
,
+ update
,
+ and remove
.
+ The DataSet can be emptied using the method
+ clear
.
+
+// create a DataSet
+var data = new vis.DataSet();
+
+// add items
+data.add([
+ {id: 1, text: 'item 1'},
+ {id: 2, text: 'item 2'},
+ {id: 3, text: 'item 3'}
+]);
+
+// update an item
+data.update({id: 2, text: 'item 2 (updated)'});
+
+// remove an item
+data.remove(3);
+
+
+ Add
+
+ var addedIds = DataSet.add(data [, senderId])
+
+ The argument data
can contain:
+
+
+
+ Object
containing a single item to be
+ added. The item must contain an id.
+ Array
or
+ google.visualization.DataTable
containing
+ a list with items to be added. Each item must contain
+ an id.
+ add
. When a senderId
+ is provided, this id will be passed with the triggered
+ event to all subscribers.
+ Update
+
+ var updatedIds = DataSet.update(data [, senderId])
+
+ The argument data
can contain:
+
+
+
+ Object
containing a single item to be
+ updated. The item must contain an id.
+ Array
or
+ google.visualization.DataTable
containing
+ a list with items to be updated. Each item must contain
+ an id.
+ add
for the added items, and
+ an event update
. When a senderId
+ is provided, this id will be passed with the triggered
+ event to all subscribers.
+ Remove
+
+ var removedIds = DataSet.remove(id [, senderId])
+
+ id
can be:
+
+
+
+ Number
or String
containing the id
+ of a single item to be removed.
+ Object
containing the item to be deleted.
+ The item will be deleted by its id.
+ remove
for the removed items.
+ When a senderId
is provided, this id will be passed with
+ the triggered event to all subscribers.
+ Clear
+
+ var removedIds = DataSet.clear([senderId])
+
+ remove
for all removed items.
+ When a senderId
is provided, this id will be passed with
+ the triggered event to all subscribers.
+ Data Filtering
+
+ get
.
+ This method can return a single item or a list with items.
+
+var item1 = dataset.get(1);
+
+
+
+var items = dataset.get([1, 3, 4]); // retrieve items 1, 3, and 4
+
+
+ get
without
+ specifying an id:
+var items = dataset.get(); // retrieve all items
+
+
+
+// retrieve all items having a property group with value 2
+var group2 = dataset.get({
+ filter: function (item) {
+ return (item.group == 2);
+ }
+});
+
+// retrieve all items having a property balance with a value above zero
+var positiveBalance = dataset.get({
+ filter: function (item) {
+ return (item.balance > 0);
+ }
+});
+
+
+
+
+ Data Formatting
+
+ get
. The method get
has the following
+ syntax:
+
+var item = DataSet.get(id, options); // retrieve a single item
+var items = DataSet.get(ids, options); // retrieve a selection of items
+var items = DataSet.get(options); // retrieve all items or a filtered set
+
+
+ options
is an Object which can have the following
+ properties:
+
+
+
+
+
+
+ Name
+ Type
+ Description
+
+
+
+ fields
+ String[ ]
+
+ An array with field names.
+ By default, all properties of the items are emitted.
+ When
+ fields
is defined, only the properties
+ whose name is specified in fields
will be included
+ in the returned items.
+
+
+
+ convert
+ Object.<String, String>
+
+ An object containing field names as key, and data types as value.
+ By default, the type of the properties of an item are left
+ unchanged. When a field type is specified, this field in the
+ items will be converted to the specified type. This can be used
+ for example to convert ISO strings containing a date to a
+ JavaScript Date object, or convert strings to numbers or vice
+ versa. The available data types are listed in section
+ Data Types.
+
+
+
+ filter
+ function
+ Items can be filtered on specific properties by providing a filter
+ function. A filter function is executed for each of the items in the
+ DataSet, and is called with the item as parameter. The function must
+ return a boolean. All items for which the filter function returns
+ true will be emitted.
+ See section Data Filtering.
+
+// create a DataSet
+var data = new vis.DataSet();
+data.add([
+ {id: 1, text: 'item 1', date: '2013-06-20', group: 1, first: true},
+ {id: 2, text: 'item 2', date: '2013-06-23', group: 2},
+ {id: 3, text: 'item 3', date: '2013-06-25', group: 2},
+ {id: 4, text: 'item 4'}
+]);
+
+// retrieve formatted items
+var items = data.get({
+ fields: ['id', 'date', 'group'], // output the specified fields only
+ convert: {
+ date: 'Date', // convert the date fields to Date objects
+ group: 'String' // convert the group fields to Strings
+ }
+});
+
+
+
+
+ Data Types
+
+
+
+
+
+
+
+ Name
+ Description
+ Examples
+
+
+ Boolean
+ A JavaScript Boolean
+
+
+ true
+ false
+
+
+ Number
+ A JavaScript Number
+
+
+ 32
+ 2.4
+
+
+ String
+ A JavaScript String
+
+
+ "hello world"
+ "2013-06-28"
+
+
+ Date
+ A JavaScript Date object
+
+
+ new Date()
+ new Date(2013, 5, 28)
+ new Date(1372370400000)
+
+
+ Moment
+ A Moment object, created with
+ moment.js
+
+
+ moment()
+ moment('2013-06-28')
+
+
+ ISODate
+ A string containing an ISO Date
+
+
+ new Date().toISOString()
+ "2013-06-27T22:00:00.000Z"
+
+
+ ASPDate
+ A string containing an ASP Date
+
+
+ "/Date(1372370400000)/"
+ "/Date(1198908717056-0700)/"
+ Subscriptions
+
+ subscribe
,
+ and removed with unsubscribe
.
+
+// create a DataSet
+var data = new vis.DataSet();
+
+// subscribe to any change in the DataSet
+data.subscribe('*', function (event, params, senderId) {
+ console.log('event:', event, 'params:', params, 'senderId:', senderId);
+});
+
+// add an item
+data.add({id: 1, text: 'item 1'}); // triggers an 'add' event
+data.update({id: 1, text: 'item 1 (updated)'}); // triggers an 'update' event
+data.remove(1); // triggers an 'remove' event
+
+
+
+ Subscribe
+
+ DataSet.subscribe(event, callback)
+
+ Where:
+
+
+
+ event
is a String containing any of the events listed
+ in section Events.
+ callback
is a callback function which will be called
+ each time the event occurs. The callback function is described in
+ section Callback.
+ Unsubscribe
+
+ DataSet.unsubscribe(event, callback)
+
+ Where event
and callback
correspond with the
+ parameters used to subscribe to the event.
+
+ Events
+
+
+
+
+
+
+ Event
+ Description
+
+
+ add
+
+ The
+ add
event is triggered when an item
+ or a set of items is added, or when an item is updated while
+ not yet existing.
+
+
+ update
+
+ The
+ update
event is triggered when an existing item
+ or a set of existing items is updated.
+
+
+ remove
+
+ The
+ remove
event is triggered when an item
+ or a set of items is removed.
+
+
+ *
+
+ The
+ *
event is triggered when any of the events
+ add
, update
, and remove
+ occurs.
+ Callback
+
+
+function (event, params, senderId) {
+ // handle the event
+});
+
+
+
+
+
+
+
+
+
+ Parameter
+ Type
+ Description
+
+
+ event
+ String
+
+ Any of the available events:
+ add
,
+ update
, or remove
.
+
+
+ params
+ Object | null
+
+ Optional parameters providing more information on the event.
+ In case of the events
+ add
,
+ update
, and remove
,
+ params
is always an object containing a property
+ items, which contains an array with the ids of the affected
+ items.
+
+
+ senderId
+ String | Number
+
+ An senderId, optionally provided by the application code
+ which triggered the event. If senderId is not provided, the
+ argument will be
+ null
.
+ Data Policy
+ DataView documentation
+
+ Contents
+
+
+
+
+ Overview
+
+ Example
+
+
+// create a DataSet
+var data = new vis.DataSet();
+data.add([
+ {id: 1, text: 'item 1', date: new Date(2013, 6, 20), group: 1, first: true},
+ {id: 2, text: 'item 2', date: '2013-06-23', group: 2},
+ {id: 3, text: 'item 3', date: '2013-06-25', group: 2},
+ {id: 4, text: 'item 4'}
+]);
+
+// create a DataView
+// the view will only contain items having a property group with value 1,
+// and will only output fields id, text, and date.
+var view = new vis.DataView(data, {
+ filter: function (item) {
+ return (item.group == 1);
+ },
+ fields: ['id', 'text', 'date']
+});
+
+// subscribe to any change in the DataView
+view.subscribe('*', function (event, params, senderId) {
+ console.log('event', event, params);
+});
+
+// update an item in the data set
+data.update({id: 2, group: 1});
+
+// get all ids in the view
+var ids = view.getIds();
+console.log('ids', ids); // will output [1, 2]
+
+// get all items in the view
+var items = view.get();
+
+
+ Construction
+
+
+
+var data = new vis.DataView(dataset, options)
+
+
+
+
+
+ dataset
is a DataSet or DataView.
+ options
is an object which can
+ contain the following properties. Note that these properties
+ are exactly the same as the properties available in methods
+ DataSet.get
and DataView.get
.
+
+
+
+
+
+
+
+
+ Name
+ Type
+ Description
+
+
+
+ convert
+ Object.<String, String>
+
+ An object containing field names as key, and data types as value.
+ By default, the type of the properties of an item are left
+ unchanged. When a field type is specified, this field in the
+ items will be converted to the specified type. This can be used
+ for example to convert ISO strings containing a date to a
+ JavaScript Date object, or convert strings to numbers or vice
+ versa. The available data types are listed in section
+ Data Types.
+
+
+
+
+ fields
+ String[ ]
+
+ An array with field names.
+ By default, all properties of the items are emitted.
+ When
+ fields
is defined, only the properties
+ whose name is specified in fields
will be included
+ in the returned items.
+
+
+
+ filter
+ function
+ Items can be filtered on specific properties by providing a filter
+ function. A filter function is executed for each of the items in the
+ DataSet, and is called with the item as parameter. The function must
+ return a boolean. All items for which the filter function returns
+ true will be emitted.
+ See also section Data Filtering.
+ Getting Data
+
+ get
.
+
+var items = view.get();
+
+
+
+var items = view.get({
+ fields: ['id', 'score'],
+ filter: function (item) {
+ return (item.score > 50);
+ }
+});
+
+
+
+
+ Subscriptions
+
+// create a DataSet and a view on the data set
+var data = new vis.DataSet();
+var view = new vis.DataView({
+ filter: function (item) {
+ return (item.group == 2);
+ }
+});
+
+// subscribe to any change in the DataView
+view.subscribe('*', function (event, params, senderId) {
+ console.log('event:', event, 'params:', params, 'senderId:', senderId);
+});
+
+// add, update, and remove data in the DataSet...
+
+
+
+
+ Data Policy
+ Graph documentation
-
-
-
-
-
- Author
- Jos de Jong, Almende B.V.
-
-
- Webpage
- http://visjs.org
-
-
-License
- Apache License, Version 2.0
- Contents
@@ -1055,10 +1039,11 @@ var nodes = [
getSelection()
- Array of selection elements
- Standard getSelection()
implementation.
- Returns an array with one or multiple selections. Each selection contains
- the property row
. The selections are not ordered.
+ Array of ids
+ Returns an array with the ids of the selected nodes.
+ Returns an empty array if no nodes are selected.
+ The selections are not ordered.
@@ -1083,18 +1068,11 @@ var nodes = [
setSelection(selection)
none
- Standard setSelection(selection)
implementation.
- selection
is an array with selection elements. The visualization
- accepts one or multiple selection elements, which must have the property row
.
- Example usage: graph.setSelection([{"row": 3}]);
.
+ Select nodes.
+
selection
is an array with ids of nodes to be selected.
+ The array selection
can contain zero or multiple ids.
+ Example usage: graph.setSelection([3, 5]);
will select
+ nodes with id 3 and 5.
-function onselect() { - var sel = graph.getSelection(); - - var info = 'selected row(s): '; - for (var i = 0; i < sel.length; i++) { - info += sel[i].row + ' '; - } - - alert(info); +function onSelect() { + alert('selected nodes: ' + graph.getSelection()); } -vis.events.addListener(graph, 'select', onselect); +vis.events.addListener(graph, 'select', onSelect);
@@ -1117,9 +1095,8 @@ vis.events.addListener(graph, 'select', onselect);
setSelection
- is executed. The corresponding rows in the Array are selected.
- getSelection
.
+ is executed. The ids of the selected nodes can be retrieved via the
+ method getSelection
.
- All code and data are processed and rendered in the browser. No data is sent to any server. + All code and data is processed and rendered in the browser. + No data is sent to any server.
diff --git a/docs/img/vis_overview.odg b/docs/img/vis_overview.odg new file mode 100644 index 0000000000000000000000000000000000000000..27ef9772606aa8d9e7d6f5638d7d09d2395b720d GIT binary patch literal 30379 zcma%i19WCfv*;Ha6Wg|J+qP{R6DJc}6Wew&6LVtQw*6+#`Okg-#e3`SwYIv@)!o%q z)m?ilNP~c)0058xfLHQ_P!0%PKQ#aV_;da)0@zyGn!0#8m>N1b*jO4Hx>(xV(Yx81 z(AgV0TRPL(JDA#;*c-drn%cS0nL8OeSXdf6EBq&hJU?4k(y#!4KPSd-hAI}Wwnlb_ zmNw4xF8@5zIoO#;D9DM!L1RJxMuC%*5K#gEfPOy$ZXtnxUk?oRnE(JReMu2P6_2d* zbqF0~b9{)a4w~K#Wk_X32L({mQVjtG!3tF%>KHU@+NRRh@`2@rkjUL8VcQDdrui1T zssdMI#V@ETDmFl0Oh^LG;stKVIK|S4NK%6iKj-CJllSCX^)K4S61hVqNO}PRsKU!& zfLs|wKmZFQKmZFAKmZ2}h+B{X=;-JS*MI<=NJvPAW173cESeDkyuxGb?iRp6g@ORU z%nH1K>P$vJbkIi!8FT+*+-6(irOkIo_v>`lpe5IaF{3{6Y#8n~!&<9%Tq^uZ9LDXz zIsVVcM)RhZa8&nH*$>;^Jo)c-9T#}4B{@=2V4%mZhyM1D_u`YrD;fX*r!_agMq6L} zqGs`PryPD!uGNJ%=agajZD1p|z)pqn9+=GzuHVYDjvGDfAT=g@nY$!5vXtWDaL8{A zLihc6BTM$eW9_h;`nk{c7ADkYZKu|`(uD(gsC>RIBO%Fq@gWD5mtFS29f?05Cwv4Orpy*Vu&fx^=?D80@S4 zh@^+ijh+KcS&woxJ|I&u&|vqCqi7-u;FSSkIQ)7#zlaMlERN(w14R^90+0-`!*IDy ziokk{{~7>H1$+a{;jYWu+G83<@AVF`gqA+T27ZkM77*G7vUpfllP-I`&ycOlRxPb{ z0$2#u0a@t0YIimuYgNDZi>#)HVCeDdO*?%7>fFZ%X|1~mp8QO!bd>IDjF{HCD5Cw8G_X>+PV1IFK$tCP z>c+_B5(UeBUWsj~%R-s0XFqIN?RO{-<6|U1*C216OtvMZ24D=<`(4f!0eKDh z)9Sh3k@saesX3-x4_W&p?jk49I(zTG`OwJo3>b`allr6-B)0URilYuaS%$HH49*sz zGtcRhCTXI KYf#azP~jnsU^o0l YM9f_i6RB6| ze=7ujVOXv;W}5ckhB>vdLceNW&Fz<19Oi1C;15{Qc^#+%HQd$kl+y*6EcyY*1Lf7O zSB36e&B~vzyrn&~7k-k&?iJLGpF3s*&=*!%qONzw6Lo%8sxTEb?>uiGMOleak%o5N zW561->;J0DKapxT_21=Yw=?U(wpdu8mhL=tpQR0GwJFjW)NtIx4-iSbSzzA!X2?XJ z9WU;wNhR&}@pQc#5ja~SA7#&K`;_p-xea}ZuUUC+nm4)t4`>IQD395#3UxDP^I(%f zR4iv|e(V%n*q7^yW!-N6vJ7Pg)QT5`<@me6`!+$=#$aHcmssBz34bm%r~--TIcO9! zL!7k`atd4e3Dx rYzd%-C*o@yNM)7=!*4yWN3A}1sf|P|#yz8*Fr1XgDg)7h$bO=je zwVcfQ_r?>I6+$8?BkNGSdnW8zjG(}o>_C5pN(rU~YZu9N7gShmf^}^`07~Qvga(5} z_LILc;9@-SgN0CRLe&bN^R|``*O%q{i%*+6B%t`HTVO{v@Tr*)9In3nxV=SY;~+jp z;&YLg0B|ED=5AqBb j?}e1MGhb#zQi_ECwr5IZCoP& TpNAJ`@$T79Mi zj{-?3A4Jq;upZf)= RbqyPZoV&4E)&NV|uczk5zgOtna_EVwHqcVAsDT_hJqecN=C7=XsACiw?*m7ch z8o3=M3jO_*&SncURaahEcCQHwI9+7oKDY2}!?m{qs~*$fkbww5D1mY_IXavt_1hFK zxCY_^uN_c9xU=uf2V{aWw60~0Ftcne%t<_^T=MH(uSU@w0>52EWsxDude^G|%x}Qc zhPBWDBP-u4icq;@m1<~veoVNf6_-N$qU!W}I+5Ri5@Dw#bi;uw2+!~Vs<-(rA>5C1 zy*|TT>&d%V4|I7|Y*-SCMxeB}CFEEEbIKoz1nt`$%nMW fB2_VX>H0IOUm(Eq`){o7LFZ@>3vvEp=7 zX17i)s9AD)vOup@5?=?#;T$@r{(Jdh=ikkqpwCz--f58y@}CwW|JQ3$@&Z&xxJ&T+ z!|u&eO`JIK&Y1m;s@beuWQWQKiDe> 7}h7C1A)di=|D%Nrn6+w@+8q zRm@^1`9EsU8dh*~Hjd6~QYUY+nc3Wt8OImD7_g-UWTK=#pZqGLf& Y7WdWmw9B_V+K!{{i!3%fr9c zXLwe1niGqPCdPeA$RA`!YT2j#{*Lo|`SP{6UnDjvDxbiJE0v(E-r1$*e$2^yZ1sCK zyI@1lWvf9Ias?i03|lp}p37BoM6`#Xp`X%CfTi_;h8lWTdt#m aSnI1Ozs=z_BP2jn50Fv)s e?H=()yp6Dc#^^uyI8Q_DaS#L z>1Q5*r(RDoVGtmE@f_4)HFif!os*ooy2}zMAfY}_5g9v)_mjc3{`K%FkN4Xm2ng&k zPgYD6d&kVD!0{>SDx**4UEx$#1hyM{ra7D0M5-~C_yoCVSm%T=a<*0J=0H*2t^BQ0 z`opaHvUC`ZnSY;Tcv&M1yt^85Y|6eB9F{UW&HXdh;b4bs;+jk{yxc~UgwJWmg6e@H zExMSbA7aa}vKIhFsF@$r(s!)=L*$(AYpC=t6*V_(d!adafCn|HGt5-7xn(n0KvYYD z @Gg~I-g##bPa?5WuhWy z<|)Fe?*%DuwfYv9NDdMDmx6$k#$D`R-3womPhc6Oq|2x1+9u(`^+c_C7`QB6Z0tR{ zR`Txv1|IACKZ55&IDtWIj}4w@HRy~>DLW`wE5^g79hT%c0y(N7{3pa%IT4i3HuRB{ zUV9MK`oU~g_&95PqD;JY1E- @m zbw%0PRZB*2nk%@g4==2X@7j}P;{3LUWaU}Md4kB`%DMYFUx;Jxki-0Z-Wz!UshkX2 z)8;GW1#ko)whAAS{mn4Cjg5|T1VmO2vtSuG&BQUMd2+T>Gsr<$gT NF};{2f-W6GAMX z(&ayEQ^T+X0%j<10VeFg0W3-I06?VJG2q84|DPZl01*9u?8a2x0~GewWKbwU?hL9x z1BmeX1^FQbfdAQ`{D17-{KHHO3gGIsrBH%2Wz2G_Kl_3f0G;iSOOF`Wkz!vq1q%Gv z9#9i 6+dfIqSB6KV(X^(&lx+*fW@7LYp4Y{-(e74yW_|pgfN1$SWz}sInP^ zpxlsS{9{y?{c~~x+kIwp%%k*xZ-axIvxy@h!n%W&_fAx kDsRddUMXa0`CV-hRnS`~W)35~%)0=yhk#M#H-w*H`U?754P-sc$%S)Ym|a zMfx6nYn)D$Q5-s8;zEJ>igy%o9$jJbKLJn_zxTR_1&;v&uMiYiMIeBHd`cdGuH~rv zOSjXSi;IJJCvs8mLp1d7U9c=p;S+tW?nR7bUD;L5F?xN!)6Kf&0ztea;0yu#h1y~_ zBU*d$261Z-Gzs8z0)Rb%9{qmDMoZDQ=GH6%lOSMYd`SFeLq-TToE+HXE1(mz4xwNQ z0}(-vC*J4LP~epSfJ=%Ul*07|b~%jbnFGiI0OY}KTUC~A(e*=09t;ui9MII3`HzE@ z_`P?1^XnMm+OTVxG+ieK;&nVH?LSu6iTO*kulP*!6`rt<>F>;P`aPbEedG46i{k|H z$lz)Z4(3aG>ovy3+J$GZ??r?23E%Y%xDKNTPCJdq?At35>P!+|qXO{0zR?CqP*9A> zOwQmO)V$xo!WsX)Am<`ON=kuDi;4OEanMCmwN6Z%)|p8c-=9J2 OOZA`-MVmQZ2)}<8iQ`@J#yQXeKyOBiGs|#mj9-0lk!__yNVIe2cF8 z#TsgIgMmjZtXTu;7+40nw>wuGw^rblNWRuxWTsF`^rY>R`ix^jPbQlyiS*G`KIS4X zM@XAI)t2{A;q3NpHb7h`AVvj+$~dp{q2l}cnR?4kWI3uC#&3d!m$!x5sYvMLOKB-l z;;ErpKlsoG;@%((xkK%plVBal?3UJTzAvY->c?2(u;!rP3c)g-m( t2&e1_T!3E`9c(dJ6SXqysk5%T)!vyPtH z4Qen C1RvwAR;ieGqyLev@_==QdJS7 %e||Nqu<{+HI8I2pSCe<>Il=>Oml5&X@a>)#ZWiHPqX zt^6~5d^~>*qNSasi>2Z3ZgDa-bg_5hld^Xvkg~Tk=b`@}!G9C|h5TFpX@9rMl#hvl zk&%{xla`5Hg^`7em4l0w;a}AM8IQ-rnCl+`W?BX|T1I9SCI&7RW-eA{9{PWPf3W@$ z#_G2)e?k5!_`7;jlixDinbVrMI{h^cd N_~uTbUZW z&@;0!*fNp`xmwzo&@%n2j{nQ AtC=t?*FlC{~WNtADm5H{`8ph9}BjxrE7n}f#|!b zubAh%G#`nSd# ZQpGAik-R~4_>IFKwbLMxK?%G7hMwLgZI@zgIX-c`X^pJe<5B^8FB^v$k#LT zR<7jnME(+AW)hW}y4WV1C2!cW-4G5oiGG`^W%NY87w(DkVM?g~#Lf7IE7IUu`5q!& z<-z2)0H%lb1%fWGVG=CpX+82_7+_kVOcN?Nw#=LeLnch93 &)vHo(0{mML`jmRtN5$cKttKO&UT>B0$?I*kevxtWm$@V52(G|r2 zdh4;{3$X39$&Jwo4KGzro(tM+A72kh|IfHn4nRe0KKmEVy(%t{hHjsktLt;c*Z^=b zIwFA|cmox~wzi&vM})dMS_z!0jAhMFgz8w@jmxoY8Y8_eu?QTU?WI!0OH|4u*>BHo z1!mInW)eVtsMafUdIE>W%1-#gu4Qy4FFD0^fx21+X?PiFJWI0p!YM{wP|o*3G<~lj zPIBo!E+{#feEm!Xg5;o|N?T~LLV3d3C_2+St|!vuiwyPXXgZOhK{06CBrIP9ZQ+Mu zGhBRYB?!r0F*xHM379Prd!W!GpViw**8;oaSix%Fry`uHcRuX$I#h5}VrqWCRS?`8 z4^-siyy4?ub{F}WDD)$++C&2nZY!SdJBm-U^Z$rl{SMnj*>tMdR}&dY*dWSh=Sp;> zP%9=D+ujX>iI`M0tQZz7c0&D~^e50owDB8$rE%6TE-fCVPD0tB;IHRL5p pdZawq}va-=L3Y*Ab@?kYD E!0O{QlZ11_U9=u#cEi=J^2+sr}xT zQGqrFF&zGD|NEnl5e$EovU-#_ToP3g4D77s_63qkV3)*hc>CD39WxhWL}kb^3lZ@h z8Pa9hw>?mIMKm~0rDIod96~SlDm<5d147u@`@|5XI{xuorg*9nWK}I_9Aw}yq)z>` zZX;D($kxfN0GzuVHYTZST0InrZtf771%LGZ?+B=wLcEm3X0RT&-Iwi_q>B^@u=oZf z59{9xxlw)!EhHo}`@qmy8(~+%uZpZ%^s)>~ %h>|cr@D!2Wjm(fO8cJrj`5tw_;leqSU}f|j^}2TvEYdb z$|#)U(p3P#f6;h%U_#J?t}MLxY6q3xB5S+0n98c88(1Q3%Vd>Yxq9$8a`a)y#3a(P zG3xGeIq$~!9m)A(ZD;XVdLs?(l6BSAE9Rn0CQ8+w=_H9Olzgzjo5&Gumz>@nU6wIE zjaT|GTMM!A^rf#=VaMshh^gEvx4Npm9epW;)NPG0br 7Ydj$|P_;#~9IPpaIrWI6dZn%bCUu2`^X z`&+pWQ--dl-AIlEK8x9Wd(l3eu?1h|M4lmQ=x%( 1 zIsDGv?H6?1*uqds`2xf{+W 1%bHhN>T63epgexcL_in&1Gy2 e#a1h zZvVRebr)t5=3ruAWBBvUSaOG}iuO7(n->x=D7nJgI!w~e#f3s42MWd1PW8|AqJcc% zA{5FCAgOqzHC6=*rM2wLNB7UJQ@_(OF7NE*tS<8dPqT;dtfu;1m&T;)TFN>gzz=0r z#VHT~;?-t=QLddC-u^==cE7URJRtG~RPfwLakFksMTQ3`p!}r=s6JPwK %L?AkXRVooBe`%?=6buDt&^}${%tw z>P@^(zBnL}*DrQMjzWMq@{rhY7gP>?P+3$o3*nAXm#xd%cP1dO{;O*B6z<(}e!Zyv z+mATf&)!*|$zhrN@QXU0T|_EszMBp`3ynt&dd~1zo`5W A#k2+cd(yUM^01(yCF{_+>k@+c%7-DGDVJRsHh3jrQZ{Wb1JL{-NT#@W$gA=JiL zm=6;IZ*B_UnQItrYaxui{X3_uM7yI9%_}Kc2B6BHCv>gqx%lc^TBfGkyn>Bns{)9u z?&TZ~qnjy%AJ0epXu7aJ=~W?&(R5#;S+2gYB9%iOg73J0K>o_IdSS3^Om>ZB%i!ZD z@KRntLGLVT@lPSYV3Q5po4u{=uUzSWi5NT_7<^t)ugtFwC(yS%b$|(05uS+vOP{=% z4owC Wv|dex@Ib{2^~6Fv)5 zkTodaI8J%&PM PS-sfX1^|47w1HBta+Us@KB(45Tb1VT|VNX*wb zOW`m8Sny)Zm@g^Lu_4$G**1o<_fe{vpm#6_q}drTh1NVN0RS9GaJ7;7F2bGt1UFf< zixV0VYNiAYSt)B>7Eo1#1 QodU{98*OO znsK3x#TqeC;yi&ow@k^XU$@@~(P%MVzUrZl2j?P$AyOeF7rlKDO2r$LDhV>H6J8ha zl0j>ire*_it@CMZ$LfFKYqoLjFLdvX7J@ef_CuxlVX^;^HqRuSw$DtNWEGC|l-|>e zgh^@AWsgDd$TU~pTBr7gRadVE0YVD1!1Dw#QG!c=_qNcEVZPFshky=O49l%0gn3M< zZtrAM_17Z~ZWSZ=Bc1LY^XNhPtb|Q#DvBY~!vkeMsqOd;AIvkL_$&g@V0h-To~i z^y?)$dJTKEY=x=Ols0*C3yC*qg?qc3#pX J@c&VtZMU!L#6p z)bL9h*74w3<(SKmx}csI!4tzy$DAN?>-;C;m2oq}8Sv_$fpXDlNJCqu2?-pq@a3x> zvhde?a|QSn8u$@vuKBk`sk$Z%&n|{k`9At$mG6vwf(GT;^B>|?+ zB{7h0tfk5f*L=~tSV;?*G00?o DTnj3qUF?d>$qXUVF|#!6-NZ|Es$g|9yL^$z4N}e+D-QM zl#S>1ehc=xY@@gD8}A`qc1I1~2e0`hJb fuG`BM})#p^nZCoE#WYD)d0;2!G9$9Wp2- zA#AByP_O3KD>tfbPRA)FEgm`e&CVL~8Y{5}mI)cL?&_l* (%yZytZU8YAVfUqO;+A zzI#sb!H_1@nb&@NSUCGI)ntM_M6fhw={&N@b&TvF%3H*9E2I3ZA+jL+S0nE9n~&N- zUGe=CwD>nj5|i@s=a0ii>QVr0b0LHrlMZeh+|SLBBnt}l2>}g4h48ib{0Zd5!p-t2 zh+J<7pdh0{(=tiFw2$|aR$RKD&skj_=-9$xY75)Uc(Fjw)7IxFP*?Je#8{`scbQt# z5BKYIy*~wyzRfFLnYMYpBb)j=h&(6A Y@jXH?hPJ~;ZMr8V7 ziGg>@3^cKl=#uN7q(%YP!mdr$GB3ZkVqImM#p6(bjaSAMls@T;!t=;|QjG|}1Cpz6 z87FgserSYjimal15t*%VQO_qR6vvYYEH5VgmSeF> g}>@d zy_h0L1bF>8hrknYOncmi$SC<2%xNEEGTMN={Ahmw_tE%)^sc?y?Zwdvbj5@t*dpxa z_v3j>z8smtLT*GS_^1L^$(lcmBW!vMj>A~dd`NmqfdCD_8NvsF^tEP(S|Op&^WS>0 zvp`-m2Tx>NKPb2hi#DOe8jU7m1xLw?X{bX|40uH0=1%L2L1xNt#s&Yp`;J@A*;A*O zzuP4SCBMKMPaqKot}RfO=zh_TTEPiE1?;MBViDrKO=PF~YZGh7K%hw ~jIsZ4Y@obkpL|(ys9T%f zXN8!$9er3-LEuay$>5 vU8WM~GGECvc4>Sgaukf =>_I(x*rSH*qN5D*N;xEMeatb)DR9L@S{96) zs2G+|eqv#|cip5*#KLGkTYLYSe%mA5@njHdc%qFZ6Tno(7g<}+vak8sjy-;!o_L>X z-GBq+5EP3_3ZpTdbT|@0GJbuYB=1b<$$@;Q0bj r#A_HK~+9b(2S_*vEN531&=2#r01ePW@}vG{YtcL=RRtU*7Na zc{NG{IEk+w8;ER@6gw)Rj%D TDr$m9qq2RfCU=V$WS^o!hM;?FVP{)WdhLq&~id z%1g2N45$N3V0!B1Rte! p0DU7fdUEBgRwwOQ?bS`fR zM&-6G9b^l~7Ueb#nl!b~@r5t3Vs?dl0hCW+j 3_-eP#Qfsw20o+?ZtZ+r&nW!{%4+3HlAY|A$mp+Dbay21B?V9s+w~*;Ig#ib z$OerB^mYfBOSOKK=q$#_O&SL_2TStuHnlS^x^~+HqT@1F 3GJ#TMLoM!RYIt$_P(opTvO#Y*~|Av zAXK63utZ?2jSJclrnWXY>IrS36=i!ajb2{d@Mi!{`bo*ho195Q0h5F4sh$4m)!^Ht z<#{X>eV@&JpPUJ!^Er~mAJZo>2`Sfo)KyXW8J;B-4d*B6Tm exGF*E>VNIn3C#AwMU(rG1NQdZh |F0zguE;6wgLoXGdf02Zr?_rje_H`&2|0>59V`sP9 zff(VD@C{!~bCn*KEECIEvKx=Nx!3 4{!DP`_6xSOG&`$` z#S`Jd Db~ zC0r`YelL0`&n_sCRhxpMLdJuX4UD=FuB&{)hFjds&9i@*9G>KNUkZBqK5bie27DQC z6rt%Cq;^F$dtcaIj|CgtNcA^P_lIK?ls+7QbXlpy4f6b=5Ny-t8NibDO#{!L-OzmP z)e#tl!`PXbjwwBVybg6h8?~49isn}R>8*Tbt72x9)0mrG{wW~2G=~)jUp9Jm>iR3z zh*> c^g?=pBJ^+;chOqlN+91XDUUUh0>?-a z$9FU@LZf?$pCBZaTvM?5f`!7)lHOms#W&^mv0-^)e@fQmGjaBqKt#etPi31|Ds?{W z?o}~*Og+G!Eq6GVAWx|o;EQg0zbyet5Vf%;5#BjBG8HG^ydnoan>OsG)MbSA1xS?} zJ*LxshM;(ULV8iO5QB?HfF@5Ih0JYuPah3_(de{bU1y?9y-O0nP+hL%phtbvdDj zOBPXQn< ; zrVdfF_Z>Mz) e)z~ja>>tT}VU}yW3h^!Q(f lJc%kfb`R6*Q4`up0 zTX4RA$(}BSIN!7$!R-`7ol4e(z0Z7bhKP!qFHofr&BN`LlPnl*k_yA;OaFMzqM(l& zj!y`#>e`OvA!7tv x>tU{;$R$+_tb0&8jx{!@gveP;#EL86EJIr!%BKoR;QUz}FmK8(tS}LG{{c(u8p=+Ti zKOXv @e~T zENnu!B%wnHQ7ky(v7#UGYaHkab6pV7m+Ll)+0mkOO3s{1Nm$ix`?mBaD+d(e{IiUY zp!*w=X<7stM}rdMlhgFK7Q?zR75G}RW%N}%Q9e8I$JYA06_&nf`YRXTa9cy{A4yX# zz6?(5mRbj5?25bdek!eE5NpN?2!|A#d9Ix7HNBiI6*(fue1qDo3Iv*%%c#Za%DU&$ z&RZy;ST;G5Q8D?1y-Y@7Vtqd5+jX7Z?I;?n?(RzZRruOvayL&Ksa_9}+K$m%pigF; zk_3D!k@yC^PL7d0C#I!ijNbBNAM+!Ri7^@&&m+wl6v?BHo$iE#N<)kKG^o1O3*8l4 zYzmw9m j1cBtN`&!!N|_CY!E4mXD 5CTZ)=V)6c=puEh(Q{y&PYa4;BZ`fkZ-?)KRuM{c1_umDLuDnmn!t%YUdUlB4 z3Tx-LoEsD7UGt)Qj@gBc&F}Ns9pdU$u69*D_R24b8P?~Jd%uA>u(@&>YVU60y9LrU zeBJ;fq%XI6d=*a2Z{<}XoW-YAH&d|}8r@sT@TGghc&MG9KjXyj2gsJ!=b)wH)is}u zFMo_HTND>A#PK ^ypn8pyo<$TA)i-u#-EU2=X5C4c!-k1L@mS(hY~(=Y_R*-+aCh{m zrOx)I1EeIQll(XBj=Zm8LtE7c6`n{Hx78^GjSgD}z~TtH=EHjd$(`zC(;opnkjV-O z)7 |u2?=&< zeEp`7a|x~0G{{dE>6s*rdgYTuj~Yp(Upl2pVE2CZ{6fe;GmRL%VO4i;#xhgY2<7zv zr`&(r{2cTqyT{h~wX7PAhWsQ24wa1piY^Uoz1|8L><>R}B=AD}{gQjG+K}-B?Pa5k zL>hOzNSe4x#r!=zfQ{yHbC
F4(7HXhHQ1df?RHF>$cEn2o55#wz) ztw$&Eux;7t-Iwv87}(cMFUwxrx^L-yHBTA=n&Tn^(9%1- UE{)oq7>;@N!uw$FnB| zy3K73ki5>80Eb@w+r7(FXr&}Gq)94a0nEpU{pv|)5RjbD%{3HFoSVWV4$9HbjEiJx z*r3lSB%K9q8@VN>j{xiKw1Jbn{(Im7zi)tp6X>wg;^XYS`1lab{Y6F>D%}bbYAq?T z7oQd@pZK^U`ns~b>)wQf9{LCLni_FoaZoW*FNBoUjUIn{TXS?yzG~_{rZ5Yi1`4OC zHwdg`?@}+B%JY?pGOh0MlJ4?u`zO4f4XuT&yJAHwx&`mFnGG9OZJQ-AhJZn&m(^gz zyWVf{t1>9Md!DC<-lWQV1lrSsn>>p>HZzMF#0IWZlW119Be&$BNa6ysR^c8F4z-$7 zjydU*Zxs#Bf|QO*Fw^OGTS)v=QD>+SgGTeRp0Z7XwV6k!##u7Wj4p!iT4^+BJDequ z58N_d*<4$+P#mMBhGGkMiHt2ng~he6m2LEsYu7!E`k522(NPm6#5=U)!aDh}?j JVfImZ3g@ZTykiv5I z3c!4F4!<`+?p^C%yHC*{jczP^(z^1NzUQ$0EIZNwqv {0YWY -5Y`wkwwT%h}GTuY;-!i)C-J+c_KN!`?OVC!e@$n ~!Qm$?s@%AxB>HH|OBr+k-qweV=y_DpC9VFJqlgZ7*{hVvn>%TE0Iy~vrQgR`F zDY6zvBdf}pe=3q%z1|JOI%o~;?kPx9#uq9BTR+iXqv@qM4!-ZUE_KakRY+ ?Xvw`W5kxB_Cvug{kkdFh-m6}JOe1MY zec^G}FvgvXGzrG*=DpArTrm9Y9YZ%xG2R^XcclpNODLEvYgd#>Phb|*HNJx zRpkIGdu7c1#Q;Zc{brgi3GX(nmHjKT#_==COYXIo{AWjF76;3kDJ}9-8bG$tO&N}1 ze+294SW!uhkwu^|+Z?bdDnd(68Dz8K7qR*?3H3p)6=+m^Lf@N9Dr7y3Uo9Rfb>}di zZflnAbTL(fB}|JcB68{*YN_kS0*@>BK`E_rtPo=^;2p~0W7b2c+2N#UFAhfD4i4d2 z^Qhm@JkZkTdD-z+t(wSMLFgZ1_~{^)<|oF`|4(J#0A9(mwwq*P+qP}nm~dj-HYV1@ zoY=N)+vdd1#Lmr}|KDf!IcM*4@BP;E^y+@r`rfXp?s~hbtLpvs*MqYl;QcU&wA*dB zkyB9kpejJVKpAbT2|R`|o+yLSb+_SHuM+DJ4tGeL{Sc)|KHoy%b4QIdP_Ij-oERwX zyz5D={VG=)HGNXyNJ-|VbVHTu!hZG(N)A3qNh5Fky*%&^ zSbT-(j@pEsV45jxwtyianB{wp0WsPErqtUjtlOBPk2oQ5o>^A%tQ`k@CaW8;FUV15 z@N +%|CDd+sb@7d3NSJ~YB-hdC*HFUMA5pJE>tuk5A~tl>wsv*wNo zvTdxZnKiNp@L`5EKX#?yVwV1q8`S~kXSkUbLRcFRw^tO 4@H{hXS-ZMBm^Z zY?l+QeHgCWIQ@?FUIT*wIxH>WDA=U%ioqEnvdM;0c}5@N5MI)#MpufG |PTQn8?uv2L2hRYEODS3u=IS~T`usy)Yp%WLVR<=6=ESK_fo=(^z1Z0=T;ofc z6}-1ZjeQ9nJPWMLPyqOm4;P&P!8D_>zA-}(PTChXIDiAoUdM@S?gzlH3rVmFXXE>M zkQjnjuX!vyt|s+R+bm &jl{Pr?ghgpKGbn@*(iI!vgN5Rl+;5=wYn=)+m@g$};%@0f zR-c`lHr7NiS9D_Bz?|c3rHb#0 CRmqT(_81AoxpLE4$UlX_dM|7c)Z;=6by zn`(=UU>x3Q+@h{uJ*?p=(Vl2{M*+@2er#v*Y4h7`ibW(1XF7SV^ih`6ce_lPf;|fk zmDjv7hF6!c(+rnONPGf16xq~95)WfIVH80{)Jf+5s8q@I!J#{WuHB7VaBUt|&xOj@ z8Bmp@rVV@@B$5i|9Hy^@Jt+kC8imt#A?fdLqRV4T?(mOakcG%=gJ!(O)m~yQ7dLql z#2mk71P1P;WO=p+obN|0RG!`A h*P;FV9z*q5EaNZxc)$8>xo+M+AzLUn zQcH*_N+7WWv?hSJbGj>GgV|_>{ahqsi%6EmiXwc}V*-Z=YmSy0$0jjyv;Cx<5!l6C zJm`DQhSz7w0J09Rr|GPfac&t1%91mQ%`LIc?*zlMJt`K@1pJG*eA$)jmVBI6hM_s5 zmi9oxi_ytxr_ LzqhsFJ&jp3#6e%yZUq9TFKS>y<$E=sIBgv&yt_4aC3{ z{cb%Ep2nyp**0Y5tUeOfe?3A|4bz9hVNy^(xcW*pAXIssBj-kO0HIrFmJB`{gh-#} zXl3eY18D-S8b& 9%R?+ecb1mbV6QrQS z@;a>(oR`Eo9XoKB;D%mq!xnr#sT{s1^_ci%+t@^ 5lxttst?3O$aMjYoiYPaB{lpA9EM{r(h%64~U z9Oy5ZBm}_O&KFBAOSx-_b^s%bC<-u$Kxx)2M-Nxz-RM5;0%3QvtwfO;ZpuL(F0Fj( z@Y0HjLF>-E(Rx!8see*%pH^_(Se(Y#c-4a%nVr&7VQ2JmC%e0^IYAx|%*Y=qwR%AU z4pn>uB}l!QL9>K7rlv-3ViYut#zg7ND&l;^dCdWpEeCC$A_JTj8Kw@n2UmS=n_f`M z^6-c&fs%q}$9gJRar-%tEG2D{6u#%~Grw)W C} z&zU)kWz GnqZ}CV)f0iO3hn9U{Sf2Bp>BnL|OlLa-mEu1L%| zy+3YB(HCaTW?-}Q Fi-=>(TVA*S-D{pPFFq8R8f~RM*)ca`WQk(5YO4tivmH-lOf|WG|l{yc+Ukr z#n?QCG^2NA FP8O@Y1mt@F``4 z$>Ro8T8!{s@Y4t4zP%}cM=OPOPK@XAQfUdP{eZkjNz;K4;H `hk!O5oE1dm>E(Yp|6p~6L-$Ec&i7YN+-6Ic@RwRJ`^tYq#NvcHt5E< zq)%(m3dS<_5-cJ5BvEKsFsXH=WokOXtrg-v>a=iL(GQQF=zG%hHZ}?6twgN@J6g@$ zvKEtPXMWW?3`)#AZ~9JoN2*IOFiN$e^Rm3dn =b)W1>cWkMV==qky?Kph>g yzb6dDnZX?14DPYYaFj>x@`mRr)$Gs(mn{jd>t>Y@dZ13%6HKv(kGKdKn}~ z-l)xXAFwjUs!QC23Xz>Id5vwMW{9-W*Q-ewP6)oK!>+qiUF8!en$xf;7#v#GD?op+ zwJN`#i`rQE1d+rMpEccopBH+6XL4qTM@E?)U^F zCynYPGN`eEh0So)x!0|^TdBi(o)=qnKWF|?Ycu-tvZ(p4pW@J(&piouLE%E3Uw6_K z=yRuTID}PL)1FV7^3j{1YcO#0b$0I1ei-;-vwpu$vZ~hqihiPR&(nXLi963g6owY1 zDaZPH-UCRcX<&t10o(AhKw9oVLqV42IBQEbY}an|)6;B#+0tN#5 HV~?QPlZ zs@uU;!L3du%oayqVshU_8?;^?R~B&G$(G%%GZf}mbMMV@J%#~s-~mCy;yN68nm sW6BX>f@q8?!|mZiHW)oCof>w-tL8E?M+ PeOSu@egUP->Lk=e5CA9k0os&e?Up=Sr*} zbUyGdX` M(WIv4}M zYoCvtjWC5SXB6wLi}#8JX%G8$ZhbbFkEXc&xr`huq#`6r&eQlgddcCyWTjuy9Y@o? z*kxs(=>msI$Y9%Jzo~gew|7ywN -6W ?a8 @DSxFm1F5Ce43Sk5ZD cxpu#B=R`dQu^6%qaw%3qqn8eZG3Fz zO))M}4-c#a+sbGfE=h_Xii2E);gXJUs;Z)sRFOtmdSy8|btBZXR22FUmHXd&n4>bQ zwRS`3JIZ$&tCA|Q-^^Y%TJJC{XE?LA@{hCRx9W5lgh`1qQ()T=V@^C=Ipx~bkrqB{ z2wWhhitr #5+kesx1=4v5*_50H=@@tzI vNYm$QN(j~Q! adC$3Uj9G~@l#}1 zn8e(Zyb;5ZvGQ2AY`*KzpE2?&8eUG`FQt&G_(!ZaimnS5=fb69NOGL|ExQ_XJQ71^ zMGQHcH{FDeS%cjzIPwcyx#P-tQ`f q_t&A<}K!+f**~xYOabZXbd1 zw?==qUCjo}r8?zIqqFFd{M?0%85`pSRt%=|#yfu!s+NACIWG-ML1z5|qte7{580Ml z|AhgaFvJpv=N5I 84@$B=pfp>y&(M46K)0-ug!U+C_9KjF8-1ve4NxANlW zGs{~vC8Ea0!plXZ7!~hNkTTmyq;Oy2d0T{*rvcf$$-HfXYQpd!(iQYY>1I4daW`gN ztgF3*RHefu^=9{o0V~S(!U2(+KrD7VAn(=>qIKxL9u$cY?`<>&-$cICUgn6coqcB9 zKVPzE&gP^jQq%uowg_LSL)McOPnC3IO-w4we3%4s>B%eWk9RAc6C_OE ljfOON2GhwUYucMK0dXjJjDu-YVD<#JTG1xi;Z2!ny6>0IAVJ*Xg?)$S(Rl z8h4I*&yXgKtl+`)T;EN3{?hU$6JdxmIp#r2WHGa%p9O0kk?8U`#LT99$t>RGGO+g2 zBE?1`5RO0fZt^xnWO+%cO)J!`;$UA3t)aiwd_iQ kECPD~#y@N?%0g)fJq$oHK1$r%%(+;;b9x2iC3zq)Ph(e|R#&-Y? ze|2YCamoOCNIu18fNT=qzA|SlTF~|fB2 Tl&(@4#u`nr4=;V(5TvuQ96V!QNv(%&rlmN~8fo zcEz$q*{}Q`SvGuIIY*+P7FXi&$+;wB@qZw3b%Lv%CMcQ@>q8NR`7Xa_Sow3HIdFY7 z?t&Y@JUC3&1T_)dj(vZjfVkA>r zJJzkYX I_#O$+ zZc&mrCyCG+0tR&;#oWj%5*V_w5eFa!eO3~n(IlR8GI+W8@NhBStL%3-$D3Q~ku}$R z6fto9Z*U;}t66fQEeK zur5hNk7$mhwu%5ngp~ndM~LmokXO7BcF0&kaUe1UGcr;OhQmFQT;Yv=zI7f*0yA5^ z!wt&3RZbMVyvuYzmFFun)lBg{U6jFPl@#TFCNV*Id;eIM0|st|E!!c(1OR}@{NL8; zKz*#!F|e_A{3ZJQv2yfGQzI^S0L6Q LE-Fl&UjI_*__SJZBT-ejutp# zj&&+eAn9l3kinadw}h kaPcz}GR*94r!cx*#So1S7 z$^ve}`e}65b9fgW^FX(Edl%Z##N7xf{lw}< d zn3N_;OhqB%*%X+*dkh>P5*ayVMxq{!)i?$=%&Y1Rtj53`?3nC-9833(e;h+)jr@SX zplYL0q#^j~t`dN ynR=P?@!o}m$UWNbe(C-Q_XLUpOl5|7~H@6X(W;b z)Riy-BAjY!tuku~VN0#0=AL4OQ3;dW9g=$>7s!XR4?ppL;vEHmg(?3&+9=TXl^hJ% zQYczupAnb)mT$A&3y($~^*s5fnK8_P5z0Q7;RtkLZaF~PCt0k0*E%Zt4gaa^F$_?I zd+0Do!O{i(;Riy1+9ev%QA(*`Mf6 hlg@Cdv)g=LdkOq*P +YygTc!y7Van$4p9D?xbcq z`lWQKG9lue`O~lgrD61w5zN{mBT00^EZY}h4-@en@;f~WC%(i1Ma{tk@=5iCn)vhR zs9IB>ra@rBNg`9W3G*y1`rw!e`t&(r&B|C0%0=pc=mqO~ij D`H_ >-7Z~eJtzocK4gDlh4C3 zC6jt6EugpP&JnVbAb(4s|1#BsOxLB4Fyi*({HlC8B^T#Q5J7UPTQWvH2nm)|=%qe{ zcWi(e#9RPC1H)>pISNHn$3(yp6~caAiE7V9Za#T2djH)S4 L>=*@%HUcA{>Tja{U7&3NWU7eW|bw~nRnc2?(*<2GGQ1x|1%BC|x>ENt&L#}Tc7 z7(NjfJKRAn?@yunQ ~DZw%jj$!1Zz-i-C zL}H6d8!Z|}-!t#U6bHcA`x(YGVv rKlj`BH#1MiyiXaE6=i=?EU&)cgF9nV@tSyIKTI0+a z*~-^m*bcbM##YUl9a2*yx@&=8XhQKQkK_$S#bQ}xe%qv1UG)b&9%0QY0maI~?$0LN zn_JwllOZ=aOyMYlNzg@^GZ%;00h~+V>~80fwVY85(aNjyE{pHp$2Mz^eg+eZQfnMK zwvpHCIP9D9t{DS~FQK8xNlxdd fMnTBs^6G_4kCZa<`QU_DVDw6M mEBHp=g z7oG2BXyoaJjbm{YYr40%B|Fd0&??y(I~+Yj756AQPu2Zt)k@F)iIj$tMd7vz@$e(Z zCFix}u!U8AF+mQ|W^A4v =M zqubZg*N(Of0c$2Hg@tIshi?033;NCQ!W)GNMI`p^>8zlcY9$a3h?|XIx4jZ{I+vnA z9>NlJ$bEOII2u-X_KQnfavbwKJ&3emkF_!^XE2gI$|JOt!tW-^ez@w*&`^%9gdbCV zRy~iI anfVSG*s?Irw`&z5 zm!TXs3`SaXQhjp=A=jzNP=Ws9N-TuZegJd|*u{s$9#NbeX7y Dy=YBZY4jm zTQI#qqH+&{NK-+tQ|HyF65+>J_AIN1)LCA5UX*ppE3>CFqSK6pgKm)Lbt>?@L>8g@ z*kW>~(aq>Inlz?+q^QU$ lcl+=X~m 8^RT5jn)SlKzO`Z|Z1>gqhrK~~EMiOZ- lORYt?9|mctqhEk>}s&U*I;|I#<;$(GO0LbK6?fHEJ68 zXaiSqEHXDlqN2~Y45uAtb=W=%YZ0y|Uxpnj1$WQWP zbv2i-5v|oE%N`VOF4T0c;DXhs8^ZmQ*)8aH0!A&U)`SiF#ATa`bLj?NAbEw6S2oYVNilrV%y7Ef>yxWaA!*0U4=$iZ;z(E z9_mr9fK{prTJSW>ZL`a*;*46vlGayPLAl!Nm9@Rz*PW7nZb5Dx8BY}_XW&Y6f@JmT zjS9?v0a&|++&9buNNxq%`tDn-ifdZ$?KekPZ_={<{lqHFL;+crrMps;ok%=QHu{^X zqt@9qL+xufhyvJYhoz5WBcG>};T_4dF8;DqtCzPE@>f}l@ft6a;^vCcPB~J%Gfat& z;pK3(q#b0_*=zpVvDqRu(g$Uj)uGX0q-{KGA*qrW50NWJKiq1HwaQo`w!l-?-AAk* z{3ccJC5*y0d95!WlL0|^m#9%s^`xEg5dow}#0;aCE1e_@kdQtFt@a)5rjw6hk%)go z`bKW+Up}7A-B;*czC^gWM#}1A(j4l=$*-SDYXGlafBe`jD>pz;2Pp6sm>%y_jgd>S z@9S6qEjPTu!>TFN!~3G!s8Gq_u<4dsC^yylrOksPk?J&~t}~Z_StEZt;wit_(+aD? z96PS&E`MoF=Na_jLY|{lPPSEsdao(1mTqu+KKaH@;NDhH>~ZG^qMcVnZ0PaTc4aW1 z^jYB?*2i{)y &gUghwM*UvyO(>2C5>^FV zA&*fyhOOgS8??KT`IUyMy %QFbj0OI#PIRR$_tIs9&1UxB zS2tQJbZpEu-I?lL6nAXd_Kq63+}ZYSA3IqbcXDb?^x0_h%J $&-;5#Lm35R|=N&aWC_JB#0C?`mP{0)SB4leYGQh1E_d6-?@XCQNKKoN#SXB6*oR z$RWrMd%Koj`T%FpP)O>kV=GgIN%rb@>Kgkf3~T>L_vvWR0c$u)b&sK&Q&-Ye)4yx& zHZIew@v#?KPJ6xZMTgv;(*sE(_L1s&pa*W|90wdcCHC&+`3BcFIde8l?`dUSin231 zF?{FhS!P%Ku6fSAu@uLnc^StSLVOSGo*`5Nv|f+ _+LR*930&~)NX#Y-`6!(BUjlGy*4Z9nUlS8 zovK?4&qA4!m+_YXNxSu9mlpv)nvh76$l@jI6LP0JZ=2r3s1jP_8uq(+bl=Yb1o}!4 zOJPrXN>sF89FuC7X%J$s^mhWUyHaBa_aSJUu`Z(SE2kswXGc5Rx6C9BYGhqM=0^h+kV2$>Mw03@5zRR|4X<^Zbg})}^Yg2Bht62@ z(&M&y{S{2TGQ0KTh$MY)LLaZ5unp;}E$$PHjVy9TN#?$jGG&RURG*<~RS#LAIwYYl z$k@C$$C*fl^kk>COI-VjGaHaYnjXXQB(%e(GU~A77d7Gv%SdHb`wq4@Ec}$tjhBVT zgrUOod^eBJ{eFpY<8^Bl+y`yS%1}$XY{#MkRX1m~z3qIX9cW4j+f{=m%LZdVQ0+3{ zd_g_4;jly2%#&=+CMZ%ZSuP{lA!rW`4_PikOCe$2iUPlM;FF-0fDor=IO-)8$zXgR zS#}+nnhSCwi#3c!nNxd+=EZlNrXhL0Xwzn4zW^^K5~DA^bs!8H9&a}R>FHYJwtDch za10bYT~SE9DiJ^BPz4y)k^r739{aY`av!8E8*QH*)aCZxT4^S}h&5E?H0&^9x!Z1O zUP6;kr( u3y)p)wXbf0{=MgdRhu5lSe{-3*cpdW3bzLn@>U%c zB$K<-J5$NehnT#Z(Lv`a1$B3l{NWm ME|7vFa?vrArQ$OGJj!6LFv@7EBsG3m ztwwXS*r HWOi+8ttecUM1c(y0ak>c!@h B*kS!Fy`jwm)5O!$ht!1RcCqA+i)=M= z+|YceM(2?2WY&=dW-#wmoh14RRRJ(z84fDwcmMb~csDlBWlGRL6_Y z-mT+@wh<_}-LYs?c~5{>U&9i#t@lU-r@27LPBjUgnr|mS9#5J?%s%lDGW|*Y^Ktv_ z(yhSlX@3J=op+YIy+te_!z2UN-^2g#xH6##$9~=7(ST-l*%$m2#%n|t%MvTFMXCrb zl{CB494qEcebs+%)VM4LfeH__``&mSUu=A 4py%C=rL7Mi>8u5 zO51WiSkliTdRp&lM~%(7x2DrZ-w|wH(n4ysch7i5W46&^7i4khji#zuLoUFdvT(*b zH?mDrdv|Ch?~=k2^Yu(f_xdJ~g@E%5l59vJi=I33G9}k7d(LPSk$dtEdP@fI`h||W zNpyi-o4S{V2|dZs8SUWu4{q!uG>x9FN9_g1J2)>pd4^$d*_-_PBc@T4tjcLkQ3G4i zZO3o4P~Sjv$t0BJz!W-zZBou@OosQScs{E?8fR<3e&Z|h!;k7joletL3mpvk(kQOI zLM%EcL&)swZ{NO8e~c2a5jp~0 l@%^y2{z={kBcIRYo4k-|*BV0K zC7^oshWyKk%ofaL+HK`Y|9rB4dUT2$x-7U={}H+IJLXVP#u4l2I5VUAgwSmE0wokA zyPZI*O*}?Z$Tz#AJJm>|9qmU_3b`7C*Jkz^I#WA)G&yd$s7+@ for(+#;C7x+B0#-=gY6=(?HAKtFD3< z_{lv6gTVG_EJ2^))6%z#u0v&Kf=2lodi@lzN~6kME-O!i<+L`Ada|Gp4_2jiAHp|% zJp=OjUVK=z-|&7lPnIO&?Myy&Gfx=)XrBC1(fk#6?xRKWPy0~M1rV~aHa0W)UnM^W zM!H{mcuo%bdiHexD#-ayr;nY#^0T$Eb+Y|XwRHL~et3Uzz7H)&lMfXlK{H1yJzIzW z;*9+l&L4_@CLbC`|Ci+ciiY>^*>tqAvHbtf P&|B}wXI-9Yj&4*Ise=E|z z^7>Vpzti|vLQZ6VkuyC5gAaYte@G|N893S7|L@D=PycxD{PBMPpkJF0`+I#Tl#gF! zM3e+*BxFVDtUmNMjg1`s@dmnFY1FzGAHMCLiuxRMFql%%&OT($0qzLwbDMLtu0WOW z@aAGeikLD<$-J$ui{5vP#6fch#|CzO=>daY)HZ#Pth@5=4n4fqM*CsblcWSiQ%-T> zNm+)nUPlP5L?X$`SP8@ge_{zKJOGW#+E2ufOgggCNr$5R;|p~C36)H!BYIxkTD7f~ zRv5@Bu9skPR-rPuMw4g Enq{u|w`_ z(tAtOBi@17=^c2B_Ny)?Dbk8D0DhGBhm`GSDL^1(0OY@o0{M>%^Uuv6F(Lom>)%5? z{?h?K{$uy=0zdvc%D+qO{zk#W`iMvQp;7v))AEPcAGhD16~=x^TmH87kLvwrq04{w z{PUQ{F9ovSW=r}}GXFn%Wd9ER=ib<_L6hHxuKq7WDF5#GXP*4kS^I6vMt| (TSu68;9|503tOoPSNt_+Q}s=IsAhlux$*SvtQt z{C`mXs7Al?@COn9V)5U`@fRq6!|8wAm4AT#nQ4A;_-~8;0R2lw|11UaAr}Y$fbj8& M`5-7@`(H=@2SwV)_W%F@ literal 0 HcmV?d00001 diff --git a/docs/img/vis_overview.png b/docs/img/vis_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5eef9e0d726fddbd762d66f886f44cd962c62101 GIT binary patch literal 65183 zcmZs@1ymf(7A;I5xO;GScb7qeyL)hl;K3m{1b26LcL)|726qVV5S&5($@ks+-hFHR zYt_`MneMKh={~*BIeVX)2xUbnWCVN!2nYyd8EFYs2neX3;8z?RBm~3<6rtW~@CNv= z(mE~>5GaFxUmubgPzWF(-c)2H0P5dX&$40lF=YsT(R_@fk1RMMFU$Ml2&n(LB5?0@ z|CZgIf0*5!v*~$KzWl6H$MF3eYmMw^wX*=OAyPY@nrq9BJ6M@TGypB<9d-BY?9Afk zB9Z1&k-D)%wLB@HOA41vG_RQxh!OE|djwHCMWNCvAE69A#Ai-V3Ta?|yX_EZ0B)Rc znC%Dla0oENg{8fvIm3yiM$!Q)^4S^6>q}-fxceS53AsnNx!T+RpnQ ztI&D^jhHtUY_Sx=Q#7&*6C$ymVYp f&`h0$%M7BSyW0$Z~goFf^V?Y8eQOT>vU= zMIgn^&021 $h9QYl__*u39<3i5t&AEPy z8Nu)NIa88_AFb|b P=B2}Nad*2p=u9~8D%fsTeH-{n9{U|vs zvP7k3k~J3&WWR9XYfq6e<)nwfb+&{*q&bnhx%Ffi5@?HgOW2 Hl*h6~@5DyAtFtv=5`- z#haHWjPxv%2E`~PnN7bwD&0$nnS5r*N~{o6eC|$E?S8+)ef {om~;=r@BMoSXh32y*19#Tm^|S3RJgEuNKa$LIq9f$?9}a-KYH= zYBHbx0uzz3 &yokObu@h>3f%z${kG~=tc^J0~=N|572!(NWmm#q}G9{Q2qUAynx*oU_jCy!U9}u zmC6h|Q_!jT9BzGopSS5mw2F7cpED#mJE*Rq1jj~Q9O?LM#tF%spCh`2%tej&w#Xf+ z{>Y6UsHv0(qTQ0w@oAsar(H&Qop{Gp45t#yI2FB7DH$w{ZcsijeGNr>wj=p4!0AGd z_ic~ty?DI`I7q@Y)b!_0{3|@7?aFEl;h{k=BvUN=JD;?4U6 L4OGuzP<069lIe>e*OTt03@4- zBiYJpA$R9f{G6zpPla7ioheDv3FILrFYgh3cJ=o>xid^PU6?(<;VkZ{(XK0=L|a_< zay^WMIx=eL0Bjn4XBg)uf7=Znhx$$qX$5jk^{%k1sR3U~k|V_dMX&Rte%#OByzNih z8t+!@>~s9|rJlA4SMY!57Y8an!7+@)ilS=cNRSNQeYH-wjY-lKM?8%+1kf&!9Ci0{ zlLo(CEs}K>9EI~9BuhcL!K{ufQ<5BLjTDejY~=`%T&Gt-`tDyB`$RcEk!A1^G{K(+ zxIuix4}|d~v}&F m4Nlh&cpMJ<)C~7!ROF~nhibRPqty&zNd>UdMSZE4*2lbJ=@d)$pD|y}1Rt0kB z`Io%d5iHPal3M%c*4TK(Wg0ELZR?ZY-JGcKl~$DZ-hS$A0_ueoy)xcUun(Dps%h_$ zW?x@jjdtGFeD%5=ZVYDJ#AejU=`VnYKz%fro>G{tYXu}+E+A$~SY$U-0vWwCg-g=G zoAXr;-sP@eYt|&h3#ulM4TLR)M+y-w^A?1oB$;QLc2)HL9ggmN`wEY83IPXxz8Xl5 zvZDVm7U2$pLdgeaCN;Oj7FB*t?tUTqyA|z7jQD8%5NU*;U1IVfOL8&3`Ehm&A-Pws z|43%{aNhI2>#$wZqJSC+bC5^wCo=EC*^H$ybwu=II-*sQ_4@c9H~3OWH1lQ{-8lPa zbHrra4-F_x$gYc?k~p?5fA~CK9#^7pr=ekBy1a*z8HUv>%+?AdGcPs-u&^Z$H;xom zx 1+3RtQfoIm9 z_c!~VCHb;^-Op^Pk4FxKb0r2Sylix4*%fC8PR-3^?vEAgb~*2NgoR0o{%i~ncPuFx zIzKymzCS kqqKRepR7w|Rr)^A8DCqUk8(WucBAe^(RI#Jl zsvU&h>N*k- RdZVT;>@~1ZHW%pq72o(ZR&;B76RluCn~QRmU`93JF{U>pjy3LK zz<7yM&+ps2-}ZN!F)kByK$6A_>z-r(U Z^6rr2v3 z8*mNW&S??BPX6%DZ}yBeN>W#`H}`h$cPanBt^$jYXz+G Eh=t }G7#ZkrS4L+mF8edzn7`NHO&E%ODNtb$rlhx8pYCG^#eh$3 ze^#68?&Li;zt;{xU}x;zYv)oE8ppl9?UV03?oB;^(d}B0d7;;SyW7Oq-&@R727Z`0 z*u9fV%w xE)y6}kaT#+HHB4jlge8dFibbC(=$lEb^@&_Ceu;?>te`>kFxF{iZ1n(m;4%z zR-|37vP&lY6B-Fp%d2a}4Yu0LY(>OsL+W@WQA4k%=F}@@$Kx|M(*#>l@_Cpaw&$8& zUk*EIdZDVVWv4qG1zf6JeLj(&iso_bO|PiAG=k=b{15I>z<_1rZ=8Wcrwt2<%*h0d zY~u0#5U5EL8BoGP3UodR9lI>`USg;3#8}K4N1H@;-AF9I(2~c$M%NNrJi%Ye-w#wI zFdst}UK9mCF{ERW+8zMG1$3*^@Z$p&0<5T6%4-`Q5%F$mC0);-xWTGIfi;*m)H_nP zMWhnxvERCA`PJ>r(zSQRlcjK28oWPlZyPC0%F@Qle@Xil+_l@bB*_fC&&?=_a8`%w z&9A 2E>_bmWPyS*Dqlj<8XZl7$30iW$tv4S}u?}_FW7JX+;CrUj zq61FLzE(=_hNs0znAlOpdZ#jXvDK2Rnq=RIAAWyRq#K8EGy8@a)+Kj&qKj`G=?0uv zAU=g@m=>ba^nF=!Kf*PEC()G3(<5x88oXA02;k4B_MyfVFVl*fEJ)0TcS@S9N1Vs7 z%DrGYHg(Zyo2!unaq(K)3i)aViGUsT!Hig2n9&j1 urnDS0Z zOG6VI5yd^YWPrvz6?eq+N{vdzMh3;r`I`ud6_I!EG?h{Oz@K5GtBNGHEmb ;w5ctW( zqr%t#`E_58xq1Nbc-feg7NuHJNBc*MYfs{+rY7Ywwuxo!<_Gu3409G*sg|GORdF2A z?7s6^v=rUqc~Rf~*B5i03*c6FM>#L1v-doW-H1{QKC(*WMcL&!J+unGw*A`J`ac&B zUkA1U<-9q@bbts2i{$D6ctYA^_=w&hUTU~-@Lw Ipa@|!t^rTo%g_;+kg_RJsCLFI+MB8Bk8cx5M=%; zE)L=oWn>y(sNJ%fNHZRa%EXBf1v}%(`*Q)WZ{HX+(tZ%~1-{X>#>>il`!;5Bxp_X7 zEf9s6az=&|)z}+Rvq;Z>x!ke9p=+(#`S{4|cnOutl8cJGZ?@Ri*4A`9U!I#|IEMVQ z#qmKb&jk_LYN;mZ*eHIA|4B9t$`2KDizI?>b8VjYn9sY%r`dfAp3dIp{>t@omIy^s zBDmFRduM!ej)v4D(%rS<*ux~Syc~}ymC qH(~ur-Q+}*io`2Jh2QQ^t5aAC*>?6Z?q&M^U=UG1LSz7Xf={&7@ z7VYcs?XdQ3F&VQT4B`Qz6u@IV_M+Ds1Ivca(RLThCJvw{j~9o+2suTe`{kzp)s6@m z8NhXBY^=n5d@%_2frpK4$_}#{!L{dZb|xT(NFd>@j~@au8axvz2~@Nbk>`hBZa?{( zxc>3h5MNOsNUb2Qjexfe(C}QeSVc=Vnkdz6JlZ$asKePdc0DKML4Fk)*7%9?7mmeN zXc&*QnytZsiY3!`_vdTZ`{TQUfr2u8IcL@arpnQlgqG8+sc`V0xPy*6QWux>e5I_u z_T;)%`}U>q?`_F&?RD7oo?ndY*7AFCvqze&ev2D+DU niHV7Z Au8NSI>Id+Tn}U zgh95%2<4kEG*=L07j4tgzID9*L7rrQAqvE`9`N?00d6x=xf5??MH11g^*0a#1sUSw ze;Vmgzu!WYY%OAp6w~u)Yv$*Ujsr7!bVB@}`GNc+(~3q<`X1tiWL6OBWX6vrnQOzG zn|!MdM+X7h7#0EqSj-EPCfBPy7@yOc!+Y Z_1XM{&exY0AbdKGq( gn{W`Yt#z z%c<4>`I{cHO!|z(C*4=ALw0{*Hm}$Gj@&idQodUFh=aB~lzZ+63Kx+Bx(oB~J=M&| zFCHTn$0OH4Q>@7+ac!~v4%sO}_n8{m#6epHCyFk_H!j%`gZ#~ s?;VbTH_>znJ3^WjWMJd^sq?oX4Z-F@77OKmq(>|5DM+o49Z+{ zQt|QUwOk{$*Yz_!VvRg&AU-mN=$*rOW;*Y!L&Zr!H{A6doIlVu(_+y%uj=`t=Q^N2 zF(t%h_M5BO!Wpv}i9&G4`OD(we*7}oD%>l)>`a}sFB?Nmd}KTa>W*zkSHq1#vaM?r z@to!>{+;b2{KBiODy %4CVAh&{q4XT7tMsL$|Xa_Nd66rl4 zc4)3te>I4cWCuV(z}&$Qzl@GC&{EiP#o_ 6fiwKDip_d;N@k;H}-v zuv7PHwTKVSa3N^8upr~Ou(9!Gp;9YKf2`i_G*E})dD5sAYFLdnMhaUoi+85kb_og= z1#5_KwZEZj2mPO;5c)mJ`YD(ZJ_O`__*l({b>>P^aZ83}CjwO>9w-h4hYtbQQFn9J zXRtlfqiL{U3-Pf!|K;k`?5WLRrm7iMsnQUN^a!c!rP$+2+cDo~iM>KJ#&~>G?)JNq zPI<+AKmqg7Y#>2;7>DHSM^FO_8A@;(ZB*xTWy0|MTUW(IP<&4yJ=byHS=B1be;64g zO-l4@-gY}tX?s<{dqPDdpgv%!$37pkV0EP7GI*V|NVuH9MqfDsHXx7Va~S133KxZX z3R!xKOe6)l0lDmrT-RDK@6J3#G&<+qQc{Q%9_P3AIl%#B`!K(h)SLv26x5zbn{A}P z?^v$%bco^bDq~s2GJ6XS?HTsIBE`~OGIW3=XNAnf$jj_&n$s_7B)k{wMsXAGm3{EW z>}a`ozY4pA6&dfOwfA!Dj0vT_^0ZPpl27!bkFeg~vYj%hJhhn&let7SDC?17y299$ zaK;r6jSl+H$rK)(F4b=J_ r=jdoufvd|QmU^ ~|0N(AJm HoFkgr`6fY+P+J9O=-VJ1g#LjWL67Ez@O@f$5e9Ys|{C}RWY>_tD z!RY2WrEiVN>Yt7&tp^+4MstT2bndT`+nWt=HdC3{q5b4;eZGtUa?gEr!#ND`NMvs1 z*>%ZYo#oXV1YD~CDCeAaOy0B_lWzWgHg(kRnePVNJlZM&J=Vvjh1f61K?1dYUu~S3 z@ |&S*XV;Eo#>n7>a3{j%?oM&y~U#pG@!-Q)CKqY0rpN^-(K9(8al zK3^dcB0YKuTIKMcLYYj?=JS{A&Y3829e+SWVb;56T*tngFIP)RNy)%Dg+(PsBH)&n zk~;hqO<=7_*ZT_?rry(R6`gn72Mf}e&oMtqLTs8j5;{Bj!M#LRnCX*vPF{BK-Qx&d z=u{%v-t(t#GGi^=8zXjRlykGVxcER?TGn(>zO0rgb0^{v`rGhZ>)3FJ(Z(uIl*PXh zHj* !}nPccaR;=-~NqXqg5 z2)HR+o2sZc8gGc`+)s1rI5%(8#G+2~f?z(r0wKP` uW zG$RfB#n%Lk0&6@~quJOH-!+plX%t=0SMPoXLh-VR5`1Ku_`xCw84x7~0f5Te_|D9) zHJDeIXju8xDj*38;x9J;ZKA-jJv&Zl2#}IjwZ%SA1MdKso$8Wh_dXozI W+z9d9Gn)Pz@QIPCE+%{Wv%F5_si zOn6<9a^a>ZV-4Ght-O?{dYU@dqw=MKtueIHjBf)C8RW1SHO&Qe#EIiZ#(~M?1~sfG zo+*7a1otrW%Z@!suvtL>DzWRetCFXo0k|qjy&cb|wF<3{jdP_e%o-JT7Y{G{ AX(zPlu2pqQDSecZKxpUuCwA`(w!)?JkHPVZ&g+M*d#}gaFZ5$&Y GaF 3BH*X1x;Y_&_(4ts95 zeJtk|?5irEUHTT~4PrXwiZ7SDK$CK*ycfs=>R+p@zNvZKHcGw-6A=-GJcRO*`3oW7 zX%AGWnPxJi^vbpQ#$whed2kdIkQf9xl{q}$UdiQ~XX;uU7SFXe4meeaUZ};eJ~<9W zs}=f@v>dMH08sp4iG-<*)GUrrYN?R?J+KXdvGDa4swGE)JsvC+>)(nca(CZr5|RZ* zmL#((yI&5D1G|(?(RbX0!qvNaOdn$B^GBDi#1at?Ye#r!6a}UUjnk%rMS-G3d`&vj z1A}=v4<}K2>(Y1?wS5$d7n{_HPgCv*-37Y6*B7rATIFw2m+v!2Ao|01kWV2O(erJp z uml4!I{dX7`#?5vMDePg>kiWSyK5^_n@ zhCbZEXUO^L K(oHBEIlrA#BOVUe#`&)&J;C7o%C<)q_8lxE zBVa+qIYazovj2po|3SZh01!eH2w~NkC*|%w+M1d_rgeq?P0%`2sR)m(u#20Mvk9y+ zM-Hi#D(dL!Ry5?-X&Q)QU%MbFP5nx-8udlE4E=1|cV*@jtlpzjHThIL(_BFqOaINw z<_UrtY?XAd|Kr;~jId2oPH?5 }JcbPp5mo7=jGJIS1hmz=KkYqdO9XjE zQ_3$!lUc>phU*fcA-u|Ns;K{xk-?NQEPvI^(p}i=k!&=|qMTSR9}aszf(wJeSC9vC zh-F!Cj}9lv`mQiK!1rBzfK6>9ro8iej^JFbP vvPqbwb)7_bKMa)YK5Io-^-|M+c@LPlkMok<%9``@{*%7F7)-etj $q-bQ^ z%dY+2qSM=#s#&guFR5X)kE|s~sWDsNR>QO*e(O6 {! zUldK*vz{B%@8)gwA2wpUN}GQ$nl^w=IAA$ApxD?rI0|*&X|V;~InSdG1NUoi5(Pzo z1CM=?5e)e**P8?#Vc~0Q<#|Lj6Nn=1Zo@%nou|ER%vW62!k0V!DU!;-7&VsBAFU1? zD?5?*+(kkxYJjSosC|?nhm*Wz3GLz+ZCW*y)Su?TKSZ9gdIBW!Ep{5RU;L8|J{~60 z@md+NYJCpN5@~XqI8s5MUmcI;KbZ+PrvGCLl{=ELFAH?M=$IQ$-tx<$*L%qll|L5{ z_*7(nf1w~Aqu0(y8@To #%NU+&~z%S>mQuNqDP5B{mAne)4EhNG+od>0ZG?oXe6cK7gn3nyXqZ;6Lk z?cqHsYiH#~Wtk1Tv<-wy-DbqdjT00e+$d)_MyFb~wnR8+ZH>xU5RelV7@3*K)hC 0`DVu{dy_u9WZ<_qst(jA9n?^Ec-QX{U|&h|m{is9tal8`n0( zrvr2-u>uFOaun6afQ(sxvdu!X$tgN_a!%#5Z8j~ebI(6LT9}nMiP*c1o%W52YTAng z-Grh+%de*U8>1)+B$+WHFP9yL3HOakC^sxy4?aBbE?N6!QJo&Fw*M!&-+mJ`wp(bU zO?QgFWMqr`c!qDxW2UEq-t;9nPnq}j2yf$?Q?Aa-Vj(h rw)WD z6%zva*29IQdM*w{r)J7-7bwlYPjrJ1_ec8ns4wI!mmJS_<_qjqc!`VK*&`W9^k`Wo zkC0FWUayLBzEV`aVkM2NudnMiS m>(N~yspinK=Ra>}<{ftug76^#rD8_6-A|pWVxSsxbpX-l>HK#F zoeEcX@I2XK8_K)4T%JY8@!1;Ai`5Lchk4ZYL1#+o5D3M2LlNj2ECRSuKJls=S#cG? zM|&W(L%W@XEGMlEOcRJ`%qCj8`l<3AysF2~&D5B#*F}Q-lw|OuLO?SBfp53koor*3 zE+x8iP#nzsfXumaBjiNUhmWsD)9CM4BJ)+hambLJR0Av!I}VP|d|;gt(WJ6)^WwkP zJh~}Ilu9+WMkn=VtClaD=0>^=AAi87wDL^VKbXsqNt9NFL_aOnbBa}uLwX73#J7sc zoAY30z&tWe!Ai7oC>skBiE>S1M*9FH1eBKPWc0133QW#v^{m<(dX8Ae!&!c`O3PF8 zbm0dK`%bDi*1D&!p}b~I*NVJ>DvlZkdV72qi|))~ZZzgS%+oMsA1-=$%QfrS43| e`o_0`5}71^WvY$yK(k-?BWLL%vs!#3lJ zvx_yJg#*bSRy}5y7{i&C*3UUHvVSLCF4ywKc*Au`q2uxGjB$yohkEi*N63JN>w2xx z#nZyu-H89Wh2@=yw+Egj>H8F^ fHDv7&gNO%c40l$$M zkhtFP4`OV9w1Sw|+R=ivp}teB$EiV7Xvo7#lg}eq_J96uAH=+Fl$tIcd%D1U@BPC> zWyqLvRn`xMUpX^xT#|X@77t@~aplQRH3=4lu+4HhNA*2Z9J<;vWkhQQTNHSz*o8g+ zMeUB-wC1JrGV?6+F?fkCiW^+e;3R% o7xKKOWctLxex7-_ zb-Gl^FG>4#6t8h)V(3SlX*q6C0`ByWIx>pKYtv#R0gf!)rXi&d2u@>UR0W+WDtJXR zIKe*B_Xqh#h8LWu7fT~g0sa+HjjaGWM+gYc($pZE4)xm@gsoqt>Kf#fS#fQ9dqt9i z0=W?R^3mxTw_s%;$a~?ileenea;FGl63sQrw1uDiD#T%01P{5;-%VUWt%ssqP8yEP z5mXSb&~+X+&64>?L}kXDzWV8tRoC*2vlUjkWH{MB)DE~fh;PZCGr75rH}9k?o~vZZ z(~&u0jGwv6%s&<`V&^7qkJ)m?RL5&2#N`7g%f9xqRpXb1Tc^t# ;b8i zC^D{uS|n^dZitL5aYW7PxMs-KC5u}YfzEo3GlT#z8HdvVlUIkJtFyR;Ng le{Mz8Qq24S>~3*r2o^tpQ~7rvUQcEjjg7A z^o<{vaIFOSXzNn=jI^XQ&^lIBYO5dUZr&&a&CLE#+<404KKe9nqp=!5PIiPU)uD4M zSfhXQ7GS&Lmy>}Rwbr8rnJYA aGa4_HLtpD*k*-!jd{ zS6>0iAx9~?L;zlw1co&UPnbQ991xRi5zsQ^;GjivUDEOD= sv z#Oj^1ZK%78IS=?1M{m+vYNEFUT=@@w>YGS$qFm-+to+C7oAtPA^;pcHq>Hl&cyQ^T zr@F7S?$o)UquM2PnwvhXvRGAENTQs(oyIF4*Vk B5Hi7jeysl=;YN}okOcGL3SK}s7h3vjZ zAieHq>e>VHfgRXn)Yn1WO|Pc*eb?)6{+;$cfP{NY<`)Y`eGm3(fBz!il^n|_a9U*1 zv*2`F-~2}Mbb7%u^QGYnWNz_JOAL3_`@magTk 8}q$DKTluaw% zr`%RAnnjw)%we$OU4TpVDLX>)``?83o_{$^#?%26ye0(SFjrQsJqta3II?GbVc*@H zI#x &)tl0zhRI&9KKF7419LVbu zrvYl>GvxWf!NKmXIOkoa;dbW*JSH^~9y?{DGBBwyIvGIFL%rP}zi&~Hgr?%IWG4gn zx_kM`>ow=HLhr}V<$})CRT45_TF#bR3Z0P)PVqlkS{|mQrE$)VeyHfebmoIGtwv&C zs6-}+DK*mTx%3<=XB#k(K}^jv6=UY}Aox0(%Yi;Dh0%SGPC5B+ T3recpTPF6XEM)X661D@;tBcsH}<;gv8mWjh#dI?iUl&R z(Azh6 96%uB|Gn5?%aZy? zUkR&m%v3pZbA9;CsmPe*dU~#Ezr1Nq#2`8b?XOa1$3#6E#YjLpKT>lw)PPb>ej+-? z@*-ih{a(hk8MybQwZVie?82#wg0qV4JIu;(n>AjB&zC |1y&Q 8jTFg3O2rQ($COP76Hlwo69HfZI>`F4+~CvLGA$P1t8_)(0+p_l4G2YfCe9CNRv ztyCSs^SInpke4rlc5%6pO{U*ohiE A zkiX-A%Mqcc5P%o}r8L&Q{(eYH=)dHqAhp@Wdi%-- ;IP>R?DEVM z^i3I0Wm&9!4@$?o==uOSWFwDP90;{9C@j|)R?L|1H66b2eMV6o&k+)QyT9h|@VYaE zf)bY+PJ!bBoBh!#?pob8Et9en!_Aw}!_H9Q;WP;hG<0y7|LZ+daca<8dU|qQeSM{F zvqdsJ*I0^q5|67Jk@P#7Hk@u_9(%F>WJa?j?Z1}GsRq3G;ADD!Yw2#0lDk8R5fM8L zt!rLmkg*$t-NW)qp?ljE=s|q^tgL 0T!=%I33~i?p0#Q9Qc@a& z5z75*6bkwhc#|3{xATt6Kq*IO(A7q&oX>8q@iJ!%E4a$k?Rk$YWt<3~c_9=z>3Rr$ zM1+NfDFwEI5x1tnH`aJ0j*Q;1-{`#g#c4FMTs--7z@*qbGJ>?c01QkfVga$ HES&=b!!ZD 4i>C$jkIZZsqnEI#O|@*ui0;owz2AXX z&G5%D)Kk_JwU2UP!qmkhwBmp9)XbyXsMWzhTU)z@up PAxvczbIr=Na_lH??lz{eJuy{QjxcVaS z`Y@
U-(a)Ev0 z{qbC@ hk#|xi10@oJUnzfQ1oJE8Wy +S@sal3x4Q``JH5@&de z`ki6$`{I~)GkAT)jEGnVfM1#q;@@2SzhC@+zdolnkgtaa0Rkldw2j?S!3p`l)E`h4 zAXls^@c{xN&I!EyCjcBeK_KCSM}NC7K=1$|1RzI=@#6s&0)nd`vX(pu1|pz83sAcK zRCLmf5_ai3#>GP=LlUD=CXl0<<2$s#_}PSnxn|u#ywq2T=lx5DL+8iPdNT9SuO2BD z^*4NX>F1a5beq}U4a~5^IG*N3zVCCHBu*mhskr>fBfkzTQ&9h$*4g{nLk;;gH1k0~ zVATP541J>sYq);85qVhq#CpwVGhkj<7@RJwFN{L*+mT9iMR*(zQWffNbYJqd-HJ3{ zqKd1G9psFMzB_KLP`@6MJejIz2!# zG8~? z`4IMNR=!DVJ?g2#Ew(^4-fCN_&fL&$>icgl(jqmw_GU+)p>G=qq%%C}^xRZWguYE< z@wMG|dZmdxZN~(bi{_s!E)ZkJe_LT1vT;xSB6|4fq!)g>mJ*aIoa*RkC_ile_}#KF zh2}Gi&KggB2i`EKqr2zYMKX2kbG9Gdc;3FAqy4~yw|ot(lb)N*>>&qsRT_Jc&?RH# zbgg$s&*sn0T3F@=lPbGUPkY1pG!UWy0#334!Re`*^_oyKezJvO^?54n*i-px;9w7w z!9G`ihEJCQBAFvO9Gl_~j?K&SQ`PQIZn7&SMj=9!V}8apN!m0THS00851E6kiNO^! z&DDlf-WR2gSHYjq(EWd!2n|JR6$ZcGy3U?4F>Q(X 914O5J$zRxw7 zXA2Ny%!5W-&9+Rt7LqT1Ib|Q9xS5v-)7rletTaBW=G5-XUT#Un>YnclKJqxMkV?Li zC@>7Fy7-SSa7ow5`iyG}XtrGVJt+B=J4TP7+}ViyFpk+mbY`6NaQf3+!o>V~Hy5x^ zlZm3=&qN~2K+f?kBAGAd+54>yVWP;yoapWT%6 k(j h4XT;qpwcp7` z6?YQubkNo=>9yTV^v_QZjm~YSWa+JTE4-&>=9I|l8(O_@*D>UloTLi)(y+c7bLO@M zX0`$9t#%qT-Y6r#{|LPCK+39JmosfR+=23JCn@EfGJ5a1wsqbLHF0^GKaDX|xJfq8 zo88PcTW$ugK7=+0f VG)NsQh>Z@ZsG1CMeX*`nR0HXAYGeJcH mC)X#GssHOD5P{ z1ycpJ^AVc|aMB`Jb3WwCM @+#X^uqgX;X>yeJ{>*>YpssDbkF_I9ltI_ z>NnaqN}cq}%_3weeBY5s4 Jc`65Uu)lj)vc1= zbXK(}iNi>KytW4l>hmmNsEQ*6P5D0&dp9N-bN62GbQHWmx6~+moDBU;AZHtPO6RqK zGo3rKgJ=aU7h@?|rgb{ 3#7;)eG{3qJpH@vVd3_9mB+z7CR zh)?gCK>0y;EA2}h%fL3g@t$=-Fqd?BN=47T(*BSa!3@e6O+*ryKt|{lY02ID{8IpP zJOgo YVJ3 Yjw2b?wtEx%9LMS65+Lo$8% zvD;(kxXVfNefPy`p)<&rQjXsFA!YWurL=yoa;7x=%O}_jkqjJt&L0Fd+WMJJhOaLt zdlkVxt=1jC0dTc%tzxpL#*@p@`)veG2cu8u!}QEA#cH7xHv2PCD*z)$&f! ADxX@I=Igs^Slu4+tzM^&$p;8fsQSuXWKhv6%?4< zy{j_;pN} jMHB?=W_H_9#u&8L z52uF{$HBRPXQ= QZG|n?#m1|iE>;Sm$qXg-5k+4 z7!a+=;6hGHmS5wZOwBIWA&(!htT_KFOSYwksg@YX4S8p>PI_7!hjbv5Fuj`jQ?Ats zZ#(X~HgGlc$aw$zw<_N~@KEC76PX6%K5o`dDk1Cuq-bU@C8wLtdn1{``1)m7k#DP% zh`w6!20~Qi{Z^1^M4+0^3F3mK(|S`57hW$5-DJlk--|7>O#?ig205Gk^Y5qPEfON) z#}3YBL*^Ks-%7(Y9Nt0pvhjIJG7sOyRqYGd1U-Gz%SS#nt-s8YO$Lx#(-2g4!at$3 z6d(7`>zq5^Fj}^Y!kacGebQ{9tQ9jw5%!sDDni&`o%ph~;D KoPsd8{cLrU!20iJ0-0$GJaTGTM2wsF3t^(x9j03k*&v)W9Q_U zk4}}QH#Ff(6!bRyXK_VKT@?>f2Wk4(h|IWE*gan$7md?;k?Z7Ltl$Kz)11ahJ2#wS z>iX3d&QjVak;|kRCXu4}H9)A7Q>x$y>mFh35pMYDtLdDS YuoN6mDJ zZ}&A^8nuW4bg>X^OkYW>z|xulqB_sHkwb>Q^8IxhEduFl=hWcDe3Ldc1Ev?>YFA1I zyM>BAFW>2VNm5$ZofXHm!+G5e>?4Y7L2q94N|!%*1n1|{r&=EO*hwo)zY!@4%pDS2 zu^kGTmB6Z{0=izH+@@Ay$%KBR4d@HaL48?MH0UAkAs+T^|17dEuNl$2^8-X#R3AoW z-L-}tGH42*cQfK1ZKus0o-(k>ZMKr!#46kGLp0nlUKT4UO^E_;cJ>E}+f!y7k=eNz z)FBZu_|)hMswm#IhEdo^k1MKu*}stTUGwwyV49=#2nG8p&eZLxP={QYZ)e1k<3_bH z_Ci#oAYIntT4|}GS!yrqU!jqM^BEv4p+B{)Ma1LRyTh1 E>Kk6*!+bA@Y9m z#$Ek^7c$nCywUi;lUOOs+ljbElyvExbIwq^p3u;4jgv`>Jc~9yPSsIohr9WKLBV2W z)S0I#d#ph%9ss2rCryd5t^$pP@UJU}0egLLE&>6b`=8E6jG>o|GUO&TSQHW2>$IE! zL_PR#Au;!sA?{8h>eZ+c?)da0);_8jm<6oVs n+eOLcNnZJy4cL%umOC~NE8MpClzQ12M51-dwZNMqr(_bww-4>1AM_s zUsoR*$)FU})zy_s5||f+4Pq9 7Q>iPGe{_n4W_?ZXJ$^Pm74LS_qXva*8=D8%QXi>QaJ_-Ckzx{vq z{?8#z(JBTRa)}AS4XpMh`SDk)L8UhZ;9v;`xuGv5F*T`_qh@Q+{EQ{)rtIHOrNFwQ zK!Z!+x;8=Qo;CPiACUOhz-z_x)o<^AVmuEZcVIOyZRRh M@1>7)+d9;i!T0=qgq<@d4X3%zj?eQrRpm9+VI>#U9s)vgBTq8oieHB9 zX{PqhWJ~L9J=*`+s{!H&=%!<@O)-BB7C_0oioy4zZ2w+lGl%B7I+`AQ)8*|yd;zW| z;1B