From 22e406932fdc2508d644f355bea6a1597a77471a Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 30 Apr 2024 12:52:22 +0200 Subject: [PATCH 01/24] providers package init --- packages/web3-providers/.eslintignore | 1 + packages/web3-providers/.eslintrc.js | 7 + packages/web3-providers/.gitignore | 0 packages/web3-providers/.npmignore | 1 + packages/web3-providers/.npmrc | 1 + packages/web3-providers/.prettierignore | 1 + packages/web3-providers/.prettierrc.json | 1 + packages/web3-providers/CHANGELOG.md | 49 + packages/web3-providers/README.md | 59 + packages/web3-providers/assets/logo/web3js.ai | 1516 +++++++++++++++++ .../web3-providers/assets/logo/web3js.jpg | Bin 0 -> 80258 bytes .../web3-providers/assets/logo/web3js.svg | 33 + packages/web3-providers/package.json | 50 + packages/web3-providers/src/errors.ts | 16 + packages/web3-providers/src/index.ts | 16 + packages/web3-providers/src/types.ts | 16 + packages/web3-providers/test/.eslintrc.js | 7 + .../web3-providers/test/config/jest.config.js | 1 + packages/web3-providers/test/config/setup.js | 24 + .../test/integration/jest.config.js | 33 + .../web3-providers/test/integration/setup.js | 24 + packages/web3-providers/test/tsconfig.json | 1 + .../test/unit/constructor.test.ts | 37 + .../web3-providers/test/unit/jest.config.js | 9 + packages/web3-providers/tsconfig.cjs.json | 1 + packages/web3-providers/tsconfig.esm.json | 1 + packages/web3-providers/tsconfig.types.json | 1 + packages/web3-providers/tsdoc.json | 4 + 28 files changed, 1910 insertions(+) create mode 120000 packages/web3-providers/.eslintignore create mode 100644 packages/web3-providers/.eslintrc.js create mode 100644 packages/web3-providers/.gitignore create mode 120000 packages/web3-providers/.npmignore create mode 120000 packages/web3-providers/.npmrc create mode 120000 packages/web3-providers/.prettierignore create mode 120000 packages/web3-providers/.prettierrc.json create mode 100644 packages/web3-providers/CHANGELOG.md create mode 100644 packages/web3-providers/README.md create mode 100644 packages/web3-providers/assets/logo/web3js.ai create mode 100644 packages/web3-providers/assets/logo/web3js.jpg create mode 100644 packages/web3-providers/assets/logo/web3js.svg create mode 100644 packages/web3-providers/package.json create mode 100644 packages/web3-providers/src/errors.ts create mode 100644 packages/web3-providers/src/index.ts create mode 100644 packages/web3-providers/src/types.ts create mode 100644 packages/web3-providers/test/.eslintrc.js create mode 120000 packages/web3-providers/test/config/jest.config.js create mode 100644 packages/web3-providers/test/config/setup.js create mode 100644 packages/web3-providers/test/integration/jest.config.js create mode 100644 packages/web3-providers/test/integration/setup.js create mode 120000 packages/web3-providers/test/tsconfig.json create mode 100644 packages/web3-providers/test/unit/constructor.test.ts create mode 100644 packages/web3-providers/test/unit/jest.config.js create mode 120000 packages/web3-providers/tsconfig.cjs.json create mode 120000 packages/web3-providers/tsconfig.esm.json create mode 120000 packages/web3-providers/tsconfig.types.json create mode 100644 packages/web3-providers/tsdoc.json diff --git a/packages/web3-providers/.eslintignore b/packages/web3-providers/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-providers/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers/.eslintrc.js b/packages/web3-providers/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-providers/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers/.gitignore b/packages/web3-providers/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-providers/.npmignore b/packages/web3-providers/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-providers/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers/.npmrc b/packages/web3-providers/.npmrc new file mode 120000 index 00000000000..5cc817c4313 --- /dev/null +++ b/packages/web3-providers/.npmrc @@ -0,0 +1 @@ +../../templates/.npmrc.tmpl \ No newline at end of file diff --git a/packages/web3-providers/.prettierignore b/packages/web3-providers/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-providers/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers/.prettierrc.json b/packages/web3-providers/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-providers/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-providers/CHANGELOG.md b/packages/web3-providers/CHANGELOG.md new file mode 100644 index 00000000000..3366ab50bbd --- /dev/null +++ b/packages/web3-providers/CHANGELOG.md @@ -0,0 +1,49 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [1.1.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [1.1.1] + +- Stable release + +## [Unreleased] diff --git a/packages/web3-providers/README.md b/packages/web3-providers/README.md new file mode 100644 index 00000000000..4fe1e0036b6 --- /dev/null +++ b/packages/web3-providers/README.md @@ -0,0 +1,59 @@ +

+ web3.js +

+ +# web3.js - Package Template + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is a sub-package of [web3.js][repo]. + +`web3-packagetemplate` contains the ideal setup for a Web3.js package. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-packagetemplate) or using [Yarn](https://yarnpkg.com/package/web3-packagetemplate) + +### Using NPM + +```bash +npm install web3-packagetemplate +``` + +### Using Yarn + +```bash +yarn add web3-packagetemplate +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-packagetemplate +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-packagetemplate%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-packagetemplate +[downloads-image]: https://img.shields.io/npm/dm/web3-packagetemplate?label=npm%20downloads diff --git a/packages/web3-providers/assets/logo/web3js.ai b/packages/web3-providers/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-providers/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV 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 + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-providers/assets/logo/web3js.jpg b/packages/web3-providers/assets/logo/web3js.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b4cf23de26173be4d1375647c4864ebd77a4767 GIT binary patch literal 80258 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 + + + + + + + + + + + + + + + diff --git a/packages/web3-providers/package.json b/packages/web3-providers/package.json new file mode 100644 index 00000000000..a329ede3dfe --- /dev/null +++ b/packages/web3-providers/package.json @@ -0,0 +1,50 @@ +{ + "name": "web3-packagetemplate", + "version": "1.1.1", + "description": "Package template for Web3 4.x.x", + "main": "lib/index.js", + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json", + "build:esm": "tsc --build tsconfig.esm.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } +} diff --git a/packages/web3-providers/src/errors.ts b/packages/web3-providers/src/errors.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/packages/web3-providers/src/errors.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/packages/web3-providers/src/index.ts b/packages/web3-providers/src/index.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/packages/web3-providers/src/index.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/packages/web3-providers/src/types.ts b/packages/web3-providers/src/types.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/packages/web3-providers/src/types.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/packages/web3-providers/test/.eslintrc.js b/packages/web3-providers/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-providers/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers/test/config/jest.config.js b/packages/web3-providers/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-providers/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-providers/test/config/setup.js b/packages/web3-providers/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-providers/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-providers/test/integration/jest.config.js b/packages/web3-providers/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-providers/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-providers/test/integration/setup.js b/packages/web3-providers/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-providers/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-providers/test/tsconfig.json b/packages/web3-providers/test/tsconfig.json new file mode 120000 index 00000000000..c73c54e77b4 --- /dev/null +++ b/packages/web3-providers/test/tsconfig.json @@ -0,0 +1 @@ +../../../templates/test/tsconfig.json.tmpl \ No newline at end of file diff --git a/packages/web3-providers/test/unit/constructor.test.ts b/packages/web3-providers/test/unit/constructor.test.ts new file mode 100644 index 00000000000..5d08d50bebc --- /dev/null +++ b/packages/web3-providers/test/unit/constructor.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// import Web3ProviderBase from '../../src/index' +// import {ProviderOptions} from '../../types' + +describe('constructs a PLACEHOLDER instance with expected properties', () => { + // let providerOptions: ProviderOptions + + beforeEach(() => { + // providerOptions = { + // providerUrl: 'http://127.0.0.1:8545' + // } + }); + + it('should construct with expected properties', () => { + // const web3ProviderBase = new Web3ProviderBase(providerOptions) + // expect(web3ProviderBase).toMatchObject({ + // _providerUrl: providerOptions.providerUrl + // }) + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/web3-providers/test/unit/jest.config.js b/packages/web3-providers/test/unit/jest.config.js new file mode 100644 index 00000000000..ceac341e332 --- /dev/null +++ b/packages/web3-providers/test/unit/jest.config.js @@ -0,0 +1,9 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '.coverage/unit', + collectCoverageFrom: ['src/**'], +}; diff --git a/packages/web3-providers/tsconfig.cjs.json b/packages/web3-providers/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-providers/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-providers/tsconfig.esm.json b/packages/web3-providers/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-providers/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-providers/tsconfig.types.json b/packages/web3-providers/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-providers/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-providers/tsdoc.json b/packages/web3-providers/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-providers/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} From 2c1d21c073ac81fef744860605aa7503d58ecacf Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 30 Apr 2024 18:04:12 +0200 Subject: [PATCH 02/24] types and quick nodes provider --- packages/web3-providers/CHANGELOG.md | 11 -- packages/web3-providers/package.json | 26 +++- packages/web3-providers/src/errors.ts | 16 --- packages/web3-providers/src/index.ts | 8 ++ packages/web3-providers/src/types.ts | 28 ++++ packages/web3-providers/src/web3_provider.ts | 123 ++++++++++++++++++ .../src/web3_provider_quicknode.ts | 58 +++++++++ templates/.eslintignore.tmpl | 6 +- 8 files changed, 240 insertions(+), 36 deletions(-) delete mode 100644 packages/web3-providers/src/errors.ts create mode 100644 packages/web3-providers/src/web3_provider.ts create mode 100644 packages/web3-providers/src/web3_provider_quicknode.ts diff --git a/packages/web3-providers/CHANGELOG.md b/packages/web3-providers/CHANGELOG.md index 3366ab50bbd..87f56484e8e 100644 --- a/packages/web3-providers/CHANGELOG.md +++ b/packages/web3-providers/CHANGELOG.md @@ -35,15 +35,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --> -## [1.1.1-rc.1] - -### Added - -- Added source files (#5956) -- Added hybrid build (ESM and CJS) of library (#5904) - -## [1.1.1] - -- Stable release - ## [Unreleased] diff --git a/packages/web3-providers/package.json b/packages/web3-providers/package.json index a329ede3dfe..508fcbd6c98 100644 --- a/packages/web3-providers/package.json +++ b/packages/web3-providers/package.json @@ -1,8 +1,16 @@ { - "name": "web3-packagetemplate", - "version": "1.1.1", - "description": "Package template for Web3 4.x.x", - "main": "lib/index.js", + "name": "web3-providers", + "version": "0.1.0", + "description": "Web3 Providers package", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, "repository": "https://github.com/ChainSafe/web3.js", "author": "ChainSafe Systems", "license": "LGPL-3.0", @@ -12,7 +20,8 @@ }, "files": [ "lib/**/*", - "src/**/*" + "src/**/*", + "dist/**/*" ], "scripts": { "clean": "rimraf dist && rimraf lib", @@ -46,5 +55,12 @@ "prettier": "^2.7.1", "ts-jest": "^29.1.1", "typescript": "^4.7.4" + }, + "dependencies": { + "web3": "^4.8.0", + "web3-providers-http": "^4.1.0", + "web3-providers-ws": "^4.0.7", + "web3-types": "^1.6.0", + "web3-utils": "^4.2.3" } } diff --git a/packages/web3-providers/src/errors.ts b/packages/web3-providers/src/errors.ts deleted file mode 100644 index 303b68944fe..00000000000 --- a/packages/web3-providers/src/errors.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ diff --git a/packages/web3-providers/src/index.ts b/packages/web3-providers/src/index.ts index 303b68944fe..5778b1c54e9 100644 --- a/packages/web3-providers/src/index.ts +++ b/packages/web3-providers/src/index.ts @@ -14,3 +14,11 @@ GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ + +import QuickNodeProvider from './web3_provider_quicknode'; + +export * from './types'; +export * from './web3_provider_quicknode'; + +//default providers +export const mainnet = new QuickNodeProvider(); \ No newline at end of file diff --git a/packages/web3-providers/src/types.ts b/packages/web3-providers/src/types.ts index 303b68944fe..9da4c1dbfe7 100644 --- a/packages/web3-providers/src/types.ts +++ b/packages/web3-providers/src/types.ts @@ -14,3 +14,31 @@ GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ + +export enum Transport { + HTTPS = "https", + WebSocket = "wss" +}; + +export enum Network { + ETH_MAINNET = "eth_mainnet", + ETH_GOERLI = "eth_goerli", + ETH_SEPOLIA = "eth_sepolia", + ETH_HOLESKY = "eth_holesky", + + POLYGON_MAINNET= "polygon_mainnet", + POLYGON_MUMBAI= "polygon_mumbai", + POLYGON_AMONY= "polygon_amony", + + ARBITRUM_MAINNET = "arbitrum_mainnet", + ARBITRUM_SEPOLIA = "arbitrum_sepolia", + + BASE_MAINNET = "base_mainnet", + BASE_SEPOLIA = "base_sepolia", + + OPTIMISM_MAINNET = "optimism_mainnet", + OPTIMISM_SEPOLIA = "optimism_sepolia", + + BNB_MAINNET = "bnb_mainnet", + BNB_TESTNET = "bnb_testnet" +}; \ No newline at end of file diff --git a/packages/web3-providers/src/web3_provider.ts b/packages/web3-providers/src/web3_provider.ts new file mode 100644 index 00000000000..28c8b25cad2 --- /dev/null +++ b/packages/web3-providers/src/web3_provider.ts @@ -0,0 +1,123 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import HttpProvider from "web3-providers-http"; +import WebSocketProvider from "web3-providers-ws"; +import { + EthExecutionAPI, JsonRpcResult, ProviderConnectInfo, ProviderMessage, + ProviderRpcError, Web3APIMethod, Web3APIPayload, Web3APIReturnType, Web3APISpec, Web3BaseProvider, + Web3Eip1193ProviderEventCallback, + Web3ProviderEventCallback, + Web3ProviderMessageEventCallback, + Web3ProviderStatus +} from "web3-types"; +import { Eip1193Provider } from "web3-utils"; +import { Transport, Network } from "./types.js"; + +export default abstract class Web3ExternalProvider < +API extends Web3APISpec = EthExecutionAPI, +> extends Eip1193Provider { + + provider!: Web3BaseProvider; + private transport: Transport; + + public abstract getRPCURL(network: Network,transport: Transport,token: String): string; + + constructor( + network: Network, + transport: Transport, + token: String) { + + super(); + + this.transport = transport; + if (transport === Transport.HTTPS) { + this.provider = new HttpProvider(this.getRPCURL(network, transport, token)); + } + else if (transport === Transport.WebSocket) { + this.provider = new WebSocketProvider(this.getRPCURL(network, transport, token)); + } + } + + public async request< + Method extends Web3APIMethod, + ResultType = Web3APIReturnType, + >( + payload: Web3APIPayload, + requestOptions?: RequestInit, + ): Promise { + + if (this.transport === Transport.HTTPS) { + return ( (this.provider as HttpProvider).request(payload, requestOptions)) as any;//.result as Promise; + } + else { + return ( (this.provider as WebSocketProvider).request(payload)) as any;//.result as Promise; + } + } + + getStatus(): Web3ProviderStatus { + return this.provider.getStatus(); + } + supportsSubscriptions(): boolean { + return this.provider.supportsSubscriptions(); + } + once(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; + once(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback): void; + once(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; + once(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; + once(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; + once(_type: string, _listener: unknown): void { + if (this.provider && this.provider.once) + this.provider.once(_type, _listener as any); + } + removeAllListeners?(_type: string): void { + if (this.provider && this.provider.removeAllListeners) + this.provider.removeAllListeners(_type); + } + connect(): void { + if (this.provider && this.provider.connect) + this.provider.connect(); + } + disconnect(_code?: number | undefined, _data?: string | undefined): void { + if (this.provider && this.provider.disconnect) + this.provider.disconnect(_code, _data); + } + reset(): void { + if (this.provider && this.provider.reset) + this.provider.reset(); + } + + on(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; + on(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderMessageEventCallback): void; + on(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderMessageEventCallback): void; + on(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; + on(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; + on(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; + on(_type: unknown, _listener: unknown): void { + if (this.provider) + this.provider.on(_type as any, _listener as any); + } + removeListener(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; + removeListener(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback): void; + removeListener(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; + removeListener(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; + removeListener(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; + removeListener(_type: unknown, _listener: unknown): void { + if (this.provider) + this.provider.removeListener(_type as any, _listener as any); + } +} \ No newline at end of file diff --git a/packages/web3-providers/src/web3_provider_quicknode.ts b/packages/web3-providers/src/web3_provider_quicknode.ts new file mode 100644 index 00000000000..22c0ff9a1be --- /dev/null +++ b/packages/web3-providers/src/web3_provider_quicknode.ts @@ -0,0 +1,58 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EthExecutionAPI } from "web3-types"; +import { Transport, Network } from "./types.js"; +import Web3ExternalProvider from "./web3_provider.js"; + +export default class QuickNodeProvider extends Web3ExternalProvider { + + constructor( + network: Network = Network.ETH_MAINNET, + transport: Transport = Transport.HTTPS, + token: String = "") { + + super(network, transport, token); + + } + + getRPCURL(network: Network, + transport: Transport, + token: String) { + + let host: string; + + switch (network) { + case Network.ETH_MAINNET: + host = "web3.quiknode.pro"; + break; + case Network.ETH_GOERLI: + host = "web3.ethereum-goerli.quiknode.pro"; + break; + case Network.ETH_SEPOLIA: + host = "web3.ethereum-sepolia.quiknode.pro"; + break + case Network.ETH_HOLESKY: + host = "web3.ethereum-holesky.quiknode.pro"; + break; + default: + throw new Error("Network info not avalible."); + } + + return `${transport}://${host}/${token}`; + } +} \ No newline at end of file diff --git a/templates/.eslintignore.tmpl b/templates/.eslintignore.tmpl index ffb881be6b5..332d6a32b8c 100644 --- a/templates/.eslintignore.tmpl +++ b/templates/.eslintignore.tmpl @@ -1,9 +1,7 @@ dist lib +hardhat.config.js jest.config.js -.eslintrc.js cypress cypress.config.js -src/common/chains/** -src/common/eips/** -src/common/hardforks/** \ No newline at end of file +.eslintrc.js From e6d25342521a4abb021462009f0dc58c9725cc72 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 30 Apr 2024 18:08:31 +0200 Subject: [PATCH 03/24] readme update --- packages/web3-providers/README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/web3-providers/README.md b/packages/web3-providers/README.md index 4fe1e0036b6..b0418ce716e 100644 --- a/packages/web3-providers/README.md +++ b/packages/web3-providers/README.md @@ -2,7 +2,7 @@ web3.js

-# web3.js - Package Template +# web3.js - Web3 Providers ![ES Version](https://img.shields.io/badge/ES-2020-yellow) ![Node Version](https://img.shields.io/badge/node-14.x-green) @@ -11,22 +11,21 @@ This is a sub-package of [web3.js][repo]. -`web3-packagetemplate` contains the ideal setup for a Web3.js package. ## Installation -You can install the package either using [NPM](https://www.npmjs.com/package/web3-packagetemplate) or using [Yarn](https://yarnpkg.com/package/web3-packagetemplate) +You can install the package either using [NPM](https://www.npmjs.com/package/web3-providers) or using [Yarn](https://yarnpkg.com/package/web3-providers) ### Using NPM ```bash -npm install web3-packagetemplate +npm install web3-providers ``` ### Using Yarn ```bash -yarn add web3-packagetemplate +yarn add web3-providers ``` ## Getting Started @@ -53,7 +52,7 @@ yarn add web3-packagetemplate | test:unit | Uses `jest` to run tests under `/test/unit` | [docs]: https://docs.web3js.org/ -[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-packagetemplate -[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-packagetemplate%2Fpackage.json -[npm-url]: https://npmjs.org/package/web3-packagetemplate -[downloads-image]: https://img.shields.io/npm/dm/web3-packagetemplate?label=npm%20downloads +[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-providers +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-providers%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-providers +[downloads-image]: https://img.shields.io/npm/dm/web3-providers?label=npm%20downloads From 0708b870d88059d1ca9983ba647a4683a455d447 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Mon, 13 May 2024 15:25:24 +0200 Subject: [PATCH 04/24] import fixes and unit tests --- packages/web3-providers/src/index.ts | 3 +- .../src/web3_provider_quicknode.ts | 6 +- .../test/unit/constructor.test.ts | 58 ++++++++++++------ .../web3-providers/test/unit/request.test.ts | 61 +++++++++++++++++++ 4 files changed, 104 insertions(+), 24 deletions(-) create mode 100644 packages/web3-providers/test/unit/request.test.ts diff --git a/packages/web3-providers/src/index.ts b/packages/web3-providers/src/index.ts index 5778b1c54e9..f806524435b 100644 --- a/packages/web3-providers/src/index.ts +++ b/packages/web3-providers/src/index.ts @@ -15,10 +15,11 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import QuickNodeProvider from './web3_provider_quicknode'; +import { QuickNodeProvider } from './web3_provider_quicknode'; export * from './types'; export * from './web3_provider_quicknode'; +export * from './web3_provider'; //default providers export const mainnet = new QuickNodeProvider(); \ No newline at end of file diff --git a/packages/web3-providers/src/web3_provider_quicknode.ts b/packages/web3-providers/src/web3_provider_quicknode.ts index 22c0ff9a1be..bc8f3cfa09b 100644 --- a/packages/web3-providers/src/web3_provider_quicknode.ts +++ b/packages/web3-providers/src/web3_provider_quicknode.ts @@ -17,9 +17,9 @@ along with web3.js. If not, see . import { EthExecutionAPI } from "web3-types"; import { Transport, Network } from "./types.js"; -import Web3ExternalProvider from "./web3_provider.js"; +import { Web3ExternalProvider } from "./web3_provider.js"; -export default class QuickNodeProvider extends Web3ExternalProvider { +export class QuickNodeProvider extends Web3ExternalProvider { constructor( network: Network = Network.ETH_MAINNET, @@ -55,4 +55,4 @@ export default class QuickNodeProvider extends Web3ExternalProvider. */ -// import Web3ProviderBase from '../../src/index' -// import {ProviderOptions} from '../../types' - -describe('constructs a PLACEHOLDER instance with expected properties', () => { - // let providerOptions: ProviderOptions - - beforeEach(() => { - // providerOptions = { - // providerUrl: 'http://127.0.0.1:8545' - // } - }); - - it('should construct with expected properties', () => { - // const web3ProviderBase = new Web3ProviderBase(providerOptions) - // expect(web3ProviderBase).toMatchObject({ - // _providerUrl: providerOptions.providerUrl - // }) - expect(true).toBeTruthy(); - }); -}); +import { Web3ExternalProvider } from '../../src/web3_provider'; +import { Network, Transport } from '../../src/types'; +import HttpProvider from 'web3-providers-http'; +import WebSocketProvider from 'web3-providers-ws'; + +class MockWeb3ExternalHTTPProvider extends Web3ExternalProvider { + getRPCURL(_network: Network, _transport: Transport, _token: string): string { + return 'https://example.com/rpc'; + } +} + +class MockWeb3ExternalWSProvider extends Web3ExternalProvider { + getRPCURL(_network: Network, _transport: Transport, _token: string): string { + return 'wss://example.com/'; + } +} + +describe('Web3ExternalProvider', () => { + it('should initialize the provider correctly', () => { + const network: Network = Network.ETH_MAINNET; + const transport: Transport = Transport.HTTPS; + const token = 'your-token'; + + const provider = new MockWeb3ExternalHTTPProvider(network, transport, token); + + expect(provider.provider).toBeInstanceOf(HttpProvider); + }); + + it('should initialize the provider with WebSocketProvider for WebSocket transport', () => { + const network: Network = Network.ETH_MAINNET; + const transport: Transport = Transport.WebSocket; + const token = 'your-token'; + + const provider = new MockWeb3ExternalWSProvider(network, transport, token); + + expect(provider.provider).toBeInstanceOf(WebSocketProvider); + }); +}); \ No newline at end of file diff --git a/packages/web3-providers/test/unit/request.test.ts b/packages/web3-providers/test/unit/request.test.ts new file mode 100644 index 00000000000..1e7a5e9da37 --- /dev/null +++ b/packages/web3-providers/test/unit/request.test.ts @@ -0,0 +1,61 @@ +import { Web3APIPayload, EthExecutionAPI, Web3APIMethod } from "web3-types"; +import { Network, Transport } from "../../src/types"; +import { Web3ExternalProvider } from "../../src/web3_provider"; + +jest.mock('web3-providers-ws', () => { + return { + __esModule: true, + default: jest.fn().mockImplementation(() => ({ + request: jest.fn().mockResolvedValue({ result: 'mock-result' }), + })), + }; +}); + +class MockWeb3ExternalProvider extends Web3ExternalProvider { + getRPCURL(_network: Network, _transport: Transport, _token: string): string { + return 'https://example.com/'; + } + } + +describe('Web3ExternalProvider', () => { + it('should make a request using the HTTPS provider', async () => { + const network: Network = Network.ETH_MAINNET; + const transport: Transport = Transport.HTTPS; + const token = 'your-token'; + + const mockHttpProvider = { + request: jest.fn(), + }; + + const mockResponse = { result: 'mock-result' }; + mockHttpProvider.request.mockResolvedValue(mockResponse); + + const provider = new MockWeb3ExternalProvider(network, transport, token); + (provider as any).provider = mockHttpProvider; + + const payload: Web3APIPayload> = { + method: 'eth_getBalance', + params: ['0x0123456789012345678901234567890123456789', 'latest'], + }; + + const result = await provider.request(payload); + expect(result).toEqual(mockResponse); + }); + + it('should make a request using the WebSocket provider', async () => { + const network: Network = Network.ETH_MAINNET; + const transport: Transport = Transport.WebSocket; + const token = 'your-token'; + + const provider = new MockWeb3ExternalProvider(network, transport, token); + (provider as any).getRPCURL = jest.fn().mockReturnValue('ws://mock-rpc-url.com'); + + const payload: Web3APIPayload> = { + method: 'eth_getBalance', + params: ['0x0123456789012345678901234567890123456789', 'latest'], + }; + + const result = await provider.request(payload); + expect(result).toEqual({ result: 'mock-result' }); + }); +}); \ No newline at end of file From 6e09b81809eb4a796ee29c71b3395f090c4dc374 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Mon, 13 May 2024 15:31:55 +0200 Subject: [PATCH 05/24] lint fix --- packages/web3-providers/src/index.ts | 10 +++++----- packages/web3-providers/src/web3_provider.ts | 18 +++++++++--------- .../src/web3_provider_quicknode.ts | 7 +++---- .../test/unit/constructor.test.ts | 4 ++-- .../web3-providers/test/unit/request.test.ts | 16 ++++++++++++++++ 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/packages/web3-providers/src/index.ts b/packages/web3-providers/src/index.ts index f806524435b..eea79f433cb 100644 --- a/packages/web3-providers/src/index.ts +++ b/packages/web3-providers/src/index.ts @@ -15,11 +15,11 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { QuickNodeProvider } from './web3_provider_quicknode'; +import { QuickNodeProvider } from './web3_provider_quicknode.js'; -export * from './types'; -export * from './web3_provider_quicknode'; -export * from './web3_provider'; +export * from './types.js'; +export * from './web3_provider_quicknode.js'; +export * from './web3_provider.js'; -//default providers +// default providers export const mainnet = new QuickNodeProvider(); \ No newline at end of file diff --git a/packages/web3-providers/src/web3_provider.ts b/packages/web3-providers/src/web3_provider.ts index 28c8b25cad2..1080d7a7acf 100644 --- a/packages/web3-providers/src/web3_provider.ts +++ b/packages/web3-providers/src/web3_provider.ts @@ -28,19 +28,19 @@ import { import { Eip1193Provider } from "web3-utils"; import { Transport, Network } from "./types.js"; -export default abstract class Web3ExternalProvider < +export abstract class Web3ExternalProvider < API extends Web3APISpec = EthExecutionAPI, -> extends Eip1193Provider { +> extends Eip1193Provider { provider!: Web3BaseProvider; - private transport: Transport; + private readonly transport: Transport; - public abstract getRPCURL(network: Network,transport: Transport,token: String): string; + public abstract getRPCURL(network: Network,transport: Transport,token: string): string; constructor( network: Network, transport: Transport, - token: String) { + token: string) { super(); @@ -62,11 +62,11 @@ API extends Web3APISpec = EthExecutionAPI, ): Promise { if (this.transport === Transport.HTTPS) { - return ( (this.provider as HttpProvider).request(payload, requestOptions)) as any;//.result as Promise; - } - else { - return ( (this.provider as WebSocketProvider).request(payload)) as any;//.result as Promise; + return ( (this.provider as HttpProvider).request(payload, requestOptions)) as any;// .result as Promise; } + + return ( (this.provider as WebSocketProvider).request(payload)) as any;// .result as Promise; + } getStatus(): Web3ProviderStatus { diff --git a/packages/web3-providers/src/web3_provider_quicknode.ts b/packages/web3-providers/src/web3_provider_quicknode.ts index bc8f3cfa09b..97df2b7c94c 100644 --- a/packages/web3-providers/src/web3_provider_quicknode.ts +++ b/packages/web3-providers/src/web3_provider_quicknode.ts @@ -15,16 +15,15 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { EthExecutionAPI } from "web3-types"; import { Transport, Network } from "./types.js"; import { Web3ExternalProvider } from "./web3_provider.js"; -export class QuickNodeProvider extends Web3ExternalProvider { +export class QuickNodeProvider extends Web3ExternalProvider { constructor( network: Network = Network.ETH_MAINNET, transport: Transport = Transport.HTTPS, - token: String = "") { + token = "") { super(network, transport, token); @@ -32,7 +31,7 @@ export class QuickNodeProvider extends Web3ExternalProvider { getRPCURL(network: Network, transport: Transport, - token: String) { + token: string) { let host: string; diff --git a/packages/web3-providers/test/unit/constructor.test.ts b/packages/web3-providers/test/unit/constructor.test.ts index 557e369fc15..3da05f09158 100644 --- a/packages/web3-providers/test/unit/constructor.test.ts +++ b/packages/web3-providers/test/unit/constructor.test.ts @@ -15,10 +15,10 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { Web3ExternalProvider } from '../../src/web3_provider'; -import { Network, Transport } from '../../src/types'; import HttpProvider from 'web3-providers-http'; import WebSocketProvider from 'web3-providers-ws'; +import { Web3ExternalProvider } from '../../src/web3_provider'; +import { Network, Transport } from '../../src/types'; class MockWeb3ExternalHTTPProvider extends Web3ExternalProvider { getRPCURL(_network: Network, _transport: Transport, _token: string): string { diff --git a/packages/web3-providers/test/unit/request.test.ts b/packages/web3-providers/test/unit/request.test.ts index 1e7a5e9da37..09b2c6aa046 100644 --- a/packages/web3-providers/test/unit/request.test.ts +++ b/packages/web3-providers/test/unit/request.test.ts @@ -1,3 +1,19 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ import { Web3APIPayload, EthExecutionAPI, Web3APIMethod } from "web3-types"; import { Network, Transport } from "../../src/types"; import { Web3ExternalProvider } from "../../src/web3_provider"; From 752968ddfdf8ef2b402c8b3cd177ee87450f64be Mon Sep 17 00:00:00 2001 From: jdevcs Date: Mon, 13 May 2024 16:00:27 +0200 Subject: [PATCH 06/24] lint fix --- packages/web3-providers/src/web3_provider.ts | 73 ++++++++++--------- .../src/web3_provider_quicknode.ts | 5 +- .../test/unit/constructor.test.ts | 11 ++- .../web3-providers/test/unit/request.test.ts | 3 +- 4 files changed, 51 insertions(+), 41 deletions(-) diff --git a/packages/web3-providers/src/web3_provider.ts b/packages/web3-providers/src/web3_provider.ts index 1080d7a7acf..81d98806339 100644 --- a/packages/web3-providers/src/web3_provider.ts +++ b/packages/web3-providers/src/web3_provider.ts @@ -32,12 +32,12 @@ export abstract class Web3ExternalProvider < API extends Web3APISpec = EthExecutionAPI, > extends Eip1193Provider { - provider!: Web3BaseProvider; - private readonly transport: Transport; + public provider!: Web3BaseProvider; + public readonly transport: Transport; public abstract getRPCURL(network: Network,transport: Transport,token: string): string; - constructor( + public constructor( network: Network, transport: Transport, token: string) { @@ -62,62 +62,65 @@ API extends Web3APISpec = EthExecutionAPI, ): Promise { if (this.transport === Transport.HTTPS) { - return ( (this.provider as HttpProvider).request(payload, requestOptions)) as any;// .result as Promise; + return ( (this.provider as HttpProvider).request(payload, requestOptions)) as unknown as Promise; } - return ( (this.provider as WebSocketProvider).request(payload)) as any;// .result as Promise; + return ( (this.provider as WebSocketProvider).request(payload)) as unknown as Promise; } - getStatus(): Web3ProviderStatus { + public getStatus(): Web3ProviderStatus { return this.provider.getStatus(); } - supportsSubscriptions(): boolean { + public supportsSubscriptions(): boolean { return this.provider.supportsSubscriptions(); } - once(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; - once(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback): void; - once(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; - once(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; - once(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; - once(_type: string, _listener: unknown): void { - if (this.provider && this.provider.once) + public once(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; + public once(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback): void; + public once(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; + public once(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; + public once(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; + public once(_type: string, _listener: unknown): void { + if (this.provider?.once) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.provider.once(_type, _listener as any); } - removeAllListeners?(_type: string): void { - if (this.provider && this.provider.removeAllListeners) + public removeAllListeners?(_type: string): void { + if (this.provider?.removeAllListeners) this.provider.removeAllListeners(_type); } - connect(): void { - if (this.provider && this.provider.connect) + public connect(): void { + if (this.provider?.connect) this.provider.connect(); } - disconnect(_code?: number | undefined, _data?: string | undefined): void { - if (this.provider && this.provider.disconnect) + public disconnect(_code?: number | undefined, _data?: string | undefined): void { + if (this.provider?.disconnect) this.provider.disconnect(_code, _data); } - reset(): void { - if (this.provider && this.provider.reset) + public reset(): void { + if (this.provider?.reset) this.provider.reset(); } - on(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; - on(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderMessageEventCallback): void; - on(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderMessageEventCallback): void; - on(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; - on(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; - on(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; - on(_type: unknown, _listener: unknown): void { + public on(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; + public on(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderMessageEventCallback): void; + public on(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderMessageEventCallback): void; + public on(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; + public on(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; + public on(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; + public on(_type: unknown, _listener: unknown): void { if (this.provider) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.provider.on(_type as any, _listener as any); } - removeListener(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; - removeListener(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback): void; - removeListener(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; - removeListener(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; - removeListener(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; - removeListener(_type: unknown, _listener: unknown): void { + public removeListener(type: "disconnect", listener: Web3Eip1193ProviderEventCallback): void; + public removeListener(type: string, listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback): void; + public removeListener(type: "connect", listener: Web3Eip1193ProviderEventCallback): void; + public removeListener(type: "chainChanged", listener: Web3Eip1193ProviderEventCallback): void; + public removeListener(type: "accountsChanged", listener: Web3Eip1193ProviderEventCallback): void; + public removeListener(_type: unknown, _listener: unknown): void { if (this.provider) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.provider.removeListener(_type as any, _listener as any); } } \ No newline at end of file diff --git a/packages/web3-providers/src/web3_provider_quicknode.ts b/packages/web3-providers/src/web3_provider_quicknode.ts index 97df2b7c94c..120d8edf527 100644 --- a/packages/web3-providers/src/web3_provider_quicknode.ts +++ b/packages/web3-providers/src/web3_provider_quicknode.ts @@ -20,7 +20,7 @@ import { Web3ExternalProvider } from "./web3_provider.js"; export class QuickNodeProvider extends Web3ExternalProvider { - constructor( + public constructor( network: Network = Network.ETH_MAINNET, transport: Transport = Transport.HTTPS, token = "") { @@ -29,7 +29,8 @@ export class QuickNodeProvider extends Web3ExternalProvider { } - getRPCURL(network: Network, + // eslint-disable-next-line class-methods-use-this + public getRPCURL(network: Network, transport: Transport, token: string) { diff --git a/packages/web3-providers/test/unit/constructor.test.ts b/packages/web3-providers/test/unit/constructor.test.ts index 3da05f09158..6c404f8cf0b 100644 --- a/packages/web3-providers/test/unit/constructor.test.ts +++ b/packages/web3-providers/test/unit/constructor.test.ts @@ -14,6 +14,7 @@ GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ +/* eslint-disable max-classes-per-file */ import HttpProvider from 'web3-providers-http'; import WebSocketProvider from 'web3-providers-ws'; @@ -21,13 +22,16 @@ import { Web3ExternalProvider } from '../../src/web3_provider'; import { Network, Transport } from '../../src/types'; class MockWeb3ExternalHTTPProvider extends Web3ExternalProvider { - getRPCURL(_network: Network, _transport: Transport, _token: string): string { + // eslint-disable-next-line class-methods-use-this + public getRPCURL(_network: Network, _transport: Transport, _token: string): string { return 'https://example.com/rpc'; } } + class MockWeb3ExternalWSProvider extends Web3ExternalProvider { - getRPCURL(_network: Network, _transport: Transport, _token: string): string { + // eslint-disable-next-line class-methods-use-this + public getRPCURL(_network: Network, _transport: Transport, _token: string): string { return 'wss://example.com/'; } } @@ -52,4 +56,5 @@ describe('Web3ExternalProvider', () => { expect(provider.provider).toBeInstanceOf(WebSocketProvider); }); -}); \ No newline at end of file +}); +/* eslint-enable max-classes-per-file */ \ No newline at end of file diff --git a/packages/web3-providers/test/unit/request.test.ts b/packages/web3-providers/test/unit/request.test.ts index 09b2c6aa046..e462e66107b 100644 --- a/packages/web3-providers/test/unit/request.test.ts +++ b/packages/web3-providers/test/unit/request.test.ts @@ -28,7 +28,8 @@ jest.mock('web3-providers-ws', () => { }); class MockWeb3ExternalProvider extends Web3ExternalProvider { - getRPCURL(_network: Network, _transport: Transport, _token: string): string { + // eslint-disable-next-line class-methods-use-this + public getRPCURL(_network: Network, _transport: Transport, _token: string): string { return 'https://example.com/'; } } From 6f25006e79e2b731712b6d672dff771968b32e85 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 14 May 2024 15:46:16 +0200 Subject: [PATCH 07/24] added host and quicknodes provider info --- .../src/web3_provider_quicknode.ts | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/packages/web3-providers/src/web3_provider_quicknode.ts b/packages/web3-providers/src/web3_provider_quicknode.ts index 120d8edf527..a1b66880110 100644 --- a/packages/web3-providers/src/web3_provider_quicknode.ts +++ b/packages/web3-providers/src/web3_provider_quicknode.ts @@ -18,36 +18,68 @@ along with web3.js. If not, see . import { Transport, Network } from "./types.js"; import { Web3ExternalProvider } from "./web3_provider.js"; +const isValid = (str: string) => str !== undefined && str.trim().length > 0; + export class QuickNodeProvider extends Web3ExternalProvider { public constructor( network: Network = Network.ETH_MAINNET, transport: Transport = Transport.HTTPS, - token = "") { + token = "", + host = "") { - super(network, transport, token); + super(network, transport, token, host); } // eslint-disable-next-line class-methods-use-this public getRPCURL(network: Network, transport: Transport, - token: string) { - - let host: string; + _token: string, + _host: string) { + + let host = ""; + let token = ""; switch (network) { case Network.ETH_MAINNET: - host = "web3.quiknode.pro"; - break; - case Network.ETH_GOERLI: - host = "web3.ethereum-goerli.quiknode.pro"; + host = isValid(_host) ? _host : "powerful-holy-bush.quiknode.pro"; + token = isValid(_token) ? _token : "3240624a343867035925ff7561eb60dfdba2a668"; break; case Network.ETH_SEPOLIA: - host = "web3.ethereum-sepolia.quiknode.pro"; + host = isValid(_host) ? _host : "dimensional-fabled-glitter.ethereum-sepolia.quiknode.pro"; + token = isValid(_token) ? _token : "382a3b5a4b938f2d6e8686c19af4b22921fde2cd"; break case Network.ETH_HOLESKY: - host = "web3.ethereum-holesky.quiknode.pro"; + host = isValid(_host) ? _host : "yolo-morning-card.ethereum-holesky.quiknode.pro"; + token = isValid(_token) ? _token : "481ebe70638c4dcf176af617a16d02ab866b9af9"; + break; + + case Network.ARBITRUM_MAINNET: + host = isValid(_host) ? _host : "autumn-divine-dinghy.arbitrum-mainnet.quiknode.pro"; + token = isValid(_token) ? _token : "a5d7bfbf60b5ae9ce3628e53d69ef50d529e9a8c"; + break; + case Network.ARBITRUM_SEPOLIA: + host = isValid(_host) ? _host : "few-patient-pond.arbitrum-sepolia.quiknode.pro"; + token = isValid(_token) ? _token : "3be985450970628c860b959c65cd2642dcafe53c"; + break; + + case Network.BNB_MAINNET: + host = isValid(_host) ? _host : "purple-empty-reel.bsc.quiknode.pro"; + token = isValid(_token) ? _token : "ebf6c532961e21f092ff2facce1ec4c89c540158"; + break; + case Network.BNB_TESTNET: + host = isValid(_host) ? _host : "floral-rough-scion.bsc-testnet.quiknode.pro"; + token = isValid(_token) ? _token : "5b297e5acff5f81f4c37ebf6f235f7299b6f9d28"; + break; + + case Network.POLYGON_MAINNET: + host = isValid(_host) ? _host : "small-chaotic-moon.matic.quiknode.pro"; + token = isValid(_token) ? _token : "847569f8a017e84d985e10d0f44365d965a951f1"; + break; + case Network.POLYGON_AMONY: + host = isValid(_host) ? _host : "prettiest-side-shape.matic-amoy.quiknode.pro"; + token = isValid(_token) ? _token : "79a9476eea661d4f82de614db1d8a895b14b881c"; break; default: throw new Error("Network info not avalible."); @@ -56,3 +88,4 @@ export class QuickNodeProvider extends Web3ExternalProvider { return `${transport}://${host}/${token}`; } } + From d37fc2ed62617e9cee03e5aa5d9bedc2abca3dd3 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 14 May 2024 15:46:38 +0200 Subject: [PATCH 08/24] added host --- packages/web3-providers/src/web3_provider.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/web3-providers/src/web3_provider.ts b/packages/web3-providers/src/web3_provider.ts index 81d98806339..2bba9a7b880 100644 --- a/packages/web3-providers/src/web3_provider.ts +++ b/packages/web3-providers/src/web3_provider.ts @@ -28,6 +28,14 @@ import { import { Eip1193Provider } from "web3-utils"; import { Transport, Network } from "./types.js"; +/* +This class can be used to create new providers only when there is custom logic required in each Request method like +checking specific HTTP status codes and performing any action, throwing new error types or setting additional HTTP headers in requests, or even modifying requests. + +Another simpler approach can be a function simply returning URL strings instead of using the following class in case if +no additional logic implementation is required in the provider. +*/ + export abstract class Web3ExternalProvider < API extends Web3APISpec = EthExecutionAPI, > extends Eip1193Provider { @@ -35,21 +43,22 @@ API extends Web3APISpec = EthExecutionAPI, public provider!: Web3BaseProvider; public readonly transport: Transport; - public abstract getRPCURL(network: Network,transport: Transport,token: string): string; + public abstract getRPCURL(network: Network,transport: Transport,token: string, host: string): string; public constructor( network: Network, transport: Transport, - token: string) { + token: string, + host: string) { super(); this.transport = transport; if (transport === Transport.HTTPS) { - this.provider = new HttpProvider(this.getRPCURL(network, transport, token)); + this.provider = new HttpProvider(this.getRPCURL(network, transport, token, host)); } else if (transport === Transport.WebSocket) { - this.provider = new WebSocketProvider(this.getRPCURL(network, transport, token)); + this.provider = new WebSocketProvider(this.getRPCURL(network, transport, token, host)); } } From b5aeac83c4ed511d5eeb45441eaa40fe4b405065 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 14 May 2024 15:52:37 +0200 Subject: [PATCH 09/24] tests --- .../web3-providers/test/e2e/jest.config.js | 35 ++++++++++++ .../test/e2e/quicknodes.test.ts | 55 +++++++++++++++++++ packages/web3-providers/test/e2e/setup.js | 24 ++++++++ .../test/unit/constructor.test.ts | 26 +++++---- .../web3-providers/test/unit/request.test.ts | 3 + 5 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 packages/web3-providers/test/e2e/jest.config.js create mode 100644 packages/web3-providers/test/e2e/quicknodes.test.ts create mode 100644 packages/web3-providers/test/e2e/setup.js diff --git a/packages/web3-providers/test/e2e/jest.config.js b/packages/web3-providers/test/e2e/jest.config.js new file mode 100644 index 00000000000..ac012e7f098 --- /dev/null +++ b/packages/web3-providers/test/e2e/jest.config.js @@ -0,0 +1,35 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/e2e/setup.js'], + testMatch: [ + `/test/e2e/*.(spec|test).(js|ts)` + ], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: `.coverage/e2e/${process.env.WEB3_SYSTEM_TEST_BACKEND}`, +}; diff --git a/packages/web3-providers/test/e2e/quicknodes.test.ts b/packages/web3-providers/test/e2e/quicknodes.test.ts new file mode 100644 index 00000000000..48c8a72f634 --- /dev/null +++ b/packages/web3-providers/test/e2e/quicknodes.test.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3 } from "web3"; +import { QuickNodeProvider, mainnet } from "../../src"; +import { Network, Transport } from "../../src/types"; + +describe('Web3 Quicknodes Provider', () => { + const transports = Object.values(Transport); + const networks = [Network.ETH_MAINNET, Network.ETH_HOLESKY, Network.ETH_SEPOLIA, + Network.ARBITRUM_MAINNET, Network.ARBITRUM_SEPOLIA, + Network.BNB_MAINNET, Network.BNB_TESTNET, + Network.POLYGON_MAINNET, Network.POLYGON_AMONY]; + + transports.forEach((transport) => { + networks.forEach((network) => { + it(`should work with ${transport} transport and ${network} network`, async () => { + + const provider = new QuickNodeProvider(network, transport); + const web3 = new Web3(provider); + const result = await web3.eth.getBlockNumber() + + expect(typeof result).toBe('bigint'); + expect(result > 0).toBe(true); + + if (transport === Transport.WebSocket) { + web3.provider?.disconnect(); + } + + }); + }); + }); + + it(`should work with default provider`, async () => { + const web3 = new Web3(mainnet); + const result = await web3.eth.getBlockNumber() + expect(typeof result).toBe('bigint'); + expect(result > 0).toBe(true); + + }); +}); \ No newline at end of file diff --git a/packages/web3-providers/test/e2e/setup.js b/packages/web3-providers/test/e2e/setup.js new file mode 100644 index 00000000000..fddbec59a1e --- /dev/null +++ b/packages/web3-providers/test/e2e/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 30000; // Sometimes `in3` takes long time because of its decentralized nature. + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-providers/test/unit/constructor.test.ts b/packages/web3-providers/test/unit/constructor.test.ts index 6c404f8cf0b..eb64b29163a 100644 --- a/packages/web3-providers/test/unit/constructor.test.ts +++ b/packages/web3-providers/test/unit/constructor.test.ts @@ -21,18 +21,19 @@ import WebSocketProvider from 'web3-providers-ws'; import { Web3ExternalProvider } from '../../src/web3_provider'; import { Network, Transport } from '../../src/types'; -class MockWeb3ExternalHTTPProvider extends Web3ExternalProvider { - // eslint-disable-next-line class-methods-use-this - public getRPCURL(_network: Network, _transport: Transport, _token: string): string { - return 'https://example.com/rpc'; +class MockWeb3ExternalProviderA extends Web3ExternalProvider { + public constructor(network: Network, transport: Transport, token: string){ + super(network, transport, token, ""); } -} - - -class MockWeb3ExternalWSProvider extends Web3ExternalProvider { // eslint-disable-next-line class-methods-use-this - public getRPCURL(_network: Network, _transport: Transport, _token: string): string { - return 'wss://example.com/'; + public getRPCURL(_network: Network, _transport: Transport, _token: string, _host=""): string { + let transport = ""; + if (_transport === Transport.HTTPS) + transport = "http://"; + else if (_transport === Transport.WebSocket) + transport = "wss://"; + + return `${transport}example.com/`; } } @@ -42,7 +43,7 @@ describe('Web3ExternalProvider', () => { const transport: Transport = Transport.HTTPS; const token = 'your-token'; - const provider = new MockWeb3ExternalHTTPProvider(network, transport, token); + const provider = new MockWeb3ExternalProviderA(network, transport, token); expect(provider.provider).toBeInstanceOf(HttpProvider); }); @@ -52,9 +53,10 @@ describe('Web3ExternalProvider', () => { const transport: Transport = Transport.WebSocket; const token = 'your-token'; - const provider = new MockWeb3ExternalWSProvider(network, transport, token); + const provider = new MockWeb3ExternalProviderA(network, transport, token); expect(provider.provider).toBeInstanceOf(WebSocketProvider); }); + }); /* eslint-enable max-classes-per-file */ \ No newline at end of file diff --git a/packages/web3-providers/test/unit/request.test.ts b/packages/web3-providers/test/unit/request.test.ts index e462e66107b..ccbaa0f7cc7 100644 --- a/packages/web3-providers/test/unit/request.test.ts +++ b/packages/web3-providers/test/unit/request.test.ts @@ -28,6 +28,9 @@ jest.mock('web3-providers-ws', () => { }); class MockWeb3ExternalProvider extends Web3ExternalProvider { + public constructor(network: Network, transport: Transport, token: string){ + super(network, transport, token, ""); + } // eslint-disable-next-line class-methods-use-this public getRPCURL(_network: Network, _transport: Transport, _token: string): string { return 'https://example.com/'; From 857cc9729b3200414e7efd925b36f7be347e3993 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 14 May 2024 15:55:21 +0200 Subject: [PATCH 10/24] lint --- templates/.eslintignore.tmpl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/.eslintignore.tmpl b/templates/.eslintignore.tmpl index 332d6a32b8c..c2d4ae29304 100644 --- a/templates/.eslintignore.tmpl +++ b/templates/.eslintignore.tmpl @@ -5,3 +5,6 @@ jest.config.js cypress cypress.config.js .eslintrc.js +src/common/chains/** +src/common/eips/** +src/common/hardforks/** From 4fab7b0a6b3366c09fef365e301d02f83f9536cb Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 12:58:02 +0200 Subject: [PATCH 11/24] default provider and itests --- packages/web3/package.json | 3 +- packages/web3/src/web3.ts | 5 ++- .../test/integration/web3providers.test.ts | 38 +++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 packages/web3/test/integration/web3providers.test.ts diff --git a/packages/web3/package.json b/packages/web3/package.json index 52bb78ce8c8..59ae5de5672 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -101,6 +101,7 @@ "web3-rpc-methods": "^1.2.0", "web3-types": "^1.6.0", "web3-utils": "^4.2.3", - "web3-validator": "^2.0.5" + "web3-validator": "^2.0.5", + "web3-providers": "^0.1.0" } } diff --git a/packages/web3/src/web3.ts b/packages/web3/src/web3.ts index 0fda2c10521..a34f4abff16 100644 --- a/packages/web3/src/web3.ts +++ b/packages/web3/src/web3.ts @@ -30,6 +30,7 @@ import { Personal } from 'web3-eth-personal'; import { Net } from 'web3-net'; import * as utils from 'web3-utils'; import { isNullish, isDataFormat, isContractInitOptions } from 'web3-utils'; +import { mainnet } from 'web3-providers'; import { Address, ContractAbi, @@ -67,10 +68,10 @@ export class Web3< public eth: Web3EthInterface; public constructor( - providerOrContext?: + providerOrContext: | string | SupportedProviders - | Web3ContextInitOptions, + | Web3ContextInitOptions = mainnet, ) { if ( isNullish(providerOrContext) || diff --git a/packages/web3/test/integration/web3providers.test.ts b/packages/web3/test/integration/web3providers.test.ts new file mode 100644 index 00000000000..07044969e6e --- /dev/null +++ b/packages/web3/test/integration/web3providers.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { mainnet} from "web3-providers"; +import { Web3 } from '../../src/index'; + +describe('Web3 Provider Integration tests', () => { + + it(`should work with mainnet provider`, async () => { + const web3 = new Web3(mainnet); + const result = await web3.eth.getBlockNumber() + expect(typeof result).toBe('bigint'); + expect(result > 0).toBe(true); + + }); + + it(`should work with default provider`, async () => { + const web3 = new Web3(); + const result = await web3.eth.getBlockNumber() + expect(typeof result).toBe('bigint'); + expect(result > 0).toBe(true); + + }); +}); \ No newline at end of file From b525c6194c23420ad2a02d37c3759e3befb6235f Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 13:10:13 +0200 Subject: [PATCH 12/24] package dir rename --- .../.eslintignore | 0 .../.eslintrc.js | 0 .../.gitignore | 0 .../.npmignore | 0 .../{web3-providers => web3-rpc-providers}/.npmrc | 0 .../.prettierignore | 0 .../.prettierrc.json | 0 .../CHANGELOG.md | 0 .../README.md | 0 .../assets/logo/web3js.ai | 0 .../assets/logo/web3js.jpg | Bin .../assets/logo/web3js.svg | 0 .../package.json | 0 .../src/index.ts | 0 .../src/types.ts | 0 .../src/web3_provider.ts | 0 .../src/web3_provider_quicknode.ts | 0 .../test/.eslintrc.js | 0 .../test/config/jest.config.js | 0 .../test/config/setup.js | 0 .../test/e2e/jest.config.js | 0 .../test/e2e/quicknodes.test.ts | 0 .../test/e2e/setup.js | 0 .../test/integration/jest.config.js | 0 .../test/integration/setup.js | 0 .../test/tsconfig.json | 0 .../test/unit/constructor.test.ts | 0 .../test/unit/jest.config.js | 0 .../test/unit/request.test.ts | 0 .../tsconfig.cjs.json | 0 .../tsconfig.esm.json | 0 .../tsconfig.types.json | 0 .../tsdoc.json | 0 33 files changed, 0 insertions(+), 0 deletions(-) rename packages/{web3-providers => web3-rpc-providers}/.eslintignore (100%) rename packages/{web3-providers => web3-rpc-providers}/.eslintrc.js (100%) rename packages/{web3-providers => web3-rpc-providers}/.gitignore (100%) rename packages/{web3-providers => web3-rpc-providers}/.npmignore (100%) rename packages/{web3-providers => web3-rpc-providers}/.npmrc (100%) rename packages/{web3-providers => web3-rpc-providers}/.prettierignore (100%) rename packages/{web3-providers => web3-rpc-providers}/.prettierrc.json (100%) rename packages/{web3-providers => web3-rpc-providers}/CHANGELOG.md (100%) rename packages/{web3-providers => web3-rpc-providers}/README.md (100%) rename packages/{web3-providers => web3-rpc-providers}/assets/logo/web3js.ai (100%) rename packages/{web3-providers => web3-rpc-providers}/assets/logo/web3js.jpg (100%) rename packages/{web3-providers => web3-rpc-providers}/assets/logo/web3js.svg (100%) rename packages/{web3-providers => web3-rpc-providers}/package.json (100%) rename packages/{web3-providers => web3-rpc-providers}/src/index.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/src/types.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/src/web3_provider.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/src/web3_provider_quicknode.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/test/.eslintrc.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/config/jest.config.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/config/setup.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/e2e/jest.config.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/e2e/quicknodes.test.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/test/e2e/setup.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/integration/jest.config.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/integration/setup.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/tsconfig.json (100%) rename packages/{web3-providers => web3-rpc-providers}/test/unit/constructor.test.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/test/unit/jest.config.js (100%) rename packages/{web3-providers => web3-rpc-providers}/test/unit/request.test.ts (100%) rename packages/{web3-providers => web3-rpc-providers}/tsconfig.cjs.json (100%) rename packages/{web3-providers => web3-rpc-providers}/tsconfig.esm.json (100%) rename packages/{web3-providers => web3-rpc-providers}/tsconfig.types.json (100%) rename packages/{web3-providers => web3-rpc-providers}/tsdoc.json (100%) diff --git a/packages/web3-providers/.eslintignore b/packages/web3-rpc-providers/.eslintignore similarity index 100% rename from packages/web3-providers/.eslintignore rename to packages/web3-rpc-providers/.eslintignore diff --git a/packages/web3-providers/.eslintrc.js b/packages/web3-rpc-providers/.eslintrc.js similarity index 100% rename from packages/web3-providers/.eslintrc.js rename to packages/web3-rpc-providers/.eslintrc.js diff --git a/packages/web3-providers/.gitignore b/packages/web3-rpc-providers/.gitignore similarity index 100% rename from packages/web3-providers/.gitignore rename to packages/web3-rpc-providers/.gitignore diff --git a/packages/web3-providers/.npmignore b/packages/web3-rpc-providers/.npmignore similarity index 100% rename from packages/web3-providers/.npmignore rename to packages/web3-rpc-providers/.npmignore diff --git a/packages/web3-providers/.npmrc b/packages/web3-rpc-providers/.npmrc similarity index 100% rename from packages/web3-providers/.npmrc rename to packages/web3-rpc-providers/.npmrc diff --git a/packages/web3-providers/.prettierignore b/packages/web3-rpc-providers/.prettierignore similarity index 100% rename from packages/web3-providers/.prettierignore rename to packages/web3-rpc-providers/.prettierignore diff --git a/packages/web3-providers/.prettierrc.json b/packages/web3-rpc-providers/.prettierrc.json similarity index 100% rename from packages/web3-providers/.prettierrc.json rename to packages/web3-rpc-providers/.prettierrc.json diff --git a/packages/web3-providers/CHANGELOG.md b/packages/web3-rpc-providers/CHANGELOG.md similarity index 100% rename from packages/web3-providers/CHANGELOG.md rename to packages/web3-rpc-providers/CHANGELOG.md diff --git a/packages/web3-providers/README.md b/packages/web3-rpc-providers/README.md similarity index 100% rename from packages/web3-providers/README.md rename to packages/web3-rpc-providers/README.md diff --git a/packages/web3-providers/assets/logo/web3js.ai b/packages/web3-rpc-providers/assets/logo/web3js.ai similarity index 100% rename from packages/web3-providers/assets/logo/web3js.ai rename to packages/web3-rpc-providers/assets/logo/web3js.ai diff --git a/packages/web3-providers/assets/logo/web3js.jpg b/packages/web3-rpc-providers/assets/logo/web3js.jpg similarity index 100% rename from packages/web3-providers/assets/logo/web3js.jpg rename to packages/web3-rpc-providers/assets/logo/web3js.jpg diff --git a/packages/web3-providers/assets/logo/web3js.svg b/packages/web3-rpc-providers/assets/logo/web3js.svg similarity index 100% rename from packages/web3-providers/assets/logo/web3js.svg rename to packages/web3-rpc-providers/assets/logo/web3js.svg diff --git a/packages/web3-providers/package.json b/packages/web3-rpc-providers/package.json similarity index 100% rename from packages/web3-providers/package.json rename to packages/web3-rpc-providers/package.json diff --git a/packages/web3-providers/src/index.ts b/packages/web3-rpc-providers/src/index.ts similarity index 100% rename from packages/web3-providers/src/index.ts rename to packages/web3-rpc-providers/src/index.ts diff --git a/packages/web3-providers/src/types.ts b/packages/web3-rpc-providers/src/types.ts similarity index 100% rename from packages/web3-providers/src/types.ts rename to packages/web3-rpc-providers/src/types.ts diff --git a/packages/web3-providers/src/web3_provider.ts b/packages/web3-rpc-providers/src/web3_provider.ts similarity index 100% rename from packages/web3-providers/src/web3_provider.ts rename to packages/web3-rpc-providers/src/web3_provider.ts diff --git a/packages/web3-providers/src/web3_provider_quicknode.ts b/packages/web3-rpc-providers/src/web3_provider_quicknode.ts similarity index 100% rename from packages/web3-providers/src/web3_provider_quicknode.ts rename to packages/web3-rpc-providers/src/web3_provider_quicknode.ts diff --git a/packages/web3-providers/test/.eslintrc.js b/packages/web3-rpc-providers/test/.eslintrc.js similarity index 100% rename from packages/web3-providers/test/.eslintrc.js rename to packages/web3-rpc-providers/test/.eslintrc.js diff --git a/packages/web3-providers/test/config/jest.config.js b/packages/web3-rpc-providers/test/config/jest.config.js similarity index 100% rename from packages/web3-providers/test/config/jest.config.js rename to packages/web3-rpc-providers/test/config/jest.config.js diff --git a/packages/web3-providers/test/config/setup.js b/packages/web3-rpc-providers/test/config/setup.js similarity index 100% rename from packages/web3-providers/test/config/setup.js rename to packages/web3-rpc-providers/test/config/setup.js diff --git a/packages/web3-providers/test/e2e/jest.config.js b/packages/web3-rpc-providers/test/e2e/jest.config.js similarity index 100% rename from packages/web3-providers/test/e2e/jest.config.js rename to packages/web3-rpc-providers/test/e2e/jest.config.js diff --git a/packages/web3-providers/test/e2e/quicknodes.test.ts b/packages/web3-rpc-providers/test/e2e/quicknodes.test.ts similarity index 100% rename from packages/web3-providers/test/e2e/quicknodes.test.ts rename to packages/web3-rpc-providers/test/e2e/quicknodes.test.ts diff --git a/packages/web3-providers/test/e2e/setup.js b/packages/web3-rpc-providers/test/e2e/setup.js similarity index 100% rename from packages/web3-providers/test/e2e/setup.js rename to packages/web3-rpc-providers/test/e2e/setup.js diff --git a/packages/web3-providers/test/integration/jest.config.js b/packages/web3-rpc-providers/test/integration/jest.config.js similarity index 100% rename from packages/web3-providers/test/integration/jest.config.js rename to packages/web3-rpc-providers/test/integration/jest.config.js diff --git a/packages/web3-providers/test/integration/setup.js b/packages/web3-rpc-providers/test/integration/setup.js similarity index 100% rename from packages/web3-providers/test/integration/setup.js rename to packages/web3-rpc-providers/test/integration/setup.js diff --git a/packages/web3-providers/test/tsconfig.json b/packages/web3-rpc-providers/test/tsconfig.json similarity index 100% rename from packages/web3-providers/test/tsconfig.json rename to packages/web3-rpc-providers/test/tsconfig.json diff --git a/packages/web3-providers/test/unit/constructor.test.ts b/packages/web3-rpc-providers/test/unit/constructor.test.ts similarity index 100% rename from packages/web3-providers/test/unit/constructor.test.ts rename to packages/web3-rpc-providers/test/unit/constructor.test.ts diff --git a/packages/web3-providers/test/unit/jest.config.js b/packages/web3-rpc-providers/test/unit/jest.config.js similarity index 100% rename from packages/web3-providers/test/unit/jest.config.js rename to packages/web3-rpc-providers/test/unit/jest.config.js diff --git a/packages/web3-providers/test/unit/request.test.ts b/packages/web3-rpc-providers/test/unit/request.test.ts similarity index 100% rename from packages/web3-providers/test/unit/request.test.ts rename to packages/web3-rpc-providers/test/unit/request.test.ts diff --git a/packages/web3-providers/tsconfig.cjs.json b/packages/web3-rpc-providers/tsconfig.cjs.json similarity index 100% rename from packages/web3-providers/tsconfig.cjs.json rename to packages/web3-rpc-providers/tsconfig.cjs.json diff --git a/packages/web3-providers/tsconfig.esm.json b/packages/web3-rpc-providers/tsconfig.esm.json similarity index 100% rename from packages/web3-providers/tsconfig.esm.json rename to packages/web3-rpc-providers/tsconfig.esm.json diff --git a/packages/web3-providers/tsconfig.types.json b/packages/web3-rpc-providers/tsconfig.types.json similarity index 100% rename from packages/web3-providers/tsconfig.types.json rename to packages/web3-rpc-providers/tsconfig.types.json diff --git a/packages/web3-providers/tsdoc.json b/packages/web3-rpc-providers/tsdoc.json similarity index 100% rename from packages/web3-providers/tsdoc.json rename to packages/web3-rpc-providers/tsdoc.json From 718b2cad8edd5b8c0bdb4cbe4df02758987ae95c Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 13:13:02 +0200 Subject: [PATCH 13/24] web3-rpc-providers --- packages/web3-rpc-providers/README.md | 14 +++++++------- packages/web3-rpc-providers/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/web3-rpc-providers/README.md b/packages/web3-rpc-providers/README.md index b0418ce716e..59284dbb29b 100644 --- a/packages/web3-rpc-providers/README.md +++ b/packages/web3-rpc-providers/README.md @@ -14,18 +14,18 @@ This is a sub-package of [web3.js][repo]. ## Installation -You can install the package either using [NPM](https://www.npmjs.com/package/web3-providers) or using [Yarn](https://yarnpkg.com/package/web3-providers) +You can install the package either using [NPM](https://www.npmjs.com/package/web3-rpc-providers) or using [Yarn](https://yarnpkg.com/package/web3-rpc-providers) ### Using NPM ```bash -npm install web3-providers +npm install web3-rpc-providers ``` ### Using Yarn ```bash -yarn add web3-providers +yarn add web3-rpc-providers ``` ## Getting Started @@ -52,7 +52,7 @@ yarn add web3-providers | test:unit | Uses `jest` to run tests under `/test/unit` | [docs]: https://docs.web3js.org/ -[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-providers -[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-providers%2Fpackage.json -[npm-url]: https://npmjs.org/package/web3-providers -[downloads-image]: https://img.shields.io/npm/dm/web3-providers?label=npm%20downloads +[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-rpc-providers +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-rpc-providers%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-rpc-providers +[downloads-image]: https://img.shields.io/npm/dm/web3-rpc-providers?label=npm%20downloads diff --git a/packages/web3-rpc-providers/package.json b/packages/web3-rpc-providers/package.json index 508fcbd6c98..b09851af2fd 100644 --- a/packages/web3-rpc-providers/package.json +++ b/packages/web3-rpc-providers/package.json @@ -1,5 +1,5 @@ { - "name": "web3-providers", + "name": "web3-rpc-providers", "version": "0.1.0", "description": "Web3 Providers package", "main": "./lib/commonjs/index.js", From 6dc50ec08c1d474c9c94cb81e8af8109674fedeb Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 13:13:43 +0200 Subject: [PATCH 14/24] web3-rpc-providers in web3 --- packages/web3/package.json | 2 +- packages/web3/src/web3.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3/package.json b/packages/web3/package.json index 59ae5de5672..b4271c14f92 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -102,6 +102,6 @@ "web3-types": "^1.6.0", "web3-utils": "^4.2.3", "web3-validator": "^2.0.5", - "web3-providers": "^0.1.0" + "web3-rpc-providers": "^0.1.0" } } diff --git a/packages/web3/src/web3.ts b/packages/web3/src/web3.ts index a34f4abff16..a3b6b462842 100644 --- a/packages/web3/src/web3.ts +++ b/packages/web3/src/web3.ts @@ -30,7 +30,7 @@ import { Personal } from 'web3-eth-personal'; import { Net } from 'web3-net'; import * as utils from 'web3-utils'; import { isNullish, isDataFormat, isContractInitOptions } from 'web3-utils'; -import { mainnet } from 'web3-providers'; +import { mainnet } from 'web3-rpc-providers'; import { Address, ContractAbi, From 017a7f229f8199124d6ab211f994ee6e9f266fa1 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 13:22:20 +0200 Subject: [PATCH 15/24] packagejson updates --- packages/web3-rpc-providers/package.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/web3-rpc-providers/package.json b/packages/web3-rpc-providers/package.json index b09851af2fd..110804cfdd9 100644 --- a/packages/web3-rpc-providers/package.json +++ b/packages/web3-rpc-providers/package.json @@ -27,16 +27,15 @@ "clean": "rimraf dist && rimraf lib", "prebuild": "yarn clean", "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", - "build:cjs": "tsc --build tsconfig.cjs.json", - "build:esm": "tsc --build tsconfig.esm.json", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", "build:types": "tsc --build tsconfig.types.json", "build:check": "node -e \"require('./lib')\"", - "lint": "eslint --ext .js,.ts .", + "lint": "eslint --cache --cache-strategy content --ext .ts .", "lint:fix": "eslint --fix --ext .js,.ts .", "format": "prettier --write '**/*'", "test": "jest --config=./test/unit/jest.config.js", "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", - "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", "test:watch": "npm test -- --watch", "test:unit": "jest --config=./test/unit/jest.config.js", From 9c4c303549dacb7e3fba13abbbb932563357baa1 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 13:42:01 +0200 Subject: [PATCH 16/24] rename test file --- .../{web3providers.test.ts => web3RPCProviders.test.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename packages/web3/test/integration/{web3providers.test.ts => web3RPCProviders.test.ts} (96%) diff --git a/packages/web3/test/integration/web3providers.test.ts b/packages/web3/test/integration/web3RPCProviders.test.ts similarity index 96% rename from packages/web3/test/integration/web3providers.test.ts rename to packages/web3/test/integration/web3RPCProviders.test.ts index 07044969e6e..df2aa539e66 100644 --- a/packages/web3/test/integration/web3providers.test.ts +++ b/packages/web3/test/integration/web3RPCProviders.test.ts @@ -15,7 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { mainnet} from "web3-providers"; +import { mainnet } from "web3-providers"; import { Web3 } from '../../src/index'; describe('Web3 Provider Integration tests', () => { From bc3187ac3b644e868a8559a48b03c89a8b71098f Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 14:06:20 +0200 Subject: [PATCH 17/24] tests in web3 package --- packages/web3-rpc-providers/package.json | 1 - .../test/integration/web3RPCProviders.test.ts | 28 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/web3-rpc-providers/package.json b/packages/web3-rpc-providers/package.json index 110804cfdd9..a3046999279 100644 --- a/packages/web3-rpc-providers/package.json +++ b/packages/web3-rpc-providers/package.json @@ -56,7 +56,6 @@ "typescript": "^4.7.4" }, "dependencies": { - "web3": "^4.8.0", "web3-providers-http": "^4.1.0", "web3-providers-ws": "^4.0.7", "web3-types": "^1.6.0", diff --git a/packages/web3/test/integration/web3RPCProviders.test.ts b/packages/web3/test/integration/web3RPCProviders.test.ts index df2aa539e66..3992cc2620f 100644 --- a/packages/web3/test/integration/web3RPCProviders.test.ts +++ b/packages/web3/test/integration/web3RPCProviders.test.ts @@ -15,11 +15,35 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { mainnet } from "web3-providers"; +import { mainnet } from "web3-rpc-providers"; import { Web3 } from '../../src/index'; +import { Network, QuickNodeProvider, Transport } from "web3-rpc-providers"; -describe('Web3 Provider Integration tests', () => { +describe('Web3 RPC Provider Integration tests', () => { + const transports = Object.values(Transport); + const networks = [Network.ETH_MAINNET, Network.ETH_HOLESKY, Network.ETH_SEPOLIA, + Network.ARBITRUM_MAINNET, Network.ARBITRUM_SEPOLIA, + Network.BNB_MAINNET, Network.BNB_TESTNET, + Network.POLYGON_MAINNET, Network.POLYGON_AMONY]; + transports.forEach((transport) => { + networks.forEach((network) => { + it(`QuickNodeProvider should work with ${transport} transport and ${network} network`, async () => { + + const provider = new QuickNodeProvider(network, transport); + const web3 = new Web3(provider); + const result = await web3.eth.getBlockNumber() + + expect(typeof result).toBe('bigint'); + expect(result > 0).toBe(true); + + if (transport === Transport.WebSocket) { + web3.provider?.disconnect(); + } + + }); + }); + }); it(`should work with mainnet provider`, async () => { const web3 = new Web3(mainnet); const result = await web3.eth.getBlockNumber() From ab747a1077ad2dca9e8ac4ceb2333a74b54dc793 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Tue, 21 May 2024 14:06:51 +0200 Subject: [PATCH 18/24] e2e tests update --- .../test/e2e/jest.config.js | 35 ------------ .../test/e2e/quicknodes.test.ts | 55 ------------------- packages/web3-rpc-providers/test/e2e/setup.js | 24 -------- 3 files changed, 114 deletions(-) delete mode 100644 packages/web3-rpc-providers/test/e2e/jest.config.js delete mode 100644 packages/web3-rpc-providers/test/e2e/quicknodes.test.ts delete mode 100644 packages/web3-rpc-providers/test/e2e/setup.js diff --git a/packages/web3-rpc-providers/test/e2e/jest.config.js b/packages/web3-rpc-providers/test/e2e/jest.config.js deleted file mode 100644 index ac012e7f098..00000000000 --- a/packages/web3-rpc-providers/test/e2e/jest.config.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -const base = require('../config/jest.config'); - -module.exports = { - ...base, - setupFilesAfterEnv: ['/test/e2e/setup.js'], - testMatch: [ - `/test/e2e/*.(spec|test).(js|ts)` - ], - /** - * restoreMocks [boolean] - * - * Default: false - * - * Automatically restore mock state between every test. - * Equivalent to calling jest.restoreAllMocks() between each test. - * This will lead to any mocks having their fake implementations removed - * and restores their initial implementation. - */ - restoreMocks: true, - - /** - * resetModules [boolean] - * - * Default: false - * - * By default, each test file gets its own independent module registry. - * Enabling resetModules goes a step further and resets the module registry before running each individual test. - * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. - * This can be done programmatically using jest.resetModules(). - */ - resetModules: true, - coverageDirectory: `.coverage/e2e/${process.env.WEB3_SYSTEM_TEST_BACKEND}`, -}; diff --git a/packages/web3-rpc-providers/test/e2e/quicknodes.test.ts b/packages/web3-rpc-providers/test/e2e/quicknodes.test.ts deleted file mode 100644 index 48c8a72f634..00000000000 --- a/packages/web3-rpc-providers/test/e2e/quicknodes.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ - -import { Web3 } from "web3"; -import { QuickNodeProvider, mainnet } from "../../src"; -import { Network, Transport } from "../../src/types"; - -describe('Web3 Quicknodes Provider', () => { - const transports = Object.values(Transport); - const networks = [Network.ETH_MAINNET, Network.ETH_HOLESKY, Network.ETH_SEPOLIA, - Network.ARBITRUM_MAINNET, Network.ARBITRUM_SEPOLIA, - Network.BNB_MAINNET, Network.BNB_TESTNET, - Network.POLYGON_MAINNET, Network.POLYGON_AMONY]; - - transports.forEach((transport) => { - networks.forEach((network) => { - it(`should work with ${transport} transport and ${network} network`, async () => { - - const provider = new QuickNodeProvider(network, transport); - const web3 = new Web3(provider); - const result = await web3.eth.getBlockNumber() - - expect(typeof result).toBe('bigint'); - expect(result > 0).toBe(true); - - if (transport === Transport.WebSocket) { - web3.provider?.disconnect(); - } - - }); - }); - }); - - it(`should work with default provider`, async () => { - const web3 = new Web3(mainnet); - const result = await web3.eth.getBlockNumber() - expect(typeof result).toBe('bigint'); - expect(result > 0).toBe(true); - - }); -}); \ No newline at end of file diff --git a/packages/web3-rpc-providers/test/e2e/setup.js b/packages/web3-rpc-providers/test/e2e/setup.js deleted file mode 100644 index fddbec59a1e..00000000000 --- a/packages/web3-rpc-providers/test/e2e/setup.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ - -// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules -// eslint-disable-next-line @typescript-eslint/no-require-imports -require('../config/setup'); - -const jestTimeout = 30000; // Sometimes `in3` takes long time because of its decentralized nature. - -jest.setTimeout(jestTimeout); From 3e5ca4fd17370d1f19cc8f493396051579097309 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Fri, 24 May 2024 16:03:48 +0200 Subject: [PATCH 19/24] lint fix --- packages/web3/test/integration/web3RPCProviders.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/web3/test/integration/web3RPCProviders.test.ts b/packages/web3/test/integration/web3RPCProviders.test.ts index 3992cc2620f..24bc312610d 100644 --- a/packages/web3/test/integration/web3RPCProviders.test.ts +++ b/packages/web3/test/integration/web3RPCProviders.test.ts @@ -15,9 +15,8 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import { mainnet } from "web3-rpc-providers"; +import { mainnet , Network, QuickNodeProvider, Transport } from "web3-rpc-providers"; import { Web3 } from '../../src/index'; -import { Network, QuickNodeProvider, Transport } from "web3-rpc-providers"; describe('Web3 RPC Provider Integration tests', () => { const transports = Object.values(Transport); From adbaf495ec4046e0972b615e90951f701eba5bbb Mon Sep 17 00:00:00 2001 From: jdevcs Date: Fri, 24 May 2024 16:13:26 +0200 Subject: [PATCH 20/24] empty provider --- packages/web3/test/integration/web3.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3/test/integration/web3.test.ts b/packages/web3/test/integration/web3.test.ts index 18a49dd0fcc..757105902f3 100644 --- a/packages/web3/test/integration/web3.test.ts +++ b/packages/web3/test/integration/web3.test.ts @@ -142,7 +142,7 @@ describe('Web3 instance', () => { }); it('should throw error when we make a request when provider not available', async () => { - web3 = new Web3(); + web3 = new Web3(""); await expect(web3.eth.getChainId()).rejects.toThrow('Provider not available'); }); From 3de133817627a80196a6a8005eb307fd1c5eb056 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Fri, 24 May 2024 16:18:32 +0200 Subject: [PATCH 21/24] empty provider test fix --- packages/web3/test/unit/web3.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3/test/unit/web3.test.ts b/packages/web3/test/unit/web3.test.ts index 3d520f38e36..8734144824a 100644 --- a/packages/web3/test/unit/web3.test.ts +++ b/packages/web3/test/unit/web3.test.ts @@ -21,9 +21,9 @@ import { Web3 } from '../../src/web3'; describe('Web3 object', () => { it('should be able to set and read web3 providers', () => { - const web3NoProvider = new Web3(); + const web3NoProvider = new Web3(""); expect(web3NoProvider).toBeTruthy(); - expect(web3NoProvider.provider).toBeUndefined(); + expect(web3NoProvider.provider).toEqual(""); const web3 = new Web3('http://somenode'); expect(web3).toBeTruthy(); From 6ebda4205c0c1e7e67a6e8ce0889a1255582ab66 Mon Sep 17 00:00:00 2001 From: jdevcs Date: Fri, 24 May 2024 16:24:07 +0200 Subject: [PATCH 22/24] lint fix --- packages/web3/test/unit/web3.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3/test/unit/web3.test.ts b/packages/web3/test/unit/web3.test.ts index 8734144824a..3cd00a9e718 100644 --- a/packages/web3/test/unit/web3.test.ts +++ b/packages/web3/test/unit/web3.test.ts @@ -23,7 +23,7 @@ describe('Web3 object', () => { it('should be able to set and read web3 providers', () => { const web3NoProvider = new Web3(""); expect(web3NoProvider).toBeTruthy(); - expect(web3NoProvider.provider).toEqual(""); + expect(web3NoProvider.provider).toBe(""); const web3 = new Web3('http://somenode'); expect(web3).toBeTruthy(); From fb4b3afb82cef1d56f10687dea1f243804a1e4cf Mon Sep 17 00:00:00 2001 From: jdevcs Date: Fri, 24 May 2024 16:32:45 +0200 Subject: [PATCH 23/24] default provider tests update --- packages/web3/test/integration/web3.test.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/web3/test/integration/web3.test.ts b/packages/web3/test/integration/web3.test.ts index 757105902f3..0044942b46b 100644 --- a/packages/web3/test/integration/web3.test.ts +++ b/packages/web3/test/integration/web3.test.ts @@ -124,13 +124,13 @@ describe('Web3 instance', () => { expect(typeof web3Instance.eth.currentProvider?.disconnect).toBe('function'); }); - it('should be able use "utils" without provider', () => { + it('should be able use "utils" ', () => { web3 = new Web3(); expect(web3.utils.hexToNumber('0x5')).toBe(5); }); - it('should be able use "abi" without provider', () => { + it('should be able use "abi" ', () => { web3 = new Web3(); const validData = validEncodeParametersData[0]; @@ -141,12 +141,6 @@ describe('Web3 instance', () => { expect(encodedParameters).toEqual(validData.output); }); - it('should throw error when we make a request when provider not available', async () => { - web3 = new Web3(""); - - await expect(web3.eth.getChainId()).rejects.toThrow('Provider not available'); - }); - describeIf(isHttp)('Create Web3 class instance with http string providers', () => { it('should create instance with string provider', () => { web3 = new Web3(provider); From e8b76d61b83656e2e391504f14e280e7e33c649d Mon Sep 17 00:00:00 2001 From: jdevcs Date: Fri, 24 May 2024 16:57:36 +0200 Subject: [PATCH 24/24] lint fix --- packages/web3/test/integration/web3.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3/test/integration/web3.test.ts b/packages/web3/test/integration/web3.test.ts index 0044942b46b..37587954bb0 100644 --- a/packages/web3/test/integration/web3.test.ts +++ b/packages/web3/test/integration/web3.test.ts @@ -124,13 +124,13 @@ describe('Web3 instance', () => { expect(typeof web3Instance.eth.currentProvider?.disconnect).toBe('function'); }); - it('should be able use "utils" ', () => { + it('should be able use "utils"', () => { web3 = new Web3(); expect(web3.utils.hexToNumber('0x5')).toBe(5); }); - it('should be able use "abi" ', () => { + it('should be able use "abi"', () => { web3 = new Web3(); const validData = validEncodeParametersData[0];