From 7c6734c5f8be6947f470075b3c81add627b324a5 Mon Sep 17 00:00:00 2001 From: Rob Moran Date: Sun, 14 May 2017 23:34:57 +0100 Subject: [PATCH] Added node example --- dist/secure-dfu.js | 3 +- examples/secure_dfu_node.js | 244 +++++++++++++++++++++---------- examples/secure_dfu_web.html | 2 +- firmware/dfu_app_s132.zip | Bin 0 -> 38020 bytes firmware/dfu_bootloader_s132.zip | Bin 0 -> 37157 bytes package.json | 2 +- 6 files changed, 171 insertions(+), 80 deletions(-) create mode 100755 firmware/dfu_app_s132.zip create mode 100755 firmware/dfu_bootloader_s132.zip diff --git a/dist/secure-dfu.js b/dist/secure-dfu.js index 1a340c0..646978f 100644 --- a/dist/secure-dfu.js +++ b/dist/secure-dfu.js @@ -190,7 +190,7 @@ .then(() => { this.log("enabled buttonless notifications"); buttonChar.addEventListener("characteristicvaluechanged", this.handleNotification.bind(this)); - return this.sendOperation(buttonChar, OPERATIONS.BUTTON_COMMAND); + this.sendOperation(buttonChar, OPERATIONS.BUTTON_COMMAND); }) .then(() => { this.log("sent dfu mode"); @@ -436,5 +436,6 @@ secureDfu.prototype.removeEventListener = removeEventListener; secureDfu.prototype.dispatchEvent = dispatchEvent; + secureDfu.SERVICE_UUID = SERVICE_UUID; return secureDfu; })); diff --git a/examples/secure_dfu_node.js b/examples/secure_dfu_node.js index 5200cc9..7122ca0 100644 --- a/examples/secure_dfu_node.js +++ b/examples/secure_dfu_node.js @@ -1,18 +1,176 @@ -var fs = require('fs'); -var bluetooth = require("bleat").webbluetooth; +var fs = require("fs"); +var http = require("http"); +var https = require("https"); +var readline = require("readline"); var crc = require("crc-32"); -var progress = require('progress'); +var JSZip = require("jszip"); +var progress = require("progress"); +var bluetooth = require("bleat").webbluetooth; var secureDfu = require("../index").secure; -var bluetoothDevices = []; -var dat = fs.readFileSync("test_images_update_nrf52832/dfu_test_app_hrm_s132/nrf52832_xxaa.dat"); -var bin = fs.readFileSync("test_images_update_nrf52832/dfu_test_app_hrm_s132/nrf52832_xxaa.bin"); +var bluetoothDevices = []; +var progressBar = null; function logError(error) { - console.log(error); + console.log(error.message || error); process.exit(); } +function getFileName() { + return new Promise((resolve, reject) => { + if (process.argv[2]) { + return resolve(process.argv[2]); + } + + var rl = readline.createInterface(process.stdin, process.stdout); + rl.question("Enter a URL or file path for the firmware package: ", answer => { + rl.close(); + resolve(answer); + }); + rl.write("firmware/dfu_app_s132.zip"); + }); +} + +function downloadFile(url) { + return new Promise((resolve, reject) => { + console.log("Downloading file..."); + var scheme = (url.indexOf("https") === 0) ? https : http; + + scheme.get(url, response => { + var data = []; + response.on("data", chunk => { + data.push(chunk); + }); + response.on("end", () => { + if (response.statusCode !== 200) return reject(response.statusMessage); + + var download = Buffer.concat(data); + resolve(new Uint8Array(download).buffer); + }); + }) + .on("error", error => { + reject(error); + }); + }); +} + +function loadFile(fileName) { + return new Promise((resolve, reject) => { + var file = fs.readFileSync(fileName); + resolve(new Uint8Array(file).buffer); + }); +} + +function handleDeviceFound(bluetoothDevice, selectFn) { + var discovered = bluetoothDevices.some(device => { + return (device.id === bluetoothDevice.id); + }); + if (discovered) return; + + if (bluetoothDevices.length === 0) { + process.stdin.setRawMode(true); + console.log("Select a device to update:"); + } + + bluetoothDevices.push({ id: bluetoothDevice.id, select: selectFn }); + console.log(`${bluetoothDevices.length}: ${bluetoothDevice.name}`); +} + +function updateFirmware(dfu, package, manifest, device, type) { + var init = null; + + return package.file(manifest.dat_file).async("arraybuffer") + .then(data => { + init = data; + return package.file(manifest.bin_file).async("arraybuffer"); + }) + .then(data => { + console.log(`Using firmware: ${manifest.bin_file}`); + progressBar = new progress(`Updating ${type} [:bar] :percent :etas`, { + complete: "=", + incomplete: " ", + width: 20, + total: data.byteLength + }); + return dfu.update(device, init, data); + }); +} + +function update() { + var dfu = null; + var package = null; + var manifest = null; + + getFileName() + .then(fileName => { + if (!fileName) throw new Error("No file name specified"); + if (fileName.indexOf("http") === 0) return downloadFile(fileName); + return loadFile(fileName); + }) + .then(file => { + return JSZip.loadAsync(file); + }) + .then(zipFile => { + try { + package = zipFile; + return zipFile.file("manifest.json").async("string"); + } catch(e) { + throw new Error("Unable to find manifest, is this a proper DFU package?"); + } + }) + .then(content => { + manifest = JSON.parse(content).manifest; + dfu = new secureDfu(crc.buf); + dfu.addEventListener("progress", event => { + if (progressBar && event.object === "firmware") { + progressBar.update(event.currentBytes / event.totalBytes); + } + }); + + console.log("Scanning for DFU devices..."); + return bluetooth.requestDevice({ + acceptAllDevices: true, + optionalServices: [secureDfu.SERVICE_UUID], + deviceFound: handleDeviceFound + }); + }) + .then(device => { + console.log(`${device.name} selected, connecting...`); + return dfu.setDfuMode(device); + }) + .then(device => { + if (device) return device; + + console.log("DFU mode set"); + return bluetooth.requestDevice({ + filters: [{ services: [secureDfu.SERVICE_UUID] }], + deviceFound: device => { + // Select first device found with correct service + return true; + } + }); + }) + .then(selectedDevice => { + device = selectedDevice; + + for (type of ["softdevice", "bootloader", "softdevice_bootloader"]) { + if (manifest[type]) { + return updateFirmware(dfu, package, manifest[type], device, type); + } + } + }) + .then(() => { + if (manifest.application) { + return updateFirmware(dfu, package, manifest.application, device, "application"); + } + }) + .then(() => { + console.log("Update complete!"); + process.exit(); + }) + .catch(logError); +} + process.stdin.setEncoding('utf8'); process.stdin.on('readable', () => { var input = process.stdin.read(); @@ -22,77 +180,9 @@ process.stdin.on('readable', () => { var index = parseInt(input); if (index && index <= bluetoothDevices.length) { process.stdin.setRawMode(false); - selectDevice(index - 1); + bluetoothDevices[index - 1].select(); } } }); -function toArrayBuffer(buffer) { - var ab = new ArrayBuffer(buffer.length); - var view = new Uint8Array(ab); - for (var i = 0; i < buffer.length; ++i) { - view[i] = buffer[i]; - } - return ab; -} - -function selectDevice(index) { - var bar = null; - var device = bluetoothDevices[index]; - var dfu = new secureDfu(crc.buf); - dfu.addEventListener("progress", event => { - if (bar) bar.update(event.currentBytes / event.totalBytes); - }); - - console.log(); - - dfu.connect(device) - .then(() => { - process.stdout.write("Transferring init packet..."); - return dfu.transferInit(toArrayBuffer(dat)); - }) - .then(data => { - console.log("Done"); - var data = toArrayBuffer(bin); - bar = new progress('Transferring firmware [:bar] :percent :etas', { - complete: '=', - incomplete: ' ', - width: 20, - total: data.byteLength - }); - return dfu.transferFirmware(data); - }) - .then(() => { - console.log("\nComplete!"); - process.exit(); - }) - .catch(logError); -} - -function handleDeviceFound(bluetoothDevice) { - var discovered = bluetoothDevices.some(device => { - return (device.id === bluetoothDevice.id); - }); - if (discovered) return; - - if (bluetoothDevices.length === 0) { - process.stdin.setRawMode(true); - console.log("Select a device to update:"); - } - - bluetoothDevices.push(bluetoothDevice); - console.log(bluetoothDevices.length + ": " + bluetoothDevice.name); -} - -console.log("Scanning for DFU devices..."); -bluetooth.requestDevice({ - filters: [{ services: [0xFE59] }], - deviceFound: handleDeviceFound -}) -.then(() => { - if (bluetoothDevices.length === 0) { - console.log("no devices found"); - process.exit(); - } -}) -.catch(logError); +update(); diff --git a/examples/secure_dfu_web.html b/examples/secure_dfu_web.html index 7b924e6..d16981c 100644 --- a/examples/secure_dfu_web.html +++ b/examples/secure_dfu_web.html @@ -195,7 +195,7 @@ dfu.requestDevice(true) .then(device => { if (!device) { - setStatus("Buttonless mode set, select device again"); + setStatus("DFU mode set, select device again"); return; } return update(dfu, device); diff --git a/firmware/dfu_app_s132.zip b/firmware/dfu_app_s132.zip new file mode 100755 index 0000000000000000000000000000000000000000..a4f94b437c2861158556e6d12bcc105fa691a2df GIT binary patch literal 38020 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 literal 0 HcmV?d00001 diff --git a/firmware/dfu_bootloader_s132.zip b/firmware/dfu_bootloader_s132.zip new file mode 100755 index 0000000000000000000000000000000000000000..a551b855df1d5c1af92d7f467356f12dbf1c1a20 GIT binary patch literal 37157 zcmeFadwf*Y)i=J+%$b=plMp5lB!&deBmpMjHeA$*)lMeK$s`040Tq?X3`y_|w~R^9 zp!6~EfD3eL2>)1EjVmT%42Zyx)D!Bm}h2 zuYG>+@2}qrpP4ylU)ElG?Y-Apd#$y1$`NVHQ z%b7oKRb8FeyQ*gH{CTri`!=S})WFl?^j~^~xAwoQg6#B5HGZf);^&8Dm-T4;8~^LB z#vc-~K;lv57F4GkiAt8NZP9>3Rt7FWl~Yr-#?`efslP=QTO~fI-~;!ejqw zBF?jn{&|x=XqLE-#!cb6*zCR|dMQz1ZXoz9o!ooGUwEXQk?=O7XmUT^NcuNnYsYxO zBCx{MLNp>rdBNK0O0_D?B$Cx1s!#D3IyzW^@Optrcc$)e>5oV&KUwLVqy!zEdI7L! zP-rB(H+3um2?R~b3{Py)$Yaro-Nd{km!JG{55u1N+%3!%vV}aM^R)a^V~J_8QIbTb z%;(?s6GN28amPbU+bzYxFYgOp~v?M^Q5Y7NW0C)(C>M(7tXvc2N-~6^6EauZVFO-77B~#xE3;U(*gWGh8a}2qnCJ|ZeuYf zR+N|^>_Uy2K4N#u&(`Z&i_|eX*`Fs^TIqNY`MrKRUUcMshg3?}Y&;+6=XzL^UC2^% z-sz{Kmo40&j!a)4O&@+ckGD&Cow1U6fbncU%}I~dI@QOkPqZwNkN0JWpP6`J{HOC# zW+74z_0AO@5_mj~j~aXG^Ozf!D;ZdoAN%w1tCQv;#~7s$DXyCVJ4>+a(=dAIvbP8N zE$GoOezht_mVFeXCFrXTSlHBl+>M+pfzF8VkRAP|Pk$V8$7abFL*wWyd5rRh3kOXE zv@QL6+hn2c1w&It9lPTVjNQ}1l=*!6j{bA!KWjJcc(FIxzq6O&O+C@;r@cz1<|$ca z8(-CTZ__VneF9^Vr_`^^Q#>o9kuQg6xm#NU$QfhTCgS4~;r*NzKeh1#UCa0X#aDy12-c7wRiG9H}K5Bintco zWp8=Dl=wAUZ4cjz;lS)J*am4Q<#))ODRW_%X%{eiqqtM(a3Xyn0rpA zFl}!-a+WHL-4L9nu4-EUq3AS>DsBA^MJG8Si|j%bo!d{1me%j~aQe@Pzk`{tN~~Az zyqf>W`SEL4^Y0}W(x*+i{CofEuQS)*Y3(5C%i5oC8BR`WCz(zq!^zBp+(bIF@JRcz zb~3~K*`)R|q~EM$I9_nE$Il&!@;Zs|L}DQ4t)0w5N5>J=9WKi(M9DJLaIABt<{fE2 z7k;Df5!q>W(6%yCgq7_-ata05p2FCU^Uevu> zdbYsKWa_&gHOy!8kCF65VOjg4g7lMPdKwcFx*tivZ+vq5T}tC$Jp=V`x_$nLlOopOg!XlWZOaL|q> z2&pJJC&~vL;J(qwg`pZrR3$Z$?E@U>N@s4yfE7|H8u{}OlaY)k>yBvT)Q~7}nAg$B zUxtW%S&%$`(!?GUDG!&2`lm_U^Pl0JLun#^(|@Bx?32IXux@;i=|pBxo93M9x3(s$ zP~HU;!%3?uA?PZ6c!)kHt1Ip6L2GN8#I;g6&!En~S>>EX}8hvAHLeywsDVYd_t^@E`pvkkDG(o_>LGE% z(1+h&={H`M4-B5?K0?j-m;1RhDX4X4w>hq)hs3|qZ@TOqm|XTAREVUOM=P{EAiZj( zkP=?$=boDcC@Z@y@k@G00w{3VJE(BkJ0LZwnS7)dUJ3xpxjO=4a!rxj($h)FM9{1HZ>nmVk6ZJIH0dK zTEp~2U%o|8V5L%O5omxBjpq&;W)OMyL-FDSvAHLSwDcq~bcBr}w9*HbD(n-KYQW$* zisjYaMzzJOyW`AvbjMp_6nWk#rgR%EccEvaYGFok2UEJ^EO&Lst39R=M!(ZhF^ZGB zjS07-C!=awuI%xZ6hh5zqe!v21N0hIlVS=iFJY%)ed!%FFT<8YA355`e+t`|`wa&t zbtlA?berQry<{V3*VLfVE*Z2-2JMpne?z;G`SDNDZuCfxQ2n18X^rYw`B-g~>LyVA z(|V2Ssi1l)sGjIjwczcMD;r|<81J6;cGqi+DVn@eI0X5{cG9JH~B$`VDHGVaZGD+}>@5)U{xJXz(uO zUBY9yUC4_kK=Xg4T@JD#r6~ChwBQC6CUrBaM5NEJ^czw}zoQkZE5t$G#cEL5o!ZTS zW)_Yp8kY_*zdhxUmbgT?AC717<=Az zTesPCv%=Amduba~I#60=UcDjr-rNUsSH$Q;c|Vo(N!?fy3K4sx5eP-G6Lt5^%Q4~qyH;7tG!ck zj^Y32?Nk<_4NAdp;ScI#4#rWO{-=GQb?Mwdf1ao9P`Ls?L7URUU(UV|SFVGwj&2&bZ^Nb+DXF_ra>jWr%|AS>{>tY&3F%G8a}3n&v>Q z1xm&`J!-J1VL%Pz4nzKM4HHUd($e|ErPGv*wPZ*6T4u+dwYrfu4EfY@N#PluWuMif zmRTuBxjiWN)!LWV=>T89gMHe#QF-)zw7qjqICEbxHlRN>x3Y9Cl6NJZMcWs0voY;7@*wa6|PM<-o)7iqD zw0qli*v+Q(YIbmHw~R)nsc+P(9gUD)@)Me8=y^nU1KtZ23*CJ;5P6D@v2Axc&Gm%z zNPL%4KMu0*+o_4)l}i4VRKP7VnG=ZJc#_Ct)z<2jq%^=qyY&i5!V@`kzVs=Bn-LAg z%mvAtn8$c%3OO_wCM5oABC({;a1-S3lL~RtUFzN;qg>wi;Q_0AY>`gf7YHfb_(Yi* zYYnm;%4Q$hB$l|3~>P#_J2?yP zyUUOyoL-xJ4Ig0aV}m-oAv7MgF(QA|+w5YFkjz9W9rKB%D7|rN&Ozi{IKm3&!dm*F zUKTcMtbY}@QMSBka$7r`q9agWNMNP!JZ*(FByy1cGVYgT}t^rU_yJeKdkeoQb)swg#}Z>yKoU3-nk zyM()TzUTYXzMpm_jv7U73yRY1MP~8#;zZAFMdmcKI4&*Gv%H9#t353(ijO^&7FlCY zi;I$CPsK&acq%UD=Ouayi&A5$1x0-9$yJmYdvX@pV^230&5S+WP~^bV!eS?C=M*i7 zrCw8%6MLFp^u5@VqsSS1(n*PRW>Z3l)ODTLTlIE*khL>G17_SYWrfaOMC4M!dD7jr zIgFTl!Ov)`>d^VBr%Gk3Eu;_~vFkqzDJ*`|Po@=5@T9p}k<1(jPRKm05SKwDvj&2P z71qUwBx@iz-lP4}wK>Ku1M0YMtygPNf}8Vz_Yr9zBNx7l@x< zP59>3p4D+JEfv!0mwT+tmlalvMT! z^#PyT0KxBo9;OO<@qmw*hr^|T4kv|kUtH@VN9?F}u1^WI+<=-Z8 z-3E9+JmOH~GvzNH8N6`p8>t-@Vd>;g&JdkxuVK+z!MKaa*$R1%*b@Dz2Y;X>^&h&$ zM067OA^gpUNp@ezUkEP6GZJ%n+!T`Ck9R^C8*kU2Y;c0-I`xv%t~<%+G&s!x2HtGy z(H<~HA$_8yPr}j)Z_zZPG}Rs#{Nl{maZQCAQtwT*g9Ba+!G1`4^%Ti`NoWz6^uHE? zQ|C=knD6s9==$_B=Zb{vb=h`nuu7hzv)48EI2dzQ(s4`o%+DNkCyFQ7*w=>CC*Wl8H*o*Z^8&Wr< zX4h@Zo)V1zygYkuko}xwKM`D!ofz69Rb-1nUv_+`QmV~gUdJ4W|e%CXx>kRQa@no#O@k^ushA$^7 zY#ihoA^ejHL%QK{*GuRJ_CryJ*M#}U=#Gt%xE_XS6p9MQo~$oWKAWU)R+4og#KqDZ zTz#>$Z$iK!V_!E%8dMwgwY`pff_)DwQQRgeOk7jp{vL*l9I?SK8<8wFV7d&g#Btko zGuR;WyTcRpGt5DY6iu5hn@o|@I);F6TkY&_w*3G=_G2#2fO3R z`fi4qm7$X|4D6>fGM-d29ZZH^`pU!v`HV<-m#_jYStYA2L9+5{YfbTZqfc~XOJ&Z? zZP!bjn!;_TIBD1rn|_8dXdH!&UaD_rXOK`=J8E+orWv35vrWM-6u#?6vNe9?*|>NE zB%3pa11FUs2E!P1sP9iIQ+Zv+EHyJJ8s1aL)}!Zi&V{|NKhJb4w>%o*wT>?ULJXlJxpBB=d>*fg~(R}!iLmIe=*w`;+Q*c{(@_+y)Nf^@9Of3$~EZ4sI**HUVec< z(0*&&8-o^cS!$fe>UWFI$!?FoaBEwf?KLIIsM)ZMRX9pIg-R5Zl@kS zQK&v;Z1WdB*fDXj{r-B48sS-ZOb`*Yli8`;Y2@|rneLAg`}vTa)^xt6SP0cXnVqjG z@lIkBg&MT`r%ASbGg7@-kyqnh7+IU~ZLf%m~)sa&-llPa?=V^EzV*&kjf?kEN z0TAx)Bjj5!Hu9C#)m7EQ0Boo=>x@!5wWL9KTJSU`2o0{><79g2H_>>3(Z!r}rqVgu)!yV{Lz<49(mP$MME<2*k6+6f(_2t*b+B1H&_l*Lm1~;E1lI(- zjgkoOem_Hsgu%!|gUur8exGcuhu0OqkJS^t^R)65%lC)Pd@tzoThPVYkx&BpqqfZZ z`8qE+u{D@pM`7&|b%3Sseur76%;UE;HWl(Jre{w61)g55zN6zegq#0j`wq${Ste-W z9i8l==RDc@Cp|0uss0u9yV0(rleT4A^n6`LAUnVZh^XH(DZoL_nefT2b$O}G`_l}n z#~bA9d#!Gg8E0et`Tm5(4gMs4y=SI>y+0bM=r!4r_-N$WUiw|ri(Q4sWJ|>Jk9!Sn zGKGk(9>4%@6xQcxlbgUeXPp@+Jf+k%?N)S-n%BkG4OzM)CeUKwu{_`W*Ymb8Go}W~ zbh@${g{uUNOc@=S9EE8$$hQrC7+`FSe{4~{$1HZ8(It1CVefqrJDY8g71~%7Dij-6 zuU$A6=J+GwvBL2%J5|fOUO6A8xUj&(ShTI~`hX*l>$3%jjj7ey4Dz~zlnNTYj*h>d zw>DJ&YE1D?k;%vm==~&%gjWB`(YeD@DoYthmHL}aB~zUfJnt&?xkr^pa+iDVnE0;p zh>fJ{{HMe6Ou|#WA+G3gtn0)efvg3@`s!cBiKw6cjzZ=x65mnSxg`B@53y6&v~5}s zbcb&=HGQmmFj6@%wuDTZ=C@9vTgfNHwp87R@>KA5< ziH&t*uYSnisZ1mM3!wYl*G;6k!$kZYlS_<^Bx6$1AGcX&PY6z0oH#o*IBs@Uux$3k zkV7#}+3p%2%H5{RvWDUvME;A?7|?vpKYH_##*%v0_gjzC$9Wg|N%py*zmvA>u3rS) zqLJIc87>A}d?f1}c4U4hSNM?lv8PMqykCSV4ip!P1B1P2G~zr&pB){Kwy`8Tc-3MG zDP6GFQ{Fa?lzwx&=QYJj*u4zjj2=!5ja@YMH&31(OIlJzVKq_`LNto$ckmRO)u$!> z#Lk8&pJBjf5cLROZUWYp#&25HzLU(cEiCv^+0gjK_QvLm59UU%XM^Ky_nw0K9g3GI z*E4@w3+U!hBFdc`80K5i$jgX3^mi`IFL2#bxG>*WQ(m=kV`X`*Z{yvR8Bv}_Iv#7I zwSG51dERda=yOPY{;vUsCvpKISZ0JKx(x`eB=%|8FMke-rH962tRBEqS|}A9bTG2D z-}%iaPNu2!LcLShM7exCA^dAf0(h;JnBB%E5tfU;q33MK)b;~dccYQ1ou)Q|bv9AqMmcfO5%I;cbEn6+bW(bhJz$Zk&#=;ZeR>$cFW;@K*7 z-XEOd9uJBv31t;$sVN5s(}g)jlyd($sFnGT!JI{9={ZF#)?}oY3q&J1gV(5KUm7Ht zSg$(`@^xzZ%t2-+9a9$A8=ShG`kjzcPG+x@C(rp#v6Gn~VjBQ|UW*>^9~<0xV4(`< z-v&j&AZPWm#1Pa8H-gja<+?$=B&fMngS=pDvv$6WaU~8DiH*y>7?G-KzSg^XedRFQ zS7n9&&5<&$$~9HhmHe_&VR?SRtwnhStK7Lu@=FSquF5SdTjpL>w4`XcTIc3A6G;Ls zW3Y4A)K*si6V=GVq9sD9rz#+XWc zP1Ty(ipqO^<(0El9AYv}@FL{AVpQ&`N?POcKE_}z8v(&aSsXtg&yb8nfq6zRujsExWoKSE+Ie~l>?`{HT3y8dWb&9< zpGIkJ?@`E}EaoJ5R-sNz%x64w&t&b$6JJQq_t*{?r18+P8GLATFT-0qa{`8<21FpS z_-0Pf(zGt@TG;2N;sc#&)iigm*z@`+Wmj8**dTlc9pf>vzV6FOHu=GVuT$F&oKouR zu|6ChD*5^k6;_|f4@J_3=(l4CTBhYg`2FYbj2!LVrs$eGT;#|#!nj4Jum0YAUVhM- z>;XjU9fFy{%O#U&+DEAkuCXVqVzP(U`>Gc^HwhZtDhf08ZTiH@Z*=1Kr&Nwn`9W=8 z(a6EKl#cOkBCj1vTui1Vmc-xa2zY%5uycguB8YgE>~%a+?g`-C^G#T+TM=jxIX6kC zTyXP%HPGT?0*!^U{Ys}-JO_T&3i!jkQtrU6=i2nZIPpjx$*?RQBh3@~!tbqI?c_55 zU?RcmggMT~&MwteOpb)^Ont)Db2OMIgAecz@BdovNb(tlC);>&f-pTz3h1)jd*Yhrr6OgJX^jn)foT#tAozMp%E{b@La)3aYcp4swfD47Sos>@k%DOQxXtOl@%WVivx&C&P z;-%Z=c}s^~2;m}Or@*R~-(zQ3$Joufx{3X|`9+%_cTGC7G*#zM5xk;R;_AFUQ#R)} zhdd&)nfDDw_A4II=BpQ3d3;~G&nvQ^%rB^>pX~A z+GpTR(ld&mI0HXc<=gnaII8vM5&86++tn0H-|i*PEm|lz8eapy$Q20eSC1g>?-}9B55>tP}qda9X$$jYb&?XSIlwU%S^wnf{D>7J0g;U(ArDU9SHd*DYZ z7AJZQ{Hbu0+S<|H2Nx4Q^G3Uu(&A=NA|?2gTbI>!ae%jg9+QGkwq#2?l?8+gG_SKt z+gmd5Hq)9Fu&vATHn`GH>}O@DI1rJC?7kI&TcN)u zFJ$CRLn{J5S8LVvvi!e=UsIo}d-Z%>_&-qpEJmWL_g5;UyAkQV0dsLgUSjjOnRnmD z-&|k#Tr`3Ppz2A7u5NoiBw|mI+aS_k+uOiR*tW&s^ZsI-A7?)dtX-x zZTH*Ru{MTRPmS;Hjo#W#&|pSzQ}vBJ@A~ph>%CMV<$W7{wY=Y3zOJ&C7riy2iUMiE zntTN7Q^Wbz%4*-5&HM;BtxOD;Wh0HOQ8f>(4{AF_8@zW{QZ#*Qe3e?~sQ#t(;U5z4 z679WyKkrjv)cEcnORO)xU+uj94P?7}f8kn>KEww59aq%f-s_bu=^9uRQO@>9zbC-^L2Qx~gge z4-GRmgHY&F-!Z42{r_wuLxCI=uQe~ZVMlQQ0 zFRx(PGU1jIYR|BCJXFVI!^Z)=YD{tb$I-}LgRDR!)8nvObn<8FX(=n#h)(`Anxy`Q zq6BY828dk-U$J&lo*l!nY*a(q$kRsX{8e!oon5+!YN%TJGVi@3)2_T~1I|@e%$}_( zu$ScC0JMB6_XZ+Y4Gzma_A3=N`5y} zZHsGYFg&D}-x@+2oh&{kd|)#`oA9}o7=cH#+=UhL;=tUO84 z%dZTYr4=UArx`L!IRDa(;{w!f$*Fb~z5HP(?IUf++Of5bWKx?Fvy+Dx-_^9D|%E@vU!NkCgEtQ@W)^6t>`bOeh|EdX^;P+elu6HMR7@hkj~N zWm@lt9oE{Jzh={N99c%ZL|O?C|I#(EFWLiS8t;R}ZtAo^lEh3?!pzj(um`!*LZaY4 zWq{9<4IJI_cOMJ=0i7X8$2b zX8kUxs6KQnP_rWq zME-C9@<6kL4GTpaMqhR5*!(KU_*FHv-s)QZK3}akEZ|0&J%(js%&t)#ldTj?#hOj4 zHmt5*MRk}}HB`ZfwFR47%t+$f2un=$CVy=Waz}7kR#~emKM>xd%|QHWZ_O2U5>5VJ z(Kbvpmy9o~GzhCyL((b=f!b}*nzh5E(q|6n$PBQA4aKSN(?KsP7h<>;ZRD>Y3GL3M zzGwsV-9_ly&=WZtPco9HI?_|8*-s!u}oA~&-L=NpQ_IT2Dk_)9CNw;{q!zeTLH2r?ISol+Tktfdc zgj&N0{!M*VTX9x*0?z8z3j>jB`b~oH`i-wIc-MMc?hnA82M+&Il-T1#ev#ST=rV=YitMh3Tzc%C_4GYx=8fu(JAv;DTX`kS$x%Y( zhmnWX05KeTf zd93mo+RMcLUBL+;gJ27!2Hc__e43G{j7<^m2k;w2nPs3*?FZ8G03_2`TX1$Sd9^_M3uJiuhu)NDf{8f4gf=@bZ-Z z^KZ_{?;?tV#;G8>gZy7yhADhGU1pu>DLti}hTYP62W*$ik1Gyx68_lZN~VYDCUMuK zEKqp~)7K)D2(KWTW~M;W8QTh+xh=%3OAnEZbYX=+b~Ew~@F1jM?rLxQ`%J_byhE5( z#PH;Ko!pH$I$9GN6JlWy#TT63f}H2T|9f+w`zcSMZ7bnz`5)q!k$*cxcJ0aM^GVaJ zNryuueXan!$WWwf@VH{<4MM)K&&7qNs@Sz-r~NbUduL2#tfUw0Xi+D>-pjfX-yn;9 zfL#hrSl;utW*3U_!ve~&RhCHEI~5ObpMYC$qPk_tTO<3&Tx<@to%ceX@@Klug)&-0 zcNc!T@ATHH(qyzK8Roge{GVrF1<*D_dv6IFC7Du}nVh$%%y>&7H6 zPoaGxJ0B8f2v@1tcPr`Oc^R-u?&)m|WFS)325$~#gJMJ6B_sa~UKV{Y4Rb^%zoYPi z(wU*wJBZVhjQqo1O;hMl<^#g7u)q8|JgSeHA%TvNt7IXci_Prt=*;AoRjV$0&3#`| zxp6p0>zKntnl6n!j3}F+?$RxAd6j=Npn-1G?LiC2=8I-ZxOl)iKk5Py&y11C@MOnVU`aI+Y{uWoO-D-}_UtLe;;n zQQAa4;4WZKu&Q>ahs3!<&9N&U_%w$izlY{F7kpWgGXY)|X37#P+|c<8C&r)v%$(GWqq?CI=2UUr}Zg zHVjvk!n)FQ;rvSKs2l+R%X}@5?!(pvTPMJReQ&I_U1kd!X1CNnwPwBdZn|!%lIz3x z+^;U$(S6F(#%m$JWT~(URaTX{iVO0VuPQBDwXC27Pn4D#F2jb-SQWn1ubLw?8!p{v zQtlSt@`%V{CaoJ9SH$4Vkj2MjbHQTYyudbJyo32BdQa8)I3_+HoKCfM5P97G@03NO zUR0lR95|w05Ktw8oSV?C3EB32``|N4KU)ZMxlhyg_7@~V2xgiZ)l9989c(>EX zK;xu3aQuK(($dq0<_b>m&wF|kV<|~$N;F~z5B(ynm9oT2B_PIqj^_y0M2rs0FtF6a zJ4}z&-i@lsahT6(lN^G8&Wh3eSY05?^0j%R$sw(*tK{2h*e%TftECwcE zT9B{%xb!zmzzuJQ4~8?@?@>9TpRE`g^be5t)wTVL!Iwl=z-llD>o&~wS@RoRZ197k zyCpsNqw-WSIOV%4y><DTJh*1=rq0~Kn+ zpt62{MYC8}QMVzdGN*jA&wSw5uqWMvC_YBkGxzv^rWor3Vo_?q(;}V|>1bQ?&2gQ@ z1U^k?piMm3;+)*(q44h~Xo@%#r>(j0I z3*lqzkKEfQH$Jr}C%?X3u5S^$Qa_s1;_-^t=X*UTpqrf&ONGRIvOOR^#L@oVQ%81L zx}n+03t_*#GuS5XQ2TnWk!pU7{I>y0J4!dvqo99&ctYX1Cw`S?FTwuj3|hJgPg}me zkKfh+5ae4FaY4xyCA$TKfj1_01KY4LtCWzJ0Dzq#+qXM%s@|L&N?nX zr@S?MgK(~Ky*dXTM=Fn0zWmE@m6~$z!0?zkrF+zr4Fi8Tlf>M=J}+el=3R~2?#6-1 z;Vo+JT?4;X^6PUp)K%_ZuT)T-^mfFfSopwSaxhmLU1_1sm=WzFgWISO3oak)YlE$* zFSJRm{r!ROx!ZDxoHzKez)AP1Y1a(U8I!YtO0pHglYiN)wwOJjd~kFQs25?=F`G@Wpv~v9cQM5aL(!vE5yTK$@6)?c4Mz(4;MG zXcwis=1ZxfJ@Hr7)ZR;(Bs2_~|1H`st@KtvmaVDM#_bBZq>_KMP_iOMquCi$tOgQq z#hI(bpat4s0J6jEZrH$NQ7b9-4z`9$4$|N%RYz>;)AkdoI0F)sJB22kt+4WsQ~7p# zuI~hPU{?uTO7lhMifdIlbFpt)V1I$($PIXN!6rd1j0I}W>As?pVmzh$82K-Ki}AF_ zm%f&f!+p!~T)y^?c>c1FLUefewQNta0X*GIy+rRR)}~up-cypAc*!NKRH41!XUA$L zh{t2%%=%Wuu{YxOJ&&6AHt;SiNILN*;#}EaWeX$k>tp!?;rGt4=5=a`m-^mU*rxXt z#9#AsJinkhP0hZ!B83N;Or|X6@-we-ctn&Ahrd%MQ$O0Oaxb<>+C0%@82o_uc{fuv zV+~Z3TCtMfSa~0wt2f-|#Wt~OV@$UnUB?BPIjp{@>7(SNnn!)8!?S33k3s7=P^%(l zHk?Ps{>llQc@-+z`25F z#9X|zCL#ObhsV8KB)$Zzkc@|yj%ty{-l0edY@e{xOOxC>`Jq93AVsB0uflyd&E~Njbquw>EJ47+h;mMcnl7JO5l<+@tQ(OH|F|4KPeq=N z`$S<{u~A49tk9D4FwzfWq|;SQUsgtswAIrDzVTN3Tp`mrj~tL;icp7 zoKUYKqV=p-OLGIW1G#67@D1u=A3X_=;PLQd0Yt`Nv_r~bScNgZ9-Q6H%tie6BK5sBN~3mv+N-1bwSmQ)rlUSqAiFP)H39zR;uMWC;<&lz8GzWts$xZ252QjJ_~Pt zPN%aNzIA>e5{=TftD{67H^jmwh_HKOPw#VI@qPG_m#t` z3@%-Rtt5ZRSwsVBs3u||R2Ig{7jN3&SEp&!C}^6T)?6pwh3Su`kF4EGIMQCIJ5m+N z+G_8{8h=&w=n&lDe%_#+pqw-!Lsd|@ej3?LA;L*96^4xO9o9p!#QW-L(!?1|? z#nap*oZ5fnvxR~ za)z`4p+vU9*U&KHcMI^y6mE zC%c9smHi}OnZ5y$RWlt1HL|KNvT-0MuvVQ3M~340!N}gINm#$c?{nfz_L$&0HRt^y zHOlO%8g*X1JycPWyucvUsc-)|Pc!P_2e*atrT454lP5s5sw7aVGWXZAwsw zkKR5h$bt@2L5F7$Tlit%8N?R01=1zdZKlx9hwf5qE*zpz{~CUU*Gv2OW=}Z$3w*b( z^_TxKOkvU}Km*_z5L+OM*mdGt_Oz|{c#b1lpZAP+Q!8L!Jp2I>X?3;H!7L;)o2QV8sMa@tMAO8tI7~ncOG{2s_s=arcSeA^EY1hj~d1B z&*?%;1oZCX@TY0;mu)I9$G&0BruFML^H_$e2pXk|Q`Vpw#Z@blRwu@HwP2Jga2;6A zNB9WL>6#uz1C73Z!GyCd4D6Ciu`lLB*2Re>t)A0<`#sI;{IJPx>st}v*NO+45npHq zUyh$=_eLZ6&}Lix1oOZ)WRRq_$;jsdp0!_x;dkq#V?o!twIjZ6>>_3+ymm89q4>?r zOnp#?Hxs0Cs((@)Gs6_r;e@D3T}A1zI9L%UZiU@6sNP606j^$R!n#5y7}S=`09vGC<=9C&G2W=PoZfb%bWq-dcAEx;$@+p2qb^#+p zkW(@EcNGIWWZn-D?LcMDGXpg0Xd-4j&Ug&N8xFLL$r4ROjA~btIsc+ff2g#mv|h+r zw|O0bj>x6Zy@xUGTD=p$r28j?jmy-#RGbzK&{FmJxdGg86)IBGauH|Id3xxnw}h?( z+(lBx)FovxCvsIzR_F#VJ5TxDmHbVEH+$d>m;Qti?a($1-MFLo8F2WQxo%d!8+R%f z!0&^$-1@A*P)0+a~>ndj9023Yon(^u%aC&ZRkW zNjR&~7?>`@l76&I$0YHtha9fhOeaGu7L>-i$L8EEG=i22@n!k5`BE%ijdN(bmL=G_ zA%=8BUp@vu&@T>}NHRVZ_{3nSc1vv2D`HWRv$Uh2m%=1t3BwySEgM+I>I)G6H6p63 zMt7?80twB*sD>vJlD@*mxCbJO4iWM_taX3K1eIRj?@vSQd+CK=ZsPpe!la@}?!HKi zl7hXBGnK`OrLUqku>nzoSE-|9@6Qs(qr_f?;XNLLvB`kHRv)DEeIWAcn5mVRM9puUPrfdR7&Nq?)=9Am&CCNNtNx2TmKK7_W%!+xRurG{9D^vY~QARrN5N zQVWmT-w*SQ*p#`is=7jp7n~% zQ@bX8z|m8NL{96Qr}|%soZ3e+jgqPRJw&n87aE8zRFV1y{vrVN&Jx*-yWQ#T__wjY z4G^PKEQW|W%tzGLnpNfNt7A#J#n8`hBu;CO4!Ok+bOCb|+W>s!>>5!tw%|>`Hr0EF`x)Mj z)6nXwAm=d8LDSO1Z4;?oM8^^5(~Ea6dTz3y!yN}q&|;(daHFt6_~n5t!MTr-pTpV9 zD#XY3MxGgZ$4*YX!?S{O7f!)b60x%qi>o!c4twZ3HR*_}?Hh&t#I>ag(lbmHvP@K?Czp!EQvC=11*UANS*a z_gtiXHaK1?*p(qtkBTGTCGgl=ZxS^Gi z@9Gm&o76G*(_vF!F0XfV;E!QG&Gg}u*uh<%^TEKU$Qg^Au~+0A82B)3mDnDRFt3gM z@KNM{8=s#K{0h3|;V_*~Ek6ODr+U*4{UTyp=^GEp-dvc|SuqPT0QWKAZ=D?CI+zUd z^jbWhjdGo-9l$h0mqFkE7)|ZGsl)iflc!UOUQIa>y$Ls9Z*9Z<`|&TF_LC=1Zy^RX z=eJSZ>(I#*zjMaG_zNj~O;_Fp8vz%hcRCmV@yQ`Z)k(V5lgwFb#BNw^i%gIhs8(?l|RAV~i@ z%f+LFw|jUMj=yubE+bmRBC%eivF}Bxbd79BobPb7v6k*mMQez7qcP^JYIRJYw*%CR zh*iu&)Jin+dDKKKL4J!fP%5(=jm{p3I2C%+kn%7u7KphbEp;5S+wHjy5rmBT9>hE6 z`J>2WCt(MBRglfTI>=?G20bEf{p;6}-pI?)WwBCF?s4%U*O4QQo?zH3I_liFoTI;u zHe~|&nm&oS*b$x%{~q&cwW#ZUU-u54q%a{{ItsuyNaO6rGW-2O+vnr$HwF_vXY3_7 z@0b}(w3|Zxkv!bT)*sn9L{Gxo>$h|!*;fQ@@JL}cG%-!hSg=0fDMXI|0;LBTa z^SeeVoSAQ8n+#3d1Nn>N1(SV?N}~tZxw+{N+)g~(jCLldPrpi{nsGEzJR~-@)_Wdc zo4i|&;f(!S!Fzs+$IwL2?;@&tFXFZ%LyAsdY>TDq)f#h$v@`i@1uggQ$YpIeN%Y)$ zG?G5#*+#81`g9hz$&DdmeJjGMb+*~D+OW&1kcVprDQsHamWCUNm~nJx_refeuhb$K zjr0wAw&_%O@e;+-cvtx8DtY7M|HcqsxyE+8)rSV^^!* zQxKEEBX_ODVr?`RIE?RY?S~t5kJCFY2z==2QMykj^1g!)KmN|+ zSU27mQhwwjCtKPR^HK7l-LCGSwNu6%b>MCXl1XpD(eGq;KA!f(W^S%-#xUP#1`XNSL0vk7+m+}zTO4uQV5@d4+7>_elQV1*?(yNRi*c8O;}a!0 z$UJV?XK#GvRPq5463h{G1gPJF*=uiXJyjMkO3rhGR;1w8Mw)^fTX3fZJujn;qXT<` z4;%M2KGxRc$^w@#sPmpQ>6&zCnGmLD96_w~<5&;-5V?$V?9btLPQ7|6C>r^%f$=4t zM#O6en;V^zX#_xXy%Be1vE%HRJ9iFx8k_5Bdn2|1Ar_AbJsI1W;p2tss-&Z?;iN#G zCBafbBc+$(Y<5DBJQvNj94||K$Ynb2tJ7t?-o1T_E||3$XaA4TGfe4zZz`Rw|JJW` zCgS(^`|0;r`xV^kO8=S@g)|G0@ORCgD@$#1nT~o#px8#BXcm!`{q)|qz02uMq0!uU z;m5eM&Y(iD;jDWC&d(6s+UBWSD0H1?tUCK#+<9cg%sHtryL}$bM@8hVN+i5R?FVi9 zDR4YKXy42s(wxQJWjebh$N-xOSgnM44gs^AjuFNSX6fCDjKF&g64P$0XQbSAoBuZxbDhhaSC7J2vpgl?FL%*- zv8#_pl4|G2hm4sOi8xK2|*QT;7X{!HS&K_eJ% zv%-sQl-7ZUb~)>C z>eZXQrs?MogB^*$BJ_TU!39QW#P`!{e_8A;?8X%-mA@Z z+g({+|?iP;oQXA!PmqIh(*dR_##NZGjMt=*-CMr)i+6s z-{rJhj^Hd16W7Pc@wmR(Z z`9HomgFBn+D20Y#orr`cfCBnZ+%AGsP!*}~L02ylAh8eKtnmEO)P#^TwXJ*kl*myJ z+TyLOJcV@OukB>xZ`NV$Vn$bn8NNJBN0^TPwSbv~8xe`_u*n>}nJYc(AXR6HuIem9 z=!mhBmPS_$#)qVKDjgoJC3;GyR*Zx^}ZZ8))S2?Zg`jqak6 zCe@d}_l9;)f@b3`bI}k#L^QhJ!lEHYo&M@Pjs7uM$dAIlK9Vz)P zF9*3taMBF-S#}hN3HbYnxTT^l06XUJ%w=e9C!IqE+*{G=`WvJK{R=p`I6HSofWhq& zc^=CHu0TnhW%GOInF;z?rXWrZ;C`@opc_Xc??jdG59;2J<>;n%bSF(Qhe|dl_3O@= zr6=oHA4#v6#Cr8oNB7PtB*dl{)g@w9=|Z?^BDKNuLLK9?<>O8m?+%>WPt4EtGJs9n zCz+4671hE2spD`n*5l^MkeTg}4CWASAU)3{>avnN(225ex1x{rt8&O^5IJdPO%{0e zK;+l`)SG%T`WkLzy%73anAXvx{a;Y)PeGS>GlkBW!2Pz14S{i+iO+-;?re%vglRyFl42TGbnjk1BQmk5$XMIVG zS3oSFc3-X41`!MvFp3|vYgh2&iP~Qa*!DqvZI$}%_C2D~tu3h7)@s|=4Ptkx&wWOp zpRnsw(M<#-`#<+4A!6Ho``gKH?wxz@+?jJ{CNpQwobw+b;+!nI8OETy!?r9G=V~&v z6xun7#*y=A>*sGt27ZO}S2(j8aZF2Y+7G=%XzmC-AOk+>=6ViP(;iNQR!pJSh1K8` zT-$-+#G2L#Hb)1Jg`~%sDq(8@WJvUyBq6>hyrY_;N_fx~joj(pO()^hN{*__W^8;237p)fJNYNu`hY@wa;=%g$WS~G0pA=&C zi64spb#fE1$6UD|aaLN;+8OhGfHt1oq=*i*(TM7_=K^1XX)q?d=d|y1CZm-lH_4)# zZYFDKf6U)Oo~lUI6{ii;b=8B=inJ+`V0&y*0v>7J;3UfzT?WV$> z7}`_C5`%0sYYiE$jY`dj6)0gyGao)&8Y zi&@+#tNJz4XqUu=wG6QB+G-=dZjoPP75KWXhcBB(6mT779PKFYz zrT6$UNltR(XoW}^O04y!W49`T7E(Gr3Gnc4`uVPm~Ms*Q_|N8blqIJApA6oq2z!hMBtTx6$TFdalxT z*_A-^_RJ~fkWneEDF{@0e*joe(ovwYt^{vG*z*2@6tma9*x74|_TarmS>s+iDUYxY z&oHVvjT(||qj{J4aukg`w|l;hx*VZJ=vL3E2+NkZ3Mysnrg1FDRSU#>d*(jHi-{CW zYEsnmlS-dSO28^b(sDmhlwqv3sC%zsHO|LB(k=qHL+p>#~PI6PzXZ zU66r?BV_$bM`)n0O@EI=e=ZZQnM~)Whz~tii~nS>RTe)0|I0vYKq?nqZpyLb_+>dX zN#J^9b=rZ`v5%Z&v# zGv~j{%qersEJ)@^_7hVqc4R^(e%oRzZeeG%`{#aC{H=C>xO90g&e9bl=veaCA{e8d-Q zcNtr9-EZlpKP>rtMQ8Dpln0r6*3Ayee#7Lm9YCkf4 zQ+um)gdy7zm67exMrjNY2E47B9i<(8xm8*;W4o@1ui98N{q0jlhU#iwQar7Cda?eU z1N^39-8-j?weKDQK6z&Q;lZ2R?~U5rzM@dl?kA50qSoeig}l+A&isvIWSOEP0O19W zk>*3ZvO^w}*?vU6xxHl4=Jq2mmAA{}vv{surl{hFYyCTdBy~K!tK=IE5&Y_?pbn)} zoA{^J86S){Nb~p|5e8k}^jeLfJkL;@ZD`J$Rtt_VUtgPM(BFQB5g{2FObJc|y8y9PVu0?IfY0rXfTL=eK;T2`! zIv_ZI>Cl#ai91D64f<=S)yp>&4bpU0%`_6Df>)r9jpz%)Ez&eaPG23~$GzkRiOGi# zL7&H}d+pC*|7qhTtm&B8dzJbD)=)^ydhOGIicpqibtpMjTP9(5S(ZLB5>KSI7)vxC zyNg4dagYi_r;g1rq`HSy-7M(K6Yc@*RMDxG3S%fe_lUGSF-lB=9^E3s|5>`KghX4A zthir#;vLcr{^eH$Iz+V!7u=)>{}>mK(UQzik;AHDxAhvCqOKAZoJA@bc*S7Mue$7W zx@qL?wts=)n+&qMC)?TFs5TWn5bJ ziV^z;ajN_5WvO)nAEPz&8z@+g_VawE}9BWxJvMlk~3NDlJg zu%8I=R8&_~e-*~Z>yP?(MZ5%@YM1>{7r1a0(W{_!fy|*9EY`$hO=oYneLxQzm3)Ma zVDIIaqHNgR;iQ6pd%E<;f9?P$Y8+&%>rhH^4RX+`JlR}O&No7*9jG)NQbpXIb*Y$d zy>ZqNl?5EScw0*xpJVK{?*{&893*u+AE_)^D3yb~0MCJ?lZXctI8)Uy&os^=F)2-T zK=Y}K^fxx=ykJx{1@KZ^0Drb1WQfM1G`+2NwC;{n8YOtzmZNIAi0`B_4SjBn=~+Gj zacN~SmcLrS5+1e;v7NW<(Fe3R3d~0BF(uYKQ63tL@s62B!M7Y5lda%pjtaRF_NLji z8EA1L&q(Mals1ivYk{M{VghNs1pCEw*{iw<0ioVuw)mL+(s&~wD5si<)9kdWz z)S-2+ZITHXH(mDkyX^vQGO(LmBINV!1` z+PSp_mNJK`Ojp3F$_lv3kaPufvAgV3q2t_T*L1Oj>n-u6Cg59Rz8ZD%u*nQ5cgrRR zSLTyiP^!d4O@p%S(Ge{#L654ZoW6x{H?N_Ms4!m=G-(00uiyuoeCxpFFMo*rh9J=b zZ%mxyQP^CN&h&h+VT%`FK4O;mr<*0ptr(Nem}ThKp-$RBXDEA54-Fa zdb{lzkX$}!@#2BK^(S&xLnuo?u<8(Gy?tA4W87%2tjE5vUkq#E=Jla1UBx^>T?{Hs&G~IMc@x40lgk50{>3HHJd=&S4 z`lTri+IDc#nL}gVDM{0AOH!@=GUV2;*`CWkwq_U(M`j&OIg|Ofhwociq4I-X6o$z!G9@I3I;qBfdM$ny0qvs|=Ht|7-WjhCP37 zxHbROKTN(Ge0SdN^}nwEVPVvvnuGE-ZvKXlrEH(?#T_f} z?r3f<*m3o@Gmii5^!v>NzT2gYS(b2X?7@vI(=Q&Vf9XQS!_~91r`8mm9=HF@C~5uI z>*k&446vP^QMK=f?A&jBm&C`1Zu0+^QOTMii9JOLvjzqx&zW1|pZB@{($$G)PnB;< zSW&&}=83wQ`H}n0+h(5nD7*0Mh?~_dF}}6`wrOI}ee=$xs<7tW5sJb|!!p*Sj%sME zpKwGOH97rY+jE)U{C6wiR$=7dmIgeL%6lU$VfAsM9z0&2U zspzQQAATrjyWrE{PkbO}U%{8de+%!2dxF!tosOLQqVMb@dEBWz&UL?1aH^khVuT98 zDSpDyb1jI-_UO>gDkv!#Ta>dBda{B#T~W?bD62z{jvy|{j%5*oiE6hhFSKQ$_*Mwx z9|E6no4hUdL?97kq8h4rLO|#&#JT(5nUA31=SljPl6A=hyt}U0#cH!_M%YjP3%bdo z5!B)*%=LsG&9zoMcg3qT{RY$ITEK)(vCE87M4b{$qo8ICUJUxqgxM)Vh!hHD@M7Qi zb7=`uSg+KU!605#uO>w%tUwANhpsdPd53^RKm>WcB~T!ia;9ME?^cRS5Tyn*?-e(* z_&GZIzG+#$_&sFvwZ@c(ZxvFcPZN_7a4tONaDp+J=b2cyqAsm_9-b+hoTkCf(OZ7; zj3~bVuo%qVTrv#zStMJ`PLyT17+(Q1L0Fd+!Os6TBrSJ2c+;hM+^Hcaa0!t5^ilg1 z480;#B5wVG+0&?Q%&S&TL6FjSE2Uoo=tEp-c=Tai`SySF?@G*7*0dfhPFkjkrJ`9PF+-nl`CiN5R~}@am}Js^^6mEv$G!5K@!yXL z`(VJ@^o|>E?pPPudqw}(%$de>qoz*z{#XB9Kj*u8-=TSpzpYvQd{f7f8{1P3woN?! zV%|hKyOb_x4^riVzNAsj)Q!kHJX_8xj>{Qgdi-Z179w%|`g}PX3hy4TiAJ}}f^CQv z7cYR1pmPn*YMeiHoe}(5=XCz;qyOIn>`@0CbH=ATp$z{!y%0h*ZZPC*7$#*+C zx8jO?7(9UQCO(}!{^^%XOLKBwE*Ure=|udyLN;^$Iw%%BtKd`0U3$L4P&?-1<6%o$hg>p!XgQnl{OxOVu8;eth*VC+BDJBX zMn5{LkKQ%*(!~qGys`1NZo)dpjn&&K@8%BrIO>I~0d*}ezGZvv#FayZ(Hjo^$JE;k za(doBw`FPPd&B-1KP9U(YbGZNWqtIYKNEXyALu3@2=8{Elv4