From 1f971c74906e6f502f397e6f07c6430ad8cf7701 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 18:20:34 +0100 Subject: [PATCH 1/9] Add a script to copy the node sass bindings on install --- package-lock.json | 65 +++++++++++++++++++++++++++++----------------- package.json | 2 ++ scripts/install.js | 18 +++++++++++++ 3 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 scripts/install.js diff --git a/package-lock.json b/package-lock.json index 39eb5eb9..c23bd39b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3323,6 +3323,28 @@ "sumchecker": "1.3.1" }, "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -4431,16 +4453,13 @@ } }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", "requires": { "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "jsonfile": "4.0.0", + "universalify": "0.1.2" } }, "fs-mkdirp-stream": { @@ -4811,9 +4830,9 @@ "dev": true, "optional": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" } }, "fs.realpath": { @@ -4916,8 +4935,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "ajv": "4.11.8", + "har-schema": "1.0.5" } }, "has-unicode": { @@ -4986,7 +5005,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-typedarray": { @@ -5091,7 +5110,7 @@ "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "dev": true, "requires": { - "mime-db": "~1.27.0" + "mime-db": "1.27.0" } }, "minimatch": { @@ -5100,7 +5119,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.7" } }, "minimist": { @@ -5219,8 +5238,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -7727,10 +7746,9 @@ "dev": true }, "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "4.1.11" } @@ -13367,8 +13385,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unset-value": { "version": "1.0.0", diff --git a/package.json b/package.json index bac0fca2..b1ce74c5 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "dependencies": { "csp-parse": "github:macropodhq/csp-parse", "deepmerge": "^2.1.1", + "fs-extra": "^7.0.0", "nedb": "^1.8.0", "node-sass": "^4.9.2" }, @@ -69,6 +70,7 @@ "webpack": "^3.12.0" }, "scripts": { + "install": "node scripts/install.js", "build": "npm run build --prefix client && npm run build --prefix core && npm run build --prefix csseditor && npm run build --prefix installer", "build_client": "npm run build --prefix client", "watch_client": "npm run watch --prefix client", diff --git a/scripts/install.js b/scripts/install.js new file mode 100644 index 00000000..e13bb7ad --- /dev/null +++ b/scripts/install.js @@ -0,0 +1,18 @@ +const process = require('process'); +const fs = require('fs-extra'); +const path = require('path'); + +// Copy the node-sass bindings to node_modules/node-sass/vendor +const node_sass_path = path.resolve(require.resolve('node-sass'), '..', '..'); +const prebuilt_node_sass_bindings_path = path.resolve(__dirname, '..', 'other', 'node_sass_bindings'); + +for (const node_sass_binding_name of fs.readdirSync(prebuilt_node_sass_bindings_path)) { + const binding_path = path.join(prebuilt_node_sass_bindings_path, node_sass_binding_name); + const installation_path = path.join(node_sass_path, 'vendor', node_sass_binding_name); + + if (fs.existsSync(installation_path)) continue; + + console.log('Copying node-sass binding from', binding_path, 'to', installation_path); + + fs.copySync(binding_path, installation_path); +} From 43ec860bfe9ef6f7683af298323bca7168e2e384 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 18:28:01 +0100 Subject: [PATCH 2/9] Add keytar and bindings --- other/keytar/keytar.node/README.md | 3 + other/keytar/keytar.node/index.js | 4 + .../keytar-4.2.1/darwin-x64-53.node | Bin 0 -> 39724 bytes .../keytar-4.2.1/linux-x64-53.node | Bin 0 -> 35520 bytes .../keytar-4.2.1/win32-ia32-53.node | Bin 0 -> 92160 bytes package-lock.json | 164 ++++++++++++++---- package.json | 1 + scripts/install.js | 23 +++ 8 files changed, 160 insertions(+), 35 deletions(-) create mode 100644 other/keytar/keytar.node/README.md create mode 100644 other/keytar/keytar.node/index.js create mode 100755 other/keytar/keytar.node/keytar-4.2.1/darwin-x64-53.node create mode 100755 other/keytar/keytar.node/keytar-4.2.1/linux-x64-53.node create mode 100644 other/keytar/keytar.node/keytar-4.2.1/win32-ia32-53.node diff --git a/other/keytar/keytar.node/README.md b/other/keytar/keytar.node/README.md new file mode 100644 index 00000000..d883f86c --- /dev/null +++ b/other/keytar/keytar.node/README.md @@ -0,0 +1,3 @@ +### node-keytar bindings + +Copy this directory to `node_modules/keytar/build/Release/keytar.node` to use. diff --git a/other/keytar/keytar.node/index.js b/other/keytar/keytar.node/index.js new file mode 100644 index 00000000..351a3b6d --- /dev/null +++ b/other/keytar/keytar.node/index.js @@ -0,0 +1,4 @@ +const keytar_version = require('keytar/package').version; + +// module.exports = require('./keytar-' + process.platform + '-' + process.versions.modules + '-' + process.arch + '.node'); +module.exports = require(`./keytar-${keytar_version}/${process.platform}-${process.arch}-${process.versions.modules}.node`); diff --git a/other/keytar/keytar.node/keytar-4.2.1/darwin-x64-53.node b/other/keytar/keytar.node/keytar-4.2.1/darwin-x64-53.node new file mode 100755 index 0000000000000000000000000000000000000000..7063683c1d34146221ec7c31ac2b757eed5710ce GIT binary patch literal 39724 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 literal 0 HcmV?d00001 diff --git a/other/keytar/keytar.node/keytar-4.2.1/win32-ia32-53.node b/other/keytar/keytar.node/keytar-4.2.1/win32-ia32-53.node new file mode 100644 index 0000000000000000000000000000000000000000..38adc225f0fb861e08a9eafcdf5792f46d2e480b GIT binary patch literal 92160 zcmeFae|(h1wLkuBvPl-$unQ)#Xp|_S#s)FELBS=MKsJd=U_;1;EhOMA(Cvzfun*8m zAn{2goAIgK7W?tutG9Bot+lqLEh<{83BhbY|?9FR-m}b3s%{>2iS7okPdH;7--hFT8x9`61zWalj|FSf5rF>uJckjzAnp2T^ z@BK@bPD)K3o@IcZ^wY=8fn67>qW{MJtk1g`?_+;9;Qd70HSb#7Gq>~^cg_2K@jl?a z3->Sn{k+#N@}2kIk9%O(`Km75zyDvSy!VOw1@ArLZm!br=fwNm?|$1)bw*q0aZA!H zQ?pVFOI!LEAZq-6J2g=S^hwL>gFh&OdsRxa!DhJslR?TA{Gzg7o0McL)hay>NiL!;T2_7=fWw+Z!_7$C5wp|p^_!x65>=Tw85+$CLFC=`X=P0m!hl;ps*Zogxp~^ zXEEz(+#MWMuBF$BM6&?~l{gw(f+K-?`Z_&(sAMsKq5Xs^3ooisc3F3trM-kp3=1ut zkcz97l`ICFQKem(w&Cx8Y~Z7i9G}f*7&38XxAVa92b+pOk}V|$uNh=Kpdr$ z!Rq0U_X{$B^N3j%p?I{n_U;ApyaV{1Ey}W(f+GUUz5Kn&f(&4CFciLrle1hVJNv;l z5JWj=UwI>Y_z64~)}JGRz4CJA=~r6E=j>Ek`jx(Mwv8X-BimW-;g9Kn!Vf=(6#5H4 zOfYQt*DgRv><5qI#Q@rX$FBtXulOi{7DRz=Mhg9fA0`+&PyzviIV%m4^vqIta!P^e+|m%lo{#Yjt^emsu$3S!yj0HnPJFZRGwvR z!R%vq?g|xUWmXUoaR&gYig*sT^=@2~QC`L026#eXR@THtH4B`3c`eoV zm+CgY7D|d}x8M)!KgJ)j4*s9ZADL00n~B```)~2bTQ`3#fBfM5Ab*hN>g8MX0tSDS z`~EKeVDEqpG6-3(;19fI>rA20NCQ(iz#u;&22t-?&gTP@zf6Sk6G+gO+#AbHLIWbLV7*pV(y4R>WNnKGI%vW9`*UQj1q6 zFiCrn#0KOi71F0lF%JZ@GD!fQjm-l=%&CXioFz(2DGdseex5*rG0rkP{NH+o_;W;s z`2uB^BPIX^|4tM9`~NJ8p3l{p zXZ`>r~QIk_izNrhd(z^`x z+syYdH0;_6KX0U}PG35}wo$qvaw|L#xO_wzQi`(jNakWp6@1;8x*aliv0m|DtA-Is z$Xva-CO|LJg>laf`Uf7FCrSKcx_p4kkm(5eg`=V}rjd0G(a4&ge1d3t#JRiSm~C^b zny1p@GO-8BZkaKf(r6gzqsalelIh`hoe`r6V^}B?HPu6g6X_G-sozRXS`Ne}@bh1PgRL^g%$4G!tkH z0su>65-WAEf{b!%W){evM~L7)#UOu{#2eEEaWgzBBk9H~Y08`jbqZqZdf=EbNDKQ= zv9;z_jQ(Ta6m+0DQcJg>R|W^)EPe2;LJl$0-B%9q-=)hET*P>bu4KPtzM}ybo$qMA z!F)&f>GR!YJpB{qyI=Ht-Fzn&hx2H{dy#5}WNn~(1^Y=8Zm!e8G>H7eX0*RO*L7Mx zrDtQ0K7y}1e);UP-^|(9+qIzed?MS~%Eu+{RLupgo#uRFDKNWVX&Ik$Qfcp32Cx)( z429T9kC!)JF9;eItwo{~-bmHaUw9*dra$&*9j?0KUhG)K%YH@dR{biyeRsoL2c~)Vxp3DP#fEXTEX&vpEmXl z0WMA(+mA_H@aUe|v1vhXZ+$oQc~qn|WYysAdhL!RhT9WCufAn}XG76D`UGlc7zZA<%;zB$zeP^&$bVHJAa6tSgK8Sv)E24m=0F zybCY7&PR)0!#sk1SP1g2u-j(h2?KL^Y^0DKM`(uYvL=#dsKqoxbd9z>i%?Wv$s#Tz z<#264A{groOeaQ52Whc2RIh}EX&0@;{T-OlLQ{04@}dPGa8Q8dlQ9BjiDXQhV3cyU zH$;;()J;D=L?Ij?2)Q~0B939wfMg_-hF&)NqO!EI1ACzqI||YiRp_08HsrB40E6sc zSR-b${oV>K7s<1cxCDumS)ZTT<}9N1Oj7xx^FVM=_FbZ~9YJQ2e`4mcKw_>4HwXeE zUBaX2I6Ptq1f?jzg8kq_&@VTVDP98-bopsI zy~s)?m;FYtA*p0J({c4R=m^0k3t)OoPzBuUo9Q4e9##x?2lXq zb5?3Oe?|YsIwA?q-KyIZ8tJJj=jAh~gjKH#_3G8}TFmK#IwtI2m27#I!^>ol#m)*f z+lvJ$wijCRX|4}mmH!92T`nwgnI3hvT}z)vYzv(yGD>^E23zMmyo1c>(+t+3r7xt< zUOQf`>`p+t1JHKYpA+D&u0LnMBh|?|1fC_5s;wL`Hy$2ouXaypIi%SOL_@NnGVp)~gJ&b2eliJ!GG^+=dkS<)`W!I9ni|Yn2ub8`nIPFK zLnJDu0b;3um4T|K5DLIuJj2ATk0R0K%C2c`Q4jT#rO4rQf6a$MWc8T$JU<`a)P6c@`=Qm@yI@d@LSWt%bV&DA?1= zZdKM>5;qKIx3JY_rM)1MO!v>w3^KiggUI_a!i!#Br*ljwk)N-rE&N+}$3*yd84vnV z0Mq9aR|_U#lZ$l1rh$@|VvNR+HN`Nb6n)Jk`m7Gtt%C(2G63*WdJ2FmqD!2(S^456 z&c6W1zN?~)OiQRs`&&Eg@4OCdG1KfnfIAo|3ys0;8Qj<-x>mKzuFtVc0ZeF`i;F<9 z1$6P^0v3<*_pCwwE+zinL8L80v4EK!H|@GICb z#^2B*qRco8)f0bv3}&1rsf8xgZIALJyheh9iui5t4++p;&yjfs#KA=zu;%r${rp$&iw?{Pr;rWRqt02*|9l!UVB=)e{_*n6~mPGDD8L6kW{ z>+Kc%%r%6gwcYHZC2q|E-%g8Ek9DoK!M1S^=+5590=NDGC9F>Q1KlE5vx8#gd+?K- zovw~(szo&q$3l1pErct-bS1nmO^^dir0=Qz@ycI1L+;p0_;>m@#<3Fql(5SHc9mFb z^O^7~)2dY&-xJ8Q|jFPGK8qq`=M=9YwtTFI?DNYv;ut3dH^JofLIBJwaR-j09fEg zc=>Nfi|o#`5UH6_{m1&%`j3tDA5q3a5n*lo+f$=d8ypf!clO{+gh&w40HBfvvv@$7 zi*`t(s2y3<4j@PK5zx7O&>AFUeX`WG9gP#M7ZgBmX40FM?x2!K8;=F|R`8qjCa^yG zR8bYskS%L48vu{3;=57dCEz2KY(FN2EL1|1l?Xp*2bz*v9-FN8lvkl!Gk7+lVygH< z0AsUbZ8`{x3d1^e+O{4Lme~#$W2J2d3Rsn95SH-Diop$sjuWMoUD<6)_rgK?%mW3M z2zMncz2H3d3CJ;#onZ$n$t}H{Uyaoq^(eWef2Tk5Kf{8E9$O2pVMn9d@T|dZyTryx zE;V#rFU)NiRA}r%qtT0v8G4q~c+A%DB2o#5y_LMGThsVT)Dy^KJ?OkVit73hCQVj? z7G{yH4q!3>SHjvn6DA~zM93xMov;>Vz@R?GgDeHap<22f#HfIG`*wi>{Cx6K-Nz?< zc(ZtznuHtc0$8rn2oZ_^IKge)@vG7rRVN5hm|3)}Fz#Mwe0 zkoa38kw1s9H~w>6h-;PZI8R7M1%)7yeJ|HbfdlN!+;VmhJ(0&Z1F>jNWLv~D_kb^e zYytH|EI=UbYkGoaU0{8$z=V3@Qub@qYz>d1HK018I`rTG#Q%!m08)d10|f`r^c?Rd zy<9C$FbI%=w!S`+a%Qy&`lj*k08tOD0k>l@283gl@vp=6*Qf!wwhBm=cnVVmOQID3 zP0%NedB{UKm-_rtJ&XSpu^d7Myy@Y8NE*a}Jd<%aT-?J>)L*FAk3of5mOPUvGBMVt z@22YQS?JehLK^Rb$uZQgey@?h% zXaG9O$>}28)Qv5+MzZb46Wy_c*xMj`5LB5h&{?aKeID-tG!I5@hgme)A04dozJ^7{ z03@1yr+_qs>{P+0R>E^_oAcOI*mrCXhrv*gAr5AK90M?et<5F=`597`wGMckp1>1{ zL-C&mS!~QALWc6jPvvwJ%R{G$ReTc|vWu9nk{=ZnVJe}Lm6$+=mW5!w%F9I>;X2dhVdX4{}kL4xA?zAimpc?bj)u@P!Eu&XbRAnWuP%=R*4F(IP=8CY)uaLfDUG+ zi@NclsRK~(DCS$|aNXDxWAZ+j9I4a!>6?bIw%~H5+ae~Ab8L=_yMF-;|ass(lsb%s4$pnomU9W<0rclpeisAn&5*hbB8Pyw3OW@Lv8^zQ|_ zOQ^shDJAAy;(XA8d@|#7_voSCPslZTs`ayRiKprZDl03KYz@B$6Xv|3-e(ed;GMAd zcI}`~lyy&Q*SN$z?4Y64n%V0Sq0zo>oAJ78Eol9~3?(`(pR%t`Qg&+*i=lsBH^kfX zi9R`Els4Rf>eTt;m5(|@Gh=%09%CXs3O)B2NS&dkt#19$oOp;IOT-YWGLvk-)pg3& zunrVZXHQgTPPC0H0%ZzL5J}X6+;G7T@pMP7&7N!z3>&3c?D$(_fna?;X?g;;Q>*m@D<5*O8!@NE8@}@vHQ)g&x2_c z-wN?D^#p_xf)hSRaKf$V=2%q1pch)FR7^AXipbVeYB2>UuW_+c) z)t44$i3ON%(7#G;ntf#=yB8gu#&)tf_MBFBrR(ULn^p7JPzkmZ(5OvdDc%Y-&r<2- zRTwp5-E*~6Q;t<~FA4DQqUr^{wu;Jj(h}KzFi~0sPldRq9Df?j5jXkZ5rj2kfGTU@ z-h|8TJnKM37Us9JHEFD!RoStY<7>vN=5OkV3YS*9d#K1Gri9cYk=KsKt1HGUA9sd|V?4g;o;>rp=n5Isf zlo%E(O~RvcrH{F)yu2Jk2Kf2wgznFld5b=FR{RzFB9={I@rz}G!3x;58X%u z>Y>S{626eWOGcEVCrIp0(z* zVO-lDIu2@8s`r?bH*Kyi(7p?_4+|zgw>ssI29t+f+%|)&Wna$ZqXm9~$$vz&Uprp; zYiFn=#^k5ax#%0#2PW6R(RMiS2)WRGX%#EoY!b-%{Y;Po8YIyIxQ@GVkcle=6Mv$* z1rtwZpOjbf0|KHYG+nn}f$UZMR)9cpz4YK0{@SM?Q#Dj0a{GB*1rLgRZ8 z{uk(*0f|42qCUhAq&Qo;UPm$hW2}Cg+#mhk)KvXfWof^pn!nA2Z$jg-Fyrc zhTZ+N(BMT#Km>f_cj)E!P^DlooGt~g_VOb-zQN0|ZxkUuVCY+*fZBnBc34aD__4#Q zrGU@Ids}n$Up4t7ej|!wN>1Sq;9+mT>fb@l{}>wI7Ruh(vVj6K=9X@yH~xRnh9>uk z!Ime;v-ljK&&|}tbttAx5EO~x3XdlUNxku3UKVsYe_D2De? zIbaycVrAXTRIcUvAGrhjZp9v8s_=PKjhVcSE#=O$z|5d9Yv=1xltzV8YcjSFtgNxjmvn1G36QD z#2Bpa&H_e(F?{Xg2+M8>CIu3FZ(hH3{&x{LnmUiJ=^naXHH)s3OX-?lgzK_L(pQLE z>Jo9gszBV5rit5xDdKiR9&S%On&iigxuvZO#ofGhG486{vUNGVHy#J>;iPB47$(HM zZK01_m*6d&G#^*OJDjvoe5KLpH=Y9K`S-L);kxB`r@^JaGa;%%vy%Go-r6a#R5L^u zz56{N7XJW*B==EQd6tl1#(eSlIg-o^iSNE-zF30vu!+8k4ia*cKZ_!MUT6r-r(h}) zVJG@Wnpgd2!2Cj@DzT4g%F;6u(v+orWYc;D-N4*^PWKsjgS7M=c)f`pw(Ae7yBnFd ziA+6eS-;cW?R57$Td4thL%mh6&HlLH53hn(G}r#1xpANT4gNz^&N^KC<&>A^;A3PY zQirFGDv_ktPWyL^K=74+EySLd-h$fN#54a0RzF|cjyj~b?P#Ja z{~LiWH7gc#sMO41&(Yr!@J6H&lVj<$#17kwg=uQJBk=$plJDusPCVs0930Eatgbt) zD~Gcgmc$uWSI0`LvNPLtSpLM>QiB%ljGW`&gy4WUO}x3KZOImr@!nTAqh{tYN6fAR zK}bHfr^oi&k;v0?b4yLzHWOSRpF{kBcT@Nr$ghZle}H!n|MT@gAISuZAB9G{&D4h3 zU_XF1wD>S-wDB^u5EFyQ@kcCgX_DYGkr??Dnfdcb;(2(*3tGojQIG5pLv%DoCo4m+ zI7W34V@Rt^)8q_IcJRxtB^inRs?|DPR{!H@0^bj_j<1aueS?s-HH^WX@M%INzOFv7 zh#349Nls}``Yj5Wcpbp2N#4K@f;1q;Hz2UC)$zHH@Btld{-+7OMfz*7_~w?#UBX(c%4e#S z&T+31_JK@aPKVN=9qMomhA)A{`99meT~ZN2`HkcEox69Y)t4M;?_VCKMa)i z1}y&EnW*e8j93!>JIb)7ciB|X3Gs{7Tc+VwPX-=4olGLndWj~9WmB8L2zGfoxa%eQ zmecCN{yxZJnt6lQDQmN&b=MezbekzMj=8&;H{g5TvuzAWOTNL{~8pc`wdnQ&PRmbv2Z0u1^P`F zqZN>&xzLaSGl`X1-n>4L$S(lnusLfl>QsfKBQH({AV8dl8XrL`LTVFTA8VlNlXY}` zejQ!^xE9xCk39CYxT%ke+mk_YYg{32KV2?vzw+bu#G{Q*;KtnMP~&DisPym@9>Stt zlC7+uKi~;9ZW3RgAxwS<6DUdmnXvmAIQ9#|?&nDN3Awjx>AN5c;7XdW^&V5*&ydb5 zAYE|`eLT>nPcTq}A){!90V`P>j>#4@8iQE!(P0&B%7pDi#t7-eF|QNSarVc2`%NC+{fJg1~UjXzGul+DtD@lmGvxvaKxW)5fB0T<)^4~ zl?gkj4RBIbIFHR7c9k9c9~jPyVVa|Xyj&Mr~J;{kua3m6O zOF?3yB#&bGuK*`yzbPah5Q(cN)SgLUZs60u?&d(seCO^<>eZ`c)t$XrpzBmA+(o z(iS3{(qYjHVo*w3DdlWiW^lC9k*Oz>j1bAr7QtB{5N58aN%JuTNtm~7X+fu(iTIbP#5qfz=jRARgKb#FcZI zwujz=#H>G8hiX?{W_x)8VT9%M50KjR5xN{nL{8JHVW*!4&sl30wXv|X{TF0bl}8R1 z=tO&rypm1%1xohP5(=x0C+WFef2Kiad-<;kt5R9A(q&dxn?ot;1~ZZpSB-)tair2^ zQCC}Fp|z`GTI?!}q7+?T7a&Q;FQ z`=MpF+idSxm)SOq!&@i4?W8v{Q{Mk3y>`><{h8{9+}an_)z+@xpc;Ie-KVbZQ}3Y1 zuZIl;<6zTU9Bg`x!L~%a1h`*a-T!ysY#sua-s0fWYYeU#_RDpbownT%irLlGXxRo( z%pT#kmp{0ax*vQQb(vXRG9RjQr`}P)%bJs$QtnXNO-k6LC&{0(gMvqX4Q6TWN;v&f z<-oHL*OAVs*Cc3P{zb5>90{;vi*+jtNpPP$KO(iBH1vIAbdRlXFLQ_dXG_RUB zQk`ZKwU+DbXK>_Z^pSyS8ao0+a`rSAYfUBE>^aIOCi%1|ay5#ugFqGEmCww|-^^c} z{%Jo@w)=o97B+4xj7)Mptwf;y3P}ZO6r%iAzl`F3SpVxzB^k>czOMUvb*DAqD^DAlrs2 zWZSR^**1I!**4sdY#Y`f+lCD*>bnSLZ)+XKyu1m`UpZd+EK~U#O2n!$04ZIWy{(;; z@7>;3EJL(lI!FTovE)z+#-W}lN3dhbru@yMe1?N9n()CSpERfvNrXIM?MkN&b3x-r zs2HsA!G_jPQi99Wr?c=b3I0wdZl`hPr9oMP;kY3M|K<>bRv`&(LHe=+T<-JWvU)Kt z>sR2zcaVnm;j#v4XrKB*9iXbO(e+MwD{xzcuKgsb@vY!B>VF_ny0oF{Y7FYkJLSJX zE(UX1D>xx&W0!}cT`?g=p!z4Q44=%51=TMtqb{g%<&;6@297 zpjVF%VtcH1E9}<&=_FEE?Dd^2+SY8FIBU`4@FLZM>4I8@yis_lo$Vm+H;38sYIXQYCEGtuf!lY3zL(Bw`n{Q$He zU2#Ahp>8?Xuc(<2L;I}|?|lOx&}?(!ey4Q`e+p4Ptk}Y4Tg5w^D_ts*;!ErC#odUD zsm3u|?QTtCGcD>WyRM0QJwOJdTMEfNP$Bpxpo^sm{|P24GGp$tvInha3m_yLU!Yv> z6U+^5ovWDgXZ9=FfUThw>8z|zElE(#B`l*}HP>U2hnX6kG{|Z*l`rS3d$FnZ{2X8|-svCRW=EMF?~}0tLm~xZBo%6Aq>C zwwUlo^85$ygDkovwLQY{9H)&ui_r=fOIu6@QGSOE%WU_xEVHd>krMaYMx`iWyYknb zoc%h8^|PWwT_50^AZAE7(Hy&>B$F<=bSa<<38Iq4bXlQ`ps2Wo2||-!kHmDPRnud2 zk_^s(Y$oXq4`VnJau;cse<@bUC|~bjQICz^VZr zM4ATE&=ro#xt{WJ|F*@kHHLs9j@hy-2~7Y#Bq4Lze6bDQIhL)kDgy&S7hvQm=Ldpj z*QwQ$)V$T|!r$B3h)}6jdC)A$d;KQ#DTXqi3Ql+l&*J4SyhOGwd6e{BG8NL22uPTF z3(d5w5;0&wC+f4XQj4>LFXALy{SIw~Ra=2$V$%3@5Cp@%TI4}9LJ2#Fl5I?@g!>OR zNCB7vdMxaE?STyK0f+WLHcv5%k;}qcRl#7DaUOHNPxe5l)n2UnqGWs2?x%q=zp7nOKkb;-kee`5a+mI2*Lp59lzw{B>*^ z^MMvhJ^|3=L}yDItiR%jAZ;?GVW-EH1n8(wxu6BdG#-_0(9pSp^eA$}RBnx8BJIF^ewENU2` z48ZTC;8UcQWjvXNgQENrWVeW8w}9Vp;N@8vR*OtjuJl#OlLIOK=a8#{mx8K#gRVi^ zDR831T!zlcr5NvzcfkS(o0^G(ik+Fi3flSa6HoQaooMMH%@m3MqMwIsY z-zF06r3*b_Zd!zD;E&ox9Y$_FETK2S8?7A%=hswg6M8^7QIb=kPP)(&xOoC{p&TOb zh4pa+N_s`f2sU{4qZlBFl6_RDhc5IKNZ=767>1P0h?P7OSJDc_!f&PvJ;B_hdq+e` z>tMC-!!N8IrfU1*3TIL|2VLkXVAgd4qp3tiR(IW!7nGezh1mCAfPg^xtYB)P23+TTmDrWMeYj|(s_Og# zRTa8;{Qv=zJ3*+ZMgW3=;VUT&)W3U~;ngAeO73yt4Y+uMxLM3yrTv&7rhh0V2-wiG z=Q2;$Tuw1cP=PL)A81U$cvk5N4EPVC7Q>)sOm?*S!@OiG%F<+)O_Lo>b6W5=c>E`7 z!DJVX*;su8ra5N)J?*)nd2ZeBG0~0DC%U5FTlgGN8V^hH5P6a2HN)g)%yiBcNOh{C z{(EM^0sT>KWpk}l%PsIm(;V4`xu&B054n&Ik&%PX0A(dR)l75f9&2T}XTGo6M+a4C z2SCODwfA5#+4;Zro|nJM-ZL-o57~P}u`G27N^hbIjt8>iq#yeu_=iD4Ho^aC_8#dT z;A+Rkfq&WfHx2({xc;xbhm1h~Ywyu{*H}|A?H{rCMCUHLWByXQ%@qiqvMMcBXlc-V zDrv4Qv$K2q`3=~j;jPjREUIDeRwJ#FMG)c$VJ|1W1PxOv=Od5<@_aW1_gMTMav@r1 z+kjB;R~gobdz7{IM0sib+O*81AB_!;#=|xAFbogZ;z7QXm1e-CF_V>>p;nC}2jpCB zg@aE=9fn6J@(pLp6t|TY@Mp1Tz_<$Bo>I{Liq3Q3K)d z(<;TXhSodq2xdcH*XPdH(P9dQstOJx#eyT0+!yeujh$dNT4$sp=F+cw2y@}6prrHg zwCfo#F@_qCBB$C&A49?g7i#RJXZ1K;A3I9dC*P*)^9Shq$Gy11bJ!CmfN{ZN67*YZIk zdbtdf9`xPGY}-PR7usnKJnp(~tm|n|-_mJK32PHH^Id7qH*5Gb13I!s-9sqioJ^HK z(FP+PGL$}O?5}e8*rmPB77zXL@1b1)1I)ZwcF`YSrYGqyq>}6njM37cgE|Jxk^)Is zt9k>bSH~c5#S6XmQ&0_S3akm@f^TZ{rc%&%nWeqNDuKs_GZSqBC^SbdSMs;r3zwrj zdW++3_|{9zTQbDm5-Gw7+fd-tDmaMds%u~bm=zk%N=rSVk^Ef{$E)4S6KJEmjkNH3 z52#f0OoE)MbR>kt8!E&3%8O_j9HaK~ub?(jf)-0S=84t-QOc6rT}0<4ARL1_u!g^L zMDIYvo~@wK8GzEMEImPXuI~dIAC0vr?a4JanW{XrZ!iLi!x0UO8()KhZA?Caf*~rX z)2X^^<4Ala?kJDr2gnobW0oxlVQ)#Sa%!+WPnE4#9_u|c{wUT&$*_k4)e&^Sm*9!Y zKIqpat_$)BpuMQZ`Q`$iX&|n{j$<{l*G9$&H}yz_&FcV;z{x$FeATj5J|P;vh+2Q_ za2)%VgI16xXbwyn{d_ajSznB|caYt5s@oDoKwfnlt>HM?vnX8TlGb_oMg(>e{cR01 z!Dl$^X%9TmRq8{VPz2F1Be4XYIyE>F1FMIOk^1z9;SzCJSg-q4-XH~ z!(Di2pobatQ-5dxL(GH#wmm@y_B`(LwaAFtq{vu2pgJjH$3r7Mq~M_$587&M1rK0t zCVKaXFH~cR*tG}DXzpN_A;8K=T8Q=TKwCHTVHt}?{15h%iqM<(wVi) z$}>@gF)wh~4tL;cbUylyl( zkAk9#b^2l*hK(>w4I-nfBY2tfTt!6%+jD6DU<3S*Ll#7a(_x<@ z{7>VVHvk)-ff-Al>X1kIPeA7R-^PU>hA8&={N0qmDdBaIfDT8-)b=F8&;*x5yJX^f zSCUjjh>#W2+M9Ux zsctJdD9FE1HlUKDp<8upfrOB|XFm81K@Su#qPjW$A=daoTJr-GY#fmOG&u@+Dr(_R zf&0JF0?!8SnL< zK?abe+5YBRW2k1uT(CWf|v8{P*4Jw*MxF;HbNFzdsiRY zSH(RUh-9Xa=~wFj$Vm!VdKxg>GVy-QIFs|}>h2*)UpEDc7;A@r3Gw3af|Vl_F;sh| zysFB>$+bW(o--N(*vCRyBdbv+rco=OM)g`3g{DMqroKjezX$SAH9w3Wl#zS*T9m}Z z3LNFjkzTqr6E$KpR`1poBjuoa)1I14$Uok#DfdKDM9joO)Z( z0_#fQ)F}w+35QY%0tvPEL+Jzqzkx#I1TegOBt6lN7~NbVCKBdO1KH>hNlTS79wEy1 zFe#nnlR~pCp()q`5OP~@-VM)J-Slha)P~*Lu0=dqG2SDSwM2>zCUB6EjL%<31NRy9Y2x#=^tZuv>n9T4vBZZJ7Kk6i;a{(WHoJHVv7&>5}e=Yfd(D zAh7r};;b8^t5bl=HRHfA%g7?gwrb*7XW+19Np}3%K`oiEj!tf@Hj;lpAK^xBg zt($tSY-T4TBaq~Lt6{fovs*jJBO^*twYfcIVF{3Ikxw=!13On;ttQD9RDIL5VZj@q zACE__M6}NKYO;rylewANRUFqaEwQ+34U{1roCI)Px8N1Hg3drUQMm@h1g5d+k7!*F zw$^T6NfGI{LMS7*^Q~SP!f(~5w%?T5TR%=TL)_#N;% zK$D^nU7hi(yZRy9l>8=AmV#u8$3BrYIQWSV1HQt{o22a5B3WMkO%M?ckj1-o>t>X2 zYFnuwMp_T-)IOX6OgGxU79IM!mD%|g>upYnIHu(XO*7cO_=A*+69x6;6Y3080Q*IL z2@DNRy%!=sGMDX-cXHR=o=+#fx%+~*Qp0K~w{H2*MTk4tG!+=2g}}2AV*WqS}lADP4nIgyXn$QLcMBg5y|n z6&r{^_2`4{0Utd}AUwiz6tq<+vbr*5@sTFfD@RC~A~opk zH-$Kh(=3_fN+ME|_k}d+sG0*=N1rwspKA0^{<|Nfvx1PwA4H0O9lbt6ugmeOO(sbE zX7NZR`E_{o`P#ZJK*Pp7e1PWRlhEf#@zkgD0SeU=x+kV{Vga!oAUdbhga?(=d{m#+ zp%sdWeH79Sy%UFs4ibU2Vp^-hL6%dXU|GPrU7rE~POuj9`5`Y($NX>{!&Zyau;5=f zwC~V<(%fE09^sI91rKB_-V>6~KqIT|!NlK&`4Ispu7Q<)X2bM<+W7{2mt}oy53BAw z^agvwp!FdH2}bLoN+kSe!TFTPUe@PqgT7GKcc=qCe7N^rWoP6OE;q&41-FX8z8(fe zuN%9T%Faaol}xs&Uj7BiYJoY#qVuh&qvg;ZR>qx&5dR>B?BeP%>o-dc1>Wh)wa6QB z^On*L>pi0RX>Kpm^jW?~pXEvF_jveXjQAlU0P{l<=oiUm$*y9HJWkL!io&2*Hk1s# zEmUj~;o;$=?dbExP@Uk45-JgY4*ieVTA>m>MZAD7_@8eFKj1E)dWGY|c{a}V;pLCv zXd{pSXKZ=-!fP>Ia+XEcAbiP~lgI;w;p9eOkiiG#{xnP|Xdd^X7q^-8*1%gg1<{B6 zx0p4w$it0Ey=Bv3M6hXgFqLX#RWyY)n@?}Mt`gauNGq}wjhi^ z?;PQb4#8Xml zRBo|Kix(3Tgbz)E!mP$H()d1rSf%3U~gY=QWbtfq?;Kr@8mQ`1W7a;V*a))h%cf@oHDLC>D$E_2-kZr_=pv?fG8w!N5OdvRD!D@XzppS=i7H-Xe+u`IgSbk7NBr-Xea|c-*!aE#)8K zP1%(-*rcQ{o6~4x1vPeX+Ur5Hb)wL;*M}G~WQny`$cy!}q+qtTdKP~dV~Q2e^0~yM z7EH^hc`cZ#ti@gvs7j~CgJpzmW>yWxJW{?*DOmJ*kdLBPuJL;K7Klu-)Vz%341M7z zkmTk6fgYjxgqCz9yb#k8E$8s?02QOd>rxcBI#xv1i;p;+j{gi_P~E-$C7=U*`R@{4 z`mpZO?y88PaVLLkSg< z!d8T;Z9MaRSe)(^sCcP?K(rMG7SX;G=qx~Vbqvuj@CAr2jUt*yhzdn|5Ycy#$ICAl zh)%;yE$FjL6dXi!J7qEu_3{pI2N3-bm=L08VU?g0_VNfbreQG4@5wb!#w&vok)aqr6_}> zdiZISP*N#@v?yJSmq7`0SzjlmBY0hb(l>GCNwx4(rEk<41ZT~!Zd2=v05veu=jyn! zWjub2%>t2ce*F>TH`EHR*s_iFLwU%;e~!#Ptmr7-E0hb7&z}I#0;%L3^HFb`(vsH3 zL(!ypdXi!7z(_(Atub=O0N|FMWr!>i#%*lhOT!tbnOO;=ci) z*lh6{!D_<>GqUOzY&3|9J$u-sN>Zatiy6i=Auq*($51k>UZX1GqORtnf580?Ey;pb z=^RIFbkooH3mkc+@3`$fDxlaw8(^DSQWq>k(N3 za(qPAC2&p{aL6RD8|dI5!7&D`z&>?_Wu1-eJ^TU`6Q#D_gthtEVhpC3ID~L>xh*(M zsza-8yRxPCsKF&j$KjP;a6%dv%Q~Ul-49=1*RyCKv}3Y>haBtzdm~hPG*osxRNXoC z>fjtyw+tQd&D%ZNElt$}eC!R>Gk`N%bszOqR6u`z5CEWYM{H`@(Q;(tS78l=fsP(P zz76QZsaMM{vf87p>^RnX)qOc(Si9H(_!e5vC(M9z!L>hBdFINqy@$v51an!K9by)- zp6@YER>lfFr>v(S5er4ExbUk~<{5DPVTbDxR(XcZWPNk_87R19BqROma%GVQ&2finJC(f_Q^nqp)gE%)&yXdSk?o$gr57j{2Wa-2yxG4rz`k} z_>nryKF6u~oEi_WO6~D0clRC~-w`T15xkPg9KSMl3x5e2XClns=Xzi6(ebb1Pg7}F z+V#$cF}tFIABV?NH$jwR2o73A5W{EB*~7wxy$3>N{WwlHDPWx+S%bX*i%f~{1WXnD zTXdEwb8YU9Bdw5<>v`G~(I_A8unx{jJsPOPBV;^o~)%3dye?*5nF|_(IT5tfy zaA3ydejm0CAWA5g^(r&X_yOkAIO>{?_*k%rxYMas(I3A)hH`y34XrpcK$#V0L!1R! zYY9EM12QTyw%Ii8#^9J~3xk(UyDezLAw2X`ZjkM?3HzhwQFZ5UlgFqfCM@vnVBd<0 zD*iW=BVPQT^H|;a8-v!m^9zG1&25x3VVeoZS>)_5>^8r^8KfRB3xR3X=E zsX52edM+WPZbON>KXP0r$zz&T+Pr~q{Or1OlVr=3CqKb!@Jf&Nyp9lMgB^GrZfFnq z?8iD%^sC`bsHw3GR*9+{2Rt8#`GEuoBYk1W001{S>iyAve}I zfqXJZjt>?#qZDTy>vdt-WHboq-|#dPy$h$C z?KyEXmKHFF^ngxz_(1?=f&<9Wasr!MrsQ;`uOC4m z?lXf0Sb?RkwqL>`AKOE>&>H27*qlK=4jigalyhn-_7HnH{PtStL0}wukaoI+{y@iO z2->O-T7UV=UkdX{&V^?4txd_rWD59PWkk=HiN4L|sZFLr+9UTl6g6W4s_)K34-AfW z;a^r8IV?j}9&I&_=U)fZoyT4y2(r&tfuRPP-_!)AmDqY(fDLFGT z&h|n%4eLm%E4(VTUC*6a;M%$RZ&>{{n;^sAtpIqnu^**8Rk))ZelMtkCxfYsPf(<* zV&AH?7pS!ryceDvWmf@;kSYiugL(Y4UpJa>zsQ%x-mtycP)5}}gC8oan>BK*y}2Q^ zAFw0#XA*+xl#)p)fY#J7lE@WFX?j9D6uS1WY>oH=KT&^7>Fka9IXe*!0$7O$6Y+Ec zPfAOs(l>U^Z~<8@%#2*7{E^bft{Dk~eqHI3bOjSdbyx)YWfDrlEgyQ( zkV<5sz|Yki;m;OSN^8dN(bB5SPF?Ok!|o`>E&=h|Llscc{h4SpucB$TPk93d3oSSa zCZm^{sH0YwV!Kx#W|A|?bvQ$T+JM;wKRJ07e*{xaSc0nwzcyOM-$nGVkB&YRwsdg_ zKoY+V+n8X{AnSvz)p3`cj+gqiV)YE)-ilKGb1D^10azThhmV+jN=tD+TSu&%ApiVq z5-F=D`9BTcXqgsBQr&5ow4n&nkqY{1nO4nMLH+;|hpM(U+(XjPjb9<%N`W9<3-Jn- zbsLEytp$?jZ|51)YLVzf>ySs6pBU-zaN{*0!jQ+G}1>}+L}@-QEhcO zgV#X^G)y4LFo6u{CJ-dCO83W0lu78e@CGQ!a*pH#DR@?_rVcLN1h@m1RVhl>crH?r+gbb#T(87 z`$DB97fJavc2|B}e}N-3!q)IM-s&$n^@A_+Qn*UxZ|L-0R#3k2_RpU8#BK;2Xd($w81 zu|2_?n+qX~f;qMq#*(-iQ-6U3-Kxu)H|8RbrN}vUrtO77lk4c}zd&%+O_k(*CCW~V zqM28|iW34V&}IWS{$sHwH4ug)LY-|5B&(aI0nVajEJ2-{uqYc5M`n3X$LzS8;D)Ji)7av+VsE#?*D-S$WV+X=-p5pG(V(rSjx zX***rgEB)R4KwLxa5^*}#6hI51z&9?M?8M>fF5)47+Z^1TENxI;QYSE%l4=bBrIbl zbj31PSpGa`-@$Wg+MTee;=BAojXEO%`(nk|p)E7`=>|Y!Jx&cn9+7P1K=DD_Wk;)W z-aB{!IgrJHEV|B|=i&A)P_~a`Xa+^ZLE)~d@Zv6Vp>@gZeWymp`Bw2?Vk4RljeZ}n zNzYskI5B6WK%u$|T&PEJ(IOuCu8bL-?W=5jI1J}e19D^rP4`uB`Hz6BGZX5xe!L(o z({`M}Scw$F(VFfWST!oAS2ep}Z};$)cG1DKB?@*0e^ZLd?ysW@Jq6PE$3Ov8Zu37y ziI3BTp5UX{YkY~3Yse0xDd>W)*kRNIwdn8NVe~Pm1dash26q^}6-)c4?l2PVz+kDU zQZpKx2>nE3o6!EaJw`{wpei@^8QlRU7aNUwA(LtS9K4Ex)Z*h>yu1eD&9^ZTBkrQT zMf;uk66_=!U2rulifUAG@p@kW4x;yVy3kV~gI9qCqdSd8kwD*vpTg4}%!eaMJ0>6! zOgJ5D`0C#Xc@Xt34*|QFAkL?Y*ua!1_DMy->KmA1K(Qf+wl5h_GrtC^p8yKbVsn$3 zKdVnv(alZRmL3n4b~hPN_x$>+aa}=B1!%GHDT&YfTBx-1$$%RC8mMatssJrEMJ4kA zs7T;*!qwOmbrHIKgMhCz09%X@%fU(3tB)N4U2K>d&3{U|m$6|gJ#NEPj1)t5Oc|)Z z^edep2%ZzMH*q!a`A{^4o%cFT&IU>4EKSbT&(eyI?2W;{_?wWQ!juR;^$)hnZPc0d zC3Oyv&Va~DazPMXD56Y6H5`tJV7Ae)py|QMHT(;RNr-D~SQS{mOn$=nyBIVpb@b>0;|gtp&f8nhCEs%( z7ljhjR0mK);J^$=bI~|+(~NASmgoU2t^xVkSnw6*8K`B0#d~rS^F&!?y#w9>TnBLO z*6i%M$oE*dy*RsG!Rer4ZJL4wYT!&HIq-QTA#ip++P#?i`zY3_2O%hZ(5_ zvMU2BOsK}8^d-myuOM>0(w8V_;n5Pgni9gr4h%kR3;D*8e>gMmz_I+4RDyFKZH*+I z$cRsFaMHDZ^gMKg6#ny1AOM|onkRyMDtOD4U>2w(Htt7JekBTtvqhr{GmOkqGfdnl zOeb~%z^@4aSpsk<^ut6oRE`a|GXO~W8NI{wOgjN-`L^=i82iM@JTgCFW2tP$K3i;W z>#bl{qx~ZXBSxUaS(J8*h*YKvWt@lug7KC|E~Txb&S z-rTZ)Ohiru=YR1F!T*LD5jS!%hfkF)!K-1Rp`$SfR4h=MK)Ga#e1i13Z6*p2dftEo zV&=L*%;N2kP_a;*3TPU-9YyR<)lYDmoP~}V5+-iM?08U?>?&Bpl-aeLcr}%7(`}5H z@=D2&aRb>kE>rk0GHxWt88>ziRGi+Hso%2oTZXs^@pMn>0r(uD;8_zpT&>vrQE8d# zF(c3#G109Qy<_N9WWi7T3Jd<_;DVTv2b8uF{H;{wR;qrhUMu&)&IoTwTOiwSC!(Az zhIIqs!f#(wy_e41_y{KNfMt=ZcY`B1SuNJ6Vb_Z0T}M~h9Z6FLMg*@=25dM)bs%kh zo-%Oxh8w;7q?lFAk?Fh;TUBU%^fs19B5bJ+8olQ9aywAeZRGq>SlIQ&FHhJHOTba! zM1hYVh1^G#r3WOeS4JQvDqA(pxb+sQ#@>0OeO{Z~&W90d<7f6v4{&hH!2}3omyg^je_CaHir!ummV~s6!9niK=c} zDLtyd$B#T?j5sGp3*w|Rp~#ICI#hHri%wy;{Y+;@iijXCdt)2kh52$VOa=O|gPMTj z!INPcMONzBk-1bd4ETggAyDSZ7WV4n%V=g%?f;qXT!1Vuq~;vXU*#-SRT;ju83 z6KN?JUA=#kP>0B4_d0oh`vaHWk4lIej4$9d_QRt)l5#59+f?rb6Hqo!%KqBH9D1bW0FB1TWcXfCox9kVcaf?xEs6954#d;tnX8PiS{X<9ow=!ooN z!BGetmnqDLI>otrS%|_Vh0zjL&NQ-D{BSo7_A|#! zh&BQlSLW8O$9a_BL>z3y87be0PA^4FreY?J%;h&;=gta6pD}g{d55FIq$8IA_54o4&k&cQ`{@3FGg)MVs{n*4% z?%~fOKeSZ%>IQ?a6T&%)DsXYwU8>$zR)cZX>jBh76_XDpWz_ zQxCk4;C(>U)l_NG1YB=n+$@Xba$OKBdc z(7`Pqy*hl1>LNbcmap+$;I%a~*rymJm?}=SD_J5=^gghKSYkyJndUo;5AOpHV}7lI zKf@2C`Cd}2t)}f+6`Mrh+m4aCX?szXPu3%I3%g`hJ-HndtB|VuV%D$ILK^7pO0oJ# za<(+z5{V+-mjjR)Hqh50xPIQLY6DmNa1v^=IEq^>H$2IrfC$|?Gkqh3-@e3?Ln^(g0ZtiPmuMtUC*Pc$cV$-h9HnZ7zECv)4Y z=(31uV^+i|og>zrvb?2@G2d!T-2xjEmI_HqH8U(7jj7wWHKy*DHKy*K&W-7A3MM&~ z11<8PJ-LIbV3O_oCqobCzBH+HjJfW=t#4CD;NG9(`g7$QZU;gd8yN&^!+D!YG^ny%zeozRnO&}3419+u#`a-ck>T)waRc2rMlJ$Pdm_6 zmEk}*1(4T(#)!ZWnY_(n<+29}(Z>f$?#CuO+~d;HP|b^$M}I|@0=P%c(Vr)YKbP*~ zMM_jJ`>XO!OK+AXsP6}llOmO>^+Nt?KF=eb{72Q0iE5swi!_fNdujdd7@lQUR3fGM zK2b`s=x=Q>y21AL__*OvN+tu&yGLk`orVhAhJTPebDxB;2pOF5^t^cD>qrS(46RmuxOJbr+rClOhVWglM|;o z;}gQho18(Klb8^eXmTPnXL3T=WRvq{or)(VAuPq@_%tUqAuQG8{8c#Cv&kGN=gR3j z^;DwZFX$kl31OjTkf${#JRvOH*s*^`wxw(JZQZ?%g+BVctJ%wE}edu=Es-{F0lFw(9 zaZDj^Jw2w3OT_p?F+Lzqu)^RpUj??d7q?^ceZV5P?Zs!r_^vX_+{t$kW7Pw@FiMm& zRbZV~nr{*|&%Vi351bZf;=V;WM=?BzEn3-9#YRf~u(iD?Lx<0$qR$dzfilh$<9ubz z7GpX_&%PK-Hl1Ecl06-1`lo!qeT^=1Zxl=XE*$^jb|$XpYooidqoal|h74;2Lq{ef z82imKN^B&%ReW*zj&KIFgd?4Yu#hpd^Ro=)gAR1Dy8qX2%cvvQ)pa}2MRouEdIz{;QMAwXR#Vov!YloG7fbv^Yi2N?$rZ`JqTZsxVnpv@Uw+cu>_X>ICa zx%upbnU|8N@as=Y-E=IfrO|P2OxjT83v&9R@`+ad%AR87s|NMOI5mt%^$_1erURz3 z=@xfOqZjzT@5}ME*Jz?+X&Azl%;^d-m22 zf8VV250?+-M$Y!#CY9>C2Gg6aZF$pg!W&f&|} zme4yDRXn)UVEp*dW{$~B!+O_+G4Brr*#rovJBQFt?c~o}z=j_9KFL=Ieb6?f|0^2a@lb`zs zwKKZIK>Na}wbL7qlDs>Fj{z*$c>EssgA%eQsTQW~pB&U?Wchz3iS6Q9$xClPRvEsx zc{1W*b(CpNCV5BLJ3B(PiSAtF;Mp5wdp0!M|2dSY)^+qm-CrCx}{_O zAwA2N#klM&s!KlUuI3bp*_gcB!!R1bH2ZrbZVr{dVa`ZC}7= z3hY_U3qes;Guoz&ogTiTyY0oGbCd1YhH|iY|L_`5Q_%1hnYEFHz;hJpK)G)tDk1er zGX1R=DPF))1IZ1Vf#32NHFM%1MUQ9($UUVnU;N8Zx)voRd9KKEKqlF}4)Sc`4RWP) zad%@3IUo$X=Tg)1VZJ#kR#_IwmN)M)r0Lo2Cz-zAl8R``j&s|1dm?Eh0YAPz ze|*nJL@-AVU?-mqsb#S>8~bC!xm*3ng-T9YUVD#s^jqPB*<70*KKyOl?mnZcCcc)R zP`jc_)kKGFH(y!0y=tmrgjY?4!L0x&xb_EomT~mHdp>H1uzc=|+0UU$-Ydr4w)^Pt zI@fg@kFMeXyS#kh@5Zu z38% z%}@8;yq}!#zD>vN4)PeMr4383dQuYMg?C25UOX6-R_;I?mjIo~^qqg5aPq;;T0T~{ zQ`XDBXLiViCx(NKH@=GY7Ja9ioC!Mpf^<}0Jm&6+nEWe!*rL_HfrVCrm@N4 zYX*-U{i^5`-J^UmrdNh48|s8Ug%R@u*3!HqW%!>{AwAWJPs>K^RR5o3QQg(|Ly1{; zGg*=zH1}Dn<3d8!Mk$ZZ&g#M|dePcL)uOdlY2&$-ixX~@l*$({r?@21wsl!rj~Y~E z^4#Q*m>~9j*MzVSJHht>8<%qH%+UDi;Vmd>KBY0qRO;$9_F%))*n|y9D?HcMH&v!_ zItEWFLFwiFd=m~!f8(6B;Tw$6)Gz#KWXEkl{X~xRQVjt zS36HSYg)T3Jwz@yieS%84kwpgyy$G{aC>>thRA(yfo6J%vau-r8zo4cRO$&PkNSvY zvYd{7hH6purd|RaqjbWTDTH+zL+1GIk~WUGQ&h+0nCL9h;ZTKov5wQ{neEA{cRAWM zCFVZm4pI)>r%aWkb;ZhwG8!p2g}ZzDZ0*tbnOUz)Hfw1Dwe(l1r7yd5D64heuB+nR zL$0+~Z{2fRltVP{)+X2u{->la4oVJg3J8%zcrB*~rpq4w-xc zMI^1}zH5)MyW*W38Od%OM^Hl!u))&SH&N=GnR4<$4quz^>3a_(B-h(KqR&iZ!({W# z@zweA0!#AYP0K#^_ED9$IkkW6xtdUJLz&!vWW~v^Hj#g}RDw4x``0F%(%7$@$>zB2 zMO*yQ{IPvf)(&TXacpvv&GR-*NiG`jajx%EwtHoJpp}cBKZMWD&(uW!0F)+jFw^%= zfOEBWjz2VY=FG%GJ}AjX&S}n_ibt;M;%YE`;BB8QhJJ!)R3%l@Ps~(XI&JQ{w!V|~ zm|f;QFg*EK$dqtiFYqSs8=HKhY;ncfkGs2Lc>|7ep5lor8&4ATDfAm1A;);uo(L)% z*ES`*jm`D7^|t%vGlc#dy|WK*?&^(DI}n>DUpvy=jHpPBj19%7pED^A(yr{n3d6f! zAB-;DO!I5kZ>eq_Urjwlv{yp1U8?9J^CG8h_uzEj?r>BkJS^NXo++Whp0B#Q`xf@R zC*Ajy#kZ3ddGj0yPFQ=f?9Gm386yJk%aPWa=^MlGc-h}!H_M;Jum#UJh-su-T9UMm=@&ox=Zqx7!q2{q8>4e z+R|QB&nK5OFY^keof?|3{~M)!u)VZhrL?^KD);MEKNwirNU6*ZZumE)W#~~=8Gl^W zC1bo?5_+L>qg0>_KQ(-FdplRW-~}vRY{f2tg4cL!)uPTrg>}9(wE37a8p0YAh*$n zAEs@od=0PaH0I&8j1Q`^LpT}!g5<5eN!$?fgn03)K(vB4W!&Ixq|k&{C5z>@_~Xqp z@PCEQ{gVf@u$YXr$a5?D$Jq5FBGT8ePe15RfqGDH{v!oP{kutqE&ar>c^(vDd{FaM z7x^fWY;jgjZ}Nsd(edCc$n-sZo~IC7Zk21*SAb1t@AM}1XyKt;(Vm8Hp-$E>r$U(z zXZog+0AsJ0%emU0cHJe>1B_^_8rGi5^yNtcwZ7}kERX7l?wRM*bIA9jE!J*<=k$nx z2N9L6E)b}kt}muIr0z8PD~}Y$9Ea~%tro(EpgEhLrDJUV1AfxwdC9|)lFwP%8pqq3 z-acx0<+`2C^Typ+!L?{%68jjTdp@1%7?qjNShcFJ*dXx0nyziZyly&}7@6Yw;;3-)@pKKYit}PmvibVgLLU zBiY^#`!<%O{y%isUn5!n&%LSk$f~u+h$z1L*+S#lXXQi$p3>V#Fn2ez9VQ>Eav!5$ ze9+U(PVy;4em9R+T7Gn4*!+b3Ea>u4v71wh6pWQ|{&?QJ#5C7`lUV@PZ83?iZWRgr z)rph=zFSn7D2ngvgHcZf{UO7XeeE|gKIUm}`SvNa{F{D=Kenw3!+qnZ7_~LU;ekqb zQ-V4M;L1{)?cUIxWNsQqQ}mIFe&&AsPT$gC9#gWVAJUe5%JQo>)nx_H?(bhO5xcT^ zqIVio{7+b0T{3e;8R`3^iiS!yzLGMw?{9^39TuOS(y2y^p$n%V2FQCFPfLt@UgHVh zGK70^hGV?u#;9J=>N?`S$H5n*1oaFK(IawabG}Eg$2g-IjUPh)p|H z$&cws{@GvYz5x8D&tUn$bN3`k#5B}?XF@*3B&|Y8HUjHn9-oF_?bZnzNt}h*t z2G>0u^X%<|Ash;=qz;-1PMcHStsH#u1}WF)+xFIUnb1bqHNz&{LepHgQ}R$s9?saZ z$Xt6ejbS@slG@&ZTQKm|!Hj|84KFkc6}7&PeNJXN6RRGFT+`JvJ7RazAMbwAA$q{; zyPw+J)pY}!zoGh@m*f6k)@9sBD}sYR8Fv6vEvEhBn%sOSFUWl){?NE4S2u>dwzjh1 z^9|mbd*&}VgaRlntq|ov$Py|mamgNX(AIY}W5v^H?Dz5UasgTY_wb<#ZPRu>pnIW> z**}+&h$~|^3%pD0uD11!Bd9s{2Al!n(iA+l^^L(*_QBn;dKi+A%3kMtk%)ce{9&(2 zMk_{^&H-56C>24PbljJir*<4hzW-CRFESb7KtP;k;<~24$qT`g{4N z{mB}fuc!=ooHR^jfVybVDXDxz8PM1F*~{d`VfelT^|RKW^S?kTa22xf5AglijD1^s z>^|GmYHaFQb*Zl_&GF4rV&FScq1>1@<7YC5^`> zABy+FAg*=kFX1>{;W{|S*GtT16*7pwsH=##4Sb9Ki3{%#{9Qd7-m@MJ`zK!&!>m?r zY^aq-sf^hi=kIua%8gc)oF)tBtMlrwm^~?WmItupD4f3Rsxl=?9I7K8y7B7}-KaNxSC$tB-O!hB>qFl!{|ke_>u(9C zXPxR=F@2jf4oqZ#fr0sT;g3*R``4e8o8IVh>o0swaNC3OUh4YhONI+~dS715DqY@XjcEOsrkI{|o+a9Lk*W zG5*L+)$^2 zQH3_YM;R|KMu=qYcUFMfhU$is$74UGlpi!)Ub07Uyx5W2=0`-L4TtJaw(}ZJHnd0- z7wa1y|FG#vcmIa!6Fq~OtO$OZ(+@K6r*EIs#x7C%zah9_lbGrrsAF8ioaj_qthRn|0n0w z`IS%1mn{BP{{CscWY2)P_%MHEd9=T3dXz$6sAY(T@LC{+`=dz~4kyxLIzqjTtAxW+0o|hC^5K z+|Bgt?`j%8sJUXKj{hup5W#gDlu2yGtI~Omb!OZ_-4B_LlX29ow>$5?G=^nj|KJd9 zReEekZJ+Y~wMLK%J*NqLeTn`$${%;1|*7L@?e8!tD4MoviYMEKHaoR<- zz1kCDr9`UD-ie`1uUpnlP;>Q=#^72wp3~h?dbO>qoE+T+tGB!DnS(uQPWHeaS{V_2 zd_=ToUw4_T8@Sdo@edD(gL}(h)S63ykcJV_ch{YAiV$YWYU0r=YP_g^& z?MS3CY#RbVa!3p*o;)$|A?(sg_t5f<@&hM&J_p19T4UJ5mwDV^c|^j-@+VL9d`3Jz zDl-I`AME4Zk|u95yC5yz9_^jZRUSTcSFBH~rZ=U{oaGx9Cfz-v zF}XFLeMQO>(y%Pt+(P%9j_y!>c_w7Y`YCe`C!}u8#@N<3O1>1(>JNKu=g%>q({Al= z`_T}F3fl%7e?6_e^yyC9h98pW!r-~XYg{WuTU6-rg}LOiRolkL@pvG)X%B^AHpFEZ zZu@~`d3(obM86Tyc<-r3ZlyTUc<<@PE@_P{{`DD`_t5d%Hi{C=SH4rGp+gAKJPkW{ zu9@*Q%jW|y?-D`%T=T`;d>X$bB7(%ZT3FH$JU*Liro4|gN##r~^1*pu=bTA3eMiok z_jbhZUt^}=|5F1yP4>pfW@)}2-vHM=B8fXZzP_%pl4y*_7vj1m_E~bpIR_C<1s;(} zqv79ABnMSC(E(tt6Z2czTrcJtZI-+?zo5(~curlO{qM*()88JxVZRe;UPs`@YSU{^!p1FCtiDSQFV!XI@rc(>O0$9!G@{h2egu?_p%oIJ*@; zbjik(A2yxaH+gmM%*KZF#(MQtELts*3_4fqa5qZ?4AAWn*nLkCoOw>*9#P}ki^u@8eETA5d{O`09^{)WcTW8XI_o zgzX$h18b)GgfGeR9e_yNMmZiRkHh987{(@B;cx8--$TOV;kVxi`=knMM$M;uh)9kp zjg)g7wvG40X!x`-*{(B^WZNK1=K2PeE7JbKLZbEg=Z#H{aL-joY0~km#U>p=g`GRM z{)qRW1W9sV-BA$Fg&?_AY#_| z51%{N)yH==2UOT7KwA(eM^#9YufFbV&0kDTMX9wYbos{zku%V-P z(yi?p-}b?wss65syP&wAacRT3`Fv-p;~1A{`=T!U#GiTKFv{B6 z5PcBWYI4Q7sDtLbMy9HH#~L%AAV$e4&kA|7=d~Z<&@C(UTum_dqG4y-wAzyr8Y~YS z#b9(420lVHgK3p8!sQvHe9%~gAqVl;W8iAxnkKH;k53BsG}%Wbg~RrC38^+Y;TGqJ z&*X$!oEl$<$qE)0Cp^My_~L=YG_)3uZz>}3*2%>i?52l%rbXD#?G42&ny!d&?&7e_ zT+YE8D4HL9ZZA(h%-yocn$?o^3rVi)bW4^S3~m(f;UWGZlHVXt(jn zel988&bNuKzl0%N3}0ag6~lQ9Owc{oe};iei#^wW=nZHnvGz1^eTm_^R)Wg})ZKqb zKRz4ZW$50XB3h1MDkI|NLTSV_-_^AtDXn3EKddn+t#Ls6g-R3;-3d>(>Pz5?NZ-+C ztSKcMgs&^h5IUySKW1~KvLpVGw`Odg*JGH#xVTiVb>N!MIo%oY`Un`TT{y2io6%35 z)?x{B8Y%0Aj_jnd*x{8j^;F~SDs{JUG&@`zGV)z}P9)5M&AG23B=s!iy_?zcEa0g% z-#@?#<@@YkFwH}wjmbPUBHEv6%#Rq)m}$+CSyZ>ihWNJT-%)_fe6PEgZTJ3P%Y4_p zhQX7IIL_Co9i&hWwHAKR@S2QRdg5Vyk@8$}FS~ni$RR$H#rf7QoyzQ!bZocnPL|k)*@&FycvYqNt2r5}X1|vLAM5M6<&ha8 zRqN)3Sa)BxdNqrC>afeq@?O^3(|f(#iY)SnzLC#2-_i1se%=7VR6w?xj?|blx}PCG>~VSM=+t*i4Z5}=A!LA z4$60S+}*H;o>ZwyIXk{B{+|Rxifj8$O-3^I^Y!Q7 z_tYC`&SV!?#2STTpQ*S-cDP017HNt;QX*&i zc^BJn>)!oGt#@zy(F$&(@v)H`f3)`S%&OGr@ZkqNCv71$0}l15ncLi-nri2EwYWU( zRJDpr=y1LS!PkcldiM=u(c6}A@Jv|`Z_V6?xx^#d8gmh}H-rtg`sXQ`ZT_?~FoWTQ^j-)C$iLZc6{*RS0M@P%AmAWXy#!ts39ua8xg(!bIMV%o(E0aI!~P;b>TT` z_(zzonqRN^?;HL;;^92UgWA@)_cY9ljubi+I0ETB29+(~AP+6EuBIux2fIPV@1L=i z9ye_LjuS)ZOYHB-8Tp}ayxTPV$QQPf?)kRQj^^83?BKcH%(wZ$_ud$Kkn?~C+t_jP zpRm1B6S9~6r1#l`x7(6ykk)46Pxsc708xgU-;e6MxjXOmjC<2HmrIvsYNp%YgO`nJ zYd*4P_Ne!Ee~r&Y-RG_Go{xVsq$T8n=kqpCOI!Rq@%#CN6k~o+(0ccfVFIpq1%mjD z<0m2{_dYIqWIMHLVjIiWi5JJ!x^83j_m6QOxo+5S%JsJzpB+|TSnt8=0_z?BkLNE? z-m4~FA}~R})^Jfkby(_ajwv(S{hY+)<@fLvD{L>$j_~fS`P*f(Q*s;n4nje07vhg1 zIa_DRDXB#wy+cC}+Fq>*Ik54Njhm&A;sLwAE**!4q4h^j@|Hu*(1X*4zIl)3Y4Tpq zGDxyaHpa$RpFbc~#P_RSv?aV@n@lt=$5hR9`>D>o#FuXyw`gihVpZzc7Td%c_dkhX z53Rp#D4U<3Ra29OnO}C_+uGj!8;Q3L{nFjXbWP-(Dsj9g-{(1Pd*!{5z5Z7zJVzrA zwViq1QxkN)f$MTNCr5mZ?Lg3&uIgHR-uAgjLS*j${{9mQxX@!SgfgKNr~;B-G#Ckm zL+7{!>y^wPqX~Q-+zveit%eGr`OqEEIA{dqfOx`v(EHFi$etc#Tn~+hGNB@<0{SoLm(U)l4mtsyhC+F} zJPH~O&4ZRe%OSb2;)l>S=y|9bdK)?geF+_wGVq&6nvs`bTweZTvHYgLi4f@UWAR`SL1U2!_`+ZO<6b$|0&LCqAG#_$6NBOMb4(K6h9MlIo ziu|`h*Atigj?I>bg<;giYZUX_yA6B!FAVz^Z*}n2Z!+vpy~(}ZzwF?N-|z`R_P?YU z_Uon@_SwZti%V7%JMva8$}4phloaEh7T~@xC)bfvR8+DkM>}o{aPtM2CEhW&2iadq zHSAeSg6un>3hY)oDxR{koK=qEycLe3yyC?!nKBykDQ#UUv2l6>a)kZlT4gc+j6Q4F z6QL9+1ImVqpq0=j=wWCZ^bE8UdIj1K9fazjdguhy1f7C>&}pazItv;9!kiFf4+X=a z2*?igfg+(O$N@z|G0+Go4jK)OfyP6L&}1kDN`=y(3@8hl2W3OK&=RN!DurCoN@xSL z1=4~dZ-mzuwY?Md0uXeRMCP3i*oZ86@jHW z<%@EPG_Ty1i&-oS7Pyuahy#`d3-WWyU6y%y-Xd2?ndwd9DY7gJ7UbnDED-;tuCm)k zgJpT;uCjtfF5$V0bBYQU7w6>~7FRMNO-s^t5K$Q835!?bc5nn3bE9G02hN9N zO>{kh)?l~^_u)`1bTc#zx}8AdiQsz7YoPg1_VRpJ&cdR+8wi`dd|`lDByxk1?OIiu zSCTKzMz(apB1gH4ez?f7*qu|BtN9|7;>Fs$TnhytF81QQoq=VwYoCPN|eHZ;9hOvJmK}LpF|%Yy`yd@3LWJFDfZr^(}(RcIUbr zWqB@lS+S~)?Bo<9dsarqw2r!KuWhp~P5YH2l(sDGR0}>&j7E0Jvf=`Vw2krtsqyR% zVdxegP;uXIyXW2jSHdpKDb87(m-}79yWHOu1t@t7tcS~_)FJ6k{w!I4tMBaGRmC~W zXzm5Y1+D^m{OY_iM}A3}L&|Qs<+$=z7PtbMwdDgp?G58wlW6zzotcp`enV#eCf-i{ z)wQH7j|ZvQZLP7#aou$eqHQ0GXbB5)R^${g#2JnZ`o3dwUiqT3f>Pa;4aY?3-jj-Q z%F6>>962sWOeeP_dCnpu(`!lr-LY)Zl2rkLa25BGWu-DwI__Fn$Vlu+mB+jqHVns? zJa3?_P>xY*6fiO_Gs^k90&_9A$S5(&j66*Fa28@JQ|?8^D0rF-@(I5t^k~ zLx;QtQ=DYaSgPVI=5LV^Z``7Io#QibTWPomq4TD^h<47HQdFKK(-zI)V>6mJr7SN` zu}u5aJXdB;k-HNw-Qvl-MEp%_Z+?@?Xoz&cbfm>xDS4&w$}+<)+N&NaR>K&GS=RmX zdo;jYg*jZa4cSJq%s&b+%WjIrm%SIu{9gfP*`%@fyZ9P_W#*hHG>3f4d>cm+X&<`+JbMMYDnr~A;-_2;_$$^XL;RO1CUFr?`6H~mOqmShj+|m+O5Q?a zdQO>ywz#RP6f$#P?I-XihOJZ6=IDN_dGCG4UlAmIx{ zeuP(@lQ_s7eD`8^IRhkdx$>4R%oAA>XNj1I*J4Th?dGKEtZAU>({Ikry?K?2Czsy{ z$8>%UF|6Weq@;{nwrrg44e5rPafvXDa)KGyB_nhAo2%?g;2;NTvj9wIq?2)5hs(vL zk}<<~*mXSR#G!rY_+*Uh;AJoxy47fE`LfdKu ztIYJpCjUmzL&aVGIodhmOZ!YQQjBrrX&HaZ`6s_Tq#bL_MsE7YceCuLp%&;Y)CygM zj7x?+6pDcQKv7T(G#VNYr9i1r8k7NLLGz$&C>L4+6+xwt3t9F8gU&+XZF;PgT=&5o1w}(6pwZBHXfl)v&4Y@dHP9C58E6-D5UPXf zp(e-&@i9evE5y4n_Hf7!MM4fJ1{wpULRpab&jm}NHPA!Qc4#NG52}ZnARlxQisshZ zG0-b~T<9Ql3~GW3X?wA>C>fJit69V(+O5nTO5oqA#%RsYpzrEmVhDL+UQ+??fsD`~ zdp7hOBy%1g7!wv`&xN)_El^6AAo~`m36eR{S|pEkXv1@Kr?k)hZ7KYBaObmv~0~PsJmBvYa?2cT&Q@nBz=o ze|J7*bdsFP7%1bw66|^8Hy4`~qsZz%DYJx^5xJNVEikO)=DXx2bJ21YHlO@hp)DzW zcX(a%W#qsLE4kKk_^z~9s*>w=BB6DvI`oypN;=leE|&7T7>CP|TN!EUoa9o975{Nw zBH?WC66Mx&aFF8_PIRAv=ps%gyhPa3tw5j!Y!r0mf%lTAhAeBWN@WkEG?5W8K(TL zG=kvSp>IQ(ql&xCa|Kf;P0uM!SNa@Q76E)w{p8KaS(cYkk~(SHWSrDoHL0{Tt)!@6 z(JEFk=0rXtuWVUCvC`E}&vPv)k*Ui6@jnMo^v?fc4C`NK{*`U0%Kz=Z4b0Rp|JOOh zdgl1nzaZm3`xh9){YJ;XVCMG!$v-Q+Xx^xZi*1bnW&t5kBRlTq7)3@I> zk=OPg5H)bnV8@W_hDHy&{)U(vZyG)#cI3@*qi%^Ged}%C8#8uX!uScdI}>vjqF~Qo zyriITY0`IVWrG-CF+N?*9J?`Ma47%TJy|;eCVbq8qS-^4y68LqP{9 z`jt3P^ebaPc|IkAqC-gmMK_TKiq0Yn6x~8LD7u9upy(hQ1mPnpgh|)fuft( z0`>;Cf>(pv!9L&)urIh16y3)jP;@@k;I-gEP)^y@fpU#TJt(@ACJ>#Q;R6SOE#P3V z6?A|`zaaY%ARN37Y~n`Fp`aamG#CjE10A63`NV)XfN`McT*iPmfr;R7Fa;a|rh&0w z7ASi}+2C#967YLqDL4jP362FTz}vx1pcC8zCW2eRByc-83ETn71AZqs1>6Hp1*^en z;6d;XunxQvtOsSi(*)iH`oJ`>1!oWoAUBFbZE0_g_gSlWgP}XKWz*6iH;2N+exC!h9J`CEx?VvQc=fJB# zS=N^lss0lXgE0^R^_18)R(fH#4=z~NvuI08Hj#)7B7o52=P zt|qw%jt0Z84YJ<~_5p7L9pLxC5#Shb3^*2?42}cSzyxp}cssZRbb>B05v%}{z=yy| z;8t)lxD!kUUje6p2f?Y}F>o5#1l|Fj2JZx0!BjA`KkW##gLi>ZU>X<$&H_h+nP4I~ z2TTR;2Iql!U=g?!Tmu$?4}t5!tzZxX$TMIlC~Nnw;7;t_z*oTT!UrS3W1tK;P2knw zX|NC23ibm-2T<>z9UKV8fFr=sU;>y5-VSDglfYbXDYymUBPF-Zs1O^ zJNOD10UiYVgU7%G@HDs-Yz0~Q8{tvJ1NH&Cf)217I0EbrjsYXU$zXpl4NL&%fk6y- zMPMkn66^|Y0K0)(!0zBSFaq2G_6K)?3E*Kch=K70*bVf7-NCb91ZWJzKNtZffYD$O z1LbJ28<+@o2UEfRU>2AFmV!YJ+7;Lhd@N1o;8GfstT$Fk1L=^iSb~Cwf7R+MnoeO}l7w8AI@)QTvlMzx)a)k^E#YPk!a? z<nQrckZ!b~^c%;$2md`r+5$S((p$uG~$&oVO~IY>Z$OU-biWs%jy(r#iYxx`bBM1(J8k@gcy z4(L{xC2WQYEA2?qm9Wy5B%gFaQj$1ln=+I#PE>nj(!L~4k%Qn9{8yEew zv>9pVVwQF#ZC%U~zqEIe+vR1E_HWhQLY04=uJi{h57H+rv-FD&vurb{_d zNm1Id^d&9#WlE+ql#FygoMy~aaYz{^srIM$V01o2e=IR);YatYiAs(#u3G+OES2^r z@-0^7vHFboNi*wA=Qs^cU>nkXK=<3gb~Z_sv4|L@yplKFPjr1xRPqX}%Rv8D`I9M+ z{B${!Ra?-{ofOqh^;nXm@~6w3r24KdvzEOs^CZ=l%T1|E83NPO`O{^v(oR#-u+mOd zHKo%|SNYIsr<&^n$3Ch@m(9qIIR4Or<-S9#HLo2E*u<4se19q)8i16poZj#qk- zZY@^48LDn|yt>Wmcqgke1;*964wk82)j5xM(Q@_NLH4t>S<0BH@>|ZRA~s!fR{C?z zvgkUIzG%ry#&`)ME}g^Zo~ZLYQPqPb3+WTO{oSGRul;10ZB9~8QuUzyq^iDem0i}D zIv(AUwVylHo}2cQX7*Q!XA*U0rIi#=AG1~4(_tqD_)iPq&ot{&;?bjqPB&eRDB7H2 z){FR=VLo5PoTl>MF`tvCipZ%bn9!vz^2UEe{ zgIVBqFcj4}-r3w}UT%&w=~EJ>Us&A1I?h9e5Z#0lo(Mz=L2K z`MME2i~Vsh;s(|vpdJ1YFdF+Jv6J5*Fb=ysf5(Gs!4z;e7>Ro@n2lZPJPvy(ScF}k zK`X%r!7=c|zzx{tS)YhqbVFOP{~X)~{utZ=O26F&{t>JOp9Mw7AkWpq*u7v1;k$w- zu!{~O4SP7~!~QgQ7JLgdV%UoXBEUmnB=}!oH25+Y2fhxD2X}!f;9tQEunx=y<=I{Y zR)Z_Scfl;u>jrMXegxbCHiFy0_rM+C8{jVR1+W^d0S|-6z@y# z9<0E=1k9#9-NA>jr-CbS9|>;7UJfq7y$ARV_J_fp;4i>ez~{k(po}xez!$+L@D)&W zMxv`ajeQd+x~K06AG_#`N{KfD482L~o+@y^8M__33#`LE5{$zBJ1_>6dCp4sJ;Bk~ z?*dZ@7Xv0@F9gG}4+c}Q=YSRX?*(RIXUV2?h&C`6`y*f}I1}80Kk1-ru*=-Alz3vn zP1vPpZ^1qad>H#mupaw3a69(l*aCk7Xvh8l*n~X+jKaPF+=M+2jKTf{ zI2v35CW3A-6`T!jC*QrnEbNbhxnKrZ3jP$_f&10q8thfz9^$ksb0J`a?&{YStq?0dn(;H%&%@R#64@G;OwxB+0F*dY6VgAVXsa69>l2S;FE4T=sm z5gdbkGk6g9F<=Vz3a}3QSTFp3o;>*gzGV4{Kj%SsbXIWe6S^T1a z`Mc)mzeTuP>qpUv#F8_KQ|ke=mPoI^Yt zi*%&CT5picnoP`+mV~#=`aGTH%U_ExCwn@~GB#-4g`9_$9wu`#S??@XGaNk+%VEW3 z%`+FOd}zMbc3Ec0lQ!%8X>)-}Tbm129cXiLKs=?Y9caGR)M&Guj8s2s`*;O zWSK?omboL{Qq?9jUsi~gA9nzMxhXeUW9FG=S)WTNORrI&%C2=oT4Sj73tCI2*C<*u zr_H*)EVJ}IZI-{5xk%Nu<}ahwS!;EjuGSIgwySkd`mCnbWmtS!*GZdZ+$H8%^;gW2 ze|-j4>tAwId(e6xtw|KUW-QW_GU_$BZpYfJwVnF>ULkra(ML$nS*+xv^&?AFyV80J zogYiTpluRHbXrSQnYA8esTyyz-biaIwLVE}FSSlVw^ywP(%MO_|Io4ORg=~ditbR# zApKjfz@*1p=4GmmwZ2FGT6#FGsnxm$U1!>?HMv^vVEGXl>HeVgH##k?!_%5xt;1WW z%Bam+^J}f&%Y|!(SHNWpmn6nReROCO`Wb@ z|4Lt!o@woGh+SH6hh5sa_Pa!-ug!8I&f=G=zNYyuHI8e&sZK}Yl3!8D;!$zh81T16 zrrP{kobjRBWTCco{FO_EuJEgvgqA||F|*N7$o$*-$yEY!E0TqZUwvGs2XaW6-;X9* zhw+%B z3vd5)f1k=*6DO>{F}K@K!mDR*xV5n2(6H*Gw?29zxbUL${9}>#J@stA#9M#A;>4NN zXI=|W8u?n$>brIMbfogPLX}9H+D`oHy_YuTfB*MA6NSN@$89|m&)+sFV(Yc%9{Jh~ z+2jn#TPXvv{;^H@`#Qt^^1FupHR$9Kbx6^2WxCnccI)0HLw^3g?NFQ3GF>v`vZN87 z7#vpx$3TR85Y%^h^jubjs--f{MSwIA*Wg16lM8|MS> z)*YO4lsA+UYh&YY`K@#C~tYhe9j<#ubg(uUFjglU>d)ezEYa=l1aiaz*p}@~{`3Pp$pg(06LD zA-+4RRxI7^TwT1qw=X1$@TX?<`0F0${i!n!e{4{m#OUjG#lP&lb;|DFf_6*s|1TV*SKxYn6l z)_;|=nf|$bSGw!Qea_K$zVdpvw?!V8zKnijpL6DtPbN-sjGSP^b?fb3__{Opn&15K z^oN8u&h_tq=5^=QIk(3S_{@oYOTV92?RVBa_UOeC5C3yKE1{w+#{uVC8Ho#bICyJ3 zEvoI2T?d@6$N!k6C*|AzcK*+u2c1t1eei*r{oDlDk{QwK@ImK?+u!-wu8)vc-QPd^ zaPA@J$4zakgB{W2=jhbI&4-+h=rcvV;%Og=A>L<--*B$GXZTCc`Qr&c>-F8no6hpz z@0iklZU6g z*lU8ZLe{EpMua?L;dzw1i+#|KwD_KtJOqi4>qE$5=d zx^Bt$bgy%+8mSeLsi%?I|4i z{rz>$TWaE}?r5gGJC459&{pTHc;fSOy>6wwuiX3Rn-h;Xy)R!k(J`L?*r>l=R zADb6DWYrnkf7Wwxt6w!rR|L9(%_1J>GJ}`C+e!p(C?ym|&z#ysOvsN1Yc2 zKNDlWuP^ak^~;3|k2-r_8!@u~&fXJ@`bpK_-+I)!>U&QcX(fAQMK{)_&6rSU%Cd7*}dndbAu#1`NCYNWHUsY2T=tRAfG z7H!aAF_TUb&1 zR~6pE9jmq7!n#q~Zei)^zbO9}+JB|(7RKahyM>8EwcWzHQ^!P$F$u- zd%3n-SUOGHEv&v?+b!H`XuE|?yBH7nSy)k`?G`$2(sm20Pra@DTbTWnwp(c2t?d?W z8KCVJ#{Kmz72d+?pK7~>X>+yR!lwS(ZejLEhgEnBTb|K&3rm-2yM@Nh+HPUR`8QQ~ z3yo@RZ%3oa*#~)4bH(~VP_Dig9iv?EFFHf{puk|zK2GagBf%lq9bhj|uG8-c%2oO{ zFb2NNa^k=+P_ES%-QF1Ny}|LI155-Xz{y|_FclOXZ3ZYh#d+YhU@j;+>>@A{bb+Fq zT?2|vb^~}F_z*Z0+ycs+`C)JvxD~t}+zv905_N*XG)kc>N858S2w(6PP^Mcl)e`oi zJoUP+kzZ7zE>+3TS*Ye<%Sv+dB}`GSo?0$gq#YJ4SyfuX>?|J-;+|h-y03~e7OWZt z6&nj!IEWrTY`IChls*yToERyUKUq1_QL^jiJvRQ6&Oz9I*q@J0ddK`Km_uQ zf&$|cf0AeU1?DXWr(Lx?bXe8Gp zxN@RpTgRZ?8lm9GxVT06i+Off_DQocqO&F?iJv{4d9#K0N@t$xm(`tk(^S}f@T5gL|u=Vg{X|BVjWl7kk&i=B*E3-%(5~b7_Y!qcEpmlgnJmf zV_#_A)KU>-WQ%(lqkDARD2zrnJpNlel_%j}{@W)nGxBRq()}lNBJ&JLm@*EDo7F$1 zExk8Y`?tosKsU}+EB`X)TpsS%rkj=C64H>qyb>I5rYT`$e7QXAGBYgSQ&Hn;or#wH z&>cEm%YN)K_q*=w>>e0?5xw<()nl2%ndyX1(s}CxTJn%Q$ry8a-nz~(>{hz<0qK4) z)3ARIiT^9PM-_9=0~F|fdA_%QU%Q_&;|+B0etpuq5f=?mZK>g*mEUflbx`S$o{ ztuySIkodb&{)K;h{l9mA@BV-9KK?u0AH2-{^86QW>Ky;&?vsDg+5K|)eE)}?-7gRS zgD17SCI3AE^(*Bc!)M0?E%{s?{?JpM-7inS`038>yDp2L!$to#{wdFPb`NaVlCQ^K z?(BYf{=WZ8XZOp)&#nFU?xXhqd-p#d?CgGd`u82~>>eneRiAL52_)r^AEHrxe=lP# z!&*D-!Tt(V4au|eZIE3+HQ6006JLXiA{Q5wvshT5xeJUG#$oF>j(b!iTlCm$@qP$T zp4ScM4deY>wGFikP3Xu!(iqxHP=fbRj871wp8Fwbnnvt9uf6K^R zx!d$nLsn#y)#amejBU!MFPwW!nUjm%%j9NEN$YotGmBdR=kRr62{(tk<-{dva%NK6 zG%L<&S39Q`l`PCDN}Nq9HxwDOW762DRemKTXz$8aJrhQz?2=}BoxnWI!P#v2h%vQDHaImNj}d5Id* zxhGR6b0>cBZRW3l0+ba~lv@&ET5*n6ws;_sncA(PPUoo0qoKG`s%=3|XWW(C0%9Ab zV(HtE>*}B$Pl{!5sP-^PpKTBvG!qgXVSbWJ-QlxW6-ikzZt>P8p>EL%R*e!`E z68hp`C)ajJLrPv&>ROeUIYz}XDJhF08PD`|PUcqAlJY#Wnme4oMRXEphSe_48w zeje4lD6b>tZwVP7CM9(2rr7%um?3rat&vDY2IN9j z)*&U`DP<+gX1nsoBnF7ztS+vRTbO6I^Z?h(g`GBW@|@AsllCIlXW~QEK#8uufL_wM zAp|&F9x1~9#Xu)FLM8@yq7(~ebTpVw?I?~AKfh84)$&wP5*N%MnU3(6b-rmGE}deQ zdf#@9b9&Cwyh&UEyD(?b(nNXSB__`Owq`BeIY8X;0f`0_Cozye#a*nfw$$xEJ~4&x zx5P`Q8aTnde8KnKdG5RgDA$%6*=dk@Q`L{UM|B35>Lgla&dB3B)PNB(tD`15w>yzWZy8~& zklz|bN3EL;xIKgj>)$m4(wL_uXa(t%z0Q)nqL*(-^tPm|q=}Tt@@+MvX~p>^iJ6x* zwvMuQa_C^Ea{;$p{-{TK5=)sgnxEq#he(T$c{6V+)X{Ik+45 zg)nk_tB;O!J7tHcHw<#77nQ7_Hl~@+mnj8#MY(|;ma*$w2Yxj|{7bcnZw*ftvr@i2 z2j{*SdXgxj%`9}PHx(7RZd7$U4RPhj(5;*4o0exce9xix!~GcNgWgPr#+C8R zii|0tGu?S*tJ3nyxKf&%ofqY)N@J6u-#25QmTUA6;AW`%oM9Rt3pafg>y2d@1u2YGTLuq-YRAarh2gP znApgiw*6FWYO?(6Ac55X(cZN{WmTr@-@+m##X@5YJ-@~T(?R@h`+oT#(NHO=Fi~m5 z1ce5LBWPHpSXfk6T9njKqLRZD6&0x&Q=Y;O6{~0@bD0&>kTS(dDk?{@&a?j?OdUPb znblfnX086UVDJ6i_P5{5^S<9b_d0A^z0CKxM+uLGiCI}-9LAJhf>%Bl6D0!i6N^Ea zi~+}QWn6eN?E-1?e+czB115PRE!Yqr zyV3>jC*@-IC9jN$#VDaX5OxI|b1x{-cN_SNFUrlD05MNRyTW(B_vUF6FZW7&*(-NK zs>ftsTi`x_Aw&;fvj}=E9=rF^Wm3*UxUsHv~0XEUuWybW~{Z!5OpTka~z!m!w zUVP>kFDLc)x%|)z5=_`1-kzO6jxYQ8`~JM%)jxMY z_)qzKtgODiX74$3FxKjYVO=BkEjku|(oH7D9AmSBYcfxY`UfAwPx}iN=s)f6AAI3I zXSUPtR~M}B>GxCnr}&-$XLvgqq3w1|{@epZ}5R6Z_I{LHf5hc5EE!`($J1MsFqEiN9mzFW(Tz zapgdqTDbSud;PvSd#~U7w?jrNckTJG{jWYBUEZJb#PWW+r_-uMpKhL3E&M-S9sWN{ z`WIJ-Q;=?e{}h2gBIpd{JDpwl-?Dr8PPRj*OYe=}#3R!C^L{<^u}*&R-~U_D_dA62 z$w+^?zy9%|VCh)5QQ3bNyapx%^aV9pSli5l;~t&3?@yWXWiTurZ9trzHU~XE`STKR zrdC3N@A$Z5=eC_94%4S{=grCXIvayC_|8CmyfbDn zG3$mo!BURBp#KAYzW$3+0OMn*IsQsd`~aL+hyZemaBu&|WW;%M5N~qLbB#!PF%JVvn;zXM!M$?vN1Cbr+DNo z^P_-8g-#4k*D?#|geWi{4JEiflfqckWm_2U^MrW4wJtJgsHhMzQ=+8=BoVygwk_Fj? z$0Co9o>+{m-cdm**-NwYaPA@gJ27($Cofu>|C{W^G5#gFiSxV@c$}E|n8ueK;~#&l z9DDrf-(rtHp-%SrV;_g?_V|9f;o(Fkp85%>vj#C?WF!$Jkz|thSaLVcA!%ecTKX0BCiy=c8_J#L@tT2AFWo@ z=T34ny_;^N@6$2tGM3I(u?N{^wuQaQ_OVWOh(+@8+~!yE+58BP6<3O{lrz=y)Cua< z>fP$^)JFA9^?>?~+N*|ZBehF3qNQq!v=VKdwpHuaj%tJSF}lzv>$CLh^}F=-dXxT+ zKFGMrxXxH*EHghetE?L93F}$wQ!Czf?QDCXv&8w>`PBKsIpkd8E^?Qr22KGt?`Q{)$iH2ej|Cf%{dQdgnF5ptrn_d^mKiWo~7sLd3u5Vnm*VFHzJHkBg#0-o`El( z>Rjz)J6oNPoZ;@fZl{|mk4Rr8_KH9q&n4#(1^V)9)a@?1hQ3I5(1SFDjb@xpWLLA9 ztcX>yde*{rvv%ml_bi-8@p0VX(^2DF`JH?X>b#Brk^eU&_-t{$h!KvMC+-#N#2cbb z>=y^c_aa;wu8dR?l_|Uv23PIasnuWi;|)!x>kbxohH&(nvQ$>uaO%}h5l%uI8OdBpTtAy%jrX1(lO@21P^ zWWL-epOzoVUXK?A*y9A3vq>7cfh;GR$P?r_5>7`^gI)_HxD`n76&=Y0dxX8i5Aea_ z3Nc$;FII^AMXh*RyeM{wJ)%SWMI04P%A272ekC5#n~ZwSR`b;5>O-jI5G_(0rCp>w zpgpR+r+uuo8fTd2n6XxZwa_ZJDy>JX-&u9mR!H@3Yn(mJuCuq==QwMfP0ki)yYq_k zmUF;4>~MFAJKeq3&4Fevb62=`yHB`H?(6Q??pbm$q-%;?Cd<5UD#d(CTt<*65>N8T zVlt6Vg@%4gFJx1JFGrxCPw~6NePTN}@R|5h3{_NRsxn*2QEpZ4RUU>eex&p$A?h&I z1lDA#3)Kqs_v#DkYic|2<_q7KTl1g1(CFjcD$YObmyib0L^;xJm?CV(K zkZG)hH3D<@veCeid3*t12qd|I-^5q(O1^aY z+j!sj#_*X@W{eqUQZvQ8#$0UPY~EttZf-Q|%w}_!xySqfay8HzW5rq2Qmq-*0_#@r z?|tiAYlLk8ORuog?UnZZ_ImL0Ir|UxE_<-!IO#x*H=PfhVXkoRaUXTJyC1seNe32T zrCcu`_jp&0eotI{1%#wDkUG7YAGazB5?tN~JyTxsG_qtu~cW$^GD<{b5asj05F6kMsGE@_5 zMd(smPQ%!1><+$#|CyU&A>=AuS*HvI5*O(=>d))rj9EsnF~YpcoD1w-ZC03nFq_PF z^MLuC8DUMcuCX>-+wuOO?yeoEw}WZan1uUiV@5ad(VNmp90}L6{3mZmM&rt5#y9b<-(1xvHdc-3fy)wsl*VE&i6&-}#v+$^w`!cyE~ z-Dg!>&seWpZ-d{5EuTHaPPAXJ-?lZU$XV_@JF2m zot|UT1`V!e@%5;x_TV*ay3K zR2iraS1(pqtLxN_YAxjaD|IyFe3~{JR{w5oo7M^~9HWoZ4Lt=&->pApY&Bjt4D(_0 zYjYlI{+t!+TnYp!bnkH2y1sU-Yrwm|rH9#Iz811_1k&>Fs#GVcYqh7eXN|Xv#pY(q zn>UsOovcUgnrJg^p?l~)+D^Ms&qMH#B3LAgV+0tfGn*x_WR}8GSsJ{V43-J6sfN|E zI@pK?whj8cgEc{?TUaY=V|(D`w6hL)I$f-r^}yfhWj-FlLwOhv=Mg*-w#3h)c`Q5$ z!Ufmi3nlO*p3GBtDo^9-JcDQQES>}VSip;TF)!hzyo{Ig)v!AiK#3~Y%o<+H>)>}Z zzz#L?9lVJ*^A_I9+xQ;7kGJy<-pRXoH}BzxcrW*f5D_ZEM7W3$ks?a?MYM<&ae{~l zGZLs^TcLKi9cf3|emmNZwc~7J3){96Ai2qQik)hwLHD!ZOBC6~c8OhTm)RgPKrIh6 zOr|L`m8Q{jnn5#Z7R{k~w15`D(v;9rS_Vy84J%s#AE1g>(;8Y!>);DCfbxy7yg}-> z(zZShbkI)P1wQmr9}8ijEQ|%Y5ykv0n#G>Lm86sSlErdZ9xH(TE(Xq)vNBfARpwzpUAZz%bPBz2eKdHhPe@LlpF2F0q1Nt$xU(7fGJsSo?GOWxMl8Yx5BLgy41N1 zZX;}1i`(Yzb31@DJ#McXBEw{ajFQnZP6}zuB$*=9WQNR=d9p~Bz{ahX6|zd!$U4~| z8)cJh0Uqp=9kNUIcvc;&L&`zx5E4crU<0E`9DIJ8B#{(Y`3#Z;yeJ|iz|_^Gf>ebz&9i$6wf?g6r!)OGJqR}*t3To3N@GcE}%L31ez^^j!ssenf0goEM zpC)KV8#JQ>Jm~>XLcos*76nekK{src1ieUuPGo`ZMWA^Z=v@I?*FZZOpczfjiZ*CO z2ehFFnh*jlh=2w}L;3|IKM7Kw28qvtv=>3r%OK?yknkEvcLOB52~yn#iSB?j_dt?E zAjJ`o;Alv%5VlAXDI!f|z-!DCMWRHMiPfS)REZi?2CFNudsU+2;meiANWCv*`tz-{rC!M65 z9D;`&O2cU+_0w2Ns7@1TGIS^%`jZ3QDTdyZLuV?XFSXE>ZP1fu+6oP6hjw%Wp?uJc zaA1@l8bN?j9zvx8oid>T1(5zyNd6i~eKl~Z9vHO)_|yt)Y6mWL1CxBfqi|r6A2>vS zK?%U0RA5ggaHjy6QwqFU1FWeA&eQ{Ab^u>mfi3O8m2O~)4|oy|Eb#+Jh|ooXNEWFg zU1W+JQ6P#%sVEm~M5U;PM_Dhni5;R@w8E=w7oDOT9==ZrRl=1>#jnIFMA4N5B^m9e zba?zZN&&p(Ql%Wef2C5b)WZAUrtE;v+^XzBTdGs(Rt~{;4pqa|NY(GH#2^EFUAT-S zqv2azOyUe-*znI%j5H$ymM_mJGD_eJt%eP(GHQ%Eqrqr2nv52s&Ddvj7+ppWEP03- z2AkM!c9@-Jm)ULhn1|p)^!wS^#NUdvqAb4^ZNg@<8(usBA9O0xm8BQizSw(?%RwY_kb!cJjaGKD{>HxkRazcSG;Q@pZ zz?Nh;J%BAGK$SIUbJe)D0bFT8+YswT@U1~@^rXPkMUVgeTIiu)33y)*etQ-u$ZOB` zL_+60JLB1w@_+?t1~)y+5DV_*fMd1bQl|(7Pm;lha?rjR^bS>H;rr*PWoo(Vt$9hu z`!gZk)sXBRkm^n#%OPM(Byh#2g=nE#m=>-@pnVXf`QcR)O=!AiYYAGCmaL_qEnljY XYZY3()}nQ3VS2QV0)PJfpDFM^?rjV@ literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index c23bd39b..5f627d6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1563,7 +1563,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, "requires": { "readable-stream": "2.3.5", "safe-buffer": "5.1.1" @@ -1572,20 +1571,17 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "readable-stream": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -1600,7 +1596,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, "requires": { "safe-buffer": "5.1.1" } @@ -2012,8 +2007,7 @@ "chownr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "cipher-base": { "version": "1.0.4", @@ -2943,11 +2937,18 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.1" + } + }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "deep-is": { "version": "0.1.3", @@ -3083,8 +3084,7 @@ "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "diff-match-patch": { "version": "1.0.1", @@ -3439,7 +3439,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "1.4.0" } @@ -4006,6 +4005,11 @@ } } }, + "expand-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", + "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" + }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -5653,6 +5657,11 @@ "assert-plus": "1.0.0" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -7174,8 +7183,7 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", - "dev": true + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" }, "inquirer": { "version": "3.3.0", @@ -7781,6 +7789,15 @@ "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, + "keytar": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-4.2.1.tgz", + "integrity": "sha1-igamV3/fY3PgqmsRInfmPex3/RI=", + "requires": { + "nan": "2.8.0", + "prebuild-install": "2.5.3" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -8463,6 +8480,11 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8661,9 +8683,7 @@ "nan": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true, - "optional": true + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" }, "nanomatch": { "version": "1.2.7", @@ -8742,7 +8762,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", "integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==", - "dev": true, "requires": { "semver": "5.5.0" } @@ -9043,6 +9062,11 @@ } } }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -10519,6 +10543,44 @@ "uniqs": "2.0.0" } }, + "prebuild-install": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.3.tgz", + "integrity": "sha512-/rI36cN2g7vDQnKWN8Uzupi++KjyqS9iS+/fpwG4Ea8d0Pip0PQ5bshUNzVwt+/D2MRfhVAplYMMvWLqWrCF/g==", + "requires": { + "detect-libc": "1.0.3", + "expand-template": "1.1.1", + "github-from-package": "0.0.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.4.3", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "2.0.1", + "rc": "1.2.6", + "simple-get": "2.8.1", + "tar-fs": "1.16.3", + "tunnel-agent": "0.6.0", + "which-pm-runs": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -10772,7 +10834,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -10783,8 +10844,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -11895,6 +11955,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" + } + }, "single-line-log": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", @@ -12592,8 +12667,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "sumchecker": { "version": "1.3.1", @@ -12739,11 +12813,32 @@ "inherits": "2.0.3" } }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "requires": { + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.5.5" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, "tar-stream": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "dev": true, "requires": { "bl": "1.2.2", "end-of-stream": "1.4.1", @@ -12755,7 +12850,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "1.4.0" } @@ -12763,20 +12857,17 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "readable-stream": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -12791,7 +12882,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, "requires": { "safe-buffer": "5.1.1" } @@ -12799,8 +12889,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } }, @@ -14430,6 +14519,11 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", diff --git a/package.json b/package.json index b1ce74c5..07ca54ca 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "csp-parse": "github:macropodhq/csp-parse", "deepmerge": "^2.1.1", "fs-extra": "^7.0.0", + "keytar": "^4.2.1", "nedb": "^1.8.0", "node-sass": "^4.9.2" }, diff --git a/scripts/install.js b/scripts/install.js index e13bb7ad..35775ac1 100644 --- a/scripts/install.js +++ b/scripts/install.js @@ -16,3 +16,26 @@ for (const node_sass_binding_name of fs.readdirSync(prebuilt_node_sass_bindings_ fs.copySync(binding_path, installation_path); } + +// Copy the keytar bindings to node_modules/keytar/vendor +const keytar_path = path.resolve(require.resolve('keytar'), '..', '..'); +const prebuilt_keytar_bindings_path = path.resolve(__dirname, '..', 'other', 'keytar', 'keytar.node'); +const keytar_release_path = path.join(keytar_path, 'build', 'Release'); +const keytar_binding_path = path.join(keytar_release_path, 'keytar.node'); + +if (fs.existsSync(path.join(keytar_release_path, 'keytar.node'))) { + const stat = fs.statSync(path.join(keytar_release_path, 'keytar.node')); + + // if (stat.isFile()) { + console.log('Deleting keytar binding'); + fs.removeSync(path.join(keytar_path, 'build')); + // } +} + +if (!fs.existsSync(path.join(keytar_release_path, 'keytar.node'))) { + fs.mkdirpSync(keytar_release_path); + + console.log('Copying keytar bindings from', prebuilt_keytar_bindings_path, 'to', keytar_binding_path); + + fs.copySync(prebuilt_keytar_bindings_path, keytar_binding_path); +} From 60e42cea07e1a0204eff7a9cb0da38e0fe1e23ff Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 18:28:30 +0100 Subject: [PATCH 3/9] Lock at v4.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 07ca54ca..6ea13aba 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "csp-parse": "github:macropodhq/csp-parse", "deepmerge": "^2.1.1", "fs-extra": "^7.0.0", - "keytar": "^4.2.1", + "keytar": "4.2.1", "nedb": "^1.8.0", "node-sass": "^4.9.2" }, From 96b7e8d859c6ffd7ac034506c886b3c5fedb9261 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 18:35:37 +0100 Subject: [PATCH 4/9] Add IPC events for keytar --- common/modules/bdipc.js | 16 ++++++++++++++++ core/src/main.js | 13 ++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/common/modules/bdipc.js b/common/modules/bdipc.js index b687f1a0..e18a1b65 100644 --- a/common/modules/bdipc.js +++ b/common/modules/bdipc.js @@ -112,6 +112,22 @@ const ClientIPC = new class ClientIPC { return this.send('dba', command); } + getPassword(service, account) { + return this.send('keytar-get', {service, account}); + } + + setPassword(service, account, password) { + return this.send('keytar-set', {service, account, password}); + } + + deletePassword(service, account) { + return this.send('keytar-delete', {service, account}); + } + + findCredentials(service) { + return this.send('keytar-find-credentials', {service}); + } + } export default ClientIPC; diff --git a/core/src/main.js b/core/src/main.js index dabbb572..57b39325 100644 --- a/core/src/main.js +++ b/core/src/main.js @@ -13,6 +13,7 @@ import sass from 'node-sass'; import { BrowserWindow, dialog, session } from 'electron'; import deepmerge from 'deepmerge'; import ContentSecurityPolicy from 'csp-parse'; +import keytar from 'keytar'; import { FileUtils, BDIpc, Config, WindowUtils, CSSEditor, Database } from './modules'; @@ -57,9 +58,10 @@ const globals = { const CSP = { 'img-src': ['https://cdn.betterttv.net', 'https://cdn.frankerfacez.com'], 'script-src': [ - '\'sha256-fSHKdpQGCHaIqWP3SpJOuUHrLp49jy4dWHzZ/RBJ/p4=\'', // React Devtools - '\'sha256-VFJcfKY5B3EBkFDgQnv3CozPwBlZcxwssfLVWlPFfZU=\'', // Vue Devtools - '\'sha256-VzDmLZ4PxPkOS/KY7ITzLQsSWhfCnvUrNculcj8UNgE=\' \'sha256-l6K+77Z1cmldR9gIvaVWlboF/zr5MXCQHcsEHfnr5TU=\''] // Vue Detector + `'sha256-fSHKdpQGCHaIqWP3SpJOuUHrLp49jy4dWHzZ/RBJ/p4='`, // React Devtools + `'sha256-VFJcfKY5B3EBkFDgQnv3CozPwBlZcxwssfLVWlPFfZU='`, // Vue Devtools + `'sha256-VzDmLZ4PxPkOS/KY7ITzLQsSWhfCnvUrNculcj8UNgE=' 'sha256-l6K+77Z1cmldR9gIvaVWlboF/zr5MXCQHcsEHfnr5TU='` // Vue Detector + ] }; class PatchedBrowserWindow extends BrowserWindow { @@ -131,6 +133,11 @@ class Comms { }); BDIpc.on('bd-dba', (event, options) => this.bd.dbInstance.exec(options), true); + + BDIpc.on('bd-keytar-get', (event, {service, account}) => keytar.getPassword(service, account), true); + BDIpc.on('bd-keytar-set', (event, {service, account, password}) => keytar.setPassword(service, account, password), true); + BDIpc.on('bd-keytar-delete', (event, {service, account}) => keytar.deletePassword(service, account), true); + BDIpc.on('bd-keytar-find-credentials', (event, {service}) => keytar.findCredentials(service), true); } async send(channel, message) { From d53afe2538e0c467aee126a91b54cf07eb25d077 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 19:40:45 +0100 Subject: [PATCH 5/9] Add an option to store the master password in the system keychain --- client/src/builtin/E2EE.js | 74 +++++++++++++++------- client/src/data/user.settings.default.json | 7 ++ 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/client/src/builtin/E2EE.js b/client/src/builtin/E2EE.js index 7ca77efc..eea8ad54 100644 --- a/client/src/builtin/E2EE.js +++ b/client/src/builtin/E2EE.js @@ -12,7 +12,7 @@ import { Settings, Cache, Events } from 'modules'; import BuiltinModule from './BuiltinModule'; import { WebpackModules, ReactComponents, MonkeyPatch, Patcher, DiscordApi, Security } from 'modules'; import { VueInjector, Reflection, Modals, Toasts } from 'ui'; -import { ClientLogger as Logger } from 'common'; +import { ClientLogger as Logger, ClientIPC } from 'common'; import { request } from 'vendor'; import { Utils } from 'common'; import E2EEComponent from './E2EEComponent.vue'; @@ -35,33 +35,59 @@ export default new class E2EE extends BuiltinModule { this.encryptNewMessages = true; this.ecdhDate = START_DATE; this.handlePublicKey = this.handlePublicKey.bind(this); + this.fetchMasterKey = this.fetchMasterKey.bind(this); } async enabled(e) { - try { - const newMaster = await Modals.input('Open Database', 'Master Password', true).promise; - this.setMaster(newMaster); - Events.on('discord:MESSAGE_CREATE', this.handlePublicKey); - this.patchDispatcher(); - this.patchMessageContent(); - const selector = `.${WebpackModules.getClassName('channelTextArea', 'emojiButton')}`; - const cta = await ReactComponents.getComponent('ChannelTextArea', { selector }); - this.patchChannelTextArea(cta); - this.patchChannelTextAreaSubmit(cta); - cta.forceUpdateAll(); - } catch (err) { - Settings.getSetting(...this.settingPath).value = false; - Toasts.error('Invalid master password! E2EE Disabled'); - } + await this.fetchMasterKey(); + Settings.getSetting('security', 'default', 'use-keytar').on('setting-updated', this.fetchMasterKey); + + Events.on('discord:MESSAGE_CREATE', this.handlePublicKey); + this.patchDispatcher(); + this.patchMessageContent(); + const selector = `.${WebpackModules.getClassName('channelTextArea', 'emojiButton')}`; + const cta = await ReactComponents.getComponent('ChannelTextArea', { selector }); + this.patchChannelTextArea(cta); + this.patchChannelTextAreaSubmit(cta); + cta.forceUpdateAll(); } async disabled(e) { + Settings.getSetting('security', 'default', 'use-keytar').off('setting-updated', this.fetchMasterKey); Events.off('discord:MESSAGE_CREATE', this.handlePublicKey); for (const patch of Patcher.getPatchesByCaller('BD:E2EE')) patch.unpatch(); const ctaComponent = await ReactComponents.getComponent('ChannelTextArea'); ctaComponent.forceUpdateAll(); } + async fetchMasterKey() { + try { + if (Settings.get('security', 'default', 'use-keytar')) { + const master = await ClientIPC.getPassword('betterdiscord', 'master'); + if (master) return this.setMaster(master); + + if (Settings.getSetting('security', 'e2eedb', 'e2ekvps').items.length) { + // Ask the user for their current password to save to the system keychain + const currentMaster = await Modals.input('Save to System Keychain', 'Master Password', true).promise; + await ClientIPC.setPassword('betterdiscord', 'master', currentMaster); + return this.setMaster(currentMaster); + } + + // Generate a new master password and save it to the system keychain + const newMaster = Security.randomBytes(); + await ClientIPC.setPassword('betterdiscord', 'master', newMaster); + return this.setMaster(newMaster); + } else { + const newMaster = await Modals.input('Open Database', 'Master Password', true).promise; + return this.setMaster(newMaster); + } + } catch (err) { + Settings.getSetting(...this.settingPath).value = false; + Toasts.error('Invalid master password! E2EE Disabled'); + Logger.err('E2EE', ['Error fetching master password', err]); + } + } + setMaster(key) { seed = Security.randomBytes(); const newMaster = Security.encrypt(seed, key); @@ -300,8 +326,11 @@ export default new class E2EE extends BuiltinModule { component.props.readyState = 'LOADING'; Logger.info('E2EE', `Decrypting image: ${src}`); - request.get(src, { encoding: 'binary' }).then(res => { - (async () => { + + (async () => { + try { + const res = await request.get(src, { encoding: 'binary' }); + const arr = new Uint8Array(new ArrayBuffer(res.length)); for (let i = 0; i < res.length; i++) arr[i] = res.charCodeAt(i); @@ -330,10 +359,10 @@ export default new class E2EE extends BuiltinModule { component.props.decrypting = false; component.forceUpdate(); - })(); - }).catch(err => { - console.log('request error', err); - }); + } catch (err) { + console.log('request error', err); + } + })(); } patchChannelTextArea(cta) { @@ -355,4 +384,5 @@ export default new class E2EE extends BuiltinModule { if (!this.encryptNewMessages || !key) return; component.props.value = Security.encrypt(Security.decrypt(seed, [this.master, key]), component.props.value, '$:'); } + } diff --git a/client/src/data/user.settings.default.json b/client/src/data/user.settings.default.json index fc60504a..546b9d66 100644 --- a/client/src/data/user.settings.default.json +++ b/client/src/data/user.settings.default.json @@ -235,6 +235,13 @@ "text": "E2EE", "hint": "End-to-end encryption", "value": false + }, + { + "id": "use-keytar", + "type": "bool", + "text": "Use system keychain", + "hint": "Store the master password in the system keychain", + "value": true } ] }, From 5868b4f0f93b0dd0e8de978b809ab7450bc4d974 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 19:50:09 +0100 Subject: [PATCH 6/9] Use a different hint on each platform --- client/src/modules/settings.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/src/modules/settings.js b/client/src/modules/settings.js index 91f436cf..84db1674 100644 --- a/client/src/modules/settings.js +++ b/client/src/modules/settings.js @@ -13,6 +13,7 @@ import { EmoteModule } from 'builtin'; import { SettingsSet } from 'structs'; import { FileUtils, ClientLogger as Logger } from 'common'; import path from 'path'; +import process from 'process'; import Globals from './globals'; import CssEditor from './csseditor'; import Events from './events'; @@ -39,6 +40,12 @@ export default new class Settings { return set; }); + + // Set a hint for each platform for the use-keytar setting + const useKeytarSetting = this.getSetting('security', 'default', 'use-keytar'); + if (process.platform === 'win32') useKeytarSetting.hint = 'Store the master password in Credential Manager'; + if (process.platform === 'darwin') useKeytarSetting.hint = 'Store the master password in the default keychain'; + if (process.platform === 'linux') useKeytarSetting.hint = 'Store the master password in libsecret'; } /** From 21c8c6d267b2358de08ecdd4e5f483007a937f53 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 20:00:52 +0100 Subject: [PATCH 7/9] Update gulpfile to copy keytar bindings --- gulpfile.babel.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/gulpfile.babel.js b/gulpfile.babel.js index 042c796f..4d6cd488 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -70,18 +70,31 @@ gulp.task('css-editor', function () { ]); }); -gulp.task('dependencies', function () { +gulp.task('node-modules', function () { return copydeps('.', 'release'); }); -gulp.task('node-sass-bindings', function () { +gulp.task('node-sass-bindings', gulp.series(function () { + return del(['release/node_modules/node-sass/vendor']); +}, function () { return pump([ gulp.src('other/node_sass_bindings/**/*'), copy('release/node_modules/node-sass/vendor', { prefix: 2 }) ]); }); -gulp.task('build-release', gulp.parallel('release-package', 'client', 'core', 'sparkplug', 'core-modules', 'index', 'css-editor', gulp.series('dependencies', 'node-sass-bindings'))); +gulp.task('keytar-bindings', gulp.series(function () { + return del(['release/node_modules/keytar/build']); +}, function () { + return pump([ + gulp.src('other/keytar/**/*'), + copy('release/node_modules/keytar/build/Release', {prefix: 2}) + ]); +})); + +gulp.task('dependencies', gulp.series('node-modules', gulp.parallel('node-sass-bindings', 'keytar-bindings'))); + +gulp.task('build-release', gulp.parallel('release-package', 'client', 'core', 'sparkplug', 'core-modules', 'index', 'css-editor', 'dependencies')); gulp.task('release', gulp.series(function () { return del(['release/**/*']); From 5fa964ed506ef75b2c5cf094cb31ab5b8d482198 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 20:21:20 +0100 Subject: [PATCH 8/9] Install libsecret on Travis --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index b9a8c60e..61349451 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,3 +6,8 @@ node_js: branches: only: - master + +addons: + apt: + packages: + - libsecret-1-dev From 6c14f80791e9fbee38bb61791e0368678c0b5e26 Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Thu, 23 Aug 2018 20:26:23 +0100 Subject: [PATCH 9/9] =?UTF-8?q?Fix=20=E2=80=9CUnnecessary=20'else'=20after?= =?UTF-8?q?=20'return=E2=80=99=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/builtin/E2EE.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/builtin/E2EE.js b/client/src/builtin/E2EE.js index eea8ad54..34b184f8 100644 --- a/client/src/builtin/E2EE.js +++ b/client/src/builtin/E2EE.js @@ -77,10 +77,10 @@ export default new class E2EE extends BuiltinModule { const newMaster = Security.randomBytes(); await ClientIPC.setPassword('betterdiscord', 'master', newMaster); return this.setMaster(newMaster); - } else { - const newMaster = await Modals.input('Open Database', 'Master Password', true).promise; - return this.setMaster(newMaster); } + + const newMaster = await Modals.input('Open Database', 'Master Password', true).promise; + return this.setMaster(newMaster); } catch (err) { Settings.getSetting(...this.settingPath).value = false; Toasts.error('Invalid master password! E2EE Disabled');