From 63f849dd24af7e0b728bdc12eed18a9c9f976369 Mon Sep 17 00:00:00 2001 From: yabwon Date: Mon, 14 Sep 2020 22:16:37 +0200 Subject: [PATCH] macroArray, version 0.5 macroArray, version 0.5 - documentation updated - the do_overs automatically unquote `betwee=` parameter --- packages/README.md | 4 +- packages/SHA256_for_packages.txt | 2 + packages/macroarray.md | 1121 ++++++++++++++++++++++++++++++ packages/macroarray.zip | Bin 25866 -> 28425 bytes 4 files changed, 1125 insertions(+), 2 deletions(-) create mode 100644 packages/macroarray.md diff --git a/packages/README.md b/packages/README.md index 6c682b7..e6818ba 100644 --- a/packages/README.md +++ b/packages/README.md @@ -49,7 +49,7 @@ run; SHA256 digest for DFA: BB8768E977D62429368CFF2E5338A6553C35C998AEC09AF24088BA713BB54DDA -- **macroArray**\[0.4\], implementation of an array concept in a macrolanguage, e.g. +- **macroArray**\[0.5\], implementation of an array concept in a macrolanguage, e.g. ``` %array(ABC[17] (111:127), macarray=Y); @@ -68,7 +68,7 @@ SHA256 digest for DFA: BB8768E977D62429368CFF2E5338A6553C35C998AEC09AF24088BA713 which = 1:H:2 ); ``` -SHA256 digest for macroArray: 5C9208ADD091E354794C24FA830F527D17CFC758C24CB77BF2154949059F7E6F +SHA256 digest for macroArray: 69F6CF496F921D0E21F3524FC7FD130B4B8290C1E0B9BB3ABEA212B734EBE8A1 - **BasePlus**\[0.62\] adds a bunch of functionalities I am missing in BASE SAS, such as: diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index d32174d..cf1646e 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,5 +1,7 @@ /* 20200914 */ SQLinDS: DD5E319EB5AA29C7054EC428072F987E77C29D36874DED1AE5C62E4B300845EB +macroArray: 69F6CF496F921D0E21F3524FC7FD130B4B8290C1E0B9BB3ABEA212B734EBE8A1 + /* 20200911 */ sqlindsdemo: CCA3CB51587E30D1A4338EAF732EF03E0922918AAA21C3ECF85CABE93CD2FB15 macroArray: 5C9208ADD091E354794C24FA830F527D17CFC758C24CB77BF2154949059F7E6F diff --git a/packages/macroarray.md b/packages/macroarray.md new file mode 100644 index 0000000..d95f55c --- /dev/null +++ b/packages/macroarray.md @@ -0,0 +1,1121 @@ +# The macroArray package [ver. 0.5] ############################################### + +The **macroArray** package implements a macro array facility: +- `%array()`, +- `%do_over()`, +- `%make_do_over()`, +- `%deletemacarray()`, +- `%concatarrays()`, +- `%appendcell()`. +- etc. + +The set of macros, which emulates classic +data-step-array functionality on the macro +programming level, is provided. + +*Note:* +If you are working with BIG macroarrays do not +forget to verify your session setting for macro +memory limits. Run: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + proc options group = macro; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +to verify the following options: + +| option | description | +|-------------:|:-----------------------------------------------------------------------------------------------| +|`MEXECSIZE=` | specifies the maximum macro size that can be executed in memory. | +|`MSYMTABMAX=` | specifies the maximum amount of memory available to the macro variable symbol table or tables. | +|`MVARSIZE=` | specifies the maximum size for a macro variable that is stored in memory. | + + +Package contains: +1. macro appendarray, +2. macro appendcell, +3. macro array, +4. macro concatarrays, +5. macro deletemacarray, +6. macro do_over, +7. macro do_over2, +8. macro do_over3, +9. macro make_do_over, + +Required SAS Components: + *Base SAS Software* + +*SAS package generated by generatePackage, version 20200911* + +The SHA256 hash digest for package macroArray +`69F6CF496F921D0E21F3524FC7FD130B4B8290C1E0B9BB3ABEA212B734EBE8A1` + +### Content description ####################################################### + +## >>> `%appendArray()` macro: <<< ############################################## + +The `%appendArray()` macro is a macrowrapper +which allows to concatenate two macroarrays +created by `%array()` macro. + +By default values of the second macroarray are *not* removed. + +Dimensions of the first macroarray are extended. + +The `%appendArray()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%appendArray( + first + ,second +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. first - *Required*, a name of a macroarray created by the `%array()` macro. + +2. second - *Required*, a name of a macroarray created by the `%array()` macro. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Append macroarrays LL and MM. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(ll[2:4] $ 12, + function = quote(put(today() + 10*_I_, yymmdd10.)), + macarray=Y + ) + %array(mm[10:13] $ 1200, + function = quote(repeat("A",12*_I_)), + macarray=Y + ) + %put *%ll(2)*%ll(3)*%ll(4)*; + + %appendArray(ll, mm); + %put *%ll(2)*%ll(3)*%ll(4)*%ll(5)*%ll(6)**%ll(7)*%ll(8)*; + + %put *%mm(10)**%mm(11)*%mm(12)*%mm(13)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Error handling. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %appendArray(ll, ) + %appendArray(, mm) + + %appendArray(noExistA, noExistB) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%appendCell()` macro: <<< ############################################### + +The `%appendCell()` macro allows to append +a macrovariable to a macroarray created by the `%array()` macro. + +Dimensions of the macroarray are extended. + +The `%appendCell()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%appendCell( + first + ,second + ,hilo +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. first - *required*, a name of a macroarray created by the `%array()` macro. + +2. second - *required*, a name of a macrovariable to be append to the macroarray. + +3. hilo - *required*, if `H` macrovariable is appended at the end + if `L` macrovariable is appended at the beginning +); + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Create two macro wrappers. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %* Macro wrapper to append a macrovariable to the end of a macroarray; + %macro appendHC(array,cell); + %appendCell(&array.,&cell.,H) + %mend appendHC; + + %* macro wrapper to append a macrovariable to the beginning of a macroarray; + %macro appendLC(array,cell); + %appendCell(&array.,&cell.,L) + %mend appendLC; + + + %* create macroarrays X and variables W,Y,Z; + + %array(X[2:4] $ ("AAA", "BBB", "CCC"), macarray=Y) + %let W=1; + %let Y=2; + %let Z=3; + %put *%do_over(X)*&=W*&=Y*&=Z*; + + %put BEFORE *%do_over(X)**&=xLBOUND*&=xHBOUND*&=xN*; + %appendCell(X,Y,H) + %put AFTER1 *%do_over(X)**&=xLBOUND*&=xHBOUND*&=xN*; + + %appendLC(X,W) + %put AFTER2 *%do_over(X)**&=xLBOUND*&=xHBOUND*&=xN*; + + %appendHC(X,Z) + %put AFTER3 *%do_over(X)**&=xLBOUND*&=xHBOUND*&=xN*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Error handling +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %appendCell(X,Y,blahblah) + + %appendCell(X,,H) + %appendCell(,Y,H) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Adding variable below lower bound. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(zero[0:2] $ ("AAA", "BBB", "CCC"), macarray=Y) + %let belowzero=zzz; + + %put BEFORE *%do_over(zero)**&=zeroLBOUND*&=zeroHBOUND*&=zeroN*; + %appendCell(zero,belowzero,L) + %put AFTER *%do_over(zero)**&=zeroLBOUND*&=zeroHBOUND*&=zeroN*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%array()` macro: <<< #################################################### + +The code of a macro was inspired by +*Ted Clay's* and *David Katz's* macro `%array()`. + +The `%array()` macro version provided in the package +is designed to facilitate +the idea of macro array concept, i.e. *a list of +macrovariables with common prefix and numerical suffixes*. +Usually such construction is then resolved by +double ampersand syntax, e.g. `&&perfix&i` or similar one. + +What is new/extension to the `%array()` macro concept are: + +0. The syntax is closer to the data step one. +1. It is a pure macro code (it can be executed in any place + of 4GL code), this includes generating macro arrays out + of datasets. +2. When a macroarrray is created it allows also to generate + a new macro (named the same as the array name) and replace + the double ampersand syntax with more array looking one, + i.e. for array ABC user can have `%ABC(1)`, `%ABC(2)`, or `%ABC(&i)` + constructions. +3. The array macro allows to use data step functions to generate + array's entries. + +The `%array()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%array( + array + <,function=> + <,before=> + <,after=> + <,vnames=N> + <,macarray=N> + <,ds=> + <,vars=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `array` - *Mandatory*, an array name and a declaration/definition of an array,
+ e.g. `myArr[*] x1-x3 (4:6)`
+ or `myBrr[*] $ y1-y3 ("a" "b" "c")`
+ or `myCrr[3] $ ("d d d" "e,e,e" "f;f;f")`
+ or `myDrr p q r s`.
+ Macrovariables created by the macro are *global*. + If an array name is `_` (single underscore) then attached variables + list names are used, a call of the form: + `%array(_[*] p1 q2 r3 s4 (-1 -2 -3 -4))` + will create macrovariables: `p1`, `q2`, `r3`, and `s4` with respective + values: `-1`, `-2`, `-3`, and `-4`.
+ Three additional *global* macrovariables: + `LBOUND`, `HBOUND`, and `N` + are generated with the macroarray. See examples for more use-cases. + +* `function=` - *Optional*, a function or an expression to be applied to all array cells, + `_I_` is as array iterator, e.g. `_I_ + rand("uniform")`. + +* `before=` - *Optional*, a function or an expression to be added before looping through + array, e.g. `call streaminit(123)`. + +* `after=` - *Optional*, a function or an expression to be added after looping through + array, e.g. `call sortn(ABC)`. + +* `vnames=N` - *Optional*, Default value `N`, if set to `Y`/`YES` then macroarray is built based + on variables names instead values, e.g. + `%array(myArr[*] x1-x3 (4:6), vnames=Y)` + will use `x1`, `x2`, and `x3` as values instead `4`, `5`, and `6`. + +* `macarray=N` - *Optional*, Default value `N`, if set to `Y`/`YES` then macro named with array + name is compiled to create convenient envelope for multiple ampersands, e.g. + `%array(myArr[*] x1-x3 (4:6), macarray=Y)` + will create `%myArr(J)` macro which will allow to extract "data" + from macroarray like: + `%let x = %myArr(1);` + or when used with second parameter equal `I` (insert) allow to overwrite macroarrays + value: + `%let %myArr(17,i) = 42;` + +* `ds=` - *Optional*, Use a dataset as a basis for a macroarray data, + if used by default overwrites use of the `array` parameter, honors `macarray=` + argument, dataset options are allowed, e.g. `sashelp.class(obs=5)` + +* `vars=` - *Optional*, a list of variables used to create macroarrays from a dataset, + the list format can be as follows (`<...>` means optional): + `variable1 <... variableN>` + delimiters are hash(`#`) and pipe(`|`), currently only space + is supported as separator, the meaning of `#` and `|` delimiters + will be explained in the following example: + if the `vars = height#h weight weight|w age|` value is provided + then the following macroarrays will be created:
+ 1) macroarray "H" with ALL(`#`) values of variable "height"
+ 2) macroarray "WEIGHT" with ALL(no separator is equivalent to #) + values of variable "weight"
+ 3) macroarray "W" with UNIQUE(|) values of variable "weight" and
+ 4) macroarray "AGE" with UNIQUE(|) values of variable "age", + + + +### EXAMPLES AND USECASES: #################################################### + + +**EXAMPLE 1.** Basic use-case. + Creating macroarray like in the array statement; + values are used by default; + different types of brackets are allowed; + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(a[*] x1-x5 (1:5)) + + %array(b{5} (5*17)) + + %* Mind the $ since it is a character array! + %array(c(3) $ 10 ("a A" "b,B" "c;C")) + + %array(d x1-x5 (5 4 3 2 1)) + %put _user_; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Index ranges. + If range starts < 0 then it is shifted to 0. + In case when range is from `1` to `M` + then macrovariable `N` is set to `M` + In case when range is different + the `N` returns number of + elements in the array `(Hbound - Lbound + 1)`. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(d[-2:2] $ ("a" "b" "c" "d" "e")) + %put &=dLBOUND. &=dHBOUND. &=dN.; + %put &=d0. &=d1. &=d2. &=d3. &=d4.; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Functions. + It is possible to assign value of a function + or an expression to a cell of the array, + e.g. `array[_I_] = function(...)`. + You can use an iterator in a function. + As in case of usual arrays it is `_I_`. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(e[-3:3] $, function = "A" ) + %put &=eLBOUND. &=eHBOUND. &=eN.; + %put &=e0. &=e1. &=e2. &=e3. &=e4. &=e5. &=e6.; + + %array(f[-3:3], function = (2**_I_) ) + %put &=fLBOUND. &=fHBOUND. &=fN.; + %put &=f0. &=f1. &=f2. &=f3. &=f4. &=f5. &=f6.; + + %array(g[0:2], function = ranuni(123) ) + %put &=gLBOUND. &=gHBOUND. &=gN.; + %put &=g0. &=g1. &=g2.; + + %* Or something more complex; + %array(gg[0:11] $ 11, function = put(intnx("MONTH", '1jun2018'd, _I_, "E"), yymmn.)) + %put &=ggLBOUND. &=ggHBOUND. &=ggN.; + %put &=gg0 &=gg1 &=gg2 ... &=gg11; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Functions cont. + If there is need for set-up something *before* or *after*: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(h[10:12] + ,function = rand('Uniform') + ,before = call streaminit(123) + ,after = call sortn(of h[*]) + ) + %put &=h10. &=h11. &=h12.; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** Fibonacci series. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(i[1:10] (10*0) + ,function = ifn(_I_ < 2, 1, sum(i[max(_I_-2,1)], i[max(_I_-1,2)]) ) ) + %put &=i1 &=i2 &=i3 &=i4 &=i5 &=i6 &=i7 &=i8 &=i9 &=i10; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6a.** "Uppercas Letters" + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(UL[26] $, function = byte(rank("A")+_I_-1) ) + %put &=UL1 &=UL2 ... &=UL25 &=UL26; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6b.** "Lowercase Letters" + Extended by `macarray=Y` option and + the input mode support (with `I`). + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(ll[26] $, function = byte(rank("a")+_I_-1), macarray=Y) + %put *%ll(&llLBOUND.)*%ll(3)*%ll(4)*%ll(5)*...*%ll(25)*%ll(&llHBOUND.)*; + + %* The range handling, warning; + %put *%ll(265)*; + + %* The input mode; + %put *before:*%ll(2)*; + %let %ll(2,I) = bbbbb; + %put *after: *%ll(2)*; + + %* The range handling, error; + %let %ll(265,I) = bbb; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** The use of `vnames=Y` + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(R R1978-R1982) + %put &=R1 &=R2 &=R3 &=R4 &=R5; + + %array(R R1978-R1982 (78:82)) + %put &=R1 &=R2 &=R3 &=R4 &=R5; + + %array(R R1978-R1982 (78:82), vnames=Y) + %put &=R1 &=R2 &=R3 &=R4 &=R5; + + %array(R R1978-R1982, vnames=Y) + %put &=R1 &=R2 &=R3 &=R4 &=R5; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 8.** A "no name" array i.e. the `_[*]` array + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(_[*] x1-x5 (1:5)) + %put _user_; + + %array(_[*] p q r s (4*42)) + %put _user_; + + %* If no variables named than use _1 _2 ... _N; + %array(_[4] (-1 -2 -3 -4)) + %put &=_1 &=_2 &=_3 &=_4; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 9.** Pure macro code can be used in a data step. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + data test1; + set sashelp.class; + %array(ds[*] d1-d4 (4*17)) + a1 = &ds1.; + a2 = &ds2.; + a3 = &ds3.; + a4 = &ds4.; + run; + + data test2; + set sashelp.class; + %array(_[*] j k l m (4*17)) + a1 = &j.; + a2 = &k.; + a3 = &l.; + a4 = &m.; + run; + + data test3; + set sashelp.class; + %array(alpha[*] j k l m (101 102 103 104), macarray=Y) + a1 = %alpha(1); + a2 = %alpha(2); + a3 = %alpha(3); + a4 = %alpha(4); + a5 = %alpha(555); + run; + + data test4; + set sashelp.class; + %array(beta[*] j k l m (101 102 103 104), vnames=Y, macarray=Y) + a1 = "%beta(1)"; + a2 = "%beta(2)"; + a3 = "%beta(3)"; + a4 = "%beta(4)"; + a5 = "%beta(555)"; + run; + + data test5; + set sashelp.class; + %array(gamma[4] $ 12 ("101" "102" "103" "104"), macarray=Y) + a1 = "%gamma(1)"; + a2 = "%gamma(2)"; + a3 = "%gamma(3)"; + a4 = "%gamma(4)"; + a5 = "%gamma(555)"; + run; + + data test6; + set sashelp.class; + %array(ds = sashelp.cars, vars = Cylinders|, macarray=Y) + a0 = %Cylinders(0); + a1 = %Cylinders(1); + a2 = %Cylinders(2); + a3 = %Cylinders(3); + a4 = %Cylinders(4); + a5 = %Cylinders(555); + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 10.** Creating an array from a dataset, basic case. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(ds = sashelp.class, vars = height weight age) + %put _user_; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 11. Creating an array from a dataset, advanced. + If: `vars = height#h weight weight|w age|` + then create: + 1. macroarray "h" with ALL(#) values of variable "height" + 2. macroarray "weight" with ALL(no separator is equivalent to #) values of variable "weight" + 3. macroarray "w" with UNIQUE(|) values of variable "weight" + 4. macroarray "age" with UNIQUE(|) values of variable "age" + Currently the only separator in VARS is a space. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(ds = sashelp.class, vars = height#h weight weight|w age|) + %put _user_; + + %array(ds = sashelp.class, vars = height#hght weight weight|wght age|, macarray=Y) + %put *%hght(&hghtLBOUND.)**%weight(2)**%wght(&wghtHBOUND.)**%age(3)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 12.** Creating an array from a dataset with dataset options + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(ds = sashelp.cars(obs=100 where=(Cylinders=6)), vars = Make| Type| Model, macarray=Y) + %put *%make(&makeLBOUND.)*%Model(2)*%Model(3)*%Model(4)*%type(&typeHBOUND.)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%concatArrays()` macro: <<< ############################################# + +The `%concatArrays()` macro allows to concatenate +two macroarrays created by the `%array()` macro. + +By default values of the second macroarray are removed. + +Dimensions of the first macroarray are extended. + +The `%concatArrays()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%concatArrays( + first + ,second + <,removeSecond=Y> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. first - *Required*, a name of a macroarray created by the `%array()` macro. + +2. second - *Required*, a name of a macroarray created by the `%array()` macro. + +* removeSecond=Y - *Optional*, Default value `Y`, if set to `Y` then + the second array is removed. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Concatenate macroarrays LL and MM. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(ll[2:4] $ 12, + function = quote(put(today() + 10*_I_, yymmdd10.)), + macarray=Y + ) + %array(mm[10:13] $ 12000, + function = quote(repeat("A",123*_I_)), + macarray=Y + ) + %put *%ll(2)*%ll(3)*%ll(4)*; + + %concatArrays(ll, mm); + %put *%ll(2)*%ll(3)*%ll(4)*%ll(5)*%ll(6)**%ll(7)*%ll(8)*; + + %put *%mm(10)**%mm(11)*%mm(12)*%mm(13)*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Error handling. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %concatArrays(ll, ) + %concatArrays(, mm) + + %concatArrays(noExistA, noExistB) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%deleteMacArray()` macro: <<< ########################################### + +The `%deleteMacArray()` macro allows to delete +macroarrays created by the `%array()` macro. + +The `%deleteMacArray()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%deleteMacArray( + arrs + <,macarray=N> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. arrs - *Required*, a space separated list of manes + of macroarray created by the `%array()` macro. + +* macarray=N - *Optional*, indicator should a macro + associated with macroarray to be deleted? + If `Y` or `YES` then the associated macro is deleted. + + + +## >>> `%do_over()` macro: <<< ################################################ + +The code of the macro was inspired by +*Ted Clay's* and *David Katz's* macro `%do_over()`. + +The `%DO_OVER()` macro allows to iterate over macroarray created with the `macarray=Y` +parameter of the `%ARRAY()` macro. + +The `%do_over()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%do_over( + array + <,phrase=%nrstr(%&array(&_I_.))> + <,between=%str( )> + <,which = > +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. array - Required, indicates a macroarray which metadata (Lbound, Hbouns) + are to be used to loop in the `%do_over()` + +* phrase= - *Optional*, Default value `%nrstr(%&array(&_I_.))`, + a statement to be called in each iteration + of the internal do_over's loop. Loop iterator is `_I_`, + if you want to use `_I_` or array name + [e.g. `%myArr(&_I_.)`] *enclose it* in the `%NRSTR()` + macro quoting function. + +* between= - *Optional*, Default value `%str( )` (space), + a statement to be called in between each + iteration of the internal do_over loop. + If macroquoted (e.g. `%str( + )`) then the `%unquote()` + function is automatically applied. + +* which = - *Optional*, a _SPACE_ separated list of indexes which + should be used to iterate over selected macroarray. + Possible special characters are `H` and `L` which means + *high* and *low* bound of an array, list could be set with + colons(`:`) in form of `start:end:by` (*no spaces between!*), + if `by` is omitted the default is `1`. If possible use + `1:5` rather `1 2 3 4 5` since the firs works faster. + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple looping. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(beta[*] j k l m (101 102 103 104), vnames=Y, macarray=Y) + + %put #%do_over(beta)#; + + %put #%do_over(beta, phrase=%nrstr("%beta(&_I_.)"), between=%str(,))#; + + data test1; + %array(beta[*] j k l m (101 102 103 104), vnames=Y, macarray=Y) + %do_over(beta, phrase=%nrstr(a&_I_. = "%beta(&_I_.)";)) + put _all_; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Multiple arrays looping. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(alpha[*] j k l m n, vnames=Y, macarray=Y) + %array( beta[5] $ , function = "a", macarray=Y) + %array(gamma[4] (101 102 103 104), macarray=Y) + + data test2; + call streaminit(123); + %do_over(beta + , phrase = %nrstr(%beta(&_I_.) = %gamma(&_I_.) * rand('Uniform'); output;) + , between = put _all_; + ); + put _all_; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Multiple arrays looping, cont. + Create multiple datasets. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %do_over(beta + , phrase = %nrstr( + data %alpha(&_I_.)2; + call streaminit(123); + %beta(&_I_.)x = %gamma(&_I_.) * rand('Uniform'); + output; + run; + ) + ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Multiple arrays looping, cont. + Create multiple datasets using a macro. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %macro doit(ds, var=a, val=1); + data &ds.; + call streaminit(123); + &var. = &val. * rand('Uniform'); + output; + run; + %mend doit; + + %do_over(beta + , phrase = %nrstr( + %DOIT(%alpha(&_I_.)1, var = %beta(&_I_.), val = %gamma(&_I_.)) + ) + ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** `%do_over()` inside `%array()` + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(test[*] x1-x12 (1:12), macarray=Y) + + %put **%test(1)**%test(12)**; + + %put #%do_over(test)#; + + %array(abc[*] x1-x12 (%do_over(test,phrase=%nrstr(%eval(100-%test(&_I_.))))), macarray=Y) + + %put **%abc(1)**%abc(12)**; + + %put #%do_over(abc)#; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** Looping over array with *macroquoted* separator. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(alpha[11] (5:15), macarray=Y) + + %let x = %do_over(alpha + , phrase = %NRSTR(%alpha(&_I_.)) + , between= %str( + ) + ); + %put &=x.; + %put %sysevalf(&x.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** Working with the `WHICH=` optional parameter + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(test[*] x01-x12, vnames= Y, macarray=Y) + + %put #%do_over(test)#; + + %put #%do_over(test, which= 1 3 5)#; + + %put #%do_over(test, which= 1:5)#; + + %put #%do_over(test, which= 1:5:2 7 8)#; + + %put #%do_over(test, which= L:H l:h)#; + + %put #%do_over(test, which= L:3 10:h)#; + + %put #%do_over(test, which= L:H h:l:-1 13 14)#; + + %put #%do_over(test, which= %eval(1+1):%eval(5+1))#; + + %put #%do_over(test, which= L:H h:l:-1 13 14, between=%str(,))#; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%do_over2()` macro: <<< ################################################ + +The code of the macro was inspired by +*Ted Clay's* and *David Katz's* macro `%do_over()`. + +The `%DO_OVER2()` macro allows to iterate over *two* macroarray created with the `macarray=Y` +parameter of the `%ARRAY()` macro. + +The `%do_over2()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%do_over2( + arrayI + ,arrayJ + <,phrase=%nrstr(%&arrayI(&_I_.) %&arrayJ(&_J_.))> + <,between=%str( )> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. arrayI - Required, indicates the first macroarray which metadata (Lbound, Hbouns) + are to be used in the outer loop in the `%do_over2()` + +2. arrayJ - Required, indicates the second macroarray which metadata (Lbound, Hbouns) + are to be used in the inner loop in the `%do_over2()` + +* phrase= - *Optional*, Default value `%nrstr(%&arrayI(&_I_.) %&arrayJ(&_J_.))`, + a statement to be called in each iteration + of the *inner* loop. The outer loop iterator is `_I_`, + the inner loop iterator is `_J_`, + if you want to use `_I_`, `_J_`, or arrays names + [e.g. `%myArr(&_I_.)`] *enclose them* in the `%NRSTR()` + macro quoting function. + +* between= - *Optional*, Default value `%str( )` (space), + a statement to be called in between each + iteration of the internal do_over2 loop. + If macroquoted (e.g. `%str( + )`) then the `%unquote()` + function is automatically applied. + +*/ +/* +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Looping over two arrays. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(alpha[*] j k l m n, vnames=Y, macarray=Y) + %array( beta[4] (101 102 103 104), macarray=Y) + + %put *%do_over2(alpha, beta + , phrase = %NRSTR((%alpha(&_I_.), %beta(&_J_))) + )*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Looping over two arrays with a separator. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(alpha[11] (5:15), macarray=Y) + %array( beta[ 4] (101 102 103 104), macarray=Y) + + %let x = %do_over2(alpha, beta + , phrase = %NRSTR((%alpha(&_I_.) * %beta(&_J_))) + , between= + + ); + %put &=x.; + %put %sysevalf(&x.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Looping over two arrays with *macroquoted* separator. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(alpha[11] (5:15), macarray=Y) + %array( beta[ 4] (101 102 103 104), macarray=Y) + + %let x = %do_over2(alpha, beta + , phrase = %NRSTR((%alpha(&_I_.) * %beta(&_J_))) + , between= %str( + ) + ); + %put &=x.; + %put %sysevalf(&x.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%do_over3()` macro: <<< ################################################ + +The code of the macro was inspired by +*Ted Clay's* and *David Katz's* macro `%do_over()`. + +The `%DO_OVER3()` macro allows to iterate over *three* macroarray created with the `macarray=Y` +parameter of the `%ARRAY()` macro. + +The `%do_over3()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%do_over2( + arrayI + ,arrayJ + ,arrayK + <,phrase=%nrstr(%&arrayI(&_I_.) %&arrayJ(&_J_.) %&arrayK(&_K_.))> + <,between=%str( )> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. arrayI - Required, indicates the first macroarray which metadata (Lbound, Hbouns) + are to be used in the outer loop in the `%do_over3()` + +2. arrayJ - Required, indicates the second macroarray which metadata (Lbound, Hbouns) + are to be used in the inner loop in the `%do_over3()` + +3. arrayK - Required, indicates the third macroarray which metadata (Lbound, Hbouns) + are to be used in the inner loop in the `%do_over3()` + +* phrase= - *Optional*, Default value `%nrstr(%&arrayI(&_I_.) %&arrayJ(&_J_.) %&arrayK(&_K_.))`, + a statement to be called in each iteration + of the *inner* loop. The *outer* loop iterator is `_I_`, + the *middle* loop iterator is `_J_`, the *inner* loop iterator is `_K_`, + if you want to use `_I_`, `_J_`, `_K_`, or arrays names + [e.g. `%myArr(&_I_.)`] *enclose them* in the `%NRSTR()` + macro quoting function. + +* between= - *Optional*, Default value `%str( )` (space), + a statement to be called in between each + iteration of the internal do_over2 loop. + If macroquoted (e.g. `%str( + )`) then the `%unquote()` + function is automatically applied. + + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Looping over 3 macroarrays. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(a1_[2] (0 1), macarray=Y) + %array(a2_[2] (2 3), macarray=Y) + %array(a3_[2] (4 5), macarray=Y) + + %do_over3(a1_, a2_, a3_ + , phrase = %NRSTR(%put (%a1_(&_I_.), %a2_(&_J_), %a3_(&_K_));) + ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2.** Looping 3 times over a macroarray. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(a[0:2] (0 1 2), macarray=Y) + + %do_over3(a, a, a + , phrase = %NRSTR(%put (%a(&_I_.), %a(&_J_), %a(&_K_));) + ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/* +## >>> `%make_do_over()` macro: <<< ########################################### + +The code of the macro was inspired by +*Ted Clay's* and *David Katz's* macro `%do_over()`. + +The `%make_do_over()` macro allows to generate +the `%DO_OVER()` macros. It works *only* for *n>3*! + +The `%make_do_over()` macro does *not* executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%make_do_over( + size +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +size - Required, indicates the number of dimensions + (i.e. inner loops) of the `%DO_OVER()` macro. + + + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Code of created "4-loop" %DO_OVER4() macro + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %macro do_over4( + arrayI1, + arrayI2, + arrayI3, + arrayI4, + phrase=%nrstr( + %&arrayI1(&_I1_.) + %&arrayI2(&_I2_.) + %&arrayI3(&_I3_.) + %&arrayI3(&_I4_.) + ), + between=%str( ) + ); + %local _I1_ _I2_ _I3_ _I4_; + %do _I1_ = &&&arrayI1.LBOUND %to &&&arrayI1.HBOUND; + %do _I2_ = &&&arrayI2.LBOUND %to &&&arrayI2.HBOUND; + %do _I3_ = &&&arrayI3.LBOUND %to &&&arrayI3.HBOUND; + %do _I4_ = &&&arrayI4.LBOUND %to &&&arrayI4.HBOUND; + %if not ( + &_I1_. = &&&arrayI1.LBOUND + AND &_I2_. = &&&arrayI2.LBOUND + AND &_I3_. = &&&arrayI3.LBOUND + AND &_I4_. = &&&arrayI4.LBOUND + ) + %then %do;%unquote(&between.)%end;%unquote(%unquote(&phrase.)) + %end; + %end; + %end; + %end; + %mend do_over4; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Create a 4-loop `%DO_OVER4()` macro + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %make_do_over(4); + + %array(a1_[2] (0 1), macarray=Y) + + %do_over4(a1_, a1_, a1_, a1_ + , phrase = %NRSTR(%put (%a1_(&_I1_.), %a1_(&_I2_), %a1_(&_I3_), %a1_(&_I4_));) + ) + + %put *%do_over4(a1_, a1_, a1_, a1_ + , between = * + )*; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3.** Create a 5-loop `%DO_OVER5()` macro + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %make_do_over(5); + + %array(a1_[2] (0 1), macarray=Y) + + %do_over5(a1_, a1_, a1_, a1_, a1_ + , phrase = %NRSTR(%put (%a1_(&_I1_.), %a1_(&_I2_), %a1_(&_I3_), %a1_(&_I4_), %a1_(&_I5_));) + ) + + %put *%do_over5(a1_, a1_, a1_, a1_, a1_ + , between = * + )* + ; + + options nomprint; + data test2; + %do_over5(a1_, a1_, a1_, a1_, a1_ + , phrase = %NRSTR(x1 = %a1_(&_I1_.); x2 = %a1_(&_I2_); x3 = %a1_(&_I3_); x4 = %a1_(&_I4_); x5 = %a1_(&_I5_);) + , between = output; + ) + output; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Create all from 6 to 10 "do_overs" + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + %array(loop[6:10] (6:10), macarray=Y) + %do_over(loop + , phrase = %nrstr( + %make_do_over(%loop(&_I_.)) + ) + ); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## License #################################################################### +Copyright (c) Bartosz Jablonski, since January 2019 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/macroarray.zip b/packages/macroarray.zip index 0325ac77e221f41021e4399321ceca5ee9b7905a..50d13c50a8f0fee68f5d01309c60727961b6bf69 100644 GIT binary patch delta 26714 zcmZ6yV{o8d6RsOO6Wg{XwrzWYiESrOYU*XB`9{2933Sv`;ihqg*g>*sYyJ-Uy%oE zKFAg5=tJ)?SUjlq`A*s;c6=J|^wRx3;5$kvNt*%G)-#5|({?;w?`X1=?msNUDKr~* z*BySp`lSdu5hJ`BAV5Qx9YOS9$Bv1gV1>s7K$);_u!c_^j&4ztdP<^_Jl zF$PPfqobv-h_Aqe#R){YRyL3K9lUzH81sC5RwUuK!B-W!fp0;i7dGRqP~T0W;3}$6 z#nb>w%eRlbAk2R-_bmtg@V!rB8{0L4maScU1-3bFUW|ro5i(4nwbt$kwbYx2;pBJh zY@4u#VBkqoG>l~5&-yMpPWZU9vzx}}x| ztl5gis{SpT6G5$RqupS8a1HXmv9A10)&m7JVlV@A#I1I_5-n9w?WUpsdK1JAOA#6c z{sWmTsjYFySeRnWE~A}8v(O`RKfqgwRe8G7=^ppqUgA2mVe?@35Wx9j_u%-Q+AUFjGIgIlW~a8Ow)yJy7%MR# z0}Yt92G+ji^M9ag}8E4}uP2WBJ?E&e@dF*~l3*$q<|Y$f`{)ltysGGd9UA zxU9LBGj#7ri6@<&c+MbcDm6F%;p^Y=M0hj?dH&tY*@Sm-0{nsK#Lhtw- zDvLj)T)a8!VSfQLELxMj#Xrzj&T_&S&^3>HLAds-El7b_OKG1qtMMMDwj*!CVi=s- zLRlczf$d>*|588?NS^1~47l5BmLMT%wUa>zJ`lU*sIT@KZT$#N8W> z7Me^W)RQ~8H;`c@n); zw`1;B%wrww;)SO7qHXpfN2h!>B=F$RV<}>`@Qr*wvd1L_o~d-KTC4u49?q@rztckz zTu$4GDf0*LL|JFD0cRXaAxF<{*cTylO>P$mA$JC+4u~9!Q(sG}Ip>Fxcr#avklDKr zZX3Ge&sNxmrS`g_rWM)zUlPz+zW>VtIYp|7nJ_pNt^Hm z;Z)x8%Nmja8K!M^AXMaZ84StrhC`U$QKYi|-(}=A*3_o>5$Y-MvEs@_uRLf&WD_V_ z$%qHW6u2g~GQ>l8X*=w7RjqPqFDA|jQD&Kgvm$Jeb&N8w2(*-V3DwS&`8wkjf4Ol- z<6Dr2L<$fLZVNnxwEuzv{m=`tsmDbak~T4*r>oa2?n2NzA0P-(tU> z<bx7t!zlildkGlIx>^2Ln#e351H4WF`A$7|J$CE0d9>qNf1zM zfW9m^3$plj$X6JNl7+C00bD<+mawp;ug*}*Px*b^3=^3|@g;-nqXDEqRAywDi8juO z0C2D1?9-Grc4ltySeXF4hw|rXRyPs9K?S}%%nSTEBW8is(8hJMc)&14Cat-3fZwRDRlvPn2-kw7a`uBR01xWG#)& zm|-P(_1#hoSd~uru7`=X)O|{OJ0bLgD%hOJ)zK8TG;T3VN#0@J8+1RfsEs&wzG5cS zOO-1isrZ@hw+X+~zR~f%02_OzF;9*^OYPPJTrck+|67J3y#@~G3^3ULE0K%mOyQGB ztFUZ9a+EwQ3AwE+v4SKn?qfzU3|G@ z+X{D3lNu!#Q;SFq6NFfPNNQE;w; zZ3i%n<&xY93l*ThsLVH)Y@1Z77Ah8X4jbLx-uI3(yYX47;R~UTgJmhd0(wS!jdEIB zgmdHj$nL*7og*%j<&SWq#%m%jr9bl5MHiCndmMFDs6F(gsG$Snfn@M*c&KcSA^w*m_M8~r!uj{6eo!d(hQ~q*$_oR)qKg-d?pg}r*BIF*Pb0Z9lZwoG4BZUx1=obo`R`z0aFySn)CKtH8 zQcod4Z@@wPGXgXc1$w+f5XxC>(px<=08tatIO_Ys3DpsZ?&XY}g+hlC^!+RG_Lbwdb#ah-c;0mdc?K zF^cu92%VxM)LF_)FT<(IG^Sqth83tanW%tU5m82C=_?;6q+U@?Ju(Go3M@37MHHCJ ztnvs52rTi`a<2rt`(*a z3fLU2Zw{7^`Bg2RHu3_J4)LFJX7y>L!brNIB+mFxWwCAW&`?d!t3wlm%?>%yucE*VM63 zr}|u|cUK+JvXjpWIW7uHutSw6HZiV>28IFyPn{$WD{PeeYO;a98wjG?I`nbu%F&ZS z?EG1;wr_h-*_xq}c=J9&0SMS>3tokb^VpIz+Ow{Mky6@~f~AsdNfz4`SUON-WYI^S z9rNpn$;jaI6wu`zfB4AF+3VaH!rIUNhIl7rMVB@-+yoa(2=wi$knOYJqR0&|Buiwr z+43yZokgHb+w=qTHEIfPpvIn{q}(U48rMRiNjwSykYvHx=V?(LX~vT#IT1}%=^l2K z8>GY4u8n1)w-#a(dgvv}Zq-!h`}yhiRXaYf@Rk~r!-3OM~U8R)2B<~ z(T%YYp8DNCbB&175&PQ(+pW4Kt4@1~rUeuC1-#x*&nbY;komI_BqC=kR{j(hK(D16 zIDK+qpkU=n%7Tzb_B*?)@bznYQ?*_z(9bg9XkbW&?xwPpv~Ln*^0uqhwag18@i!{U zSx6=dM4l&-Or8&Al;bEtluuacoC8x>d~MBt>9pcx(!pw(R5Zv;tEx7`?n{SJ|5f2A zr^D4C^tL=;^!T)@{Y_HI-x!uJ5z*WXJOM4i*mip zBxLIdM*DOuN?wlULnG{T8;?aqg!rj*?g<00_ke7dil2RvgaML@sg#+r(#^Sh%_=QEtH7V#L$gDJ&OabKmRj}51t zKXXKB4dZab0^n{8!OAib`8ZoI48`YU{b!?=Yl@vc=U=G7>IYq>rnGl`Ri1J zB-x#E9INvq(ie?1RQAura4VZ2D`h^7?@z4%6}&&t>H9iK+sIr1RN{_g#)=FYToZM1 zu}-;2+)v8is2dk!S30u>+cuFa9w+%OMo10U69W^x9aA`t^e|>YlH1pDV1{jT$_=wN z{!N>f>D>&&1mS+6B%OP=Ah1@!P4Tru9zit10d?r2G`BOMiixyX_?=hs9b&_S7<~tx zD8ktX?Tm7A1Q|Sl`Yr8`K~fUa2QO*pobV(ud1;u#wyWt8*6sVQnP*WZn4pgFk6i_G zk+m_{U6f+XGZ>~;P|C-H=3w7oaud#JA4xCoYr~Fgi z@o)~|zyJr{@F}L}-a!Eg@n#-$8p{sXM4ebw(t{~Bjp<)CQdEiRlnf$tMJyPM%cx<3bfXPb`w;%F?A+6O4sXDoV z)uRzXu~b6Kn`FhB6u zH+}O_VxmR|7hmsH0?b?nvz`cfG|$T3NehNYnF}l7=`AHevW; z?a;S_IT!nlOHz(}V+3wpSX20xv3*`Z$`t}vXr*S*pwLo03i{w=DmzT`L1m-vMUSHt zL2h8=Sq&UYBB03U%U00e<(5`7n>oC2;D1hDgK+1d)V&6=$(jLZOwq#f?Cs55xegp;9}cW2)4xrm-vo+^Zx%A%em{H%o(ov|IUIPOcgQ zpKcE%hyK2J96p!L_w&9PV{3~EiPtH)pLvVwrO(9;n`02`9Qbe#a}c_H+A=gP?v`mF zIy)w>5yf}XqpiS`G3mt5<-w8^FIr4_i9~J!GxVZHi$t&NoO!o(cZKueHYezbW*YDe zspdKibDrUg`laNW{?%)%pTfB6Ww|+tM88_IA~%2N?jvJ%>} z`@o)s^^2M_IL(2BR;+yj6;MS!Fn36u5<f0 z%MSCIVPcbwONi%OjOEhe-q2+Gk23f7$)} zHVS5B(Guv{De77qJ55~cdRyaC#y@>SMA4!u>s8S*I8y~aCa(gujXzNL&!qNh&$Bhn z%yS5iauh{)i5=db#@MDMd~dpf5zm{v5ETj_gH9(uUo^2R20(qt{UDriMNN1OE+xSN zE(afe#$KAje~~!u%_0Nsm-m=X&Qj^ftvMS#JF_+%yBSHVS@b9u5O@w{vZ!C5$dNi9 z(jutq(XHUUmF^sP+Zp-|yv&orErKUK-fdq_eK{6?sfIzSFVbfZ3|_|lZY6n%jHUPXFLu?@;r|0I(? z6Il6$f~XQ?p*ahmgF;iQDX8MS;RQbn;(sR2rJzP!Yr4=Vi(u7>La5Uud%@qG19f-5WjrX!wkvo&i$<7LTfC}3}^IcNXE(Aw>P zuG&}|VD!=0nIr*>>ab4#{S<=(fB!d$K0H55?5c;p-%ZLwyGDTd$8>wtwAB{)IuRar7R*MPk+T_f-Siqr z#(8V3==nJr9#_uX=j$8|-TTRko{QUSn-NYxtD+Ie;q)1TG%b9NgZowwpD|I(#q6E8 zsvJBV@ewtCzj&0o_~Z7of6woAkG;ga_*}^V+P#(@^z80_?vSxBSj@pH`#aMK%u1PF zDkR0erHT!Jmj%|F8x6GHs$DD%0gBWL2oTH-$tMVwSE!!e%m#2#BL=Xm(UuS_G%T|; zRu9FX@KAD-pU7@b{d_}@ZM^|*AsrITe`dM8n|~MVMs_tOzf-uv-0|{_4Vm@nY54B{ zgDx`aT2#?w4{^kC@|<9XiCuPjKgnvsHForv(4$AyS4;Zwu^7{ zOUR`VQt`n1T7G@yAl-|>*CE|t^8i6la3^4HHAMstVUU$;BL=%yA1A@3?-$XJN1Y6V z6n{WHXXseS1D1h#Cd0b}1gDiHM(s{B(_f&r1QVKM4y}R~D=8b75U?mt4(q#^v#NtR zwS)3i@WqNEirg8s!$CnN85Tt4%V7b302Ls)#|LjnNBIHgpC!z`qfzruUJ10(y@Ovi zFW|?P>p^y4n+J#5NcM2V&$*akjvx48Gzc#a;?vNX|D0$4%v9~E1yhbLz!qtQ;r&5( z%rsQZ5|J2+nEXqgo(S+A@KdF_ca+JcOiY|k=m-0z)aIf+aiUg?Dk4{+jS3OKQHpk& zpm5!_xtV8OMd2{hoPE4>i2MkZ!{XB%t#7d&ht;0Xti%!gI2;5kk~UoQKe}cvCS`TR z7B*7A%3lwC_kgAH;ea&P1`MsBix$P?sat=czIxEtI$EHBKiS#T&*~h zKLnGm-RQpMU}Vqh?5QTk>ZUEANPKrW{cj2XOg!Y)yRlN1@ZyuWTH7F0j z^1)yGBeHyzCosJE zGu%8Z>%}fZVFCCYi3=W>Ym=Fj&jQIS+ob1GlO?{UwpTCs9;RWDbLU{V1Y1*|Twgxp znYx{Y>z2tJt+YDoT{O)-f4?V#Dyv`Gk-T|hHjEb>gmKQT0J%zTFPK&zv~NcqHH* z1+_=c?UVoYhu@zzz;OF9$9HMx>^xi5U3;4kHC(3Q#8A0phd6AjrP*iIe<>W_ z{r(AbFg`Zk$2H)8W#RXrGR^RR&;|oO$$)?z(6If#(B{kTKWMW=UsYTl zdFWz41z*ufxJCjS$pemyE-EV9C?8C!pBPzyxo*FmkgPfqGw;>}62wHA+u?mh6345I z-WRodONX6pS~Cq2#w%=26`0r11Q`|<=1?bpFR#08cGleE{LVwL5oPHPE(_qY9J$A)b~=VnpcL6T$mv@$kg2nkaa?Lk$;)RaMSg9iPujO-mk#YGk;L7fxJv!JQ5*agXHNQ9d#YF*_vlF3|* zdBD}DU*msOsr^G)JOGw16cpyIc@P2+~nHBp+bFm8{aOs^7 z$zEY4bP>^lH`b3Skdvn)-?Wg+p2Bdp6PxY*%A{oYjsqq3lHb;pnf2!%sNe zpg#o$UjF)2C-~JX4eZAly`la0pfxamd`S~zn|r}dKjbhlN9c6gbgglECE7w6v72uY z#Lu*lfJc}W+6wMTm)iIImzCH0M`zmFjlA34nFm)OLf3~in@?&?XyJD$Uv3X3@*KpZ z*;JZt>C+1~j6!x6SILsp?s<2}8OR#B!&fsP=yAvS0b?oHd@p57;Z#Y?<^P<**2r5U zw>;Wkg5Vd}h}Gr&${1QgGhQI&EsfobH){^<%W=HvcaovM%?C@CCT{I3&7L))l)6jkV^m}7_cY05bg*XddD8+Y z_WF5iyUpk5|K_zkS@&DNYG2$=VX(H*CibO^&sS0DL%`^}C0zSUu5khL8Y!@CN=NJ&YfjYV+66ct?#H|fX8{Ppa`2cO9?JuFe(NGCCrWdirZBVu|Q;du*zF427_Yss3 zi|?O}(?xh~-O}HNTU~)i2&)5ODdrGxG=w-lFl99CZfhF9yu%X4CW_#nLMzo_g<44V zbs|gW6Pa^}BX%{-9DWkH7ig__@+AIh{A8ymcv@Q84f}McD4`48#xwkqCN{HX zq_fBK6+!1}l_~4$!~mK>EDSL5JR~I?uIR;)X=HZ9n?!j2qNn(WgpvX;h>jcH6N~3J z3?ep>?^jTV@+ij37H2G5XhL*;FNS_K z5JM``u<1eFGUcv5$>Zvpey69jPi!LCtEv;8Lu~6Q++!gI9CJ-kI01*z5Coyr%=bp4 z&kMUoSD+H*^?j-eB~lO)U;P{^-$=!dl+Bmu z*iQa{lQYa_fj)ZOGyzYpKagyVd*f-~+3`t|Fw;0i%IyQ@c72&(X2!xz_4DjpEhs^C zZ9C%z*oh=(RNyg5>I_kg;YroDuo%6-bwN1P2TG}3U5n3t!rA5bI~NN9A{pxTb-A@Dgj(G(b;c{ngxM9%5qdUm0T{v%44)O%L@k!|6g^gus!+AUccl@CA7OFW&#`&JgNEus>+Vdr0hg}8*2V; zm~aBx6n(fgv-911nSa|=I7g?jd`DN?}MXN}N<})z%#5Te~}Y7z8&q*g*^| z7VoE_C*AIw_1b!@lkF>~a*?gkw?_pulO5_nVhN~Kz48nX@|UOsZo2&ZnXFGAb7%6K zkLn#MDuCVr;tWAV`Z4vRNjqgb7ms>ar%bJzExYS?>CE9?l|l5alF@WhyZtu24Qt_@ z;1x$Z&xNljkJV$)Zl@%`JKTO@HA6Z;vKHSnk_mQHt&tINdGNII`PuzBDnQ~;{<6d` zEG4}h#}L`b(Z5d}oFrc$reg9W4E_WW6nys43m|->ED@CA*g4;0D-QCs)F_jb=-a#b zW^ZZuD}D4wGSQJLSHR%7UR4eEFUv?1;gpJOtIuRF@f-Lw|QdR5_~*vw&f7;&Yke~hk{G;KgG7M`}- zKLG{9dc117hwDg>R%l}$Cq6bBG-TG@7nuF%w=Be2T&=d^X}id=Vm^l~iGzx?`gAp| z2p-b1jATkU92+Gq8C&oSbjL}F-dA6}W$gO+%e0XEsxHb6(kDeV0zW1Qgl_#YxrQ=K ziAyNU)f18pJU>zUs_g~m*qFU^x1lHJePB)jrZj)W<2Ob z98f!0x7p(&nbg%?x4H-ah`)>3FSG@T29Aa~tTt{7_kr36`z7Dy^Eug9AU3wyNW%-gH0( z%*$e@b54Fwp3vqfOr+yR+jdCWHDqv+$tQQ{!!1h_ySFk)_!A*K$M&}5-&?KCg1$@? zzxeq0wf{!2%6M3xyT89*^DhuzTL(^z_8b<@I}xEAMj(SX`mR6lel z00FdH;a_%;141DcJq@HJQbrnEK;*M4j_pt&i_5D2BX_YC-0lDs+?MDXL;0#>8w3kn z-Uw-KD}|CR%I94+82*q5RQleR*zY%{g7A7?kv)q-i_yKS zS^+Ftg8J~CA~+{rD|C+eP#_^0uAbTlRc9rl`bZxH?)MT-#7@hXzh`%lOk;E7&Q_L@ zeZc+yPfI~|M0IblK|u5jlfhW}W1!k*`yvYv&mq*M-ob1Xo}8 z@!g<+1-kNw*Y0iL__z#%;kA<>h@Zsr`{2AXJ3(D7#AJnUDa+d&BDbRw291z-fV0HW z?&$Of)`P2ZMwiX)OX^($W3YP1PP8JeZiTQKxs%w?EKc?wLR-d^VD39|Bzn=cO2MY* zw}tl(yK<$n^ms~SOwoZu#H0@>(t|@mLcw1TGV_)vOtokZX3qE&0f=e84mQ+;w0^_C zWoBx{_Hu3tynqH@O=R;El60$V@|h*Xe}fesQjZPoe1 zFnW_S2bB{=3bhdNB!C-{A64+K2a;V)2E39YvnZiM4#XJlcsS4qZG`ucCh9qLQcRRi z`M-b&4OV@7O)yNrx$P#-Ae6u#5JZPifl)biIcCU`yhKsk$-#t>!bxjXV0MyO(ZUX{ z4XWXa660SHj&NrKZ_D9VY!8-l74UsK_yvE?#%{83q<_qU^#lxLsW^#T%b9r)tNbD?Sem&uQQpD426TKP!+Q1j0sY4npbPeYSiB%5f5tQ zmoHfJ8vR2?3o;JMASzF&BmDPA7*+TP82DD{<#D+=?7A_4z?*_zjQl1yGumHaTUBGzW$Zf_1)H{C-Ouv0<}pz1E+X#nsQP;&qosAE#dIoPxw@&3V2&6+V&`(_EgYMt zvO%5V`WwUl4~XY*Uc zpb?j2A9FNd%>xQ>E*p#gW=hNK!)A}es++=tV2rEOJHm-kZJfS&uSNWz$;~t5Ng$#h z$4K5wR%(#rg)#BR9U>uC3@h8Zn70uS=v`vBvP};42Wqp+c8ETJgTg1+{DX=LAVll@#LB6$WHT);_mT;Hb6V zmDJtHaD#{}wjtcRpEYG=YN&*bJhmHxIKy)SCLqg6k^~HAM&jH3}3kO zbqvXbvl@TgnGh!xC!!_1gQy344>w?2?NP72{84(%lF(qfnMb?H!_3D=k z_$k=kMKT+`h<>FV0@Tr!ngV4p=qy?XYEG0J&SnW6%j2=gl!@3tc4^n(yAlWC-4H>t z6A%=DZEp-*di`hN>vvsYApc;ofyokvpm0Kz4H1$I5R{F=^7KBJA44zq0SDgmyjmtD zSSqBltP2Ej7^Gj6h%v$O|7Z?OK2~}$6UF%5p5W1xLy9F~`_C%k{p5rfid?JX+!M_Q1yf7W^mzT1I$f9I1 zmSD1s7Cc8Z-c!bS?1~aO+iJNZGG5c}kX}0;{=HPXg}z7{?*gw>XU5uLE+|lAh!^%} zs!$3)$ey;6_scQ|;KvnEDV?7ngX8 zi?K~t{)pQK^%FoK9#68HX?G-p`f5a|XSHa~Up-~x#ky&C_5zb1dvVjHs&d03mo#?H zLFD|yZgTR1<<@XxvRr#hBlc+J-=7cW2FWqw&aw494syRuB-bm52-U@6AU1k5>8stO zXLq8o&j}&m*H=Tzl4(v>1A$Y*Vm!YNlSaaVROMqbg9HThbN;*__yTduqjPA?4@687 z;Fr%Y?lBZ4AqYukvQO8-JZ)rh&nfAu4n0^#AZxZq_zX1>ER^|KkCe&R{fzzMLrhvw zfZ0bSD#}c<9!PFQWW%_DycOTdSdy>yE`Af0VQ;>6FC|K(50b|Bq_x9OqBOi3c^pLK z>^kb?RRlo&ZC^km#mV?<$+1+%Hk=xk3_deTQX$3?M=>G-2~#f+|6+=)HqY7@N4JH; zzuB38fK>YGN2-$?g@l!+8sxD3?JUSQU}GMdnF{F>hbGefs?y39-@=(Tvkk-sb; zxtWAs57sJ0EtJguXf0Hs2vN~Z4rI$jj7v+q#se!{NyA`}L$C$NIRig99l3jm6gHH} z30ev4Ai4_Yr$AA@PF&aHwNXSBppw=!40(060ti@zaX<&*%vIqdQmSsw(5Z84k+@Gb zRkLeYN7s9M4~A<9)&f5Po&u_I>$E&;-3p6l2to#(4tH#pNlbMf?_`W0J68-}^s zpphL@uF4R5NRf8N&+?c zzH9n_vgJ)2y?88u215~ILymo#o~hS64SUcCCACt?y*p0d?91~(@a(~y)!};nSZw+L{Co2 ze+)G${A0myF}z2tua9Qm()wW4R0iNcUz1@KUU^oMyRuV+Wn`-*6Y5@z4p1!H$|^9A z^2Mx2y6atvC&F)>AKpMj+eWzn?-@R85~AdvbP0H|SxFZm+wEBPzbTS1R*{arG`!(U zL&TA?a0Nf&uZ*I)_S`2G-pfAEx89S;H^yS0!SOvs9Yu?R*oHCVoEZi$*8$?3|1Oq{ zdh){AjwyA@PG5*!moEK$@;QiTsZW={Bm;dI)_}qK8fBVs4O#D-jCR!{XK_tepO{gl zaNKzBU*C80W&BTTT8i2yXqGlmtB$hjw`tyT`3QrS1L53_&?IRelAkI zsZe9M3Xq(F{5%?wd}3#aOF+W<+BXM2GfQa{M>boj)`>1Q>K7; z3QdXHap{cGk(*|W>-5=`2;(8C4qrutIf>&77lyGkwL4vP;oX)`946)9@E}*tKtAzd z!y_jVQ0xLB;CJ(Nq%(Y#WQlHl{yz{diKXx~U| zNTtvyf1PdE$RaW@Z6H9U^CJ_A^cY$rd^<5SgY0QWQs62mCixDn-H|cKiRz@`M}Zi= z6af;Y@r`ovJ~+o;QFk`ffYLj!f3ZIgFK!H#(4Sm0m`3{Kmt|H~{MFDXcv@froQuVG z{+ZK&2e(W>*j@2ze#9G&Ax6aFu4xqwr(B4QnbBcTLbf`O+yWyCB(qXbwI!=1692|H zRMUqbetBG#hRn?WjJ7Q~h@8Tb0tPAI^@T8l5tt0Aq-n;A3@#uojE#zf&c$*g47oU~ z*_v8~?aW5+$iGuMf4X*ya;A{dX%-pYkDbZKuS+Ci%|1TRMR5WVKsd!~zs6}4`@gG= zriyFW-xQ2-EI?5R-Rd9(zHGZI=*}>l>4FVYL9~zQQG1NDHcR59W{pOj?xnO6^&L3R;yaT}^KUPOttU0vFIXWzA zhS;gfRCp0+rWEZ(+e~Z3ZET&nfK8`++ZxR!;Lmh>sr~n|CI%rJ1$Fl^#C0ZGw4-V% ze-W2G)jEv&m!iFntj2d;Aw1XRU(Y7`4HN9B?-I9Zxzi;&45+-cjKqp|W4A@=({4ed z+laXr@5T{Li!ElW)9l_=JQyLuZ`;o;KF=uJEX{@KX`RL$zbD($08`+w9t^fQgumwi zXy|=w%@WXd7790SNge+rvbyh}hds>zS;H^D&R6MvV>3Oo2(5^psIlNqv*t((V11!3 znD_%%GLhljX)XA+!s5>Zd2oUz)M2>d-BD65Cfwciv3%9jx5BV4IK(t|V&-{A{k{#d zSrxD~f2<@X$r}_h2Q63xf*73<@pwr9@Pxw4^MvbqN=rK8K^N=gipESaF62Y0*UHnB zk=yh03@PwB^|v9(#YH|dctPS}xxyn!Q6DIituCpDDZRPn#sy`U zITQS|tkpt$Ou8p>=}c-@G9Ps*G=8azAB?}x14Cf|yMx|q;?ic{sz^?l>vr@2A}ZXZ z)=Li3h!Sq@$Tzw|Y+n32+BH+c%9BJ_l=egyi_yI~pTp*m8c)uR?wV|AMDwjK9m*%C zX$7r6{^}wTO?=>LcqLkvG#V+=}xo(Hp5V-oLMJ15|}l~Cos5=;LNHG|KAkJBk2D6I$>qf zI4orxf4W_kI?g4<8Z}5QY@AHYVkOHYrD=>W5j_y@h|ThYY}n{Oa1?#V6}^3(mu#-o z``Uh^CqRT?$wEXW6^%wdtW7=~J(!+=t@%ev1~M1Q>HIyo3aLsr37!RmGlq>PIL>yy zvEdRyBYCvnzqf-$hN|@PisaI_?pw=ak>LHf$|&RszYuzzHvhU_Z^|quGXmI?b^C>AtQO`8pE2#t|)_GFwxs-s=~oMxGm>e;2g zW$$=h&g^MVwpdA&DAkad5|&@*${3esQ{1oYssmezp3R^L`FuyMsuzdEwF8lxN1zxm zF7+{JCY-U-{Gk{*=gVC?j_<%Udy0pkSH!%1aL4>M=xcustnw1gP^{8irwC#s>cSzuipI)|q41JB@LF<&=w9+gV6#L3)+ zBAI6h4(i(ZjOcMP>{g>>em&x3P;3G}P0>ux^EVGWN2zKtrTmwE()Z#a&|!unJ!w$c zQDWy%hR0?sugHlaU1}fbl76=+x~w21>4LZVqjK5}Xd@}op?%URVUg z#mr)u;NsLon=rmpB;L++6Mjf#Nvv*C?|^yO;O!y$fs(u zsM#ESQ2vhZxTm(w_ZE96ob8ruyj~>ozvw|;-9DeQ9s@K2r!qi(sx- z#|-LUndsKf4pSj9l2RjDTOZ(=)uRNkPr82350@KR=vD-%ra&&X=2601IST7zE|?0} z-k|pw7ge~6MpEn|y}+oZV;DV3VwT2fN0(^(m|54AZzAHE^W<{jL|+i#U1ZaKRqpn9 zEqxUsZ|;=1u*ksat81~(OI7w~{E^VdSlaL3EOKynU)JNSe%l;&r72)SlsyMZUBT&X zk&*EYY4}Cdb>wBNr7am~s;G(|i(EKqiiJ~`Vw|4s3h{Xx{)jdZ7BZ>rP~e-u-e@11 z$K*cF>0qXEVE3LOo8FFL{};sn1-0pI)qs!NvS-#-?lpvw_;stGmV$n_%a!viw!2i( z9__FKy|vquxI$Y+cP2Q_&{8tWldxfk1A~68};saZWNx9JO6`O zyE&y0HRa+I+V`msCrXf{P-gZp4f+zH2H&1I)UmePeZ<;81!v)c1d+~pTIwt>^!8xs zUEAc|s@e0ab2#nV`1LLzRu9R*c_1=aXe!cK9DTbuZ%E??A7W%b);jx~0546mL=ocAT0Zswl3+#i|d zuXlKxYFE@)yxg=w!y^?l{OP|m=T%-_r+nY-@TS8r*0tLbDZf1*^xXW8to?h4&+$_p zu<2UTDiuF;X{8B7AiVQTm*Go7_-B_SW>|cs?I*?n2WCyjfIMJyb)clKGX`{C#EHaJVNx!e4Pzcr`L_#LY~xhIeNI5 zlgKP!G1`;uhIksD) z$oml5$W?a2{PeGLVXX1JzTW?{ufRZF;3@e-Af1_SW$=~ge=P_Hi&;$y1tGLESvxb=RLYX#0~~0i{$cut3Tp!Yx>;Kvu=E)98KOo!nH? zk2;Qn05oXte1Fq@WPjGW`n+HG{RG@)TBp?9f3nHSbTY*1aFK3hbv2+;r+3bO6!X}G z-sTt%71f~`R99E`=8U^oM|h#ZS_cXiAdg*@@;5OYwv6nt5|2&)BlO?{!!`7U?Daby zSN>Vi=)YY4_Vk42O5KPNp8WX*40E`e>Az(gub54nAGY&N)GQ4=6{WBb% zyC--n-^Zx?h@|R-0P$x8>fkIQB-j9gW@f&Bh+2)LTb}nUw{^BXU)=o9k{Bs|fV2Q) zkSpcj2dPoAQRE>tfk$W;!}hbgl7>ujzi32c5_V{CQn1X}kVMnn_1#?yQ}|1%&YwlR zDjS#qr0Loi1Kphb)=J)HCbtR5%_=&N-iF-L|e(UPu*u0CwambV-t3Z=(3!-a=wGtu21?|=tGY|Y$ z$hYvp?f3w}%9x(oYO%$d6i?-AXz6CEc^^c0B2n5*lE1Pf*A?C32g-z+k8Y8olr88m|2@y^S7r`etK)`yWHaq^ceq7D6M%D#Vx4pGr)r zZAH$;cz~>D9Q&n0xs8e~MP0sgTVFjrGoV??v&>2ejj5D?nT$ba}`| z*|n-_&oXCdNn((Zpl#*L-bsv?hfcM}A5I+)cY_8#AbL5L;aJvIP0U6NpMD;{Ky%64 zW{H3nmy3NJK-aIFv$mYr*WzwyKo0L-?#*C8K0}4!r!{g@a?bJ<4_q3Aprz{OQGXVE zxZhN`5Uwd6A$L)Ir&Dfow7RHx`STZkgN?DC+I5}`oh0#^DRV7?nV0Hs$87Jhy@Ij! zRI~|zurDLOa~{)UO>AITVwSMO+h959-lN*BS#0a0BQ-Nk2=>FD!EDnA{_J#v20K-#G*{M>I5B zZxts*7!3lfpZcdB4%IBMMF$nJk%AQ}x?wK_Vw9zolN<3ovQ$3eRDbMzuPnJK>Ouza zzxBxvEB$TR+O_nprNcBeH#3wMAv8R0?QBEL&BlaJPVQH%nCPOup+d-G5$EWa1h^zH zFmzdZFtqmNf|@%cXIpz8Dx<;aXW}-kV`U`0ei^5(7ti9xc)t?H&@K&9zpSy0TO+2- zVjj~ej0ets2hC`yY+zx%^KJRkcWXm8!GYwJ7K4-}yP8S}xwJ0%*TtP>XTeVfd<%xd z3oQdgTmp`y{_!+ZbixgK+G6S7Y=;+a0QQpm?;;KQIW*pdH3wyJ;g;WQOlrTcY+0~3 z>&~cTjH#?Ndsvb)fQS&@U5ss#R zcI=c+7eB4vPLuoKfYkBl{n!vOdG?{KTlhKg7}K=z&xIm6Sfb%JU6+}r=r;u#K$zCx zv}mao0uJwhZQ*EjApc2!nl%Sixt~bom!P6}BqORP-!fy*M|q1qWe%}dGCzpr-_-FZ zag!GwW5GR9ezYVsw$vFpV%@(IRL%Pl2vg8Pbxi1SABtM`2?n-r+~L{<7tx1ACQa|U zEMqDdqA^`-@l5_L#JbjnQB|T@4S?S3s5AC`8QIA zQ3SITlD8K(W`ycKqYg-cLkI^%HEaxcgYtB>={nwH3!NxIB6M9?O28``n&?298Q%gp z(+MJzldq2m|K|OCX`YV37v5*a0)fb0bP7y4I9{7NCFx5u1I@Zln!7Izr#b155h8Zj zYd7gAOWp?1P1|f-;*{$kJ|E>nI);|SBiAB|QG#{VhqaDGM{I<)RwzK;@$~K8if%P; z2u0A-<_rnH(0NV{%zNi~2NI}xhwtC(Iyz8NA)zH&bC%dX#Wd}QrhUl+8jiiUx4c!r zlV?kEvq*Lf3r(_;t2@8@V)3rrx{Tfh_ z8r|faA1xe9+7+3<*De9ZTBiMOVuWKC zi)PEgpHcSVm5B(rn5vs^3=js3sD`cuf~4Z>?^R*npNNwX+i6JczfHbe2FncHtUC~| zB%H57v`Dl^*3@2a!?A`QK>g-UP9fKm1yNsN0{0mz{WxT&*_|?6F^?A3TQ#0pbG#u# zEOVH8idP)SfvQ)H=JnE*ib6rjA6adglunli*sJ}g>E(hQIAk1d259n zsTPoI>#_P&e&2iyi=Q(ALOBVznmvB?3)EMLC=o>#M)GNI7;eWn@4=8oUr1j$?If~G z)ji}pc1B9*7i;%SIT_?IT8GH>&!%Sp^Zw6Pmr#1y!YNx^sTsku&w?WMtT>vyO|Gan z8>7d$aOxwWigSvh4tI$j^&@Ex#`>~mGRovlhzXjp?PHg?0SP6Bs#!zh6RDlyGna=hP zX=pg?Q0zE~D%lUR--Y*U2CwO8T|e^4F>|G6iuj#(47kBsWF+b)$ zEPQ!C-@d^yg8T79Y-Ptn`>6Yak8kd@HvEWt8}B(G2-GrjUL7&Eiq zf}*K1&Xs`i+&k_vxxge!pKaw`fq9%f>-?5$%Z#nG z2vbF9hMPYPqt|Xf>K8RWz+T42;)@KtM@Zp<$3wIxn;FE?TBfq#mV?WcDRL0El*gZs zLW)*HIAE3(fjc=QYS=3l2YW_w`i)i%v3@ku_0T{WmGJPco#N2E5gBgu5>6*F6~#QS z?Yp7vYM2$;NP!5fQH>APxL%YEi}an^8r&#Yt{K8y4*V^e+yf&L0OPWj3!HpOO@Y7q zDYzYqETgx-N6Btt+MmB)DDG=rzu_t>v}G2G>&iN^Nl#`GMa8emp5=pMSeCd5%g-BLNimRaO@=xtn%OFXcA#KJ924cBPs)BW_x zRu(!cH6D$m!ZDP4WA5pCPDG^8@}&>if59JtuQmI-VNdSxga0t^$vGKm&;7l?yN~%t z;4i{8`s6X`ufTL!+1b6ly6MG`%3*oVYG^zaKVrT3+V2F^2_^qS||Y+JWmzaPE{@)76}Mwf?5i^pH2(ejHR zA4jmnuAn}q?VeI9f3PY-y}HQvoBw<@or45kNh@@5I zdPwTD&yq+%r$9l4FL_q)cy|8ea&w3w$9cc?)V03S_&L)m|BR3dQ*}mcZv)FKpq}~$d6b}P=LMzJw1U_2aZ^gB{?m2xX~}SyouIR zIuS22%Ly!_t2d1Gm9fGk@S=rwbu!RLj5FrER!AQVTqtG{BYchx4fgbYn-hxe%?3#^ zC2+kXLVhhV8BXK@%|O!I6J)dOg4XFx#&$2F)DJ7#$U$5Fk;2!DK^Yl$dbj9FGu;}}CJOhZJ ztI5I;Q939}zG}PrnisLFPag}h-IS~I-HU+cfsGPDIG?m+0y)i?#r+spWh1w?$?M3=fC@(;@*dP%%jSWjl7yx z25VWD6(tb2#3-S|g~b#{5f;)~-J&jAVZ#U5ag4cFAYy&^J=rlesQrqjG=^TOPn>QK z$p%@6&7KB4H+^=}njiUkoA^t;_tC)Bh@Q9^)uGyu2zwafY zeb<$fdPuiWT7d75D;zTc9n6E4F0QXM)F^*dU$b$^ByOUkjN^jaj;$ zzp9w#yq5Kf?ZwMw=c;2=^zsbLL~-Q>#F38P1pZn=2qUF%Z_2wHT`qbfg_RwxOfURf zOH+|$UPE1(zOv4{g&TW0IL%Abw~~n^98R!{oT9^Xl77pM1BfnPSyQWi`;fg^*?KY4xSy1zp!kj0oma7>xguorrS7-YaDW~GpM>X@6Jpw8YQ3lU9c$f}ZqIcW%?f51?&PzM zHjdDuP6>(EhIQEYAic#_4NI2~L$#otg$-g-_(p70d4N(GQZQTGr)K1tGA5NTZb#^4 zE{<@4Tv~>1qgsh*y@1QAP1aHdADTm)m#8t`lH1(Ef`>9_A+te3rQ zv`8y%zeMrog{qfqr|3oy(Bmh<1EwLodG=P~GJDt5k7(bnridi0zI?Bf zJqU&jpY)H%RTk(bGP>rQw~0^kvk||x-K9WI%vj^EH(;hRvI8}`YO-<%u1KaG*KjgF zI9XN_qB%sI7X}$DNmas8sl>yuqA2<`LX&3_k8k0S=&(aIMrSM2LXLe9A>FZ60I%aSe@W zKeFp_F>*U4Vimf@)vtv_iC`zy$q(})e_*F)hqth{?$m}<*R2x0IElKA(m4M`G zyfBz)ip1V{bPi9}1$v8)^Zi4~rZv-V_gi0>ytZBE{X)<9 z!X%VPE+4whJ<(5a65db>hG=>4@WSq3LeA&_tQbj^)YB@zSN$e$K$Y?uTG>7j`8%6x zb z9^NaBxL?UsOw>X5ZhqRE09a2(a^{^K`Q)GF<)4{$+~O0?JivZ!GZKl&(P>okeO^f?jREGK8G*bYSwz8O9dJx_s|7CgkZq z!14w&+`2PUYEr*Po%sH*$cc}WtMlZPXN(jx3^KL{JNuwNNBH9z_c2!dul7A z${*90Y`O8kHp`Td6`0aHA?yWuYNj`G+-uxDvi3dp?@%p>g9SIe4=T>2{eGtJVtS&m zM*h4Y+Rz++`1Byf+V(VtXFd=d;HhJlCW>Jxq6v(vHE&oYa2 ze(X+>iuuVLDr^G7=4Jb#0D0V6C?@}D77+S7Z-WH%*?Gxf4fb2JZtd5jBgAl32A4fD zCGX5LOdD?bJ#tb~(w<6!-`|@3oH(p8fsy!N(hozn-_Z}Wpa_@_kWkE&bz$dP15{Nt&u-ut`O=kwbL7$%%gk(>jWz;p!W?R@>Z>p*J;(G?>`$q1x`asfBvkUAZiTZrfRqr;Bz zy*e&_lG6Z%cABb@UMVL}I*tMn0X0U$K+xJ`uU9TisUC%!k|QA*!H(e(BCz*^$a9bC z4c1OC63HC*tgBq%{BmIKCn=1I5pjFeIr&s-RM+n|ghYdwji=yo9oDNSc}LuV@a_IQ z$xl2fQ7a&+Q0{9c)e3Imw5>ql+&FVeO%_ukBP*`E%r^*4&6LcTZBbfy*LYX-qO&}P zO-VGi_V3U_qbL%OP%kIs%YmT?6JVNazi5Y!nbK6F+>NWBA1~N^Btp5t;x5nTi$cn2 zH6^#UGR(ne`HX-ldTq{B(`-*+ke8P2<_t6lIL#90Zlv0hD~wp=W;>Q9wA8(uma(Rg%C z@x&Pz`b}@vN+M8?M6@YQ=e*O2;u5YPJJ@CzEv-KhScO2QLmHZ^3(3H6G981;A4Z8 zTD%RWS62qR`F`Hv^9c(#)$6!b1Sby%8PD3V^W=gjWZ@eT*9oo6pU!ky zO1D5V2*&>7;fC$IDM9`!{fTRKy?(wo0hM7apVu6^8t1F=cj%an+(K;gD# zL?PKm4_i8jnVqY)U!Mkb?CW_T97LuJNKp^?F2=2LnDevYYx z6!d}Fd8u|oU;CGTd`R!!5-T?Mb-HnxOTrXL**7wRcX4@_LwAa8sxU#T{j1n)|u! z*$Mgrw~Ri^ZfrbueM4r#tHK_M2#W%6THf|0Fzq6AnQ^sv#=Clbua)s)I)rc1yw8uCKU`hUooFo{~{EZ6@mY*<$Uvq$0XgbbBk=z~(vlJ3oFCFoo8 z;g{_fejYMmk=+R&^X`AuA0n-B(%ah$B@FESNra|)ASXlujFF6Xq=sH~RLF$7N_6(9 zNjzs{MmtANl8fwGpwMAV(j*dmsobMl8>S@YJjw{tJW;v|*A7Zq zQ-S*|P6P9(y=dN^S|gE1I&tTaP)GR-Yv1cX{9HSP=%_%Wucnn~$Z;$9LE^AtxiWMY z-9@~6ngLkQlIW{p#MCR{JnX5nuufnkG|4vg7CjNk*g??C#T=wkbEp|5FdMVTMeax0 zZM3l&lOPP2i~NXPBhJEulSQMJR(1QWxw};i2#+r7{?@#Hpi^i9Q`ecjQ)VyMWidZI zBjF*CDm^0=r&Mg+zc!k}=Pg@WIE`?(*?(tp+y%s)2L{~5RmCDLFe~2Y+iC@+U!TL- zmm!A4W)-81HHV~C$a6Z_V4kGccI5Y?vO~dNd%UG;h^i-Qj3n&VUnJaN9iDhQRUpt% zqM*zjJhUQRL^`NCQTqc8r#K>S{52*$u0~k!P@6WB299PF=6Jw?&Lg2KD?-g3Ccg}I z@GWOLEEk=od!*oCn=A;M(eGh8Tn*{DHg8)tsDrJ55y~!>)}|;caq&sZngE zS{RxlH5}a$=_4YFh7IUN=RzkLQ&xL+A+0BaP>)24V}*429a7eUj*)!Qq9v?=v(CI8 z84CU|(gxG4RDuwR_Tu$#`T zCV#9)4uk~#V89xKMKgvaS<1l(PleIcV1C=c`AYzg7=>6_lblFas!kunH(NYcZ0|=^ zbWDDJ3QfW9LZjoB5u=yH!$qA3<1W8tg@XwP*P+gUYH7Ou5Yu|mc3J}iAer@f<|BZU zEVN zv(inA!i}?%K>K_Bnr@XEKn~p_90fpwL`U>sH=+gjnj>tnS{hz#8ZUJ>*K}KFo7&wu zlICka$Pk|L|CZV+6yBV0!M75X^}#ckkd$*2^@PFDq+_$N+Zr$wSas&h)yJ8Cn!bP9 z(D$*M^c6e#e2Uu9fBrqHA!&;-bOWFKAx9bcyu42jjJj-5dZ|z_({TWaZGQ8q?)G*%V?6qccj#OCTd|su#V*H{MgQ6?f zWgR_pw5^z$sj^=nP?VY6TMiL!Ns`O({aTvAnKy!(lmkbOePp1i~ zbXbHPd?)P|QYu}Of8%$zbOELPCK}nL=pC=>C9j=JrbX0(T9lS7H+O{V%t2>Uf28Z$ zDF>O3c2_T<8L^88UHB<&qH?l)onil6N@gWnIQ~+}6|DhMw7E79r!KI63yEBbzTg?K zlCYU?(nMacWQQF8m_2E+P_XdBGK#&M#Y0$|4<*sor3!TW;3GblLjkS2Yil#bJ73P} zr-pKi5C%Ou@70F45T!>nJ=ysHwjZ#_xC6@Q@E^m5DvPt!*QnD?Mz6`2-%W(^w0x}~ zhMv|-8dbd5vO(!f#H3ZYelAAHWg*OAar+JR?@-zaHy(Ki9t46VNCF%109|@72}@bb z-)BV65j;_-vzP)wC+Wm%n!_b3s{>QZMM>OAl(xqp$ROEFc8Egh)9HqY0)_d7l41o$ z-rCxR|Lx6L(=I=H=Sk;#l+=w~FxyvGTMx_O;7JJmn?I4Xs3EoYq<`?qXsvL~O0N09 zquyEnAGY@W+1Os+J_C@sUs(4@+)C_r%)sK5P~g5L9TEw0dtAut9dOuZAZ-Wr zt6S?oZSSvAE7N}Ydla68OrnAC-b;O1Wu`^S-6b9VU^Nh?gXy|IoUgy;c59!)-NV)P z)f9UyQt&_)^H&V8E?*|Y`Dy31wHjsta##qmo%PkcWNHUPFlD&>Sbf8lks+}iPB8cG zmEciU_Ecq%Fww<(21)2P4C$6x5SyN}TH&^n72-pkiX}m89vprRTRgFR2Dm6r^h}bZ zD$*f9AT+1Aq#_rw8$a(OadpMY4Q2O=$0>RAb$=vE45B08V|?Vj*%`)g@ZPg+&2EP! zn&T*nCOVQJs4Z#^Rn0XoBJUm&UOK(L!8Le|E6gRN%B@u`Y!9K-E-M;gR;$)V)1{!4 zjz?q4_N>YFTeA~^jftty)+cQ|u4IC*L|^b*n0hxIcC1_&`+2-i`g>yC_BK`8hu&`U z30$!z=_*g)kpXtm8%fHkBenb1hyx zv%0oa%6w=D5*tbsxF~pq^i3*Y`F-+SywhjW#MahvXHU~^ejozRJRxJSJ=LbhSUR1_ zF3A7*_R8YOc))YJbB_EpW(7AXfywpVwC#Tp( zoP{-b>p03Z+cCz;P>fOZ6hgYvf_+Jwkg?R#=;`4E4z;}&kTT$_aoWOpYC2F*xZ%Zj zNPaUA#Q{l!&r(%33VaK-v28^4V?IZN?s~MZHst&T zwyCA11vzh|L1Ua(zo~KOI_YdI`)=4}^YfVz^x*Fe>%+aD4IcM_nVz4%TO;Rh?=;Y_ z2#nA#zgsVV_rV?=F+&p{6@7g#AZ=PY_ zJw;+pA$0f*Uy+NqhA4KY?;ls|nCFr}cGZdyI6Q3o9*Ud~c%I_JQdZv2<=urGJGI&4 z%iD=*7{Doxt93#TQX{XQ;L9JywPe={@V%iUeo8dwy@FHpvoe$uWaXuaj^DeT=YZ}fi0Yw>$1XO`8-DUh) zBcn_)-9U4Wd7gmlQ8C@B-BIoAkxOoL1SvFjy{h70@ZI&5hz`fZ?5fBv@T5po=9jn` zUr5B-eaZ}&nS^;FkUio(JSr0{0T#%$&Q4#YsIoOQ4js2JSFNZC9QH(rS_ino#0-qY z^V59*Pgzm~*1Om$*^XSL-ZT$?f+N3_gJ?%v!(BN=hT21W<&$V(aax*11W`Q{`MG5% z?~Wf~G!%5-0v#njrio6x2)qE+w5@{lvb**xD~+eI1h`2_*boFm>3&UKKu$^?<86XP z4F&o_a|iB%k^trOyE&C@xOI#ff4$anxeH9{ij2>W=xubIfeHQ2NGvl__A%M_Z(qaZ z@mlNRFuo^`(Iad>l70xrGBV_>s&@VTA}tFAjr&re``@!%Kp>2lyMHby5Cy0w7z9fC zVn+7rkDC3z=TH16C_V|roS5Pd=C2_DFCXQ<%&EZn8}dJfwBeIv%qd}BKuPxIBv8>w zVdj+oA(CHfj>pf03<5d2m|OjsXz}0Q@Gq5NC=jUc#W3o>48O)odNe2g%hcZ*xvwnn z1V^z!ATQ_t%h+Gym@j|u5VAiT@b~ria_I?@oGtMGTJAqmX&?~szd+?lg%*r|E%)Cl zOaE!8gEHyFg8nbiKk^Zvzqb4j>~C+c7?Zdxsr~}}(<})Bk^IY>wq%l*<=^i9-C6UW z?mXm^K3g(V{`m?1U4{KmP=qQdDNuoc<-hm#pVT1;MDQ=)@OnuqRR-rz!l(aUN}MGqDc*oI>DmetzToX2PyY`RtCqb0 delta 24158 zcmZ6yV{~#wr$(ClM~yvlPk7u+s27)=ft*c&OPr`P0cf3_77OKyL+KKatAnS z5*SNK78DE(2nYxYsM?xV`KUbg@)-mOXc{6BiyBa>Zs)MUg!B_P4B%4F5<_PEY(P}4 zl7Y2rV~(v0s=0V6WtkPG!{cqnr}}>8s1cxO?#@GnKBtN8W8wS3ryJ^_Q`7i{lBk%MmGKn9gLNJ5CkTuUJb}VE09V~E@ za0G;}GiXpHh!leNK;dyW!NDtId(1r^Jq!?cZ+_Ar24z52 zeKm-74IN!fAo1k&e9bb>myDuKw?Q3<*Z|aBuzsGXzC2?+AJj{n-m&Jtx((<%SFy2(GOki^ z;e})_v%2(yJ&CF0RWZdWxrYM`+|jcRmg5UAhRLvbpctv9aZi)v%^G*^w4^P)ZkjLI zJTxQU+=C*_u0kDph1VKZPm2vj1%Se!VfMuh!YW7bK32 z8sBk=4m^oNMZ`~Y;w7V%YmD0EBxiS=3V7qj=lih927eP@?%CiiM*S{z!@`*~g<=sd z-Tg^WGZc+8na(jfqY}4u zTX|e*pQv85PilT>O;*yN^lc0m`6fifpU*u9+uS8}zHguPLXq8HQJ58^+ei^qDXcUB z()dZit+Jzo9Eca(|APvY{}&b^sn;?7|G|PQxg1mofY+Q-EDh&`YmAm%bX|WdXXw$D znm{r){hCGWR(`rb@E6EqhTr$+?HqRc87t=(boZ&wBly?skSdObm7w-@1>TU~)ts%% zf-A-ws!ZNc5C_yAQNDaESel4yeuy<^`V4u`U3hZ<0dju6Kp$`4@+@Jj%dg{XVb2wI z!)H|!5F0Z8_r#Y?bUqO5wT+YDM#REUV;8CUQ@WJ>Z#*e45W9i5V`HJqDNymfQ44$` znPGUDVEfTQ>Go!Ek2I36c5pmt3BM1Vum&pE-<6wln=;e#$GY}j*@D*L9$rW~ZyFAB zA~cHkJ&C(ANfRlfg%7mXnO!!q8^xAoN1fzyz+|b**sB&D&qn?ju=os^HGZAl;+IvH z5PH^bSFZ=A%xXtrE7~NWbcovaBKOm-jBiyHk)dF_8kT41{JNt(?bda7Xm+bDY_h}T z+o2>8?=1iTRPDpn>6G*(crj#ZG*QTaX+1;+sVqu9MVWXHXI?Y_8k9Du&&A5bB*g2aW?k zr<>wC)XZ^t8a?6evo@+@voKB-8r8T;RIEU;Vj`H)gC8`XsFa9;15~1z2}>_FDWT*; zL!@4ycOkPY21qL}DPT0|8cA$Wi%dp>2ZHx4&iC$bYdMDOTxRvLh>U8*nX(6#r!X#g z{_Fc+68`(|@Z=6C*$RRcATJBbj1+b&@;ih?)k0JnP7osA5EQiNtv#ZXS>^;U&q6*y za#`>3xDP1|jRggE;`- zu-*9z6@_tbMwu?v1PW`IX^#bn}f~e7lcAsyyTjTN2I!FubhZ#~uxG-A`4u zaVnpwK_d$CnMbGNbe6WZaL)r$LN^1yI+)h+#H!G9oqJ{ezP$B)m9O3Xn)vuA&o)oAtmxs64(vkyZyiQ- zo3kLZK%oC`VWNx{M4nFOhhYPxMax42C)toAm6O89ddrJ|fG~efPqQ-e@|v6SE|W5ZZpNRsZmf?`bG0SJ4h0W^Qpx#3bLRSg zV&UAkyLA{3H}&vlAU)=7DLY0^XhplQ&<}tf51JFGOh=foJ5hzbQt^E zwWQX$0mz5M2pQ8wBHM}#++ng8$_iwy7Xg1-H*9uSXj)}@ytV7qFI$(6=h}U_&2=#) z@ModZ<-R}xiG@RaP7c8W}lx+sGG@eq8{OvWV`-{Z6!)~9SORO zXfe!g6z#;}A3>s|dm?~1Y9d66c1o0YTRzyD@vCQ@ZGW-Nec^!@xv_StX}#*Xtz#8w zIudCuB%^+4PdTRi>=q0LFgHYqyj!kdh%0Aeh>T$;AvwL}`>whfGLLh`-IHZ&m)VYa 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 jJCc8U;id;jsx&9YRgs5zT?zmI