From f1b697ca09fe7b08830a5069f0baa60655fbe14e Mon Sep 17 00:00:00 2001 From: Kylart Date: Tue, 25 Jul 2017 16:53:26 +0200 Subject: [PATCH] Fixed a bug where KawAnime dist could not be started from another path Wip on nightwatch paths now use __dirname --- assets/App.vue | 5 +-- dist/.gitkeep | 0 main.js | 37 +++++++----------- nightwatch.conf.js | 1 - package.json | 11 +++--- pages/index.vue | 6 +-- static/favicon-32x32.png | Bin 106966 -> 0 bytes static/robots.txt | 2 - static/sitemap.xml | 9 ----- test/nightwatch/main.test.js | 65 +++++++++++++++++++++++++++---- webpack/setup-dev-server.js | 4 +- webpack/vue-loader.config.js | 2 +- webpack/webpack.client.config.js | 1 - 13 files changed, 86 insertions(+), 57 deletions(-) create mode 100644 dist/.gitkeep delete mode 100644 static/favicon-32x32.png delete mode 100644 static/robots.txt delete mode 100644 static/sitemap.xml diff --git a/assets/App.vue b/assets/App.vue index 9190a57..8ec4a9a 100644 --- a/assets/App.vue +++ b/assets/App.vue @@ -3,7 +3,6 @@ @@ -35,7 +34,7 @@ class="ripple" ripple :to="subItem.href" - key="subItem.title"> + :key="subItem.title"> {{ subItem.action }} @@ -45,7 +44,7 @@ - {{ item.header }} + {{ item.header }} diff --git a/dist/.gitkeep b/dist/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/main.js b/main.js index d76d857..e338a2f 100644 --- a/main.js +++ b/main.js @@ -7,7 +7,7 @@ const express = require('express') const compression = require('compression') const resolve = file => path.resolve(__dirname, file) const { createBundleRenderer } = require('vue-server-renderer') -const redirects = require('./router/301.json') +const redirects = require(path.join(__dirname, '/router/301.json')) const isDev = process.env.NODE_ENV === 'development' const useMicroCache = process.env.MICRO_CACHE !== 'false' @@ -17,7 +17,7 @@ const serverInfo = const app = express() -const template = fs.readFileSync(resolve('./assets/index.template.html'), 'utf-8') +const template = fs.readFileSync(path.join(__dirname, 'assets/index.template.html'), 'utf-8') function createRenderer (bundle, options) { // https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer @@ -29,7 +29,7 @@ function createRenderer (bundle, options) { maxAge: 1000 * 60 * 15 }), // this is only needed when vue-server-renderer is npm-linked - basedir: resolve('./public'), + basedir: resolve(__dirname, 'public'), // performance runInNewContext: false })) @@ -38,14 +38,14 @@ function createRenderer (bundle, options) { let renderer let readyPromise if (!isDev) { - const bundle = require('./public/vue-ssr-server-bundle.json') - const clientManifest = require('./public/vue-ssr-client-manifest.json') + const bundle = require(path.join(__dirname, 'public', 'vue-ssr-server-bundle.json')) + const clientManifest = require(path.join(__dirname, 'public', 'vue-ssr-client-manifest.json')) renderer = createRenderer(bundle, { clientManifest }) } else { // hot reload - readyPromise = require('./webpack/setup-dev-server')(app, (bundle, options) => { + readyPromise = require(path.join(__dirname, 'webpack', 'setup-dev-server.js'))(app, (bundle, options) => { renderer = createRenderer(bundle, options) }) } @@ -55,17 +55,11 @@ const serve = (path, cache) => express.static(resolve(path), { }) app.use(compression({ threshold: 0 })) -app.use('/static', serve('./static', true)) -app.use('/public', serve('./public', true)) -app.use('/static/robots.txt', serve('./robots.txt')) - -app.get('/sitemap.xml', (req, res) => { - res.setHeader('Content-Type', 'text/xml') - res.sendFile(resolve('./static/sitemap.xml')) -}) +app.use('/static', serve(path.join(__dirname, 'static'), true)) +app.use('/public', serve(path.join(__dirname, 'public'), true)) // Setup the api -require('./server')(app) +require(path.join(__dirname, 'server'))(app) // 301 redirect for changed routes Object.keys(redirects).forEach((k) => { @@ -92,7 +86,7 @@ function render ({url}, res) { res.status(404).end('404 | Page Not Found') } else { // Render Error Page or Redirect - res.status(500).end('500 | Internal Server Error') + res.status(500).end('500 | Internal Server Error\n' + err.stack) console.error(`error during render : ${url}`) console.error(err.stack) } @@ -129,11 +123,9 @@ app.get('*', !isDev ? render : (req, res) => { }) }) -const port = process.env.PORT || 9200 -const _APP_URL_ = `http://localhost:${port}` -app.listen(port, '0.0.0.0', () => { - console.log(`> server started at localhost:${port}`.green) -}) +const server = http.createServer(app).listen() +const _APP_URL_ = 'http://localhost:' + server.address().port +console.log(`> server started at ${_APP_URL_}`.green) /* ** Electron app @@ -162,7 +154,7 @@ dialog.showErrorBox = (title, content) => { } process.on('uncaughtException', (err) => { - console.error('Uncaught exception occurred in main process.\n' + err.message) + console.error('Uncaught exception occurred in main process.\n', err) }) const newWin = () => { @@ -223,6 +215,7 @@ Electron.on('window-all-closed', function () { // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== 'darwin') { app.quit() + Electron.quit() } }) diff --git a/nightwatch.conf.js b/nightwatch.conf.js index 68e465c..97c2fca 100644 --- a/nightwatch.conf.js +++ b/nightwatch.conf.js @@ -2,7 +2,6 @@ * Taken and modified from https://github.com/dwyl/learn-nightwatch */ // require('env2')('.env') // optionally store your Evironment Variables in .env -process.NODE_ENV = 'KawAnime-test' const SCREENSHOT_PATH = './screenshots/' const BINPATH = './node_modules/nightwatch/bin/' diff --git a/package.json b/package.json index 86fdc46..7b19362 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,11 @@ }, "license": "MIT", "scripts": { - "dev": "cross-env NODE_ENV=development electron main.js", + "dev": "NODE_ENV=development electron main.js", "dev:server": "node assets/serverStart.js", "start": "NODE_ENV=production electron main.js", "bstart": "npm run build && npm start", - "build": "rimraf dist && npm run build:client && npm run build:server", + "build": "rimraf public && npm run build:client && npm run build:server", "build:client": "NODE_ENV=production webpack --config webpack/webpack.client.config.js --progress --hide-modules", "build:server": "NODE_ENV=production webpack --config webpack/webpack.server.config.js --progress --hide-modules", "cloc": "cloc $(git ls-files | grep -vE \".mkv|mp4|lock\")", @@ -35,8 +35,10 @@ }, "dependencies": { "axios": "^0.16.2", - "compression": "^1.6.2", + "babel-core": "^6.25.0", + "babel-runtime": "^6.23.0", "colors": "^1.1.2", + "compression": "^1.6.2", "express": "^4.15.3", "horrible-api": "^1.0.5", "lodash": "^4.17.4", @@ -48,14 +50,13 @@ "vue": "^2.4.2", "vue-router": "^2.7.0", "vue-server-renderer": "^2.4.2", - "vuetify": "^0.14.5", + "vuetify": "^0.14.6", "vuex": "^2.3.1", "vuex-router-sync": "^4.1.2" }, "devDependencies": { "autoprefixer": "^7.1.1", "ava": "^0.19.1", - "babel-core": "^6.22.1", "babel-loader": "^7.0.0", "babel-plugin-add-module-exports": "^0.2.1", "babel-plugin-transform-runtime": "^6.22.0", diff --git a/pages/index.vue b/pages/index.vue index 17619e7..0492989 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -191,7 +191,7 @@ console.log(`[${(new Date()).toLocaleTimeString()}]: Opening modal`) this.modalTitle = title - this.modalText = text + this.modalText = text + 'Blabla' this.modal = true }, @@ -204,8 +204,8 @@ axios.post('download', { name: name, quality: quality, - fromEp: -Infinity, - untilEp: Infinity, + fromEp: 0, + untilEp: 20000, fansub: fansub, choice: 'si' }).then(({data}) => { diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png deleted file mode 100644 index 91155ba6a71f140e8ff99893d88161ce4a4929aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106966 zcmeFa2XIyCl`e|wzIjuwsi_&inS1@_jXfUEv~SzjZBKWD!pVw&2m&NTrfG7{Ip+)# zAP^|$fN};DKmvpSAq0pllu=G3HHgDzy>I>dZ0R7RZtQM6-KJHwYM*?L_P5rz;{WeH zeSXsC|L(JCQy(1vz0Ys|@h5#|^y$;b#>RBtp-&%oJof3Q^8H!=yHB6=k$C05o1Xt! zpFaP#_RahK_x+^LKmMcX_5W9&J`4PR(&xAM%uNt{iTEDA+0!2p{p5YghPk%(g{K{p z@=iD;;I<)3sAxB0#z=hGdM%;hZZpG~*xl2qHIvnDwmW0!O?*dggekV8^>fFgFd z4e_^2O7*u*^4@Al8au#{G-iNpQka)TQhG$cq|}Jddlh~@J(6Ezk+gr6F3Ed^V^YLc z$WDi(m_vr7L?2yJia#Vkmvk~hmo&jin=nkLP8i+akPzk}KbPpINn(ljQzymySSJPT zvyL2LY5z}sqND%E`#QHjgwLJWU;pde6nnaG(w=6x+DV>U?IKg5$ZL~<#yi>4nEtjDanyoR z!~1@Xd``)seaUyHijJ%?P`tOAl7p@AdP_==u%Prv3px>LDI`6@lCol~$i<+g*=|~V zmzLs>YAF7ghT@K?Au5XVw#H{z(UC2xJ5C=t{p}9{qxbzAlS1rnG5)J&*h)*rJJQ_I zcC=!KL7L!XPkYzCi8{9{_bRt4cC!?*%XRk`Oe@9yi z_cFtu@dfS)uu=aFwsdH@4J8Kh^Uwzq_FvBxeJLTR9}QNiX~!ZB#drdHMGl+r_fmlq zR5Z&)Kl6uz&-?zJYo-`%&zW&~{wZ6^jJ2UJhuTR?Cc__`=;C?CU*UQMcjb6G-ascq zZ7Dq%dJqCG2s6;BNF98M8e&Z+k6Q`8KDNuMlmBJ>fiEzQ2kv3pZ0Xo)TZ;Cwf{njB z?uuT79_~j@R%$xD9{3*u{*Y+s085Og3S6L~pzZn&{U7vyc;Dyshw}MToHc)+9Bin` zO)mHuAJEcq4-FkZpb@x-Y_+A}O?DKyM^AfJsJ#CY=k$m49eY>m zhUF&9eq6!YbBhg47-T1%PiGtNvU79H6?^Xqcjo)<*t35>w!?~$pCL}u(9yMs>3uk! zXI$A2yoqnm_vM@*5&FV$VS>LU@V6Aloy)Cg=|tGPhnB*3>nUW5Ed_0`2llqOjd;Sx znnv~44*elv^OyLoZVnFrkQ%P9QMjCsVTTPgZh*a%6({q$V&@9x%=7Ppds+ne895xs z;9)y#=+H7-at8jxby|GKH|2kdUVJWdd~iR3dAy&DH)GFs&w7v&WJ#kORJ3ij4S6n? zaSz&PMY}_Y*OAIB*Z!F3Zu?HZ;;sFZ_Ri$JgP{n8ViL*V)z?^EYs3>;?WZ z2kcs4AQ!Ekj;*p2TpzsI7PvF^GXBgno93&te`vV;rGD?`1v-1+3wxJ+cy@w@CJ(ct zLtC{*#iuKHD{-9?+nMvc;^$+LYlZKGf5-V(@aOvxhpcF{qYaHk{O7y3C;Wjs_(Je| zZT1TAAKH6Q=baQRFAUhiG%?U}KRv7EDQTc)8oV+`N~)L0S6D|T*%{_>S}X34;tY2KApK+bso#jBySHMp7ED;z|7YxI)HdT z;)n(9Uu>XY_;`-*23cE@7iz?^-OI<2Z3c?*Lj4dtvSp#_)_kWQYrbEnPYcFb{RXvl ziScC#K4eL5c6P?3Pzy=6Z@KoG8g5p%L(I;$%jcQTeJAdWzsdHvhMx>u<=1h3KWV5A zF@Tm1Z$eETxW_Z*-Nl5z@cE{Ak8g9X=eu3i;fXjhXoDSv?$8VUakaVtCfTm1SpI&zH*lX7ZJ4WZ{1M}C?j^6Brk*uT#X>uQc~e#HNq@gL)$|19zl zaKU+FY&|wvg0J<)p73Wr=iHm)YlZt`;RoKrz8klXwA0XVy+-5$Z}GnJ+D;v?r0@gi z|1Ptmpv^WE$#p$Z*X7!-EZpOpHe4%yL-1B`&`urd0>}%IH%5c|k8V?M{}KCd#-7j7 z7bEQdDb(HiX&h`i7X8ww!&WpxZ;;Sik>nbk+^=Em*{_S&0RL#zcj934B97~Y(>cD2 z#OE>g%>QiD{Fu2Y`XE0B?DuNPXAOFV@F$TTsN)0wC>+_oSy%@`(Nmr>L`T8kpP(%U z@jDW^E)4ub4_ZE7JW2EWAMt-T{Qvm#{(tAUOI6MIvm^k^iGwuK+F5E!MEuSERA3C> z%Knu_#=HxAa~&|pmT!A)wKf8OiQ_fqnC{Pu`}j`QrQmIP3Wgt#a7P{A9oX{`_{-9z z1MaKTv}CM7@IyFa0)aj757=i(LHjLF{fPa$VbAC3Bh1D4@3Ow7;Lq{fl1XZ5!XT~C z1?6#Z?8IKtfo{icw$0dXS)?*D|GU|1MBMlW{wCa+v;8;gVf&1GH(~sR9xxZkIxuY* zdj7L)$$z~qat@ua`{S4`3Pb)fZ@k9oNBrL%f9{QXZ&MYS<9uM9N*bm|PvwBj37yaN zhQETlz!N%Qx*v<=d6FLxm*qZ!yThW1a*2QjaZvW#){NEjaK398JsrW($5$Ek1MzJD`mpkcM| zMtz6hCLINC1@7D7PkNBZ!mUDUto{uv*_{r~!f-M?;IqAKK^k9{=fePah`Y2PZ$ z(wgJUx6Spy%-%aWr1LTKU~Ozr|Fy-Ork)P0LN0$$CG)*mj2CX=f{-01yJze->4h#R zc!j`5!}qHx81uy2mRL~)asi(EJF-;ffCGzd2)beX?Z4Xp6XV5k?V!H;Ka4WykMCZf zCy!-%I0FG z!4E{D_7{DG<4m6QLC+U?eR7E0bLy-|p-#=YL(EZ2Q77bD;n7t#bY!K02K2Laojg!K zY0mgg9i~8 z99Uv#m_Jr?ob`w63BJJHXC1^0fA#_X;D7-50f9f;zDWld{|Mx~K?nO~eyALv=)`aT z-u|DKPt}A+^I8hnax7v(QSSv_j62tIW4K<7o(%hNj;Xvc%YSI01MQlD+zfFZ&ubi9 zuM)QJ=Aflr%h0<)tw+pqz^1=$22{oyHD^=ZnQMGud)0Jwr47~$U|ktz{tg3sPYBn7 zrVcio)BGRX--jNuY)Zg7lAxW?4-@vX4nQB60~mk70mv=3LV&qB2k`q6g8H^&PX1%% zTzsfU$4~XY@!epM{E>fg4i*JJyMKsNgr`bzy=d!2iqztP_mq zuGzNazR0F}qNBmh53>S^&^wQn=p(Gh%sIRa?jPUAr=0lDF=C~Th0^<(0Z^m0W?w{pATfcY!cLG{t#1O&I7%t0%#~%rMaA=>}T;g>`;^M9?K@K7k-d-@2dLDYmNS~z?}JgjsxwS=0F=KqRuwoM#SyC z+vZ#NqxPqh@psirr(zWRKSxesfmq&J=m5ur!neQ0^X8uipAT+k>?05ttefsa(_KcQ zUpzJWvECCkpdDDNzIOUl%$5x_;XlB1bfT@Z4FYS%yHhr3 z$(K3bWbceI3)?zl-dzWRp${8os6V*%1H4a0h-cqhY>!+A;+-+WHhaf^-CVVi z@gF+?`$8b^iwA!z^IE)yKS|_*J-=VkH-SC+M$FHL5F5@JF^m>Xm;k$%aUbJ25bKw~ z0nmqCsP`QM_Oc)kV7}iX+dSj%555lo*9&3%O*$a-z{CTr51wl@xgVPS^Z)C$qu+k` zZIi8k9WL+o-1glENG+kbDL1%D5&2m{}HuF%nzsfh7LJJ8bc zV=$-aEZh7b)`7t^Y4Bk5Er-zdd5pi7yy5G8!SyVRzYyT>XVL+GMF-gLoAe+Ed(Q;z zg6vkIC!~@-`$+dcKQtX!KUb|v3IDv;8Sppbv7T{bj^{j_ZQWzN73PU#{39`^!+7%J zoWFB@r}xi8j)yqkYn_(1Ofx`iX!jf&nlxZAO-0-{exPjo?ElB%_P7B~0{;z&1CIiK zAK=fn?}L2Odn48hU`F8B2F#7)zN`z_Zw7nLC_E4#ctAygj6WoJk2R@(Yfyb?_;U;p zcDUcAZ}!P=W7mnh31i0EdzYoaf3ySEXnKPCu_o-BY@X{o0f_H6Pcs;|&oW5v$T#*Q zwp)!DbU@z$;Q9fA`#J7Y;y*r)$NdQdP=j2cBhS@Z6Au7?;C>W(#E*Hb(9pi68p&gs zMmo9yI)GZGA4KqhNe6;q{|DEq&;8K$j=;Rl>YeE2B7RNUG)uRA{wVEO%Ws&A=t;jf zFR+@(xm)kH`8M`!%ZhFDQISA*3u*j78?4#DT7hFcSN!&S`7zcVju%7St!UR=J#5`T z?h9FLgd9MfXE>I147TbIKi^;2KjW|H0OPNSo816u-87wqzP_+=-z{pP1AJtgXRP^n zY!m!E`VxoNf*Up>@5A#f+ZU*7hO2*A@&A&^)}vDqOLGmIYup^ehholw>z!CPS-NGG z&UduI;P%P?r~l;$t@giW4cEpSkOS^rtff6B zdq1!gc(2rnUV`w~@ZIdQr#cU$Nr>}CIXWVj=v@cK;CcUTDq-IN+eI8F?sL5;)C_aR zKNM?{SVH)S7?btDZ>KfQbk$UT^2;BN{eS7KaZC#CD~0WY&YLh-@IQi{%t7=+xaP$@ zFV+bbzR!AbY^{!V%+DXvb_l_J2dYVToS&Xn{G`Xu!`(Znkrg4ttahAy->RP{lkd=HqE#8tqT7B$a%Q7 z$$c%ZX9(GiBZO<6z8n{$E^-k3>VdV@llmJ{7P#6>`s~+szf$yIx~tli@#oKmewq9` z>Ne=vha(?1*MpvJvu*?(VE(tEQTDdP`12alNG}W8wL}fR#~w`!_3*c2;e-22hn9n{ z%<{27Q$99hgd^hnftV$*hy6PsmT(YyAap=*!2l5tDE?sac=URqKi-%*VLlH)Jl}=2 zIqu4BGyI_k%mW;U>|dn{R?fxu_1Fh?x^JCT5#uB3TgY#N;Oj!c1!2r<=#jC6@ez-) zgrJ7Tb&zB0bhOY-FCAQFpq;a@UmE79ILBHw!BArJiT>zpXG8G8HJAhDyxrvAne%rq zbL{8|Z}Z3G9Ir2hAm-;iV6nECV*L8jz7;BI_d=~C@^Zx8Y@2>tdEMS33O~HtxNnhG zV%`pfFAfA3?^>+E9s*9}V(UO|*rSGJl!LhrnEZj69*lLgr^9PBL~S(5i`giR-6){>^cXJYpqztQ`sb-}D3KuTijPj^}-U1pfAV za?xp}K*U*W*Fu1Oph<$TSET30>C(CEv&Q{P?TpH6rVV!he+@*!z|0>g zeBfr^pLWi}%*g`yI_Od`d_7B-59p46&w4Otv_YCaVkpfY<#uo4z~NK-|FQqyecyP% z?ss;-3iY&T=b8n_xSYE(?xL3g4rHu5vB%^59AnSE)fYZu>kK_@o+{^B`{tvEhT8|> zkJ zZJTXh!Jls*UZ};c z4@BG-gqWW>K+yxf&yRNs$Nsn9kd#vzUE3ALAL~qfarVbxUOU8{x&2co%bsc$Y zjNQuVy51NyJGijTkL23kQW_XhPo>HrXtr~ zggGfZrabQh-??czdOzNB-7YbxFZKypDIH!r=nYO#Y(Jj!e!Pa`MBe|8ZQmDmy>AWg z1EmEnShoo~K371Khd9Eo4+#Jnj!+9hlv13H(_H zOnM;A8sU1&MdLL3`=A3>9~mYdScREJ%(D1%e9tv*6ZT5|n{8QO58D&i!uB~n;^(27nI;cE_GknDYrgXh~rQS+C1>Z02*$v6~cBu!Up@5<7h5ICro4DG(#=o0*tWnW?w^6`*)LS~B@Bxm}bZ3{$p(-Z>$KroUJyo6E7IPF@%;;*cuP$FRL4_m7`LbLpf5#W?@u>-oixS~dHy;pDe8zNbr)G5(0BG+M`xo?ihORU))w3k{B2}RU4Sdw zf0xM5^K1CI5wwn|$yZ5OF@TH@9-$rE*$L>eo zi~rPdwW#^-p06|R2Sx`F>+yW8H~juFwteOT2=~Oc&X#jC=D-8c6+iGa_u)8)^LNJ@ zjnGdhFXs~7D5|E)Dv1j6?_iCGwZNWjpL1r$o?ovB>j7gQi}-Pxiv~3t9oCkrj9s`Z z`16rU8Go*iG5&|wsc9o(okLio$HH}!WE1v`WgPr_sORtL@`Yl0 z@SvT_D>|sUnkXUEpY|?99RW2~CH7OW=Of3Ak>L7h#0iVASNGTfI$HFFT8crf;!PcZ z?E`;)-Td)7!S`&#EW-?X8l=%n&NvE;6|BWk#+z{;3K^o)k&{LX9pD;APxxcM3Gn~+ zMJihQr3y17YUrdIbwxF5%e+sywd7=Nfpx1EG-g0QTob_p`R4#yG{)_ne1L+za^#$G z!6>(<;~boisz3Vf`w7!V7#vSTY1$R6dp^SNBSzS_5ZpUcC%MB`8837EkE~bI)>*QC z?3s_X@tzivV*89^I{H9?2R@~&v@EHj@-=h}t&s@(s zuy&S88aGhKdqMPye;}?G!F)f!S|{)vq}EGLD#lgDmoYXM#=E;XT4`wX0IqR#;U9<` zl>PgPDQa+w8v9YHfH{kdz4_6_#+nAJacvP*Um-4tKj*w-48XXvpI})uW)#hHa}~TG zY6l}nJ|1f~bf?9C>VNrN^1Wy=z+4ob4Ij=cB99(bDj?McG&q!ng130 zXZ)cXv>!fv-%6FKcGJb<9Qz&If_*|`4|g!`id0k*xZoKb+d4t?2h43h4tW9N&VD@- zvU7#Cuz!vN6`$Y50kZ8c{!$~b9;kX7*X}s?bf4enU}a6?2QmI~EX#VZ1M3(^Iq*J2 zjCaqto9lq9t%`qG-`#B4vdQ|mw1}?#+7;aSsO;w+^=QnojAX?0J@x0(7#$s4qr){5w3r7$T?c+% z!G9O#CDwk4naN#mui;`W!;rrp0>^JzsF7|JH^Ba1Qx)^SBGs=cDfakIb}X~q@4nV>EBXlL-mykb)v7Pfu%0pEmo_vcw(c;1ZhpX@w@=D3cag+0^+yJN55%v`WwGz1)= z!~+}~zz0nJHrVrfy>{5&yKushPDR*Zoi?t0;EBFB_Q(#{t?N+-vSKk8kM-|+k?-$A zJg^`A5%;C25zN%Qk+YlgIA-=lABFew-?J3^H5}2>?HiR;e(y2#zzC5#^&l%HisJk} z?Znoc;~DFP6XYCV?QGNzai4`_{*}}8Wcx=u*#4jA_Xlfbzb|8NEnwJ8f@UZ z9B9%I%%2Z)HtB%dTX}y^cq@;w|3@#mUHex5!v=qnb)k z53DHvO6b7Dn&-%`2b=i+?Hu0^eIdq$_ZEsi+E3`o+F4l7L-V1NpG zfE-|qqaOa+R`>w6eUAMV{Q2l&!`CM3hwD@I!*%2=k@Ep(wHCKE;+j=_-7@Z14_3jS z^i?BvMQs^%#<7?~;#sum!%aGX+JJ)ZyBwzu9pU?Jd0%<|$*2J}mof+9x_tv=9XJ6U zIF30RFI*4dAojX~4ul<0;=wK+$cP61hym83M-qdcj(M)Ha6i}VF{eWZkSp@6C;Ne5 z_-US(4j0$*`Y-tH<;DlVKQHw(J$(3*YHE$-wQ-{88FjaPrM@$9uogZT`!C_zfKf;K z(QH>|v36%LW&{L|z)->S&pi%84QQg14b5@0!(QRM_DqMI-xAnb&?u}QnKfY^ty#2} z4(*Jk;G^d#CgcWfS>Y{mK4%^DLT@R=S!aQ3jUbQzM;93bF^&GbJ(I(6b9`k7U9GO>!b zt~v^iXWSWoSqGRCxVFeOXT~3OX^CS%S%wnpz|0ZDg)iV5;Wyd;tl_TVitTv9h9^?*#*;|%@` zc=n~0ZVSn0PA08#IZC^~I8Fy=UZlvC&9vo7hO zool4s8~nxZa#E?mM>=8m=J=0t;2f|A{GkJ!6U;(h$iARA9+>0m8uwk;y!mHDcn#ct z^MZ^&^FTrNAQ21XAr4Tk-<^YNy>`EjtKth%L$#8NS~qyrOsinO{ryTd&QM2U?@QdvEL8fKaS!(x6rwWAUeL+i}sA&N1I%?&_dTG(&|y0C}6=A zIy5DYJlFNdJdX)?qKjyhVk!(Ll9B7I|hT{8}`&kEu!S=ZZ_%{9~ z4lwD!>|S&Le&0CSF!Vd03&1?gO82$>aorOq;69X!a)*dGK=A>59dG3t&I;zrk!ype z6ScH`iN=@bR({dv&6&oa1O0+UUcmUn|F52GOQ~L7RF;!PS%HV8gd<0!>!&Z%O4n6% zXvt>Ej7&EA><*N+jdG_0le}rom|3E}co?w)V}BGnaBMU7ZdkSc^~6HxCb484-kG}DDpzNHZaHS&6sfd(Bbc8U(un~hWU%f*`vN>N0XdvrA-SQ z;j0Hi2l|T`KyU!A;ojZ;mAWuryFJ=lQ>Xnm?a$14g>U}>k9qI0sA1a=z&>tX>$X#} z*E;O4gdEe$ovQBCQN{fhx_jX&T{s>{W z-Fo_M^WAiH>oMbTXw@V-u+~mGxXOysLxQOaxHI;ZC9Ra?8%)>ET%t#KBm9 zXySl3V?ZSo?o|Dt4Y)T8xsN(< zl3zIVp-JdMc0xJ@?pZ_8{sCBHkC{NM!#fI}e-u2R2;;vVvj9%Ws}BkLmpS0z8Y?L+ zHb$zhdQKOT(x|TC1!j%PX#a*C@Z|%*$Cw9shd6K`>NUas83KF8|6O$;_iPhQ95zw( zpg7idLNA$nN~5u!bR5ne=+Ij#j|{=5G3|Iz<)H`dSW z#NPVByEkHuo)cByYo@9PEG<-B-b!bav!sWWPpGP_4Ue^=mJmgm36T^N;E(lu)*_EQ zf<80PRdMXc!t+%dQ2!rjWhv}ljsdt|_bC-#z9rSvbkNzj6soO#K@V}ewzdP0-=j^7 zR$)JJ@fEsl^IiBPcRni z31l6B9~c5Z@Kzkq4S)Cm_5)LfIv0N1I=?w4=C_CG42vft$DKXWmgcbznCpR}4>&5i zF>{0+ZN)mz^hoA?^SMFT=5{No`&`N=|I6+_dHsyXigB17Uqv|yso?lV6aLL~^YR^f zP+WP0)H zeBjQxeg4IkchZA`!pD@JT1t~$r-}Jto+VavfM?BljS;Uc;(cZ&V4sOez3G5r|G<6* ze84EXL1WD^`z~)|U(HDFYcdD0jn5lpCv$;G4;c3aqwU3GtRGwpo8^i)5q)s?4LmEN z5*%_wO}ORY{Y;zwAye-M(~7U|&=FTwq^Y z`50?`y@6L79b7d~%#=pPiw#vlo#Y_WYCc1ep&8s<5urJ5$tp@-8&L zp#y>sO#YxdA8?J})X9f5ZS+jkd*m5%UPJJP4q$zetONbUJ|i*@yqObp@;~sOGmN8T()E-?*Ud$cA;s!i@7&jdL&LK@;7~yG9(R)dKt4ns(?!6P4bsqO+%R5GVMf zw}hAuGo}4I`cmO=m6%SxGK-7lh_-`6)f27U8nct#l%ITy`|N833 zbRsbhqF({Cx{}`YWode@+ecBNEtTG?qSBIw(w>F3rr825`g-W4 zq1Myi!h%-tj0t)QbKtKyXLZq|4~<%Yg1;y7#DRF-mHg{ea-*DzvHq{-;a9+(b)ZWR zD(}_^{2x|7#kK2`>2l(6=*?dA6r9QLSQeemt`jx>+}s8_i@F}yea~Mo=>hu#lTR>@ z56+&ir_57zG;{nsv4%iiPoVGs*Cge2MQ&JYHVSLYL`-0c2`8erz+52uLZ!0apEtJfk|$s-K9ZhH6yEtM$-B8=(tq>x}sn#0VTGDA+UZii{hm zhb`iLc5mi?dzY=Zs=QZYtf_3H?3lEU>if0u{dH7cTt;P(+PZec=U>s|$LRT0aqL$| zwN-TQg{v14D$d}p1dm}la-Ca$Tt+G2KD#r;aPSZ~9avw!%~408p0o`>Q-xZ#hg zy6*cNo=wl0USIQ+>S~`+Zo(<4x&*ZzaBgWqvB0|l*gtvllG@r3pOrUJePtts`vggg zzUV9QK3Y6mz_TU0c+LbzbDdZ`Rtw%VAh$P2z+YnQg${_?5ch<%(%oBSRB-CFREcA4 z9k2)2$oMlKVAi0d9=h=e{P2_#{oHBmlEqYl`^{ewH9V2%azQgNuNC~CbEf`nK48Cq z_<)6TgqWzS=mRy-jIndy!rxp6I40org{%X-##G?})&ZqPG{MQKPWRb&H{08r9%w$& z{2p`c&qvtp2O$)roozixSpO>Lig{; z%g8-g-vAp2x1UYP68M*0y+swprBq+v4%}bRvu8$Xz-#I&8mYM88sd4(%p<3tH+~?l z`(cm15B7dR{r>>g7AbtdN1i!wMs1a60Cr#=NUXgw%^~wVs_#~;4?VVt%I{ZF$@vQc zV;TQ;=s>%`zXp0)UEVD27oEREUk)Ea4;!9PQ#(;j(^I;1xtt0yn^IYiT=HxKWoM%{ zc^Z5GpTPa!++1*iDMq-E-vYmJTFT6*!`!fgB*y4*j%i`TBZecx^qfSH#r@=P=Sk`(2)J7SjT~$&hklEqYBCs?sT-a06B znb$T9!WtLG-|kZ@kM6(k^7%`?wUvnJFI~o5N1DX8UtWA)@If8)f_0;={wX~ytEWiM zqtdCc5IUEgC)Kt*lb{;n+_No~Ry2^`fiF=1vFwZqdERss&f6r+eXN;o&({Qeqdp{R zMW`7aT0f8;zP&s%_d3w%M- zlNXeK;ifSy`8<^)Pq}{UDP?BVP{yf;;D83x~1t`vN5{ zWE~jYAM=Z9`|oVFt2-vW-Pd7{;^78;fw>O2*R75Vw0sZwtZmT0NfR+eb`19(lhATE)S|{ zd}6XU8GH7_EUW_!h!Ibw1cU3b&k*vxUGuCcC;JRFz=!NXj>vi9Azahl6Ez4HzRk4) zj};curJS6OXOF+4)|Pf^Z2C%Y5BsDpVSRW;aY5lUZ`_xX*ZPf8qPMRU9TG#w4n|W# zT#i)w@R8K;^ffg;drkF^CAx954bn(;xc#8IgFN@eKOd~M@8JGYSI<$VY2jQxIX`*HVk`IorQdjMfw#VuZ6D+FA09saMP{#7UbeEY)12AVr*0sQo5 zo%XN$L_NFvZ#)%|u)6H>6}pj`iP^qWR03W`s1ca#U(*-sQL(o-k_i3+EK+x$9Cp1eWL&%5-o z6}NBStt<@kPjA0=s~-CK8hTJh%jRr`?ZY1ef1v~2IDomJyB;X(&gG+ACvsBRywyYL zeqP__ef=l;U%J@nN=DjQqn3GwDjHr1QS6_O#dn_w?pr=*6LLoMx?%s?-)rBhQ3mcl zII-+vK3zF+QYy&Kl}f<<4UNEF5$HkKeh;dwdrVLTU@6-=+k0>L*S5lb+rFX};J~kA zeojwGlQPo6=}cx6eDX;;5C2`=_?Q|VeI@weTJdAbNIFfe0I#XJotp5*dVDwgpL*b4 z4?SS1D6OF@sY!G$F%5f1MA7bbhdY{{Nu7H6u;CGf1*SJ_-{|jM*f|*ME&3)U|$POh0jkZlF$72cJ*} zOk2JJMo$@!-t{K$>{YsZv!s)I6b@{&9Ttk~R`^NxOKa&) zNi`+Lo}uXQYZQC@7J9+W0(<_x#JFtfOwQe=zW>qpAAW&+dV-_#!U+S0*705=%md0^ z0xq`w;oEsn0!P#`u?MjkA1FHDq%xfPK3p$q@yrcF@0YbnWi>`B$1HXQ>wuyM&;j;$ z@v%jykvyTa)Z3)_-5-s8|3m+W?)ZC){=e%!a{8ashK<@j*?D*q`*vktfnnH7%nkE@qtS2R`6Oq|B@GvP z06sts*6;^|llkZTciisN=cB*P%(!x=wE86}_?Oq3c)+9wcaRI@<=4}dYmafPBlX9h zp8I3BzOVAzk z-+=u`u{X&W@Byz?z>IIclb_o2tbbz_w6_ufnUU0RAt`t3@ ztJfdXwc=+qa=^4<3f|q17ZRevBRvjE%`Hz5dp{CVU)w~*CxOMa2g24F@7utg@xOi( zI#4R>Kv^wObqk5upvlAqz2V#2;|TW!FR-3mLX9UgDvp|4knh0{DI)ZMISEpjdx6R> z7tqCCN5HZ68ojQMK|d|{zbYN8$!1;ljvlCH|Al_b-w=MnG4U~6?f$vC`VVl z>u2ldFG`v_e!Nlf|BU@0l|lOK-)#-b>;Airem-$qODdid+;8*#zQ5A_%jq-4O#=I} z7sCFT`>!L%jf*>v-bSIQd2`>B`yGt?r7QA$Om=p4JNJ^6??1eD?TD>2=glujifTJ| zJOsSj(ux0#ygbb5&y{Z6ehS-t4gdd?t`^>*Cr@9{V@Scdb5sC*xn1&z5OxdvnHQJ~ zSP#nUWWG=^RWRn5QRETO6ZRV%M>40dKJo1`2tR-6%mun~Dg(V|U~2M5=Eu642D%g- zKt;)6bSEo;QjQ(!V9rvw>(ZI?p349EZH^zocPyDS%XQ_9IR#GE4&mSCv%ZV>E?=}` zZ(&gj`rfq^7Icw(kET;f(tXsl^T}gZJRJ|eLhidFY3;Hjl#+Z)Z~*H8_r_13uIaG- zqua;)JKR*NpQigAtqIw^r}R!%5}i$mp_Vp|ty-zM^%0#@9&)7z=+!2>D>o{T%=&s@OAf@{q(rY4*jW7ZWR97`acym=SC z1pL9Vkz;H%7yDxUUZGFpF0nogg@#gjSa0>lj27=(jsC1adbH?3BO&AUFz$a zq&Od3oaS5Fzxn$=`sky-{qN5CG=CiU@%g;F?VQVHW)@R;@L3A-J5MLm<$UMBo<#C= zkERg6B07=WNQd^u2@YWF&z@^Qee`;z5(BTDG-Z5FWQdd>7b)GzN~Ft~8Pwd=Ld}dn zPkim-^Au)(UDty_Id7?VfRF zUAS-wJw4#e!uoI@xH7hk@m&bY3Pz40IG*IZf`#>fb>edVUGxI3Q&CnHeh=es@=MCG zv5hhUkHYuI)0L!1sp8H(YQkg9(37Hzg-N_$f;oPF4Y!xi-8}bk$7@0w7B5k8Wio(beQA zx{X|_xta0DtWRYnT~3Nd&7cH0zMxYX1$1ER7JB{qHF@qiO1Ys+sXS*L6{oJoaV_@u z-9gV@NW!s~1EUT>Z-MaVJ%K!P-bX+xWvs>G9Bi*|D5VbV9 z$HBdBUe}zQcn|fi7Sz8=$;a~o>Rq=5FPuD4Mllhn--X{a+JEBQ8N1{}gxtD-ocT^x z3gt!wN!1lql7fHv%^Sc!hSJl30cLSyk7v-f70c%u1u187Y(%8u+}qxmm`)wUzE&%BO;q1Uiw9`7hv~i#?!64;)P`^~IPo zh{Ikp8?k@*EIP1!y3mE7BSG|}6I&V?`jcvN%l+1@zJBll<0N1*s%_NJh*_Sjaqu?zy3}0d;UF(MvVU5^^++bH^G}XGt($1=6FYI zTPw~XpT}k@&N)L@PbAZc)cf%L&(WiKN>(2`Qd+DpJ$r(<`}8Ra-!&K4o|;RWXMRD~ zu3Q&$Slw$oZ{_@)_d`Ho6y_5~rP-^g>iiaJf8ayU%Y5ir>jT7>*l!d`K>o#Ix|W@V zS%j;Y4?c~$6yq=ZCq6b{W5P6lf2pdZROrT)y!_|GKT-eZpL4#yFYht@&fd}fQ~TgS zRt~pZZ2A|B>+e)JVc_7x2?GWfP8u|{;0ws?adV$$oGPRe5G9{W<(!uy_(K01e)K7& zpyzY$Y%8r_vL7>l_LvXj{j?3>>k*G#3}YrPA3s%7oOwdJnRODr6OwnHT3TBK_RY;$ zL!Fv}Uhqjuj=c(>j2QqJcX((T_4^M4ZCJXF4sF^%G5Z(bx^lB=%c`{$9U6ta|Etd5 zqWq@bj*PMAhGkTdyH3Or980o9do04N*%QqARg;fbf^;Q4*;ra|iOwY_OD*6fbNufW z-!fiIOP3lO8sYORXy>98N#7S7|J>g(Qa^a<`2NoA(=o@lXe{;=#lCaArj*wf&ct;| zzQlUOQCORN;>0y6J*|lDJ*Wi_yr#>SZ%Y^QZ;P0K`<>TsJ)(tEmP^xyVZRdWRWZh4 zkTh70y-|ko^%RFl!}Wuz{dRfK4b=CpBkr%beGAw(32CUWrTnBsx`SDexUjRRA0eg& zx7xMZ+-rn9wE5gorEBQ%-#wd67t>RrpTHm7q{xNrGsg1U_@7%^ zum^s;(QCuz!GG>~|GvDBIo|MldyD>k`)?g(J9PUbr(v6?4IQx^d*~ zVN?dYA2HrIeVVRiW?`leGjt~WYadooUP2PxzHot3qH^dg=B8R-yr!ZH7pb@qekC!R zjvR=jo$C+N!Ce6qbNmcNg`cDJIP_kSe{-z>Ej+@gFy4p0KklQIFLZ-va;h=c)l^?k zQ%1PqdSo-P2kiu0lXMQaWG>c;&ZG7x_1LRv8O6n%r+Y={U`q2_XWrI{X0SfvyPlSSB6^oYjIu~_ZHOXI0no(b(Inm z^Jx0m`LuNATCAH|M$?A6JROC-jD~1zpO3N~a_~z>*WX;r&ThY+4g9mRQA;g@eKiWH zDtkcrSdV=N^B@T!$&{I1M|Uv~egm=i)gtf&@T>*6#dm5DqnA<0u_!u|oJQx)T&C<3 zxzfe67bq_~N4k9eJe8G{;QA3)JCKs$ck(>eYYO&Dq`Imi%$he)%&~nGvSS|kZk$7Y zo95ECwHqlvCxONepG!&67cg&HN%zp>$xAz7!e8d7R_MSL=x+6c5-C3|-Ix{@e(-&t z^Y7E=CnepQ}w@x{43%L zM~nZkx8VO{oL2j@!i=oPZ2#A@v#I`J11t8aim5_kI7YkbqOGFBLqXjFb6@{o8~eXu*8`oqIJ> zcGk7_I^UvL3axVBR+4G&m%N zIY9V@oZNB>^hv>f|1RjKkE9XWA-EppSX?J^2=)Cn{E})E`FSN#e)c)6KTgDN!k(iy zZcq`pg!M__kK+~e`R_sR?jldUo|AKLv76gZzwelRm%nfAk^`fg5R-Eah}OvwZGf79Fd7UrDEym2N6{GWw6{|D&nG-HiV6FsafMf{f{ z?7yzEoMJ=rDI+19DoaZ!54GQ0cdJmdX+n&aOXatUF(-~$VPIc+|1NAFv4V+59zAZM zeXBM+FGBt9Mo}^5ztBfO&YGKZozjwXY2OZS8b544)&)D$^l>Z5eP<-4#OBh~ybDx$ z?+$^}r6*6?#CKHlXPf*JA1|h-1N)0qew}AiVt4lTKmN5o{?C1W_b;&hYCfM851XHc z1*I*e#Ybhb@B;{qElj>^9fqk_cW7fA)+1*>j{P3_0v14-`@L}w`q^+$9`~7U} zI2j#7hxZ+mq9PKd^rTEZpSm~o2gtIDy?x0EW8k0bpG`ad=?j%B9n`^zHsX z{-Vz>zL5`OeS8KqgZJ6~fu+>m-in!P)K?m7DK|ErO0E`CYa8~=j87uuT9~`5Kz+GN z#PY@0VfVoQ_La**M_O9z-@u;rp!~sI=|p5?M*-})o^2oTLV0zQ6zYGRVx!ZHR}1e_ zR%{CDf2mXf9%+USHPloI{4c=1QzN6qW6TAObr0pwhfcw7QR(#}V*D?jJW<1a%MNDt*N%=y^!#}%a`Q&Yh=`KPZWO`)HeeR_8hZU_rM9+O zN{h!DZPc7^U%y7T3ocSiBjWN3-sYGxcOdj5#^mZi&#<4Q|eG7xL?tZm>^N| z-@X@X!S~Yj{Cw2yYY^*Kz{lJ}F7g2DgLiZkgMV6D>aZs5j^G!LCzxlhAYLsizD`xQ zZy@hT_Wcp-Z^pW}b5v4%Ewrxe9@ci;mR`PmOfO$Pf*xQGfUt05dGR%R`V6^tV+}pH zQ!M<0*Umun9Ug#>OMz1f@TdXqb%-0gOFfm|yiRow%jwKX8UOp3MZa*d5qkzDlTmXsD}(ZeiUozNhU`Bi5cbVGlCwL4%q= z1#*$LhKICk<(dJ#{ck@${>^%k5gl!41K(HQza<%sjQ?XY8nMPYFu0=vcF+Fc(W81` zb07G(;(8!ka80o5)KrI=oI1`KyW`$i3m+f9)H((^QW=MUs-R2SF_OrXJtjK+X8BXV63TPj?Fos2YB!zM_Q6?i5$Qul-g& z6y0%mcmFBu_+CxvUFp>;U=Mlq>M5=-8fC1!b)8;xv>_(s-g`BUm>-zC6xaQ^K+T8| zTU%;?-JAF+JkZ)wOZC-dn8&E5_z29RBvsMr)Le=WyG&`Q>+$2=vFG;H69FH*$?#sxk?oc{`T&pN8r1rfkz{GuHQ&W;Zfjy_WKI{tOIWfW6N?6I+PTBpR!X6C_AM9 zxx_h%YYjbN{}{1GE@sYhV&bsx(`{hhLN8vl;``e~Y|>g^i9JY*sin4pzIxVbJe{2U z`}cKTK9tYhFy{D5kIA9!jkWa{>uWdR{|I|K-JmP5!B?-Im|_B8@Dh9Gg@geA2=FrV z{F|8fbU#1m9HquwhpiS;q))c=5Prm5Z}@Wd0y|NgMkAxmp z;y2af{mHKZkreVd2stJLt^uJbL~56?*T_1m^9)BP;5- z>=TS_IRC%`INZ!XPp9JI;ES7pSp%@EgD%txX~WT69^tvfaLgAJ7EyBK8M=kIt+h?& z491-?e+q7Y_Kc-jb!42C5?n&XXf-_iOp23f>KVg1XIQ}m3`C8-xF-MOXA0zH# z>|ec-g?&&J{76e}x$sesn;Y+)3JLjOdVTLxKbMaP+`f5i1bI%0!nMPb(XoAvuX_z0 zz+Su;&P%oBcfkn?7Hx>TswqG7r1TPc@!~}ba8z`FdAtjI)`5qW_fa>@pfv0e+uHIF zwqB3dHwxY9=xBjYmxW{gn#vN?{I26VLten0V-V##9|_z!7BwO_k))T10q!k*pXcO5 z`s^?5*Xy>7k3Qu)_cVFT-eqiQXu!V@4R|flbJT)wU(Uzvb|H+*3*cRJ_O$d0Hpv_z z>j3k(!U3`lw6#6N4E8zX{}pum+7b46 zC4b*5lg=4Yk0?M)@Dx2I_D^3udsYs|{|_G$M(_K7?f=P`Uml&E|8)KE4K+o1dH0Mj zG02NQ_62u=|0^SgH3cVpMG|tun-}v04@**qh|$;=nDYSJKF0<{h!vU|Du6xneUq?z z8Fv|b_9u<#DX?CZ-NZEo&|j2w?KwS%k6@j+58b(ycMf)Mgh*KPS2P|!<|jYOcXtkW zzI5xj=)y%#D?Kh}XHRadsRs5P0{*LRS%r&FvL|kjKfHJ}( zq#X1Jd^U$*@9A4V#{BO|_lK$G{XzSO!9R0f?Ecfc*9!BRP=}Qy_P6lGz(|sw3Tz|^ zdoR?LgNMP#@Wt!{7}qZR8-xy2mfWN#kL%yCeXb)g-mhPOCGck*U_B~DTz{{q5Vp_x z$8$P zGS7%iA`W37oV(t?&gCj$8V(T}nboD=w>_6ToU_;3Ywx}G-s@lgQ{0#RyCL{?Eyyc= z3wH1|J_G&(aXqKj7SM_1@nmb}Bsk7FN&&X1wAyT2z_-=+=ZUr$yJUZECNt z8+`&_?kU>$+4K1uSd+W0LT7WG*taM4efIl!E%4|Ouk*S6dqvxL`gB0_6L{QsZcDrd zz&&|=DXuZGz6;oTiB5r2Fvb5o-NzhsY)kZ&eT%#=%%A-EKfJE4A3ysrws9>z-L9v- z`6>JOL;W4%Sg&i#8|TjAOa|jV+L_y$+x+3fKP|d-KaUf9AFT~&?SRJtE?OISNHGCv zRE@kIUw=I;)Rf-wb8v9@(Z{y^Fm3y`dcByCpg?SA4e!<6>uenF--yetM(zj1fbia* zwseboKrjB*zRxzHwSj*4_&td6Y8tlzZQJYGUwg$~?@-^9>f6QkANTkFyzM^GK7gtG zaqju^&N#F0ZNd7l4{HG4%PquSa9>Xg&VstcGC0tIGyg6W>;sLLVVn!}bT!ePyz4?c z{6h8xb!$PLKf(UsSC0or8!Ia>q({X5cH*-?zW&RxgF~A({XFl|CC9Q`H!E7|Do5E4 z?p(V{gNP5PD!wK3qMf_3XWWf*g2t*+wD~o}@h1bLb6t3V^TG!Yy2Lqx{X%iy0KOmg z2nVZ*OJmN*f~4#Nt#3cx_x;+?%$YNP6zk{r+so;xb_LgR0&ZQ+zED?rrxkk#LNo9h zl{fN4d`^2q4e)&I5At~-a_}PVqrJ6ZxW1~Ypt7Xocv@V_oI{%ree~`AH?VugV0iD@ z^P7agkcHW2Qukduch>#<=@ieir_uK0&r7fsZ`M@`gu=SK zc3NYk-nUVv&WxL^J~v+Yb!wQNI?7X~PVtkgGs2|m%xH=FV!TAXWV&1(c37@X50;XSIc*nPVX+n^lZe$vZCHI^W<(@S{Y?(2gk1(OE za1+W5H=?Wy~&gnKSeB=aZ|v*Eu$1a6n`n5 zJ|&^>Ba&+$LY{ZMXGWCjILn)R&Y0Fi2RF|{=5e{NXQ=2}x)RuX6M0iWn`1$dPVL_KKr!8*~FbFq`b**b+be=enDUu{V|At!G~x!b$e z^+S9=A=>m^?|C|0=E-gB=Z5z2lL_3`EVHh?xgV#88i?%{d&r2`eqF&; z>$FxT+B~;^dgK&Q*0fNq%%bdQ`(RfEt(_+m+dbxxiW2bK6MGC}-nEV&^7|)TWdF+T z8+X!>Je_3%_wN^D*JRkZgt+dphgFnvQbOFPJ$4z=j#V;I=G0&VO2asi1|6~dT#^Iz zh2XtP@i*I+%EjNu99B|lkUs5QFI)N{<@ql6P6*H|%!;2(yKH5nx<1TTw&hrN$bph_ z$`JK85X&L((>tz~P?}Em3GyfS8d8XhN{IKAQ?j1~c?)4z2UV1W*KvOOPn}kLcnG8A>ecHWNCZtDc=QM6-ZtsK>GErtxR>+$QS@&*`(4O^}@9>%nw|^>rAA3wj zk#0&#^paAdH;Rvx+}1&V9tz~?(W9sn`bqCvw;$sBL5HNFx&@1|uEVgIIa`SICld?yy|9p@>7zNDhg5}*Tb@YWvRY(&ZETM4K1fpar3 z{vqUf*JpU|m9AkQCe{o6dZiTp3~U{LKbKo4zu5lzw8By<9N7u^A$Q_QeTq6Fqj&7X{kz2{#*IabnpE+uJ(&%Q$<-J z^M=LJQMPqaezt*$vg0+6?baqT!4urHn9C^QFxnlmiv{f;bx0w~%QCN}&%s z>EJZR@C9Zn+PFv|L?4A;gZ5_GV~@(7%N=n*Ns-XQ-n9}6+N+?G+fC`%Mx!B~_hrA4 z{bch(g-3w1Qi#Bu8+k}BmYAc`QU3#m20xU{FF%Ltc4UY2Q0P&^(W4j##CC`5JPvUG z=7J2F6uMtQtL7+Z8#w9{eK0gx=u;aM#c8&IsBY(S+PQiu) z_bBOfh#uyCDQ#LN$NV@&lv6invdkIq0aIWjDFONvk2O(@C&oeemRlDnJrhsqkFY%i z<322ZDEy;vH?8auhoDb?17VMy!Jies@r9}BCx=#>b_eVz=pLQudP*4ki^|>!*^3tr_`jg}>|nLT+6=B2h7)zye z!dZGqSDzpH8tOU4E*f(g#$!qn*R(oWzIi?6t}iSzHxg|>4SqiNb8UO;z6aUEr-<@6 zerZihXHKUj(`R5lG!<Gk^=R>QV@e6tj`RF|@$-nu+3zNSKWH!~9%EEE#+wL?xjsAP z&CaV7A>KRWah_WgrR(P@Kjmln?$(UiXI{hVQ&d zNj}?^rx}~bCyz+uH7N?MEO|k_oTfmp(i;J3QsVF0}t z&`QghA|Hc;jZN|LnR6_@tK7QZIV@6`hoH|#!$;>ihsRzXcUgA6@>t~I0G}Q8;P(Pt zFrNotT#wsCA&2H-Uz=@zGDTo7Gum5Uoa^?imy#3YPw>Oukq_3tct6>HHD$$Rh<4Ai zbFnu4W?5-z^jzMs!-lXML*gsz4=;oC(lolDtV>J2h z!rq3b0oorv59Ygl4iehDOe*mDHxcuJc=fZQJ!?1893^<*jf`nNxZ>xVXs`2(nHOAz zy>R$@A*?I2q*o@bhyF&1MmN7Bt4^&ptOpT3?$bXNOSZB6W`3l!!==3>c3sifHoCGA|r=O0>|XZergK6}@r z&9R@h<#R)FTxmetzf}H-{Hy~}53q~%R@SM=3IF@I)j^P_%nq^(Ivwye1nW)@2L+wl ztCj!QRv8`JDt|twB?L}JKKg2*tzAPErHvHl%l`gkvF#Hfum1r9S~64q4f)qEk<%=h zg3M87D->jb!dG3HE|HPTI`pw426T9f1U`Wjyh{@7CrHJ@uPx;I;1M?@dmAk$i%xEx z?3))YAcutuXw#wvqZlLO<{6rc^Y)u`;k{2;d=Y0jyw}b9`xg^2<~hI*;Q8o)gbq7k zOz_mlKE8I0gC9WI>Cr-ahlbk0!I*zFU9^i-v^~~w6zj|TAPVdi=!@+ic-Vku%Z;AP zs*_oFHJ2;MOy7{Ud|^ng_A>Z{Mi>+2&t=!?fUk3uhFCM0lfwe*=VO3Q59kN5lcltA z$r9E9m!~$0nScK}`NNKxCM5c+oXovy{A>q{;VZ4i(9hgXI@xts9ve3=UWl@Q)>zK>c%AJ0+12!EBR9^O zVV_oo`AUItP%HoC(^!}8l#6YjhVh+c=Msc5fNeZrKh8l?b|c4g7i?e@xjBQL%g=p& z>vAa_-i9#?{du9;bjT+ER{3YiOE9*R!0nJ65&s9oko=S=< z_X8z-jA^ubuH`Frz`EGDz^0S;linnM?%A0`g*h{Du4{^Y9Tj{Zg=qh514*aQhVTb< zV;lQ(?4O**{2z{f8g&Bl9XvXE`*IQdy-;zU(~fugbYzDi?Zmj{hVgnXxYNv0=hx|g z?ZMhq3ID)|R$DKiL(X0l=zEruqDm>)JDV&O`mlZO{}P%D9(lHb6&AC}cHSJ?w9w{H z>|ni>)s{EO&Y#~nH@mUqsyP*8Pp2E_Oz2Fg5@)t@u@CTA;I>hb$L$WEM>xJy`ZOJW zJ+E!p-;4L3OulQ*(4GZB6ud!A{?79$!CzmT3y*G>(CT@H=m(}EkJLP4Gt}GUwR*6D z{6}4ni+sa{#Y4yyKP0}64!({y=P^Vk&KdJCe=djYD=blPwVOBh8#;jP_wxSn+sGf~ zH8VFab2b%UnTa!QQ}JB?TDrCmu>7&Uifj)jgB4C+DrB)ICvW5RPm~wVd&76pg%CfA za0w!>%^t$>b>YZ?=YqWBhL|@b{0B!I5HnQ_~*3LJ{wYN4Q zw@qf09Bc|3FcQ!9S$1(QNRo|g`9ksw{x0WA_Hr?JbZYNHAh)oIR88nCUT8Wl$~GS z%pU;Xi(IrL_8)k?{IdKjF&?h7ng^b{`9t&cO+R@X`PoL+TA7S&T4aj3!W3hP3GLfp zj5UmkuAI@%hwKmdx=F-!=kI<#?e7k(#lED+65y6=kfUUfO0JjUdLLs%B!wNdhd(5x z0LU8%KYrC*v_D=4xaw0?SrgS1*HY1~T5{R66K(nOcz|bKZ4>3cUBou!UeXn%;D%R`iV@haMRHtk+5gS-;x zL4tYA5a(PH^a+-~o~jFLs2g0ccY8(&@%1G(FWCq6DdB(I3ePBK0=3+PB z7<~$34AvvZFbD2gEw|@;T#P^auNl!XPn#;5!70*BZB2dD)AJR0EV}7JawPl(8LgQs zh5v!G-IYrEVy23GAb${isQ3`@j2E%|PpSLvQ|f3QfZg;VHprV+%(bEL;2g@m0luSr z@X{3wh&s^eAvd>=mdv&m=Mi2jJl6r%&C4d(!E$r+liw!mtKK*JOn)Eylsu=}n98vS zrGy=^+{U6G^2KZ;tktC>vnAU8Usur>R|UVfqy8@P=eJT{|5NbhKBAgCb>z9jOgOeh zPTN11(cum7Wmn5F{uz-kw?E`}Ts;#!UlqvdI7D~veg!=|f!z!srYMtAqSL9P?-@9u z?tzQA7uP<@gC6o(53q;xS*^6xVgck=P0)d{xOQGVeJbp127Nhu)`*32nz%>vDp_Ck z-tW-==c{DRi{NW6nkJ{6Yj@FZ2WN5rcA2>fdX{3`(W}z^wn5!iT2)vHzM@9tn?yc~ zA=ol_?W4TBgk#RTDB6E3{2eKBj%fX73;6n;mwn0>Ad%hrLPXPC~UT|yr-hR-?$JdgT$y8AU&)D_>!zAUs= zHPF4@$FTi}ST~-fs`6Uue>^7g2UpjYQ{X{s=m7iGUVhl`QHWzAkBk0$OoZ;HHleTY z3H5-(v8RXc@r3ql*d!zchK>|qJ}Iwk6&hLxsj_C6O3Mc+`(lHzXqGkPSB}g7k`Azr zW*y9&V)jQ}J>T^@PoP~O7)-{S3~LM)qG&szXmTI z>)?@Cs&5t2#i(c@J>|N<_o#2_9l3I)T-`nRHH8Hv_F&K8Df@?(D%Jtpfz}3ec3`1U zW$WtrU9Yhb=_lKIMyag_^4}Yy{M+4>o>oG}zyB;qchBOpnO;{@(nfm0ztr11O!=3t zQzO=YZQxu7WvEsUsDIz%F`*vZ!X5V>f~y6XZM>%|?e~U}pQRSRe<jG8+~sHhYi zNu@(nRyhn_-kcS>I-K@Cv84{e_V*1T4lGUR8OGYTUqcP;1kPweTNAbS5ur(+>p|pi z$KPmn>Up3oRd;Hrv8Dk!7#2%c+g&O@e}?jtV=ymvP@}r#$?Ig=zS3S|yI^sywb@jf zrl<1J)$hAp*RS65>FwfsBUi3Afup{iVk7e?HtHsLChv*!Pul4UPd@vJK5`_gC?k2a ze*j~2buGn50- z)L4Oer0(4t7|FkU{hjtP-$u@F`%ZaPQ$l@nFI8jSyO322->aXzJkC&D)GbPhs~n#B z>zO~wO^9)b?Ir30$GN&`KxhDGRW~-z`Uj8;Z*Yk6QWAyUo_kbYbjR)6>iRz3H~p=t zWVU>&J$T{QeKEtrZtI$DXX={3fefFvdl0TLL(h^4j}t4HVs=D&HFMpDe+|W zW!QIBrNG?DWtT3%FYBh{q)QZV+#9ig2g%#Xo+>IEpO5oA_UTIT&3tOjb)mk}qu>cD zqoRT;s?Ez48mgGHZIJGEbz>b_AlxY^?ETPOYzvJn?3SC)%Ux?VKi6*lyh8ZQt?6mE zM{3laR9oLoJwwmPWrv%{mu`)r-^O$rIj(USsb)C*l*xRs;RB>9{8&R z$ae8&+G@8KzDf!Fpiz;h4laPmbJzE9j8daxD0rV8Wd&{l-`HvJ7bj8e%^Mi&D?~2x z`sy0wHEI$r#3vqqA8q`u_eeieRM`Jmpw@2m!`t-~8kj~W4uo|sG&4VGDVe(IX8Kuo z=J@Tq2mOFwuN)i;snOS{vIHD{-2<5Sp2Dvwp!3OR!1Y#34d7e6Q&=jrb@oz5`fX~c z0e6SD3-*(3>A2fL3iD3^CtE$n(Q1*86*-%zrl3Gb4G#Xn`u#*5WHN%ew_w`Wb z*}|;knBrjvTepAKeW&C~&N}9}WgfF$@D^2o^YrHBGP;>_lkVJ6Q(kVdaQ*B#0enJ` zN6TND8J{9Fw|1jH)zS9#uJF$n(HC>qQ;>HI6YI6Lo@aE= z{2{Ml!6`GVs@oFcLbLvH{i1`v4E4>nnE3p>%*@FR;L2rgHRj_2XEIe3-ytyCKMEu3+0tfLQ!rJc=~RGx4RYm99aTi`+K{oy{Q2_ zK}B@y!g*;b@+Nj831YI_RhmQHE(xRdye@QaGT$j$~ z29F2*UEp|wzXSQ1b7c@RNBYE|9oY|JE*~v-+r6$9oQu^%H!XBFF&F%N%-N&;y!!Sn zjC*A?3|=jjAOb!mEAyGD# zPg_{l+)L%)tisq=TQ9z^C*+{ez(QUDpqBKgoZ$`SHOe z;iX-zEoGd8n{(@OzU={UFpiCVg*?3A*F%n9);JU z+v*-QfP>*)H}*pBwbH$=CNXzsv$~u(mphMvPagM=f)nCGWntl8w4d``^bzLa@spbu zGmY;Q+*nt3^G3w&%a?Q2m3Q)Mt17Y@)z!zV%F7o<1w@HwsNd!O@8dVG&I<7H-H#gh zsDXbE8sI!3e?VD|@_q7zINF;1G&9z;HOj}dJvqd*9eFXtf?N^px#v{v*|8?==Oawp zkrSgm{D`XE(N^A$_@Va9*vajPn{Q7%W!RqVFKs^?E@{t-F>F7)UE1!yPu_keP}+Vb z$gusu2FY*V$9VU;dt@gY=SO*)AV!VzdW`4vKt7La=_zA-YwVPkP4@^oYVyyB zuM_;-pl8IIa-0#z+34~~oQu|jPLUg8mx{Ko(8b@O?vQ~ol$=8%4OrU*KLgr>IEzT+ zkBCF=3IF{DKbSv#E=H0c1HDE9%RVt5#OVNus7uyqJYv5$f2knO_aW9fRGR~VU&s3y zlKTcFc>@z8=6^tLfMph1jLDny_dY(4_S0X*`DZ+KNd&fIE@x0bu1k`)4Dp~^{Pu<= zzOd5nw#Ms~zxK`w_G1 zt^df$UjLK#S-&^ki(>&}ybOoKJPd{7PN*a5FXlyHTR~w=G`G!Od&tLl9uMG#fgNTU zqJaBk4E(mmh_3~f*3H&9NB2CB&B{*$TogGdjmNghmg?UB5ZB{-q-#kjWSxl0CDWcq`WlidsV^gEE2%$%($Ua2fb@y~xCsX+ClQc5MoJ$gNvT&}AkbO$TuA%-5ky{GypBcxW zb1XBLG>k!Uz+f|e`JkOq0phfKg7-|sp2N0)gMe*a&^_xzUH2|Gb_v{NOaY9A-(o7- z3eQh5etN>%1v)G>u%m&?iVs zUQ7hAfswGsXkbF4P#CN2W~=JQ*x|KhiQJ7b?a3H7lW~MA;$iVOV+FYXMxM}z&XMcF zWjb_fAux_`t+kmLzxe_KJB|Ey1Md%)Svwyw~fGLqFxceq@4~uD)_jp z0Csh%7adqyPBLKbfUQCS#%y@~eCvHSW@bNqxvsDJ zJKR&|c_9ID4emF7y%P4}<-1pG8hI z!;$lZabb*&^uqk=dE!5s%WSBx*ZeR-AU7bty$IVi_6BdUOkN zQk~M~rwH}bqpKIr0LukT%T;8~b!H3)3cqIjmMQRi zuJ%&keT-0dnHIBXB6*JET8emmhXqzz8FX?iSwx$F)nnY^w_#RNLZ)uZNj60e75D)$ zT3k+oKeqvF2)II?t9Wb-2R<>{doE&1?uwYa%=q&U%{o5~M92PK`<2vV< zT7Eqf^`B}0oZ3|7bL`yHUE z&|$vTh`2v(e}?U}zb;?wmSrXuJ}%Rs>*?ZN59hPg?l;KE$xbR^e%E>+|gf#1G`>dIT`LQ)cPPiXO1j78eGl*d5>@Te70{ zgm~*0xEt1g{;dJBHk&14bU051Fcy$Oi@RgI4RCk8mNLtqysrMs%#CvxTjKz16=RDS zYqS@>S6Vpm0f!_>{M!Q?WbPN@5~#hQms;w2sI%<>ollA*cjVDMx(x+=eVq;Chzt-z zSxPMp{lL(C4eZEO+Pcb4l*8TilomfU0Xvj;vyT?euoP{F=V`_au?&nE^pXXm9Bi>WZsHEXx3bHZLTn3Mclgrw|VdIt8aY>IT*X5#qcD@mkM(^P9O8L4yz#IRXFd-v>Bdnsylzq`wTXw ziX6u0Bqv;@o43^T1=bw1BvS9cLQGum?)FC_D3ycvY+gCbS`b}c_v~@E?;Q`o@?GymW|h@x6fuiYH#X9 z?DGREzEw$ghY&kEjw9%MG=><<`&6y2r}Bz?-~yUS-H3jI?=uGF9xx;gz~5YoO%zJ* zGypHuG^%dC-+wc|rq@a}eg8a_@i1d&7%#!NVQz=nN>$j~=wA07fB&dYYU+pjb=ZjF zvO&a&r{?KCzYrN!+}k@u4P_OiZvGlE-WtS!Yk&jLpdGa3?)|6FU-y5dq0-xT#_RZ1CKH)1WECIIR&JbO`+)~EB^>=pu$HJVP#@?QOx}14k=o&=a{@pQPa0D@a z9jYge=hnq^BSe8-BIQ$~tDQ z@iaukzkRHm^Oh68xS8MfDC0~eMTh58WJo^cZ34l!fE)#Tb0V;#buSQF8@&SjXeVNo5w4v_%8pIfD5TDMzX*u$abWlU8K}5!C~yr^dK`A*%*+=YCo`%cdaqn0G*V_IY3! z`luH1US$=%bnKuv&LQ?92Z|%=`&5jF*Tun?mE56*%Pv%(7X-{)J>tl-f%m{%hWPh} zic0LmC$H1#?fYE$3~G^?rTGRcD=T{|t1siDF6K3~_E8rG72o5bz+!HAI#+4dzi0iH z>}v3A4k8A*DlZTCw0hult0*n?D#eALL0_z-whmxD5yyQOaq)SG`we#8ND-cUDIzeA zs%`?~2H9I18i4IBd~(X&{f+a{caiJLwF=KR04Yi^&nCweJaRvfsKv&a#*~QwytraD`$cAt5YL} zwGZRg9q^4_Kl5Gc_BOu>2}%33w5-vdIV=4Rr^!y~LHef@VQ1@Qo4Z4t9O-Jzmu`G_HGpu#Ix#2D&K z{lF98byuVM>4&nNH|ZiLAvbRH*)U==?}#zEc^5Cxy}PY1VtEI93@u3sny_6fYy z4|=Gnx}4hTtHtm4bu`mpUsuALp7WtT-@hcVV5on9W2h02cOS86)r7b-#Gi3IE;zIi zlbfBENxePo^cXRD!>B*U?2deWAAH&P8*R|n(W3ZJ^?TEO-M={Nm>qp_aBOsh9-uB? zf#>%jV(6bf9S~#ax)Dpu9MK#@_UzdpVsE>t8Tx;Q`gb7i{;S82uDt0PAM$fc+0LJY z9f`hkC_rHr8KBOWWG{w#Q< zZ2Seg53<7hS%r zS6f=Rqq^jF)SVl-rDX*-E81GrIo+Mj?zLrQQ-gwn{^N(LBf^6|{`;tb@2mliGy5kL zBb0ZDGy5xieNx%A<^T0eq-jmKw@E+paot61Ru4F)dd`QN_M8hh>hW-r_aGLl2eCgr zr$hC7GNTQ8PUE%jUTJ4~u;gjfF~w@WPsw-bAJ<&}hJSlK!|42($Z0sQFa{GKk{#L zGmMsAOyc~p@{ucP63xYAJs~~JKm&dl;ow%8=4|X_4dPui;2#mV`0tgCM(i_1T!o@x zQgZTN^F3T$UH|G`pO5d0ZIBsf{|5<=8O?#4R`*)$;Fx9BqCY;;Qrsay4Ee-sc_bz;))| z#rm23HpIiQCE=t2rHAPWr_mNsh&S1`Tn?Q}MZTCsaAqN%K!`*=d^Q_*`nf39o^n#P zrg~wI*b6abUUDP8*IT!RSXbA-3JS6nb+BB|=Kl_KRy_&bYm9SWr3NuEn*CeA0fYEE z=Dy)P{)oZQoQ*&}@9oOIVDJ@09WZ7NgvZGzzzO6diR9qVy8RIja?BqXc+?`|spD%N)&e@nL$W{0UoSB$tRv{Of=Vql4>M9p-Mk>U?Hp1Pd z)stLF><4e^5B%H!*J=OXVf%TX@N52;5v%8xpQVSr!q1-Z84cILbGKBJfEbkQl;7bT z*nmzsD>Q4&XCfEJERE}0V@)W|WN{WNFy{%*mm6GNZT~a(E23BTN1eSV1razpBT!873hCJrbQRMVG?ufj!hfFkS;ash zG%;WrWhDn|LJs~vh*!eixu>4SYmZ!$8uV+Nmz^N1sn$5RmW$^xE9a`jvu|y_Wt=;C z=#TARXGJ@fe$MBmS2rzKpwvEZ(j?Iy$DjY}Ne(|cpC~OV$VLuiFZq}^&UF2DBmb}a z6d@xz+x6vA+VS}k+OTlpIeVMM&+#w1_K)&1_Pv~J1b#WisQ(`1 z!P_Af&c!K4qrE0k$?ZB#SNAB+W2b7uJ%3Nf5F-%|9h*%-9$gjk$SOH^stmECIBQrW z)98OPiHtv;L>9;sX^s3)oF{eLl7*vN7cU%jUb!6SFg9)DZ6NADIds*3E4VoQaYnc? z&R6A{(;*5W0h}dQuuTzh?0{t#(aj!b!wZO+p_q7WweZ^v$4uGx6*N`^hxZ z;4_>pnA3qhzI4zzkmjo-unp8})-3VNl)fd3{;#4Dbjl z#xAESDJe*DHp*KXpBDa^=Jd%m6tFE?b8>5#CfwtH;0#P5>eu*RennIM{%>h6a%poe zy#+Yi%+AIhdF2RQxzb6qq`c>CB<4n3X=#CWSj2Wv!_VgS*FAsv^5y@@VS#D87h+Q~ zVoXQwTvbtalCcke&v%d6!;1WJ?9H_bX^~On>-cMO--?`mu4bC+7q4o(k^e*aFTbW= z;+CFA!Zc--PsO}_xp{YKvBhGtGLqq($&%~vYy;ZCeu33WzAyXl+y?x5@eDKhnt7(Q zdbVQhi)qp^|AVs#vR|G&$>{&Ql9u^ZH}WhRenZx3qPj~pRf3O&XoU`P_4E1?~j@Hw+#T#^=P!Vyj~M@WUJ437{r}Lo z*-b(mu!rVu=R-|@A9DF!Eznfe^=k@?2I%I^LE(H>6D^!&Jvv7r5v)y3pYfU7GIR6I zEH9q@x4QWt$W}Youo@1zdTQ!go;*9~a+IGxyS=<>L0@wxb#)Go*48#_?tjgD)-`ng z+&M}NKZ^VlM>HL+cQyAP2vl;bOmq4CB~4@J@JK_;WAgWn`%3onNn|r^#`w9DNw2Mq z%}@FH+VS}L{`>eCG-*n2ihC(8vV^iS+wNV8$+WD?zlz)p?Z}5yr@3*)hbr?@2uDpg*TH#Ik3bDLgKcU? z{<^vby4TY?+Fe&mo!$2w_>iHEK;!VLgQh22o1lIpk9rBW{D%_AV++Sx3OzY1AcUV-JSz zoUUQK0E;Z_!j$)oX5GkJD}QHcC%S!(MFjvqyv26S;Kh0N=BwrslbQ zkJsTpeA|`3&;Q!m`v0M(rbYj-!}-7GzhP8=*W1y2|6V7~`l_mhIyLqf`#U+$f~LB< zQFHTVm8PP&gc_j&FrH;&!YIxl+ZxNYzt#F%uX@fK-uo-A_qctE zeKI5bdL_{)Js$4)da$oU+=J@9*NU^kG8!F24#|#2?BjG|R1lCyp?CfG^WVzXd|h31 z`p}!?`iH*mu2Os#`>MlFpFJBIy+6<~hJ8uoz<4l*Tp&*y?ljW**vv-0AD++c{3mwC zpS^2gU9dbA`Pu*1!{MH4qNk)09%65CSj1Bkjo_99f1$YDY|>Uk{_eZB`|Ik&_bVyU z+JUQ)>)$ljR;+7js7`4^!lvfBs)qZ6ofomUyaV_6FW>dq{JVe8|GwisiD*j>4l{q0 z6lB`&>t@mq{2lg6jQg*q8TX%$H0jTZRQ0>q%lolj=?7k?A2^2oj7Wq2tT_Gt0}itO z)BtIJgr{`P>)QWqKFdi_Wdt4pb`JTXnHTv=ngV_kcr?Hf>tqLBP^?)Q_r&WaF+LLO zHXp=wCLqWBk*)IIzs)mV_notG@@2993UG?N;9yP<(_-0n*7o6Y+QNlP~|qbNjTv18?bYh^K*wpJI8L$C+_c`!-r=8yIkcAPj_I&;2=e+Lk1V6)TK8S4<*W2OcZYqcDO;y%eyxyVE4>xBIhV57ic`276w zb@zUo&yfE<>6nv5_y!Lo_F(>rD*V&i-Jkw9W**6m6qT>A^?2qZw_LVXblg4rUiP*#8SZ2oH9N(;J z57;XM&mHqS%0+xitd~K=x5@W5?+3UjeFB_R-{9igWhWCDAH#JK`vG1D9zbm9>>1>N zyxzfk6(UB1~?NF2$!Oon>XfiX|bo{TF!V zunzCRI^U1DL5_V7IVcCGqMVLw0^b_;D41i*afPwSFQ(-dGk{(U)sD84fBL%T>OKoS zVz8fa1k97g7zode;49dud>VGda3s!8i<4o@!~V_4|Bt-a;lPO{`0o(xtibhTs>KN` zpUwLuz!Lx?z*vDOT-RA!6t1t;1PXrC1N~6%zxDJomdBJu1EM$RnWO;&dU#87PPB3 zcm^1&5eHt5{Hxj2P~V5Yf$aqElJh#`pvQA&%U|%W%tD;&JQHveS$&gVWg&81Z?Jh0 zo4y%)1&HZxeL1c;FLU}xdYBPqMk_GZ0v`^H3b!|6pn+SMftU=A+g>Zm?E>86mM_QS zoX6wMIY!t5an38|Orf35gnUk3>qE%b!AERgj#qYA!ts8l*rQ>5gf?DzzKIFeIW=OOa`uHL z#8(4nfY?%w>*bhOj!8yLb^XivX*k{nya0pDXQGQiPLGsEFuuUYdFE*G)oaM_q{hDQ zK{4n19y=}WA~P`=a&CS8e5cKO#oYePZ*Z$%P~5v?9yncWG{<(^&7HgIW!bHi%0KG3 z3OGmq9(yGP9+q7RIui8L^Ks!qYu#PsQ)KLg6FIGt($>$>_ksT?ymm{B6~2~ro$MAY zLVn-tVt##Xd~-kc2xf`c7mf|)I;^y`?0mW1xh^J?rT;wNNb+ggIn4&X}iaajt!EE(dQIq$iI5(D=jAJ!oDa30dR;ASjQZC)L#!jfH?WJ|gR?u{VDa&eZm#$DFma-F@ z0+ki@VvJ>3*)7USi=~hw3&GX3mfDf8{2pRmZ(qMn=TowTrj9|x6ZJpYx8u+gZC-U< zPI==&j#bq?@8#=>6UjfWR1dWC9zb4x7n%N1Us9N!uBa)k6zY)^zP?qP1Dj($yO8j@ z=fQ}W6TZH_P0aV*f@@*sIl6hhnriFrX8UcV)U>t!THF$1_d!6H@|LZ#y&}NJN7A% zXE_~l=B-`56YuM2Yx~nL=gxPVu5bKWzqF#dt>W6XcH{;wrnBkl(d59Gsb!b4g!Z~R zI(POK<)(*I(WO{1ez)zOK<&NA`&-#c_27wWM{H$(KjOUdt_n>JEe;c(|EAXqjLf&K zwwx0X;ve14F^CtDXLiHVwWE%!?6Mn53aJ_KpLuy|I{i?=Y<{_Kzv=n9&$F}3zHILq9?eKC=yhDX$1c*#cX12$2AWWAWEX-v zpq*}Bx&m8lqwoT)JfH6ceWaw;QFXGu}Ha1-1tRoEw~yj>vlA#W>U)o`Ah@lLVB zZ>nQ+b$xz!OC9zn2Bw$FhwAPW(__Rn-ED5DdDH#g_4Dw( zX;s6>Ir}x@rFwWz1aV)3gUC^f_I`q#guTec$+0iPh+TX1U|`+5-v3SCcd-eS3=Q_? zjyy#^%qN3ljLl$w$9T*Wcmg=q4|`~5gEMP*U+_)$`!1h1RTcdbu}kWqfle{+pf2|s z=N;sjxXTH*TaT`YR(+RyzwK{sB`5#5Rb6R^J+Y+bnsRkRby;&?Z+kX$u?>4EZ{=UU z>RJDu_efZF-Y5C5DF1}=Ht{4pwnh7zwB9(UdXkf*dIBHeNqV^66YNDiL9U7?30|^@ zSLu1;dr864lQ{FFGr{m7_er(uYpmY_fd7j0kgk~c-B-Pi^EF(`xkq?S>WlR`&lC;l!VGkb-Pt$WX7r|c)eZn7NCG2sax_cYdV$yi5<>z>_;iU_Q0qP-1Y zc@N}85$Eq1FKHg<$_W6bFdb{6B;*>{xOf`4OqJr=A;`_}PyCF~<5T{KHK72EdUL3| z;k8u6J@8s03~QaE+bw7z{F8%N^Y9t(2}f0m{k(af=<3YZgi~_+L_hFWJ0l+qFyEO8 z2PnpuF}qmfEV2;&9G7*#U2kD7Ph&oh8``*FfeU;tvCijX&DLbaBL4x_rAgpX&dW}t zlwdP*b&zRsoA93(&rs58n}xu}f-}l`K69VaMr-Ri{CxlY(;bt8aE=)(s|oXvCtZv| z-gVa%@IXSQo~D*;`wc>10?mRpDo6jkU;fMQPFH>p`vHIr4Iv zPY3K}z@35PFa8YtwhrJJ?umSEA{J}*?B{zJpHH9u4_B_1K6Tr3G_Lw~X+lFiazg?i zQjmWM*x+LDI&{GYD-zCS+{l<`Y@!B^`5SX_VQJgEoSY{3=k*b_g|}O8 - - - / - 2017-07-23 - daily - 1.0 - - diff --git a/test/nightwatch/main.test.js b/test/nightwatch/main.test.js index 757aa28..4bbacc1 100644 --- a/test/nightwatch/main.test.js +++ b/test/nightwatch/main.test.js @@ -3,25 +3,74 @@ */ require('colors') -const {readdirSync, unlinkSync, rmdirSync} = require('fs') +const {readdirSync, unlinkSync, rmdirSync, readFileSync} = require('fs') const {join} = require('path') +const path = require('path') const {userInfo} = require('os') +const LRU = require('lru-cache') +const express = require('express') +const compression = require('compression') +const resolve = file => path.resolve(__dirname, file) +const { createBundleRenderer } = require('vue-server-renderer') +const redirects = require('../../router/301.json') // We keep the nuxt and server instance // So we can close them at the end of the test let server = null -const uri = 'http://localhost:4000' +let renderer = null +const template = readFileSync(resolve('../../assets/index.template.html'), 'utf-8') +const uri = 'http://localhost:9200' const DIR = join(userInfo().homedir, '.KawAnime-test') +const serve = (path, cache) => express.static(resolve(path), { + maxAge: cache && 60 * 60 * 24 * 30 +}) + +const createRenderer = (bundle, options) => { + // https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer + return createBundleRenderer(bundle, Object.assign(options, { + template, + // for component caching + cache: LRU({ + max: 1000, + maxAge: 1000 * 60 * 15 + }), + // this is only needed when vue-server-renderer is npm-linked + basedir: resolve('./public'), + // performance + runInNewContext: false + })) +} + module.exports = { // adapted from: https://git.io/vodU0 before: function (browser, done) { - /** - * Server config - */ - done() + const app = express() - console.log(`KawAnime's server is at http://localhost:${uri}`.green) + const bundle = require('../../public/vue-ssr-server-bundle.json') + const clientManifest = require('../../public/vue-ssr-client-manifest.json') + renderer = createRenderer(bundle, { + clientManifest + }) + + console.log(renderer) + + app.use(compression({ threshold: 0 })) + app.use('/static', serve('./static', true)) + app.use('/public', serve('./public', true)) + + // Setup the api + require('../../server')(app) + + // 301 redirect for changed routes + Object.keys(redirects).forEach((k) => { + app.get(k, (req, res) => res.redirect(301, redirects[k])) + }) + + server = app.listen(9200, '0.0.0.0', () => { + console.log(`> server started at ${uri}`.green) + done() + }) }, 'Getting downloader page and downloading some anime': function (client) { client @@ -34,7 +83,7 @@ module.exports = { // adapted from: https://git.io/vodU0 .click('div.choose-magnets .input-group__input') .assert.visible('input[name="name-input"]') .click('input[name="name-input"]') - .setValue('input[name="name-input"]', 'rewrite') + .setValue('input[name="name-input"]', 'sakura trick') .assert.visible('input[name="from-ep-input"]') .click('input[name="from-ep-input"]') .setValue('input[name="from-ep-input"]', '3') diff --git a/webpack/setup-dev-server.js b/webpack/setup-dev-server.js index 94e1418..f45530a 100644 --- a/webpack/setup-dev-server.js +++ b/webpack/setup-dev-server.js @@ -1,8 +1,8 @@ const path = require('path') const webpack = require('webpack') const MFS = require('memory-fs') -const clientConfig = require('./webpack.client.config') -const serverConfig = require('./webpack.server.config') +const clientConfig = require(path.join(__dirname, 'webpack.client.config')) +const serverConfig = require(path.join(__dirname, 'webpack.server.config')) module.exports = function setupDevServer (app, cb) { let bundle, clientManifest diff --git a/webpack/vue-loader.config.js b/webpack/vue-loader.config.js index e4ae821..5a619b7 100644 --- a/webpack/vue-loader.config.js +++ b/webpack/vue-loader.config.js @@ -1,5 +1,5 @@ module.exports = { - extractCSS: process.env.NODE_ENV === 'production', + extractCSS: !process.env.NODE_ENV === 'development', preserveWhitespace: false, postcss: [ require('autoprefixer')({ diff --git a/webpack/webpack.client.config.js b/webpack/webpack.client.config.js index 4f706e3..c365768 100644 --- a/webpack/webpack.client.config.js +++ b/webpack/webpack.client.config.js @@ -1,7 +1,6 @@ const webpack = require('webpack') const merge = require('webpack-merge') const base = require('./webpack.base.config') -// const SWPrecachePlugin = require('sw-precache-webpack-plugin') const VueSSRClientPlugin = require('vue-server-renderer/client-plugin') const config = merge(base, {