From aa5f288fc86f1f49b81f4e4c64903cb84c20ce1e Mon Sep 17 00:00:00 2001 From: mfwadejr <125498560+mfwadejr@users.noreply.github.com> Date: Sun, 30 Aug 2026 16:14:36 -0400 Subject: [PATCH] Release v3.3.0 operational polish --- CHANGELOG.md | 12 +++++++++ README.md | 26 +++++++++++++++++- docker-compose.zimaos.yml | 2 +- docs/screenshots/admin-system-backups.png | Bin 0 -> 181262 bytes docs/screenshots/sales-filters.png | Bin 0 -> 31081 bytes package.json | 2 +- public/app.js | 21 +++++++++------ public/extras.css | 1 + public/index.html | 2 +- public/theme.css | 1 + server.mjs | 31 +++++++++++++++++----- test/server.test.mjs | 7 +++++ 12 files changed, 87 insertions(+), 18 deletions(-) create mode 100644 docs/screenshots/admin-system-backups.png create mode 100644 docs/screenshots/sales-filters.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 111880c..97ae06a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 3.3.0 + +- Added returning-customer autocomplete and server-side duplicate safeguards using customer IDs, normalized names, and phone numbers. +- Expanded sale correction to include customer, phone, sale date, price, payment method, payment reference, fulfillment, tracking, warranty, and notes. +- Added model, payment, fulfillment, warranty-status, and date-range filters. +- Added CSV exports for inventory, sales, customers, warranties, and the administrator audit log. +- Added configurable daily SQLite backups with local-time scheduling and automatic retention pruning. +- Added an Admin diagnostics panel with application and schema versions, Node.js version, database size, data-directory writability, storage capacity, time zone, and backup health. +- Prevented duplicate sale submissions while a save is in progress. +- Corrected the delivery-exception status value shared by the UI and API. +- Expanded API tests for full sale correction, customer reuse, exports, diagnostics, and backup settings. + ## 3.2.0 - Added sale fulfillment methods for Shipped, Dropped Off, Installed At, and Meet with context-sensitive fields and validation. diff --git a/README.md b/README.md index abbc6fc..65ccdbc 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,14 @@ General inventory tools can be larger and more complicated than a small reseller - Record Cash, Venmo, or PayPal payments with an optional reference. - Attach transaction notes to a sale and time-stamped support notes to a customer. - Browse inventory, sales, and customers in searchable 10-record pages. +- Filter records by model and date, with additional payment, fulfillment, and warranty filters for sales. +- Export inventory, sales, customers, warranty configuration, and audit history to CSV. - View sale details and complete purchase history for each customer. +- Select returning customers during a sale and safely correct all transaction details afterward. - Void a sale and return the device to available inventory. - Use Admin and Read-Only accounts with server-enforced permissions. - Create, download, restore, and delete SQLite backups from the Admin page. +- Schedule automatic daily backups with configurable retention and review storage/database diagnostics. - Review an audit log of authentication, account administration, backups, and data changes. - Keep all persistent application data in one mounted directory. @@ -58,6 +62,14 @@ General inventory tools can be larger and more complicated than a small reseller ![vBoxStock warranty period administration](docs/screenshots/admin-warranties.png) +### Sales filters and CSV export + +![vBoxStock sales filters and export controls](docs/screenshots/sales-filters.png) + +### System diagnostics and scheduled backups + +![vBoxStock system diagnostics and scheduled backup settings](docs/screenshots/admin-system-backups.png) + ### User administration and database backups ![vBoxStock user administration and database backups](docs/screenshots/admin-users-backups.jpg) @@ -209,6 +221,10 @@ A fresh installation creates an empty inventory, sales history, and customer lis The Admin page can create a transactionally consistent snapshot, download it to another device, restore a local snapshot, or upload and restore a downloaded copy. A pre-restore snapshot is created automatically before the active database is replaced. +Daily automatic backups can be enabled under **Admin → System and data tools**. Choose a local-time hour from `0` through `23` and retain between 1 and 365 scheduled snapshots. Retention applies only to files named `scheduled-*.db`; manual, pre-upgrade, and pre-restore backups are never removed automatically. The application checks the schedule every 15 minutes and creates at most one scheduled backup per calendar day. + +The same section reports application and database-schema versions, Node.js version, database size, `/data` writability, free disk space, configured time zone, and the latest backup. These checks are local to the container and do not transmit system information anywhere. + ## Product model catalog Administrators manage product models from **Admin → Product models**. Active models appear alphabetically in the Receive Product dropdown. Archiving a model removes it from that dropdown but does not change existing inventory, sales, customer history, or reports. Available units that use an archived model can still be sold, and an archived model can be reactivated at any time. @@ -223,7 +239,15 @@ Shipped sales support UPS, FedEx, USPS, or Other, an optional tracking number, a Administrators manage reusable warranty periods under **Admin → Warranty periods**. The initial choices are No Warranty, 30 Days, 60 Days, 90 Days, and 1 Year. Custom durations can use days, months, or years, and one active period is the default for new sales. Once used, a period is preserved for historical accuracy and can be archived but not edited or deleted. Each sale stores the selected warranty and calculated end date as a snapshot; changing the default does not rewrite previous sales. -The model catalog is stored in `vboxstock.db`, so it is included automatically in every backup and restore. Upgrading from a release with the original fixed model list migrates the existing database in place and first creates a `pre-model-catalog-*.db` safety backup in `/data/backups`. +### Customer matching, filters, and exports + +The sale form suggests existing customers by name and phone number. Selecting a suggestion reuses its customer ID, while the server also normalizes phone digits and names to reduce accidental duplicates. Meetup and drop-off locations remain sale-specific and do not overwrite a customer's permanent address. + +Administrators can correct every sale field later, including customer, phone, date, price, payment, fulfillment, tracking, warranty, and notes. Changing the sale date recalculates the selected warranty end date. Inventory and sales can be filtered by model and date; sales also support payment, fulfillment, and warranty-status filters. + +CSV downloads are available for inventory, sales, customers, and warranty configuration. Administrators can additionally export the security audit log. Exports are generated directly from the active database and do not use an external reporting service. + +The model catalog is stored in `vboxstock.db`, so it is included automatically in every backup and restore. Schema-changing upgrades migrate the existing database in place and create a pre-upgrade safety backup in `/data/backups` when required. Backups contain customer information and password hashes. Store downloaded copies securely. Restoring a database also restores the user accounts contained in that backup and signs out every active session. An older backup without user accounts starts the first-login `admin` / `admin` setup flow. diff --git a/docker-compose.zimaos.yml b/docker-compose.zimaos.yml index 6bc8525..4a269ac 100644 --- a/docker-compose.zimaos.yml +++ b/docker-compose.zimaos.yml @@ -36,7 +36,7 @@ x-casaos: category: Productivity architectures: - amd64 - version: "3.2.0" + version: "3.3.0" update_at: "2026-08-30" release_notes: en_US: Added administrator-managed product models with archival and historical preservation. diff --git a/docs/screenshots/admin-system-backups.png b/docs/screenshots/admin-system-backups.png new file mode 100644 index 0000000000000000000000000000000000000000..008e49012d1eff94c5ce0d3ac608fbaa3a33eb8d GIT binary patch literal 181262 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

BEqP-W2cPwMZm^e%bgqx>$ z8+_XDf>hnv(NaB1uJVu1)Cim_62pXdKWu9L*s1biGCq&qFls(SSW4%DRTRca;nZ{J z4h=n%EF>L$sv?eW7c>u#ioQja3dn<8%5f;|lWZ)Q1fNc>$tVIUH|ZCcyM=7{@WmXl zU80@Rx_p~7(1}ZD_W&pLjS~2uY@$D4_W<1Eijkg1V)m z!Xcok$y=l_DL7D3<*)mJx<6U+uZtZN?AHmb`6-yaG2UijB%x(>%l!N>BJYl*e<8vO z`de;!2T`8xV-0I?SRl#1>skD+TSo2e6UY0F=@rwljTq3N1L!*xCLBHa+P^8`*07icHUS2x?kfv{O8)0u(Ve83_1YUtdYWHMj(YQu9aWY;eY6D^u<*fd))Siske!*aw=s$fl0OefJyJ%r^J|Lc0}`#hbsG9NTSBqlY|R z@OO<@e&<;Hc`vm$RON&Qo%zB-LH31vg^Ru` z>jH-U5yrXesjQ+t(f#mIM_^zWTkelHRxv)seR}FM5w4%pp20K_A*!^_t+#H9smF2i z4|2_oPba^licH~_weJ6|&()XrUpvu+DJ(F~OQ|<+&zY8kq(s1OzbVx2aYFPcFsH z__CP>ig8S^?|Ms&#X}vhvEhoAsh-L|2#ktPdzytQ(Rgo2Oi9OQSm@cLI&1cB6!)GL zLi&^wm1yW(hJN*?<;C4!n*Xfy?1EFqt|xU5FeZ4|XN*3-YLbv7D>cPoYaX6mPJ;Ko zq3Wiz$AJUqbuq&_KQyRe2ybuPC|)%B&To9;aywq~_M@2GtzxJxps7(OdA3nA{hwFz|U0xLVF z>jJ$2sAW6#Zf*QUriZ_k2}49OF$kDoDT>=IlwDZaZu>50(s|5LFlQ5M*AkS1qtlC`Y5eoP!yPZ+|7L18 z!-V5P866BS9o=yMq?JK={rR{Y^DBOz`=iz2nHtnkvca?Cz#sDHt{ML)An@$?gONXf z`{!6W@bkIPLs0v(5TE|n6#qFWeUeY&c&XqpoC@kXP<#1@{FNxhs&Yq1nBba)N!Trd zL)1GT;e~~MBsBRCX*wk`@$A&O7$rT0jJkn`$LxXkH-PN%l+&9X1PlGt??h5}O{f1D1*rHmYAB(d4D*i@`sPtMD^+lzuY8)jZ!_}(jC!;gPq>viZKY#wrb;n1cW*p) z2|}VeVDR*_K<@{s>M7otOYTns@RrR_B)wAp3y%f7=6_vjI*DXbV zVhXWX*aO(E>dS&p-)oL{9LVKfynb$Blv7>%>jxR?LCEd{(Z289uzLysLc zn!8*6XR%9F726%SxZ_@H%1<_AHb=MO{#IPm@lSp|K%-XcZ!g4C! zOhs?f60GAiEnjszzuY1!>-)p41zSPcD0?g@Y|u->-m#&TcG^?TPl`s?>}dGN78o*z zbtfj=84WTUm_&SB?!<4OCfA0B@-s{yq+!4!@}^lpPCVJia~khZw>t?ctl8cW=NNua znX;SU!;8v(EAVtPr2-S~gS83g6XHS=`UWm8lrD`Y6!iI3hmRYzr_QOSKYYxZMbq5C zYqlCCTqrd=v>B8G!P5@VD`S1a@;24bU8d4y6?DW{7x%GJh7TXxc`>)C@dp;m#f)lwqp5svZ9@t<6tAm`Xv-^FagsUJ!{v-5`ig z@Eg3E+C9M6^8e+&_^K+dIc#-R;jjDX1nZyv%c%b2iu?R(M^!^M2_)1mj9*K?Xm#J0Y~TbAb-m-451zx zm5mLZem36Sl_J@iuS&uxtE>*6fjjD`mKc?UwERARvQDPDz_;?nE-fXEligX;q>qQ_ z#s#jsvpNthnLxU1&2a^}XqOtRO{sG)JTiIC$XZ4wUICIZ2=@w(PCVy`YSb4T9A&I$ zluyp;c7s$grYX8-wQbT=1RnORmS-!$1!cjZpzE;a?G@E&EDba$; zZXWO5315B^c27*;LtlamW8=1fGg1s%Q4DHVE(1Jtk1#0k=IMXhS@ro|6P8x?w=DacK$J~o6sDyTCP{GCIjm}76)v1OcvQyc|`W-uT}J*EYCnWN}f5+ z;MVxu*EG{iX}gNMyu0GMM68zQ z(6m^as_e)WhZY{Mr8Y@@A~a)Sp`r^rC05GOm`BGwA;Oiv{WE87f87WeA<3G>Z4?!e&#X+MMku4H zoe?_+CDn-{4*i5QS^2V*qQ1o^1jREXE9Y6gA`PXxbK|*<5B;YaV!0x+a=^d=F%hW- z3-6JR`>hGaoil#3mwMqHo)>&v@zR`}dX3ED*zxy1mM#?i8GcX79EIy7=g8tPa(NxB zn%e3ZUC1{?i%9$fn=Z7lfAB_e?v~~Z58dRi+hS6HP6@7xN%cgS!H>~tDy?hJoUarv0ToE z^jchIFUE#?%uSiyu+cQya_E(mZ>5ug0x#NolFq?mP29fw-HeG~XMm|dU{MuW(Wfrv z02gi_I*-P4({Pt<>Ll6sQUFBGA*4Ew>606|#lF zQXBjwy4d*6eSya?9SjQeC(6ppL4)yN8;)a{f}vIXYEW{eu2aMjZD>&`?eKtjN2FC% z&kXu{ef7-T3qQ|^DhFRog=c(*$nm!0K6Pug0oi4Tfh+kR;2dmsj2`M2WAg1zbCcP` z?otZ_-k7Xmr%B!Elo-3QxPFHLvC>3dZ$ zQtj;8V-!(f;bHOF<_9gGwI`z&wRJFFA(lwNJzL*A>e)&~kT6Y5T=goAyy+a{jUKq| z9nRH;*kC>|Q^1|+Gf(mV<2C4h2(`?ENTE?Ja8FgH#xFIAgL1 z0cX!j=J0JG(V<%JN0-L?w?CHaxInvds`PpzODPHWve}PrC#O2XTIQU8Nhe|4V0h{d z1qqt6z-j9~dz&=mIX=~R0=?_Z_RpKmsKv2lYoLU}gOl3B$G4E82ERw(bel`06zzLk zPu8esCEf4cEZqa-%D!$%rE@20tNNhK?3o+|muj6>)Xfg4W4Dg%_>Q{@2TZ2Is3~{a ztsmkE{*_*S2)RpJ89UrJf%D_h$xRrC`#IpuJe-rc*{#e;GZpOy8I>8Oa~9@oDnw({ z6+0+(Q-yG^kQ`iVQ$6t1^8~`9GEXB}77v8w_0~Od)_OFuINW5kIp)$>0?rfxYx>DS zs1Oke-Dju~Dl@B?P@EdphHY(ja3ajQ;vBd{EYK4Rx|vm`*?WKI{=oA@BCRE=vY~Sk z27fQVX&&HCG8`R&oNyp<{Td1&x_*6Bu>M-3_duz7FOkSog@?BFkYlbm(?UZaJnIyY zZpg5X`Ay3J>Tn!r`g&_HGPT#Up<6{Ld3Q>GsBnTG;O)qIB$qL{gpNrO@;Vhean)o{ zW05#DQX%#*@lauYbMul0rv1IP%_9#4Asz~|9K5tG79P+hUb2M%60h*J1S%}(dq`m7 zdS#%6!Q`SCMb&e2*s7=^KiAO#)yWWHLVP)yq{q&z4I)Fv(xwwc;{rXj;|^($M{lwM z(bpZNUZQI&>sp6msOGI>K3Vh%dF^rq9k<$biP$Q{QD_R*A3-%$OEHnt&Kf*GrpDc# zSXy0P&}6QJ8nPsXu?|pQdGluBQst*5?3EDK-O~INH>6q&$|9&iy`MnOB2!>upha>?pxAO<@J(14&!s;+k=KG0mn>Em0dU|@d7EtnbOqiD8*O226yEdha`cZEo^uC_GJ&QP-2}L~sUAji zr#7h~L}GqzW%ACwnu=0Kdk#^%ou)s2!l_?B{XJ2D?2(kbJqrG?)l~>;J}$8u_IyM2 zD}=^0u*69+F>yI_Y)TuPg!c|zYK+r*ch8$`Gb;@)ZDz$Jq$t?XAXn%xwbscxRZ{SF z=x&?8t6@iWJ3-rLt5HWTBIZT>Ks5ihUg+#u$_&HkN;tms-B6n9T*jn{>(QmTk?Lpe zeK;dFbX!H{=P=Qw?kfHI*DX+2?omXFq!zMIcXbLZ%yA>iN;Ip7uiJRonT zKq6NLGPGy7rK~+b40GD6>)mKed4lu7|F1*Szh4^vTl~__zw#cy66GvrdP`OnAl78x zsX6tiH&(7=FBT1SYcYDVJ<0u?34bvz@`aV@Z`9+a)AOe)D~Vu_C?QX8Jj$_JZ!1c? zM|}r)@)v(vnL*wM&s7WXW@!{;*z{$@j)_BOV{O zZGHSHAyKWdOJKj)dSvN-6 z7~hf2#uwb09n>-NEz?{sJE;(`qyf?k%6ITUveGIzzO(2#gQVOLA<<{|A|xR9R)8h~ zD{07vzTCV@lk(<|GAa30&IQw_I+Q_4gv<$#O~=XZ%t<&o1KQ&2F68GP(UQ=n;TP_n z!s=pr_J-f~AZgy$d)^0*Pz+W}(WJK=WfvT6vLFq?pqO}k`~VstVg2ug>^}`343Hu0 zOi#g_@EcbBHPlOK|LL0lM8U77!<*53!9lldn>rs3yS_BXjTmL1JSsJ&dpn~dz=)ev ziF$q(4*o zoN~TMr|!LS91L+QO+jO!OGbYravAoaBnCFtKMd=b@tp46wFIwR&=F{YBbdMEY!&N@ zriCcB?3}f%sEUUYv0Wd?TuY5)5B(&xNmuau2p$L)^Ip!JJw&g_BnOT1#}m(a-!k6q z$n+?8vW`#NVAxna5qx*yiO;<1g+oryKe*EkjDuB@75OkwN=xZOdW}H`FM2ePpXjg_ zVp>vFS;_3UE8oYvl-o)3I?|jII%TO;y=CE&hhbjOxn^Aw|0uvbr#%FTC$+`5U1;Xk zM*vG#c%2e9<&7uQl5kncyn*!~Lsx>W#rN%#n39ssV5jK23N{E#FYwf09cB&&Z8+1W zzaF3XB(oU;V=IwUnyYaiVx9bWwpEMy`HMSDnwwFL^`N%SV)?VdC5)>-o?Lv1G0RYB zk3c0|CVDl)k|5y=>#>L^kKZOmlOjU4oKzZOR_n0Ldfiikd-e0Yi$zON*B;Ndk2d5P zUjy}ipXf9N81oS-y7n|qWjum7eTA{AcPx@H=oNxP`klEK4Xm$_?eCH?90Th{kaL?K zc~0oIC-%S*q9Y6al8bd-n`*zmDw(PI+1*$Jr{Sa-BiO!?cp}X2dS!V<5GMAQ?FBWaYGZ=QpM00jU2I_GF8DkTjWR(=yB*~pi zHWfmsOca3Ck_M#MJYE&$yJpQFUp+2xRcKZjBZ#iosS`R7Qt6qc)ypI8&yY)80#&k1 z*hPLE2)7VNQCcYFgxuHpWnC*%U8{u09B9jv$6(8@Ge zHF6Rj^TP;91s9GOlfU)wL?YbYcRbUyDyA7L{cn5D$l%)uOeZwYtSRtyc zmD-4Z{3B?svX$aHy`VDDtl?9MO~+#{_F5UVc(*;a!g}cX>9$i9djntygmeyushN6y zTjr93#HXyTss6cSx(Aww#SHuDC@8JFiI*^wh2qO0W5S(6eMc+fus#cx{LOBb(O1?V z_oHl`*b1GGWJA0r!PdO`*pE%F?Oys6!=WZ@X<-=yiTJS`0wn}KYjsU^THga4n-AOe zQU3aqivbD(&6Nws5=Aqhi>?!z3kl;bNp1-orOCQzT7Z{$7m8j6l?4e#QMz^0p##hm zb+t#-?4IoRx0SnMFIFr&Zt#uH*V8{%K6}6_9gwFt=-Z9f^FeJDqe2ot)(6ML=S)_$ z_(2uS8-FPxpkRS*xhD$8>ImB&fvty>OB`B@r5GlxU5osKy;L>w)4+h_d2RDl1g zdl4}hP7)lZ=By^ze2s&z-cWNUSE)xjYMA6Ka(V_*)!S*-XVv8wY@&#W9Au4qA31D= zvt!K$P}`D)uk3p$jqE_KcmPYdIYWYOX>PG-lqypie!INoe&ZAVv&`w0dJUU-&bUjo zh3Oiqwne z%gv&1jnnPwG9Jwe`QA2itZLb4_Culg{MI10zo*;p+DQQRmLFPY*c0ET;+) z@)fj8hxIv;z6;4K6-%R{@^@e7JB%ex**qDTt*sJ#+bJQtG`p!JHKdBY5lAwF6%uX1 zT8XVWvEv7kIu;VGS9q~uLmyfWKZ_^Wq_d;!Edw-yzZb0O|2=9SMGg+J8WUnKxZ~+? z;xr*-VQX>cxMi)o0@tasl!S1Bz*=Zfe5h1?3At#ayo}(nP6FFR^Awh@`)EOYJaM&+`ryYdA{cOL0SSW>5y{$ ziv@6J|1w!Kg+Cv^i_7~+HGYe?D299>(QuI1tMHZuJ&89Ee>W?tJ~^bd3t1!>jfR-p-+syrzcaTv z$!_@$c&;bp;h11t)r-5Z$t(QZ-3V+eJ zP4$g(6@;nr3BUKclx6agJ6S?nQ6~Zc(ip4-3^A%Reptxb+#&QYGlfQbDgspaYdzrE z>Ujm-_tFP5X!RNIcxvB#Qw8ocE8fTuhSz5Zl)Axk2r@ZSG7a*e#fb5ijM_HJlV#*| zVa^mZpK7dWv1R3kpJYJ1f1YkK_8p3BjKu$`7;GO~G&VB89>8SR{^`FjC^u#-_vGXVB{S+9Vw3pdICFQ*O z${g2A(U#@ZJ~}Wx$242LU?=b5svNTLO0_#@;Fw}_j#>V#7;L=pv@vqMAhi6?bim8&cDCbVe4pqP2IZ2&GcbvlZh_} zsu0MYuc~N2blVZjAb5$B?$#BS_v6REuWeNURn)87SNUu!9L@v-tx2V3!PB0w;I?Gm z%MK~JqWweZUmo{|$5J(&gY)w$>b(a@Z`D5EoVq_g?fb+5KR4v|WL477itUrXh=l|n zH*`u&G?s2BhSi03RHvQ>I_PR}c+bNyD9QPjrj{4`pOsQo884?uOMBMXzU` zr1f~`Kui<|)9&oJk3los-!$~H$1RgbW8A!?%W$@7fS1W^xZ#@PABRD|M^}9;tyI424EV$o(++2@YYL;~$*- z*auG6?4v${Dgo=8Q**?sgCU@=KkuuNqnc;#jHXx>$Xn8e`T4S*%(Ra#=(>OZeo#Ry zlhq;4oa$(c^o2IrTe(dB*m?EmXM?)8STVkJ9rnW}S80%?yP7AB!)02(_2EoQ=vln{ zq#AnfUU!MF*OEOlfFIHo(?RU@&Tjg?;vLVUw+|C?IN{TcmYE>CD@7Ht<#5Xlcn4R!1mtYn?KA7WrZNBTXo2yET9Q}!`!~hlNvoRElvJ`M- ztH$o7o$@^~b&;Gr4|a_XtgI9IvXZ0$g9TccN~hwSV5vJSVAx#Fb`3az-m59h8n6x4 zx|H9RyB&Ez9BnC*+wb}rXm(SxlC|1wH$zgV9iM#G6KZ3%v3gm?{n3dw_u=TkoHyez z64Y1nTb*d*CUEW=*9#eLq<^HztoYgViqa@k}6s{Bz4Q~Z(as-bW?M8 zCap=1Zw=Hknz%y|+VyQt_4e#pzpsH|$?@tpQBf;^{a(79kE4llF`kmE7hnDI0Q(}B za#IF&*#Q--JfM5qR2xD|eaExKc=3j(>V0<^B}4o!gjo*WiI-Miog=H(OsYgD+F%+p zE>@2}iuBzbvG4c3!hrb@Cxq`%gmES((%9`@Z;yLr+aP8S7=G;$az0(rDViJNp=Q%ZGRP z?(@?ZbzlV~;g|V|P?7RHvUFKNcaLq_s<%T`ntkDOn=!iu-#V_$Kp%Z!^kqS|pv(#p zROMb(CdL@P1UWP8?Ig1!-AS)&_s#cji)&h)P@VVQ$3DOMye-;mN)4gTk<469aifQ5 zgycE&GO1YjIz`ROt8Py>6z~!{XOh@p?8E&r@4w>cSmJ=~Vx zWrqX>s$Ek)?>sURuzz6o_RZnUfjtcH+XNW+ND^cI8*AS8Jd`d_Um;T?6}{XpttHX~ zCOg`%s&@oGRQ(&!;?w_x9qgYj`kV9fNAP0KFO0o#PD)2hWo1Q~MF2n50v;H@C&Sv6 zdn_oC@{Z?0n5kg}+026G1}6pf`fvI)#-=Y9xZ;yOL%sNcMIH{R(Dc?UojE_IxpI3n zu*2#34$jzsyqrR^)B<6TA*@F3Vw4b;0V|0P+Vf}UyUqo&b|>||TDqWa+Np1mbazxL z-M`lTbmvzztbQ_E-tP8DQt|>QazY?%^qC^=eNj4TmdeD8m~JpAqc^Tn z{D&X5KAHRC^f&)!Pe9R6J(;z7l6_5kcrM_w`a`JX%KrW|1ub7dwsQ6(dkH_Jq}!(@ zJJ%=bVhtPEWl>ElvcXBE71%gCYVc(oySsL^ZX)R&kJrM17x*2|_Vs@Mh_d8VtGir+ zwW&294eREkVLS&99F8Kos2ec@UvuXTl7qtphzqVhEj#acx)o#SXOhe9$sGX2kYm`y zV8xNOLJGv!jj+(B-u8~CzqYM#g=XhyRbF`);CA+1G^)Rq)ac~ii{@sJzzXat`US*{ zA+^`BU@9__V=%LJuX_b4PsC+1-e(UN*I-yAxDrgC=d|5b4ZI|uEHm}NMSEXR+6pW)~5gksxe&aTN zrg$1gP}e}(w4t8`tlHG8=4vs}!n%X}q&X_}prKX{ucI=e9v%i_;? z^Kh@dw3@Etv=N0yI-c*Vh!T73Jmpjnoba;VmC7g~N$b7i2>>v(9eWX&3CBx9?)++i zr%Q0KaGdSWTNLMy#&ginM_YP0RN`MZ$p3>e;?L&u#E;f=sRwNk3)Bw(n)6=bUU*Yt zh?SX=Zr=+Bu?vhdpH)9zMsu{`_rit0B5PQ;;Y*qF7$l;y(q~KQa@K$eA^mY@A52S&V+Sv?nCj| z4>kXNrGIPh|Kc72;)Pxro1Nv_Zi`QcS!^5{N)JdV&Ytoq7mMi)vC3mYRa~4BpUYY# z#`dnwrF!m*)*n1t-r4W82Hu2>!^VZc3}k5i!w1_&?Rz@GjuD9L_>QZO?#q=bZ>F_L zD8J+J5d$n!wm?9KIbdP-N^h*iy?zi~zlR3^M-nD~c}-gT)?tjj#P0FZI_u8ADs_5C zX?S%zm2v2%$GzYCyH`$+ZxMK}r9af5a$`Bb4guMZ+9{nPWO+{leQL7ts$ zZyc~&XdWp@y|@g#kw!%!$!5Cs*7W}G3=0v;6T&twhv#z?KJqS9f23i6U4Hcs2A_X9 z>v#MM@9|v5XQ{i^%rH|7sw~wp<0aeAB-Ii;ll0T{w z`f0ZTyq-cC)%P9O41gyHUrka3R3(E5BQgRhpiW0CMovorQq zh|ts*|5eh53{IC##9X|9xw6}T8Tr&0@kJFY{){cS7l8S$@7>VQrDiii4 z7a=;VbogTx6E{?gjHOa=D)FnEnhS;z^E_XSfAcSNn=@4TUof?_t4k3*7yaJxDDE?; zIVg!|IGh8)NUQdYcl7LK%ArtrF5N4}uE&`lj3i zZZiB#gaykmBo9sgn|YeJdn0IVvbxpX7AgG-%yvYb{lut_!bTT~3{Cl}tP)S{gp^7? zYWEHxTNDJ~!ddj<5%07qRk^|_Mfa^yfF56cu8v7~ zk0s3jNj13-N-eT?uvQyy*Ufv|l@`1PL{8YAQjALOCE{;|d@KGr2<{-PL}}x{Py+#L zt5(ft1f}KLE#dumPc2TL8tNr@G+iP~*JvLMg(@X{;VUu}Stp>zI36ljj^O1CGEu{w z$dCo=N%_RvFztiEppBNGf@(5DbI5^ra=iL6c~?LHlz`YmjAq!+bAwMVH8`L6Ai_lW zq-HykLNyPtlv<&-;fzha8qGwDk~bz9=bycN`2Gotn1Lo!H-Z2%-}jfpIGx?K<^S5~ zw+8?~U;jP_8uFjg1IwoBTk>Qp!P}{_eadb0w?@p0YuCHyeByYMoJ{*`w}ao(FUA%E z5jwz9PqU?%4}X__S|&GZ)W&Q6D6j`}VyFH?Pb@N?lRt3okB<8z+>=3wHAe7$dKdOi z$81(fY{lKS58tUiPM;wVhsLc;{>oW%x>M5Y&UZX_^0zV-7eIpCWAp;H2O^Mahj+q0 zFjWXYTF3<1TKJ*z>2B9>;|Zb?;{73?F~(5AVPo_a^wKtDd~8e&PR#3N*!hmx$1b#o zN(y5WLFT@Jxg9nT#=JJI2aFT$oXVm35{g)h;eIh%QEFuJ=H8e&WzU(gLrbVyOyP%hPR zBFLAPNgr3AHZ^F!f}G*oc*g_ByqFnlZ|t1xX8GTy3LOeuAM^m?i^+R5u(N4aXP)Q2 z<9Xiscu1&{^`;T<&iLjN`+xQ`aSWCf)1vzJ%$56lB|D5KKk2Hy$!OmZ#q{WC{d7y`}nkI$W^_~Nk-`A@EHnf4&`SujXLrdLJ z&P{R-8?|Hw&pdj*4V@d*swRQ|@g2`v{TDJ7Ce0@6h89k8__-&^VPUPoZQw3`sv%j! z(05*}2k(STVteeo&DhnuaYB7ED?)J$TmRjmbJdfT0MxRUtSiQk3hAXd)p{7fqmxW? z$5Pw2T+hD`bmN}Fe7ejfct)$)mC+&Po5;mx`22AdqModt=>r&Btb{9s0I|ljJH_#M7YpWY{!+e*RjfdS7CPX!;fIgB{{d zW6w@#?nTdmp7s9_<;kV?jC-PeS5f^3&&kKyPAkEb#x}Sn=Yu$DV!DTY7EhLJhA2*n zAr4PA?@w(yxy4S03AJC7yDm{?`%tA_B;rB4cyg5uZA0Bkv{-p1*J?m zZEq`Wn^0|stDnZYsi`CE)6e1(kg@K^<ni(1!I$0sR2EeVL6S0*cR79xW zvquc0@z(|;qg95mDES^6vm0#&QyM<~2ez;X|41(iWPndJ5o@uPot%VWs@AOixWLTG z3<)wEQI=)X9~+{@V_g@##<-@-Hz%yDio2H3r*Xz}sq^vE=qP@;3O@vm?E;m#xz|7T zK4rJ!YDI{H_>hfFRW#av9=nn`k)nVL&u$<0k0Wo<-StcJL4pG1iL2p;kYiy4r^LkbiC}| z9;*&hqto&oawSj05EiG?6BIL2%$&Gh3jNck|Lj2V$+fq`2Yq{j4@v5stio{c>r>Zk zmoGh}c}|Y1K^c?%d6oU~W6ux>djz&?7~Ed#_iDW2WKfqJUMPTqe~|&0;&miZ8;DFBvIHN-JBKg z?^e*HfJvM!dJ)wNKUQ_sZ3T@She43L>b&n6gc}F-oR!p%7>Cfx5Ar<=iRI7Lv9hLgbIw$w)u$V zFULO~i7sEYv0UuUgwoY5;!K}*ewQ`7-dUPtlCC7(`sk}=ev+)+?My1#w-7a^^=Q1= zcigcnI$L2^y|yVZVADoR_e(wN=Ph4I(5BsriH;E^osim0@R;*W{(Nh*(4aOyFfwQ> zq{L9Kr+(pqAICn^LBDv?PpH3|>Q}Y42=EdDi>_xa?rKr71sm?aQ;#<|p4uFjPd2^r z)xB5bMPnBMhnd?r49JPuIiTL3y%StYg+f$N zY|O0^0d9D1tU5>9#B#B})3FS)?hiVWVA@%b$3|6*jdFfi-o3oG7yqTUuDeFxgJ9SE z?(=ym{Fqm9s!;_phVh#lr%M(b^xH^cER`&X6^@8HnCySE`Tbb-A2C(8 zw2gKe*cK54df>+uw3-)Yb*ru&t$B}d3|Ui3X+h45Qk&(W*yfNiWFqIatWQxm<3U^u z&|7z#X`IXgM7I9^puo#swws?H#tw-jnV?lJz`$VSJ%g6qG+O+F?sT$*+Hgs1%_haTXI~8~C%pJ^qQF6M|umXVdGmSVf@liXD zD54jeBTO`s<~AiCPa97s@luM_EE%X2G0hzN=N-%_M5~Go$i)7QO=BSQA+%+w6s?p@7t#N{cXFj!{v5-)?Kkh zDevz!+T@Jq$RP!9Pf(r=TKO;^u(|~PCm1e9=t1)i7AjiN`#8Gp4a7chdkYAYg)j3w#@~owCU$FZpXbuf}*-{kg zrXpdSv!^KP_O{bt(jDb!(YJu4OP{c=qDXXvWJ|NVl;W55unC84@EP+wfCm>jq@hml z3rYgmdKs;Pk+)_rIeIliam*A7zc6CTNF7z0)B?Kqc9`IL0;(LSdN~`4mzpWYBjKpc zStdodM$#A=d$?KEd^y?@3^rIXmMfee-@I~5>#BaYd3kkQa0%hq3e@Y6fmsS-EgH@21i7YVQ+&5tjKXN#D> z1W!2kS5N1)S;YERf~D`JwuLRF1SsZSHBWPGbgApr2$^X^r?mrn>n)0@SGvOQ-;{Yt z$EXkCE3ZT{)h}^HT~7}XeOe;6G(WKrj{(S_|7mExIbheNFvHFSA*bZo=8fIKp)sGa z9O=vPC1IR9Wi==41E3^(c|vM*0bV^m#J%bUxDpfNgtu=|b{SrX@E9m%rUdM4vH3Oo zysu;)ZAONDo{BFyim0g>!awAkEYoydkNC_B_UNtiGkQng?90*v{hA?few33PY8%}L z$IHG9xkxke$=$@0bjHf(2Rb(cw|yr|gYA65eM}}5+%REDu8Yj4t`z2GE*Q9|cu&}M zYrCiFHkMPq4_AEcMeUP_*%gU)MYT<9`W4qDl6uMfcE+H`Q{I6NDcULTcz_MVqst-1 z*{q)#-Z+@=WY$z{lk4eU+v*}Xj7(2bPI=$5@AbYYO*l0`a{#goEs%^>Vs$b%#>W$` zrOkO3(zQ@_B$KuTB&E5gqrgi+zJI~uwR{ao(TH$!$Bjj9m#tqIMf4z-&3b_r4j9p@NX-tqU1@!` z;%?R(fM&!zw$g6|pT(30RjFkd;5?;=R6mIPsKz5>_*~wslIVgyTH_Wl&zyPe)*Tww zQb?RF0`X;piyIG8>d%MvJlMhrQA2migT*Gu1u%L!ajDA+9mnjYo(~%-DH$FJ+NRZw6V2+A-Ui^s}M83~yxE`|yIq{yd!cHKy*x2mE>ycpZ8 zlsC2M8Kzc-ptw8D(L30A{nRKhB083A#A|jIZ9d7pJt>*H9HwKHoTftWDp;z1oWO5{ ziyt7oX)`WhZ<8cGb&|Oan!cy$r2cRFX zt|erwq2KtY=~vPWNhdu`sqoTqh(%Pt2(j0+8LW#riQ{Cu+htMs)|0v4rJubinNpPz z2|%)cdc14Yy{obX#A%Jsin24iuLgC>@J(!Y+H4bUDht$r(_j`hTNSt<VuXKRQQg95b-al@^N}i{h;WNDrJP3oezqT{P276;myCa z1Mg1%`u&s*wGY2Cw!d$^3M;H_@?c81##tKTriNRw*$Gkd@AETib@94u`xXkq!?M4> zd&JKD-un|0P{A)+9Y2)kD=C|=S6mD^j*0fz_+WgHmH8v04qUX<;{`$;JSaq!s*r>a zOlxc_YO*!YwS-HhwsAJEEQa&1IwJ&a{01WHR-PlqzpVDWGF;`|QsJ#%DKc5?sJR5~ zTak`%0>XC~BNyt~*DL zA#GDFg6^vwO06$Cp9z8qdxSl*>ARN#BX9%ZrDVf6n`WY3eH>)Wqjp9qNP|u(o*zL_Xbz zhK&x%PpB6D(K+r58`%$TM!X&;?1nkYYK-kA$(Pc+#)`AV$+E@oS%mwQwR~e*oWsd`U|+$X>@0$=!vp+#Wa{T zf%hG-u{WOZeDSA$a;*OJ{vJVR=}k-=9AL8GG z7b`Q;fDnyT^QpIDVo~K;gKqa83P+%~WKrwY*-sWRei}ou(&g!kO5~;qVyanBH)v^7 zt8G6#4QprVIbvr?1M7SHPz1)FjNWbEZmLN5aziQ4L--_9L;oHjw=Z&s9V`DjX`;Mc zo9UUfZdke2j?Wm0O6y;;8Cj^X=0{G!?nX|Pmk=zCH@gHtAj0B2QP)uOz^43wuE9KK zanR%j_4P2i#e!drvvu#moPUjEvDaC{JRn&aVJecs4@ad^ zyM(uO-6m(>@jN^D>MpQ97bTysWE1PU=yd#C>Tn~DZ80+WkbsRq>lD*oadn%?WKDi= zZ&}raf%d~WqQjy}!n%tLUnizNG zVEC0)MKQxkWyzv~YNyPCs(|=rGv&PFL&XKG8ONScpLnR;3TGiq`rO@_$k)(FQ8lTo z^f6bkRLSe7o{`uy2L@GfCe?ygeqgmAP5+9o%<*o=tg}sjRQ>_nsdK$&HiE^+k0fN)3HCwqdm;blwOn=Xm%n+ zx+80*yoY2h5@HhVyD-*_&mYL;bV0Hs*H_wR{RB1Lq6P+J(`d5jA>iep!SQY~!F#I3 z2?7L4J^-{7v9!y<&+GC9KuuD;X3{uBX;H?5urK|T{hzxfDA=t-lt-ieOQxX( z`31)M%9YU;>#PjPC(CmsV%}YT1N0F0<14r6qH2$*mujtq_fqY%q?u!8x)iXn{tcpWF;F{_^|z<-A>|%%~>;< zOVon&zPE}KhZK*kK=*;aT{yn@CtutDRI$HvmB>p=P(*x>mF!Qc{pDiz^ZUrqma}3O zn^HUp?+*ZTtWn1=pK8B9U@r_vT>0kMI&c73aFL;ax#E9tagnJH+E@h?(Y*UXNm@XP zQr!pL#lKJav%da83Cu?=zOVE5;cb4bhr~ha5kQn6H$@7PBC=75KfSp#ee0A{E^Hj5re3#XB`KN+5|Ww$-OHd$fSqp$ zOB_gx9bFC3mRWQj5%r>lZ21EyhN;mPl|#?dcCY$ol+G#>5sy!!-c(K2#EIyp!QGIZssB*=jtbWCwAWdySPHFPZ?#9$< ze~%fS5}gVZ+7B3xiz8*+^dfPapuwOM)n9eM{j#xwLhg-1te^H^Hl(xzo8sD@?YZ~cvmO< zg6q$@WDtLa>`=GtkpO2;VSvmTUuy3Ko6Ff6%4?n@l)A&>RLKjb8j1}w_iDr3_;p)+ zcU(~=$jaa{k(ikLl!286tC_BH^)zamg5H$P+OyKW@XlMlKxEV-hWpddO=CM`h5m^% zTWQo*Q1aZK>t`Fpr!w3ElvS`>?5fA2b#Yu&**JH+EDO2fY6ot%6qv8j=#s2C*0ho` z(xjy^P`Y3#`UH)x@llJ}c1#CHbfuFGQ z%$H93k;orLQI*9%X4@ zw61cZa{Ut=8MzCC!AWr%1C*UA3kM-++Vf;&T0#jfKFsLH+ro;&0_|k_~Ta?bYGLA|^ zGNsy!LoIpn{kbLbwF=?U&13W8K@h4@X&-WC&I*iQ8Wr-l>pKybA3*d zhMV5RWt=tQ7dwq4K?5uUY9^G?8qh41`e>^`Y3-$6*2=a3 zymaMUX&wuU%Wo!*tLQvnhg?pV+5~)HJmnR_3-y`p{_^CB-lL+++tr0#g3iITV*}ZG zO)v;Vg-CvGpN2u-yF3|CuMr$|(wod}C?`D!w*?{)ckZ9=X&#u!VaipkaCqhWKKmBl zhoHK6UQ56V8O|}z=D3TolOeZ(kHiMIPPfFK*D()Hw?d@lX9^i+JfXJEiI&tPHNV|3 z86AVlzq;3Ji#awA9$iv;$zB+wTUkfvxIk}@uproxihvwq(WSlIl4;NUQU7~$Om$1L zrTNq|*cIAwgVHCP6IE>Zc7(HqM}@~J1!b-8>7yi*2LqND$0Qr0F=x9#%xR6$#qDtM z&4_%%Y08)a%5H#2FLYoTK(&beFd>KaL#cxUX6*xm^32kj5hD><*h>o_rXZGP_JFtK z73*Xv3ye(M-iL2x)f8noT}c4=SS?2y=2tCI&1FI@y%c_a;e+>j3XhJzJc;!`NM3G4 zDR?OcwK@aXQ>*@M5Cu97;TLrQtKTkPyVx5Yx`PSo4v0|FZ?`9Dk6F^yj$8OnA#OO( z)O1>*wrF1M%}qXgx)&&U?HBbl8tkQ2-(oKj<0jODy={rY_&F#M=S8*mYq*b8Q^Rze zV)_TJTc%D`c-7sG#?Aj+pq5~*mVjR6v(Gvzg7F;Du($T1VUIVQeNBZ5CI48%l}?F! z)xLJ6Fqvuw?Oi|;R-hY|skCReql`|Li6XpV+C`_GwIjYYsQwdnU`5M#$HUlR5b%as zSmPKQePwS4v#<~F?$$eHqg|ajV#t;>41k;}!QUk5bOr~GiY>SVi5-xUU(F37iJs9VA;EGWk95Udke&NXd|d9Q}e%udgMlg0}3+fdZzB+3`8qJpL> zy=(p&xbUuZCsvJHr(3{hkC@p74Y?_>W))W$0fMH*X2!C>m(m>DYwGvKUy=)eFLoKV zKLE0AY428j3U@y{W8KBQ7kJ+|!4G9Bz8^73yDs|UO3k-ELB`fV$2nwm0UgIki2znj z^-O)vbqbB`RJ~VSYX4?puy7T`--y24maHQ!VRq8JMnUgosXgVWOJf*e6!9X=x^Bqs{Z8BCk5n6CI zX&m&(nCHB&^-<*Ez3Dx>3oF@?!IJK&?%laThP}s8t2pitD&>wr8>u*xo;h zjio}$>b7@9MW^Cw1-nHDR~CW~ZTakrOtq&dfAUcstd0}AG^I}(LnCXa)vJH;BPke9 z+m5C?=}hzqAhoW+_Y4)-gc9To7)n>|9XC@1AIf2`Msb}l7}R{xi&C2$JLPI#(oc4! z&@24Vqhpphg77bKMqeUh#qCY18bPUI@;G6VF`D28aZr7V5A?Q)zr5q7*K{c1T#2{O z7P4)&3hBDiHCkGB!FG@oERUdSLf<>p*N%!&ODC*WCV*(@LcEO#Lcan^Ys8!Pj0MAr zNS0Z*V#(n=y;q$XEk}UC(+-u>XR14Q7v(DN!&YCd_Ky}YC&O@&sNS6Qqhg(9N7M^Z z!CLN1Cg)gVLBe)TA~jlcL&1Qr%2EVi3aRlEpJ&HK+fFj;mJ7pXFjd~|vg&Q!f6^Ft z8Z}R@flW8__d9Cdo;?2S+Z)-qiL`cmd-l3g0ew4qDAmh;-&!fI{*;QKziZ5Pj&K#v$$ z5R98GV*Aqh65sI%h+gS!oC93;2t@acKWV7AdG`LvblG@0wny3VE@I#>-REvR_epug-U&%mn8c0edC9pIhP9m392sxg9ykF_ zftll`>+G>jHs)PpI_dJk>(iSBUMdgJ)uG#`Ymsrn(YQ2%imB0`X1c%?^&vsc*1GR_ zzUUpd0p!d`EADuC)0blN9r~Uu>BNWJ*qk>W<1H`!FYK9A<@059gT0BLzC5(=c9Tzt;aq+! zqz^Y~b`xYJ;vj%ajBf9~Pv6;k{)qe^q=$bHwc#gx|H@44@9O+9%r`1b8a>aR<9}Ef zTawqDv2)_yVz4diP2pyASn-Nw0fm?Q81Uc>3vE`uIVJW>2-2PZ9x=OhM&39;*Qgh5 z@}o$zGuCR6WU(9Z@Uy!B*%SKKLjU+M#R*D_bTj0)Yam!Am(Qoaa20Au4dq7Y-}MHU z-5bQdwydTg!zE_DsRI)C_s%LD(aQHTnmRQ6C zp=e-6wY3XP<#$+*M>8Rc|ARqlO1jrI`p29v=-Gd1L5LgQP4giiKIdOwz8 zSC@bl_Ey59WYK9TLu`3a@y+Ly>aAM%J2U|E&u$#b?#&P>Tk|3X56aVJa6Aj z20{H$U1g{~s_;XCyG)nTcsjDzVQp{b%T<(VtBRakAU_y}G6}JrkNhPP$9zZ`@uRhs zGmrO{(J+_ZG-HVutiyweDOr1<_9Qkd{Y7@)M-*xB2dwCE!8-|NAF!hfA7QF8Wv~Cb z1h0Ic3}6g+k4Y8Jc#m*xh;iawFfId0r%2eY!+OGs7Ww=Xz+fX(QF`>*-T`-$bDt|tc*jEkAbElBctW|E?|6*J5iI08 zo{5lmJfAGSHDb@~tVqB4Dm?sevh^nQJR*7)ocApCb`pLKu0L~-5#AgA)6x0Wo$e8d ztzhdzOEd1wUti(vQQEph)dzW@pJt32)=>oE?cd|Cb{d{DWrTCW7{&XY3NJkbg2~4K z2FrU6B3*-NrtYu$v`Nmx)!a);$pu)2R7XSM5}R_tzoO`rju!jV-;G`W^@P9W=yV8o zJ_KzmJ7)JQ+(O$Jj^1*$%Z@XKiaagK;J+JYr(oW&+7@x8pziToxo=pkk?J0j3{y25 zSLv&Fj@@Ck{btk5-?~U`CYm);lYcvswtywq^D0=f%G4S|C%PQ+6(t%KKP%{7$Y|)6 z!WUJaoMPQnO!_RjY(-_3jcUk!Y@uH=MkJTq7Z(NHZ|_A_WVk#IqdCEcd=Jn_>v2#0 zD|oypG0jUk-AXBPQeh5LvhTiDl+mXb_0x-?6>*9o$2UEF5kavl@xGiwhAO2$&p_ZM zww(H5^{Cal6)XRJryr@^KUTCEcN%8f08YT6x`)mW#GE3&KNPqMhpK~w@I`j2+NDM`h^1cvPH5gWM6Te7#7~|%f-EKxKF(5f2@pG2(&NX zaTm|tIN1+ESkRA2gWG7viuSj-QHF|VaW>s~Zzo60O2T_aJk=~p`xYncp*dt&nVgDD zMZ2u_<9$U=gtM86{Pk{`7>4t}>!qjdGR-&S%lku)=k}BMUEnyYQfVk#Aki`(S$VHx zT7Cl)ny&qIi-*>Q+*iPwniB^pjztal!V`9oqMpsXS|z02_Lj(ad+yy8Gj4m(Y(4hy z8HXbAj>n*O!?|jE`r;+Uym-C7&b=V_nZuQe>{s@h)$%&}nn_L2%XHzu_+=PGX%!Xj z?aFSv!l>(BmP0o=I8Dg(Q}tsd8=@0QP{M@;_x{Qt)(jUG!oBnUA_24Yw-1hvP$sh` zf)vNbSOACCMcs@6S%5R*kj^2!5|KBIf)4Ja+|DYT!3ZHK62@2;m}BSEoM{f%IHX&0 zSnRB@AGD;BiNCp$OY<`BiChH2aL7>Zm3%or5+?|VE{Na?Y_^8azVVkV!^mfko?3_;BmDurl5r34crN z^3X+WecSCIiC^#Zwln-YWB_9TfFg!7q7r$Gg1PVEi;KIqUjv}TzfZOy&YXU}W|Uw? zn^icA`+1lAzFOSUcBou}c!u>0j*5%)&+U&Y)r?YV03kLL_0|ooJbA0mv?4PpT`9oA8?4vf6E`EiWzs#q#&8 zIFdb#8z$y)rHY#0`_q9~WhFBII=E=j=j+)|`Y z*!R+4R};>d950+p7xu!L>0Ua@nLG-k_yl2O+AQbwEy(h1B5t7M35{T#!(NAkG^WVP zslztt{>BE$ZcCjXWyn0=pz+i;b+l8jw!lr#9_9MDWckOM>ou;|Ols(%rR`b}Yao;r z8Xkv&BM;eg#pF&X<t9W);MWrGH6FM>v9gQ6H{2vIDPhek>kMLq+FNi~xY_7+?ffJGL(6iCWTSP?T`cC3+u!1AbKIOwQ zVH5GKKG;`JfvC_YUNGh46sCUzhWz@=Uw|RU|AH6!ck-XHNB=!KIrG6S=R-?_iuo-ypPCEm2paCUFkBH+l*fsUpJ5G0EaITOHi{mZLDbE{XoXHUO6sZ2fyIr)9~;I8UU4oem>cI8`SyJ9rof{|_#Mx1fg(+h*a z92K!srW(vZh)8RxL^emNKGQ+g&S8iK<#*96trvAw!0tTiQc!nA2(=48z?FrV*&zdy zIetY%HEmWz09ZO96y8!M*t^1SJke9(uZH!ZL137*+@kLBPCft7Q;AvSWPWg~)QIss zvpjLH)YKwtggw8aajU)kzB^(r#7i0y1cV)z*N(QZF*&xiavEvy4G-@>XuUsYMcte+ zEt?!e6sylAaf$)@oMa&2g%7E|Pj*Qsc3^7>>P-(xJ%#@vC!2WSEM;Si@xP{bPx=7@ zmuPRF5bTsald-(xwZdRC1~j)7=DkeJ;-G?j{RCmlvk3dtc`34LalQCe!X4ESvk@KM zloX4YsHSm}*hZ8c)Hyhg*8-nYa*rwe&{*Yx@L(q zsLIJ*(4Sse2}~9r@k8OdRmPK}LJ}CRt}zJ;DBSiY2+>CcDX`j)Cb6B@6{$;a+tRnU z3@ybvCyH?Fw(#xH**rr5q3a#S(!%>W~t^xkHJ`okGBuv zPDl3cjSZg)vBZ_I?ev0iCReipn}(>Wda~389UkJBK2|%FDj>?(uSoTVL`jt%m`gjNK&zMR`jU82E8tSIn}>;dq4;ijyJNsON+ zGVp|Vt4R;bmN^`R!nLgqNG@C<9BXQW=Vql3j@p>1x73#0KSh`gCHyxbU@kIS2BrCr zRb2yOHa{3ME|6MJ%!5RCK}ukZ(|srxwRpD_0GEHhy{A?O$qv`MJYOL~j;-}^KRv2* zY85^xZ8Zw>o0nBFoLE4{>aJLaglvqYNcGL8hr|X~2cW$bA>3*2oC^WMrFcBQa<)Zf zn|ku??AY9tZFQK>Ipoev-<10E)%!2i^aMhxc1z~1_AzJ*tc%%c|9ISjir|G)_=TYH zeCbmCnf3cqbw;MI_Jis2s-E^F+abTJ;*fZj7)`bZpJY3}q@dB!orU&rjdXB3yXa8? zLDg-Jd_dL4)w38ukPoLT;t5~w|1H8+=>PpS|Ie5ByU@2E-RLd3r5HJH`CLwOnFhj3 zVY%SP@WuoBQ*`fw@KJYfLkaLNvb2$f3T}L^v2?9XA zO$XrHuKcDg;FaN6*5+GLX6V5|e9Q+x%SUj-kt(R?R@^0FFIuK>B0i94kYFU5*bfCoM($@p*$fkq!OaB*pZvxfSwYQDa-nJ@UwN*ethFV1+Ofo|ltXQB4CYXeT8LEhw zV3=nFY89!B3JFmNAVUZN0x|>$V`VG}gOC6+1Z0)~VGc?FzhH0gwfFwN@4oMS-}S%W zyVl2Ahn#iJ9)D-=efHV=_dE~4RKsUS)Yq5Ln5G-@5#;3L*);MH09In2Tg;6NOcKgY zbU-X+c88qn8a-55hUykpC1?~Lt#_%aORrYLa$wAmzVrMKuo^wk)kl9ossO(I2*o1u zhkHMs`xwP?=np8CPyeS!GbRSTXs?ww1O#6aGQhsB`uG`%FZ~9s`v7hG11jY!=izjX zw~cpyL*SKv6iLM9V^rQp7?)qf3;dEDgyg6pMj745$7cR)v_<|k<8O$SPYXv7c^6Nv z{04WE_z2`8B+HajF$?oc^2^&j`RAL;ry~AL3Rc#jG~>6;vkyPYFqzTPm+)EL)z_A-CqKe3;RfEpej&t29}3Ri z`5RbDRIdYS_|2o=CTJh31MeQp*lDEL{XKr|>;HTo{pT_M!D;#fIv%WJ$OU5KJ!&%) zM3Xx4Kwn~Jp{NF=YSC=-!}Kh+Xo$_$X2yc`v}ozJOUP>nyV~E2{5e^;uboLLQ_d9b z5g2D&rQwP_+7p$`$XJASAbUd3hVTqGHp-OlthcNLnxs*M1Y)$%psyyBdU%`i;Ix9_ zJQ7T`bd+VOD%~$v#{AR;r;k zAj}3)O>z&U;=9s;KCRB55ua5FA@}d5>IM%n!z?O*sv+HC0pTXO6H2DAsLs=I*~HvT z6Uey{=iH|O4@&beC&d+QF}gv>`Bt$1n}N6)F+mz=?aI599KHn{RV79Z2ptqJQBwpC z>SahCwyoyiG@_ZaB6bApU**a=q&eJ~J#r!NNTA=&5cyA7W$Y0FirT&;OS% zI6wZ=HX;jkxIVpW=D;<Xe81_WiTsk_8A7WMXC;J`Ph+o9Wsv-{+Jo{s`y>)h+S-xHsvVb)|FNiznm-+*b*EOfw{F9}l{Qr(z=gQ)Y`W198fk>TL5 z9|&rE#@uM*qzhv310X3bG3Xf$06*mp8u^!6MoH#r^z@vRu2wNeJunUn-MNFh*@Hh#g99|G zFie6DPch4YT}1{yn&^f>uXYF41-TDc?UN|E0#ZJ>jD6d+8DkqCkZf(c6x(U@_ z0WdgDsQSkyGk0Jx=UrxP+CE{1d_NK8Mk9?Ud{@98O0c`#9&cvfi;Tf&J($jYzA{Mt zK$3Dj{B)a|)n6cpZGrzX^2Rs)`vlp}&?{>{GtTyN!Y4Megz&|LqyGY+=4bZ9NqOS7 ze<8r%>qY-Y$o6DAC%*`@ zl8!V|0a|Jbg;R@p!MxcUNVJ(A2fz6NClfQbf#!DeqQ`^ZPEfg^+aslZLP4bnp7R&y zbdJ6R^m>lq!H*E*X8A1Vm=t4m)Q$B~{=3aPzhi5(P`H=#_6d|AKX>53%P3N?f#vPf zKFiI%-4|9GGDN!e+~Bzvq(1wtDB3O2EQi4ii$9!|@*vu~s7 zw*ui49Yt%)AzNGSBZS31;DDL)U3`!+;eb0axvzlhOme<=O;eo$I6mHx7 zHH?tIZ$D_lez?#6Cj<|%(}PTu2Nm9D{;(Nj@0VmM}F&{V6 z9Cyd$lH==4mYWl7c`xceNtmkyWa`+@l>tx-&KUmVhzyzW5@mMa*o11HN9%kNiWfI<|qbrZj92xVhY8JNfJHj@rlBfMggreu~iFX(kLA1C2lW@bd z^xuu~bm(aPV!diEIcFY6X%pKJd~d2Xnco%%N3`h$1x=+`E*4R5-&(ni%^&IOUcx=g zE}y!O)%(3zx+kc(?Yd{Fd1YZ%D~(~>ANrS)_T(^+xt;3!l>Tp=3WL7-Fe8SBEgerN z^m)aBru@iNHNTqBeY#~dNR_Lqy*5Qx(OzHp&c^&$wAGcRJ4HoVhp|prWX=!sgGBv+ zh}8q4_$feq{>oOUrZ33tn%mjP5z8Z?jkkFPXn&n(l=W?VeCy$dro*@?lxKN#O)O>jZ)s>KgkTT5`6U!s3pd)ZqfoXzYqO%z%2}_d(q!! zgv0>HCM=DF3F?1}^$On4SNc|PV^r#bDvGf-mTqq&)<-#LJ*1@Ap)}=b6WR@ncA-fb zH{@+>Z?P$(WU!LSJUA!yCo6hgUuNy6v0gcF&0wp{d$uQt*WPAE=I2FDL{h@7TxPoj zgkP_g#~(YnQrZ?B`_?XpIt3-n@uQr$>d6r7 z+eh5X50BuD@p>px7*{)LIxKaKMD4rKTb+%c}0s+X)HvL9SC6&`2pIyR%ENSf_U z{y?Mqn4SfljicDa;AA!Hdz1vS-&3&YEr8QQ;K0!d()=NVARmrVm$N z?d$kh+4y{SpYABY8DE1r?p15RY!3`q3Mms58VYGQgT!+5AhQOWk(eSGbgRSy6-B+vQjpwjJp+{h|SR#LTkF= z6jx|l7=u#m29;%K?qb z($j%~fWG--7wfR0j;U6!(2Bc>FyVKb68CXo3#(ze06ON7rCtj-oivFZ`I&-6*9qtB z)!RLP(Kh)_e&o7mQl@&nK#l5PM`tT~h~28p`Q`rY=alOHEV!s`Djf9EG6_NnT2m_( zXrvc+JRuL(51?`&AM+ekr?x0(qH6`7B4Dcfa3EZ1>`- zxl>#0ZeKwq!P-;D(0ZZGXT<9V3L@733`pn5a_Xzx9f$Dt{_2l)R8IQivipen!!VK_ zgz+WJlc;N<6q-YbT4buc7g5+d_A2wh#TZ|Y=EnvvAZi=tE}yDdh44V ze$(TAo4ayeI#TP&^$b4&9Fv0irL}V+s-N^F2NEzUy zHl|r%8R)41@F_HhiY<-0o$76Im*9J)$m7S}$yxusQNd>*u=4nGBUi~Z-L)}^!)jqu zJcSo7lf>LQ*+bo;9#21TgZ>(Lubf8n816q4E+w%g(db`t^yoYA>9jC6x?)2x?`EaU zee&s=P2>WY6al~-A5S=&2H`a?H=$L+pn|({68c}Qx-0cPoOP}X?YiQ6+v-@xaNwuu zhwZKL(|S#Cs85bcb&aEmU0O?NG@hyCtH;5;Ou2gv&Ot_50MkaZB+VkkW#_@p`6YIJ z-e)J>(TssX7U^VbnN^W z0{lIbKXOjIM|zNr4flN~`hk*oLyijM~n87QVky57+dPlkzEY!nnTxOgK|6w z>@#^UOUSnHib6l+s6MhaH2J5YBUH=NS`P;NejOOH4BAievd049*Vlu?#XlB0H5IAN zHx1-5@R7B+<0B}rUEJ7-*Im~p<|Hl8kCca3ln&C;(lw)~Gc=*Nb5V|O))%Z1j<|xF zLsIvJT}V={|H$tN4tm%pv8c+UR)$Iz`c7*Rq+RE)@)A9;WH6E9lQ;W1354D zsy3}AUA?%OElp~_w+1uANb9}xx_gwJD~Br^=yx6r4yr$fj`v@D7~fbBdE(Q*MJ9Za zn(U#ZJqEJ&L`pGX&a%%{{*Q@R!Yws$X^&5AAUBHlh3 z*(R@E_&*oryR`d`IZD2B57v_cW~ZWL?ar-~O8hmMQ+1$C4WY01`B}cD^6zQ?e(`jC z5@WxFVsx|h9=%N?l7ixSLCxhC6AyY>O21Y}KyaP05%9Zew-xiV`VZ;T~ z?E8L=vT2^8hLIDtJ#{UK?li@IvU+1h^&`BER5=G`;Tcl30Cuc*sND(J&X$TE8gy4% zob!M(bSpOt;Zz^dL-J0DWa2dy^3S~F-~_oseTH7(@OivzA&Q-E4|#xKeg)-u`9|c(Qwz$Ma3PH)V=E4OwrOXI_lXEZy2FN_PQM!juCG+Mua8$AV%H z%~+0fE4C0|>~Ci8gFH#ky?5J_F4^)>#hH>GhFxgwud{L_am z5*5i5&bth{$D8;it~#Ni*1T)sfTP-O*bJ2$yFTqkf`p{ppckZZE?{FD*C)U2jjk^EuHjI>~E;G*XhIer%SEI zQ88e^)LqMP9oe^LH*@PlaDiJ}yJR8cM$JWiG&FLCIU`6N#l4&9rVszjH?*YV51Fsg zM&}*-bFQI^vdjQ!3NJ8PokTRb!__aGGa7%ys;X?U%Snq@WvzP)ZR$B(UX3?HOL`(k z63!OZoOXb3P8p4lhF@Hp5eg=d_Z%Bss>?FZz8ASw>qO!rRc@iT2vPy*z^eiBWVWwQ z6!Z6FVDy8 zF<;$khkmEgM~Dz2s1tZ9I#@2c*i~64F(m zF#!~K8QBm33yKU9emmv(+|g;8QVR{jSX-@ zq|>^(NSsYjfiEqeWPxoxLIqhGI=aC~oS#Eim^w%M0{8HB997^2e@}TdAgP>Ua&AJ> zE3;Q)g~B`mC#nsRLu^U zr(bJlyQ-V7PP&*ZrLtv9FIF>=NMx#j%n2qcxPm3d`%xD}|VrQGTAp%~#1#*5i`yqzPxm zFIUK{b!nxI9cIFb6WnexEWrmBXDWzfImn;aASH~E_QIpieT z&CZ7k^-6QTyDKi!lkIYbzF|52{U`tL^#4CQ^lb{AK2V82RJO~Ozx=oGIF-&xmnP|F z#@%U5`Zgv(VM?e&cs)X6Z4V@J_Tk%h=DSnB-8wkAf6@HI{YRgE2>;P7XWBS3;!twLcpWA8z_KNaI$ywG8uF1ZwpOPfxLD4&#)s4oe0 z!ic@z1bIB~jn^-|6({KP>AeB(0iB8Lhb!amK1&| zJZMHCl|h(-*66o62_Dr9_FiADJIUBHC@}Q1`CENuR9{K~odTXAow}@!%ON~9ac-U$ zGyG)8GT6oR!97=~-t&n;7&(5mJ5V4IGVw!K?P6YZ$mus6bjqgq2HJcEba5G}<}aLw zMYGlAKDSI1*e;Eche9{78{fY|R-^D|XphmG`TCuTeDrU#mHtw}yZf%!U=;iT4inaV-K%Y2*RB~y*6 zvVjT;$A0xJ)H?zF!ZP%J#vA4_dewu*th{o;r6s2$he4GjRoVJY+3t3yT6*22ymMy3 zSD-y3b+FS=_^;dDkB6wIEm)rZyIPRS$}&2RY=8gE8wdlS$>8TcE~4^7h5&rsz<`Rw zQYizTjt9Y#6TGlg=eBoK)sCu`bA)k^)XpW^5eF!1gByw>c)2=r$G8YVt5;o{W~=V= z6tU7Sqt}C1mwIk(-0~=a=9Qc=>BW4R?vZaz53HcHrNto?K~`RRDP`I97K58d+XDSy z>?PW1jzk-6NeD1S;^m*@?}@)&<@Wd>--}!e)5u3q4tGiP6;ON(>3Sy#D6|sOcrQib zj<=eTyydkaCzwZg8Y@5tctX&B5b0ax>p$X=!Rat^Z#|C{y-mGkI}D?h=Rl)qr}7ab zA>{PF5E$U}YjyL#_U$an`*%R;3_xZ#A@Y+$_Z)1>a>7r8@osIN%6J2P@_Dv!-5!C} zdC(avxHUFpQ<;X*`C$q_R=(iO_A4n%3bIx<{M9oik85?GJ)_@^z$J5{=v`ZR-!z=7 zG4s2W*N=gy%pG?u9p5w;m+`YIJckdG>AQN5a_ADIvTt}8Y?(Y8Z*0=RxESQgOY)b8 z!iKzPme-p`tNeP5-cB07Qcb*x0VE~Y_ zs5a5kbLr_=X>IeE4S0KuB!zc{-OigOWo%YLHD{J%4Yr-|c>NcJv3Ag}tl4fJsh$8s z->F*Sdl8$B7tj0r?a<|HdGq-WPIrKoqFWObekUU=#YSy0Z}&F-fJ$m;eYz!>@D<(( zH!EcRi(|7hE>yY(88iDA&N?_e&+#ywC851N6clN~aU-ZQi6L|})>zO`t#Bv|b4a~V zTh-da0kz*%rDK#2c`+bL?wMgTaejGD=_OkL-IaQ>IQ0Hf`3o-reahFF5Sjh_-IVm2 z{XN2EcrLmR52`a&>S(-vp=dMqbT!m}L0?g^V>Jt4b$mztxMgy4vpUs73Rlny_VFV% z?Lczr>+OLd#Le-WYHCZa(E42kxb}pZ{s>Lxaa@W#rVCXXhz@HKIsV7Te!p66b`2|NCQPdsf z%KK(B4q7jUgGOq={5X{Ew(cvA9Aw)z#i3KcavB@3PgGDVu+cu-!m&@9n2NYjFTLgd z3$B25@2B+d&AKL)DyqWjp!VU9d^zt$Za>hHR9qoF1O?GUL-rn$GVXK=GJ00ekj(M7 z5P~?@&s7s3t@?E;%#^_5owr-r*3y-JZ0s55bR|c`xN%3QrKByRCsF6u${^IrctgG7 zVsOgMl))u~)**cc>n@5`JK|*+43%K0-UI-A=ejLrc4~JmD#GN!ddXCH1;8BXhPa(| zek`cYsDm7B0+Ht|sa|4c+n|Q+ep=gQLM3*)T)W8#3*kd6uG@tY!2HVd|dt}B;W)dySp?W6+WLg4k?!Q^OO2~m?>GDstGlP6B z8wr{#zN7QQQ4LvOq^jHb9Mv+!{b#Huk7Ur6_InWu?gzB4&h7q?(ZTr8P0~pv)6)`S z)^JPpX5+nbqt5()zJm0J5dR+T$UmV~8YUY6o95pke~cFQXHM%E=DB=*{-BS|m4?eP zHEwI4{_tPBe90Ozk(ajm=?`mgnB9#JsjGap|8u6*N%P$&7d~Vnjby1mI`Ln;YUI|oU<)|5z(DTN0tyrjg(@wjrkn;%)&6oxB~7Sfs_lvzrUENS9H1}UYC8+Kk>v$g zqkL|z;pf+rowPak%dDEeDwH;@+!nZj;~_&Ikx`(_>Dql8;VNy%jB>iI*w+RY+sMio z)CR@@F4REqHM3dc9Vg&>D(hdL(pjs@xb8Pd_5=HSM4iEXU24pAMt*USR^-W9(h z1Z|!RQF|?Kv)Vq|=~2t{P;9da61!z?b%>oBbx)s03&80;8Pb1D|_jajX2@5>#`=lB_u) zW>uxC^E9;(CT}@>uc~IiKWt&w9&aBo1@1=-DG0yQ-nF6E+TN1%-x}m(&G5e3;;NFeM1@>o=nzHXj-iZ)qE%)lpwU?L91f90yT#aYf=GQ!gycdDK z7l9?KcV;&3S?Cnp8XT1BET)pd+M^VR0W#%8Oh~6#$ktkj?eeC?A^-bm>nO}s3K;A^ zi_1B;mKsr>%&Is7y%#;^4z562$XhLIfisX7K|11uCp`r2@@$XNEnt1+)2&eC8|%Us zLa1k<;sjV!xki13#yrJ{Fz6CCy2Vf0sK?+XhslhTZJM)8OF0ral08kd2bo<{3$bDc z1Zs2PWm(YLxPm64tDf{k1%1kBr{jXUh)}ldx4%CPyCgVI2Zvd%GDjO{KRe6Wy#fXn zXWG|hne&H9H&!M@A9h^CnBNGCmnD&$Yy=Bcg`&PxlveEMz;SX_#>t02cwPE+G!V0D zT2M}(Fwl7~(w3=zJ;Sxj$gM4c{I;GdNsuz*K%^KwVhdp6I+9%?FE3qHsR`RsnebIL z1%B=O@}(NrS-}sbHvaPr48Za%+gKTHKVL2$C1eJ&d-i5HJ|pLF>_U|t0DK%%h_Skj z(ye}*x1Q+|qzgCz7SVk6mx_D>yhzw}Vc!K_ytmz$FY6eA5Ng$c0)CV4PWelq|K6X! z-)1wWzP(tmotnT}KylJvss}g>?zUFwX=h01j-3@>!jg6&^YpQhDc@2kbX`?KNDtNTyFz}CJ*!q} zL~83LYk@obC$NqpD>cg@K+!redj>bKqf^Tcc)r-~zK;5mb^E=DxD8xXS+bz9j0mkVNZwr^($(ix5Afc^Lilq0l`Xo_%$j9J*yFZt*_zsM`) z@{}7FBi(5Ln#ca)gitiA#2{~AK7R>5E#TL=55&{()Qse7<^$dM)0RLb({z3LQ>~#% z&Z}B-pQIcFR!nA(PU41P*sZG9VTYRbM=y`zmG$V?Zt&lqoDsoie!BKYyi2>B(6j#W zue-UJ?aHVu`obSiigG~GQaqi}0b6-NO`h3I0)@2ryNI1`hS8wnU0#t>n+isz_ zmye#XOWXqK=erxNq}e*F3=9Q&l>x&K_ElD}=6lJ=)=TV8SG_}*+K)^by2&SgftE5p zQ8}D$e3sU~S))ty^amIPoDS8>YH?J!*sMD?+DbB+mnW)7K`t*HuCRBb+Mm?Xj@c$o zxucS@+`ZXnopY}boNjgWvh~i?!{2+eebK!_^|<)r2J^H-K!9|A9=)d2(#vSw2Q($a zG-1JxGWh3*8QfuAdpAR&lLb}w8(Z9I?*u>mgEY$&gOt~9;prY*>Dezaqg?+tef3!Z z_QSbKO~M_H&z`5arz4JtF|RoftlmV?F8d$95yRb3s84iPFnS^$xQ zzdgH8FFrjMx$|S<>}4V6*Vo5)It1@Urti#E%2f3GXY@M5N=Y|1mNX^&YNKv-^p|YK z6lW+^^f|zLwAbFrnGOx}TobRt&gy4>mOW;ESd93ES(F4zf($`Q}T=tB#CurSn_1y1`NQ6(ABG4l{SN`&Qu)X>n){ABz z$f+KzVD!=`WHi5j1_aOC%?`*%#DgEB>#!I&XsUsjNU^By?O$xW8|1nLn&2E1I@~|r6%yLr1TI(HHN3Q@`8Q+|cm5q_`KVu>T?n^hw*Yo6kT`H-&4!P*pBv0DS z@9PJ=8X0;6j4NIS)cDUcuEvZsPkN1xNsSPTHwH@{4_K6kii1{N$s>?er1>hoL5w3d zPP?qJ^<|$x=@}YNv1V0_V03Ol7{`B_JEV_|XduLe5`2OUd^srs^S!>Z%C0ERDEg%k zR=zGMfaT8SPCcP-T{jw@E~~F@rtq^=p>1FFQuR-A`C@LOJe}+F-fs4A=&@rj?>X&c zJ{;&>400;~N7>t(MOoE0-}@pv7l#VDh-jOO+q#h*eJ#w8>@qTLKit$Ou|knV#I^vu zetO`Z5d!P9F_~@u(}O;fApkfkcQf4>MwQW8wn4G8w-~uxSo}#yRf2T??e%VhqP37Q zYk>nR-;~2a6E+kaPQ~^00FvU(>#VJVs``2dP>WUWh2C$FES1^$p+dzr7^Kjjb#--^ zh;Tk48(F%W@%n1^Mw$&Y3dp9Ar6+Yz0F~`6HGb<0Mr}A|%VE))7SZ#Pe3-!|!~4?v zI^7@e=R6#9Q*2D^EKZWc3kN734p(b>i)C{hg&{lL`BTL@PM;nteT_Ea<2h*9ZZcHNjo$wsqWn zYLbJ72T*VI7g|NZz2SIchJ%CCkmFNQO|PLon_5i0?IVTvoB`)Jl3-w+^Q;J(k^*=3 zcE!A{gTsiOEjycHnq-YO&s*jV$|r=}vU=YAnY(`T>1m-uA7O0gkmOYnk#xBi|5v;p zp8)Z7JnEGBk#pQjJ;neKZPzD}dt2x!d#mJzP-^7KT?T8BX4@Sr*wAgub=S`K%Md%M zJN=G!lCUt^8E;s=i3KoR!ejH6B9=~>rnJC%;yTLt0 ze@jFU%)*7I6wH0Ge5=~@LQL+`?g5&aAJ|d2yZiQOvg^=rN>yb)XNLDZMrx5=solC$A(v7604$6WKp;gqNP|-@E(q<*x`n#``y{ zr-wQB2|tQ9CYa0#2R*xj`Lc$61=@)M$c+Bn;7NSfwQc<#6G$575$8dM)S3Oj)G5{gkBC6Z2Q&zy|!xK`wTxTRpOoK_5A6qTHjDu%aESh&C!MeQfvXBc5aU9> zrVZ9sJM%nH_4`-$4!g6*{S}nz*(0&caAwf?a%QIbpF%!7N@4Lec}c_;fffv`7SHd5 zSr7YfxowX}`Yog9p3ays+4s@%;q&I+#A(X4t~QOt2%eDkmGHpjA$#AjAFAt#%OhXz zBjo`Eh318ns?>Y2)1`#2nFf9r<*#<=2rT&z808}q9z#bMgb{W=WFVaJFuhdoUWq)^ zdAXb*4(Lx0`x!AA3V)S`?XdLiw#j)KPxrS5^n#pwcoP4Sm0 zv(M&vF`hXoJ{g3nS=aV*@i*QWSUtSZ^7a^-)`GhRHSjWCjvn7moelW7k$1rt>-E6~ zg(p9o91RX%0)S@bGLX8BtBnhy#_82$?@`_vpy7Ppb2jNbaq)eKRPqp|$*6dOUQGwVni+Af_y^Ai#;p1YV^D%S#E}&vh-;v=wc{H0KP4_s2p06 zR_m$Z>2+H}^%X7zRK+~8IWyyKH1zVX&({v3z&DOuI%pGA=6}tYd-Ry!jwG{N?)A!M zxqsMSTalgB#}D|oF*%`QFH`eZi`(!||H#2B|KndLEdPxsf9KL0EApA}*i7zg64S@RP1c2I35apj@(M|9;`o#l> zR0NXk>gC}wPPKRnSF-@;dH_xW#wcBCuDOby0Xw~0?gGX+^HyhHH>Btm(%P67p??)s)3bq z>9mxT@9RAvHh8SljGB%TwxFDm))bt~OH@*EZ&XlsSbQ%6E{QbfHITxAxEz`p829zq z+ecX%t*mNR12l;>Z=)9xj4TEluJ69vWqFt{C(IeGp86Q ztQsM^(ZdV6H>+$1wU=c5 z&r%!NCF8PG zDp*#;lL{R(Ga9noA?yAPZjjg;==QLVd*f{9;8MjFBE=?WJk?`c*ZzJWQXPv17Erqm0&ORitSxVbl}{waI=Mn?NGQ^2#!;~X z#{H3`grPRiqv{t6RKt9JoujF>%oDb$vss1<1pz#F(S!^B#50OiIt(X;Ew=KFl#eqU zFUNktOTJ&M_5%lG?R$To+Kr$p;H!>AM(T70{a}5Rju|+*O-rrK*-E{Dpd1;GGUhDT zn#9qA){JTWMQRj=zvr9kRyMq|lGdDde@u=7R&}p^+&&skoEOJ9vJ*(*;D8y0C*YJH zNNsS-3v+lM1hGs&Uo)ogy|TI|X1u$5yyq9L^qg%O>zPEUMEKK6qu0AnT}uPdKC{*pD9>O}#VReIW%E`$|U3vYJ)wn(x>> z+jqy}++&{Nc#=A{xg=2lU+tZ?E^=JlkLXMfq-4Z{srd;(L)N(Y%YpGN3Yhf4SQ(xSSI?_Lr0b%ip>4^;~EE59v(N zGMN`kYvoj*=&(0A-{cDANl9^Jg{V`bmnwI<9uiBLa;s)4SFEyY6Zf%NN@~?RZjJe0p^z{dyoW|@*& zi*I-;gF$xC9rVdYpwH*e%X!LaThR@UWKmbQ<6RYNI3<9N5O;%AKe$A*3FypvmI z;+cd1gY8{s_Du$N%uvrJx2lVkaI;=XeWm1N$C`eq+)XJbD)oDKZG8!{EjS1fm!kkc zqPIb2x~2A3$xgq%LN2P3x(V5K92e)Rybff55<^4K>aV`3CrKU&?W2@ThQj46>(1k&YUN)oA3jT1#)anPVr+Xq=vw8SGw{ ze*qwp&oR%PgZl}0FNB&&r_Ps`*9xi|Wu4wm-)t|H(0DmUI9!M~vmra57y>blra_fg zu7j@mC1Kwt9I!AHeD9;jacF;lBd0#ZTG1Qslp(PNuST1ENdcgIsCSB6)zPCcLgc+T zx-}3&O@X?yN_hb!=GL<|EZ=> z$j~Nl)!-rvN~gnKAXf$ZBpHw$T?W!{r@+Ci3Gyb~&U=+E1JA@+4%V*v0(2 zQ7(wms>Uo=XI_*cW4^}PO`B}8H?zQtxYDUzlMrjj3A19$j1B8P#SHa9z<2sG7Uz_7 z388io<^E`qPku}NGq;Y`;!XKYd7E_GId+-3%fx$;hv6XWo&NVC2Tz>@wxxL(R*$+2 z_u)x8_7l(oXq>E%Qm{hw*v%#w0AoZ_gunr1E)_@j&?N{B>_% zbX{JiftnR5SmyKiMve+~>1`6_1zAeyo54IR89b8|`^#s)mEu$Ji+_r!D0}#b^3Heb zll8``k(v!d1rPIhkf}J&8guTw$Z?q0u_0VtV)UC~d44&tlr?X9N5vDzZ6hL*TTnOp zn0JykGcoT)-rl#`eZtBxP;PiHvUA+TVo3Jo!rloET342UGq!PnCdm=u z^wYgj((uXdv%dIvYLRw;lor<3C*1B@hXW2ls1J*II}#-oq1G6K;Wq-uLdGnZ)V47Pcur9XJ$(2= z(@M|t&V_(T=5{-`R=dHyN2nEUoqwP&=tpECze|Xo49Q;c@N;q;$61>T| z=h`eLU?tZDs}+Ps(eOX2T1-><${ z?4tf^>z)wVw)^u2gR`a_8Q z((fPNT75_$`oN|TEA(X-wDHmYapLu!5Q1~<#jfwWh!!nG$+TD=`Lh|^m|^{oQ0=57 zPpB=gL+OQ;%zW|e!%qPXAEj&idCc1nnR`bH(Ltp@NGN}lRO^qnB_Cxc@yYf7&!_-p zWlbF6p30|fjZVFb0UTXY0@(~zl_9J3AeD#Se%caA=XC{e<=zQrb?6Q6Q2)@b@Pi{{ zVvE5X>49H}S%c5sT$s+@O`*~cv5}v+WjIu_u5)Z>=DkS8wmxuAK{%Ld+6fv6%wxnz z`dC-w)BMOe_1&D^ZobD(*X8#j29Zl92?r*_UDnV2Cqkto1aga=?vkK!hyps_ROG-*Lu%wp4(!e`j_1>v76xq3AGB zjDuE|?0T8O74u}nu1aeu(1-9w2CXx z!cJHc&Nuw@Iqn@q)rE#cDw|net*Xj7jE0ts&T>_0x0H&OFb+8Y>O|Gg4VI}uHO7K{ zKfffv5}surRZu8DW3TY_M1Q^V1n@^Ln=G z3`#r4NAZPCC2k8qu=%QcZtv73c#>s`2KUzXXE`S4QWFq-!7&X)&a8u+;okTX)}vPH zF$+(tZ^2a~v0MW)&#Sl_QzxUNl=4Oqqx6cWj+;jZSSVV754S(+5PPDjt4$mL=76=Q z>p>8ZyK?>cweYjzKoeKtah>6<(JwHc2y%jgySwA>2ezThntb`iz;#_a<7*Wp7p=jd-J%a zuC;BL(>|>VRjV?|Ajc{KVG;zHq2d8bXo7?gWUe9t2?4_>bE}{-S4cpCkU|I{gn$fT z9*!VTKtKW^5+)f!Ak0$`0{CuDYoDh*=lp)p_r1^i_50)fBdqMT7kAdQ*WP>G*L_`7 zLaig19TI2i?@#uneh>x_+^o4x>H)!XS57<8SuK@BJ`_I5znvfsN1 za>Ycmivqf4(q*bD50ZYZj^;2_bIC5UpiwZmRWpj2-|tv1BIdrF>Ksg}Cy?mHTP8uJRx@Sy+;qr6oK*KIMI5 zeVRixn}90DwUFf+Rhj3{?)TaZOEUAZ`(i59!nkvn0X0h4{m|VLpumWB;M0cPVY;}} zpZ4>{;mM#Dk}gQA7}?pYmWm~bPS>kBmt9Pq&9Xl3BQWO;G8KEb1xS2l@zhd!cG0C0 z9itJfW<}DoiDw5YyS?4N&Ebe40-r8xVN3Dbr(u*sp(}wktF|`9gijxB;rh z4rJBy<6UEnq*12$Xn-$A!Rjrqb|BdZscAqlwX|)q_PMtsNIASTzp{9(gp#FImzwt` z(Fe2V%?2rsLjiD}^_>w|yHrB6AYVohVy6F08a3A(7kM;zziU++b&5v1cn68oFLF3mt z*~ePl94SI<^38+k9L0_N^30etG?-ih(JHU~X4m)EzVG(XrNJ6|#tI&~**&6xyGWIs z0BK#jSUZ>@?&coS-{$J_xH#p5Tq zP!Xa;RHz^L3f5QogODdYtDt(2JuMR!YEw|_DePdd2cO$X1U~6q5esE!Sat_b_etBk zaCx6;M{UKvGnDP{yV<}(wmek|d+oU5XN({R7(|-EOW9KT75FF>N=xM&D8lVJfV1}* zNj_uSzT#?4ybVmzae}j;31~P+UVe=CiU;1!~gjX3grAbQlTn;;mXwiJQZoP z{#E|b!$gt*kNEz_3vpW(Ki>up0V-|NDq8vrOO@v zQ$j>v$gtSxF#d!mKEKoxL6eSmj09vk!BEYIH_%!vt^SQ3`^su;sqt&%JZqqiV*hPj zZRs`VDV-Bn<87u4r=?jD^*MhtOBZ}?e8y_&p-a^pbskb2p?))=DoMl+?TV$;G1@)P zdPYbT-N+zyr*>wc_(>xo-8~AH#De)MHf?MxT+gnah!EvS!t5?+A0NpRY=}?z&z8HS zIxYQmhrn+3rMq_9<@yn6#S@l*8phJ5 z0YtwmHWpQglsJJ0m&|5+KCuRAw4{sMc3=0|O&16mL)`gsG*(UHAosdi@(-r`*-ppa zhTL!kb5)MV6omf%bnkK5J~qo+Ma!>g+|i5a5uR`4*y*$;{}POGQdUrlAdQ#xe1}e* z2s+YH@4zQe=j-VE1vtL~d-yH#Jv^jG&)Jf4X|TS&tedr<1xTWx>rn{)0K{I(4!2M6 z_VT6|-H3&X-5)IA{>MOi@bU#P9EIe2;f`y5Pq$3Jg?<0Yzg#{3TbX}OFcj!VK#}hs@=6%&o$}16f`B@c zTjA3E1PiMpPxR=sH)jf+}GzSta}{CEMp*6u(y4^cfzzRi9Tgh3K{4sOzW~X&KG19Hh;Sq z;#t{TYh+?cuMQ4UaC{hZZ&I(rheU8frMndlN29!ZwPs3bj)hqd?cC?5n`L(1IUuWa zx>Ck`=LT^|Wbt1Ms&$)P4LX!sKdm%MePdwenuHDj(;KPgYG2}SdK5NoEo<=j66ISZ zi)zTZ;47u>P*EBe6nZbwRN#OHq0k0$!wW{ijy+XRy{&DrBpr-om{We4k~++9h;`L3F-&I& zH;n*XwD2VL*OV@;Wq9Y`J4S0sJ4*ztAqac{R0>?hAiU6};VeY#$w> z@S0yjayKt0BG$*n?(hr2c`(1$v!a?WAG%X-x`9lB>T_XsxlN~Rok(&rA-m5-dhYi2 z^5~6W$=VdBda_K&OHbXk2*Ouy-aZsVUWM9S*zS%T97$xIx~qC=b!UAh>mZR&+b4le z(-6EE#kRsO|3a*7WM?z4;b+ZjkG3F2(0rGz5}wV3c3ZOhIp+yutIUlHe$<;om9bqw z1hyEcD^Wo&pDeF%&f0K;{_aNa=Q2Sq#^4h=L*=%F6RLIzV`{j*=FAzh1*vGMB*pO? zSROO*Hc?w0atUDkF+6`=S2A^Q@q+#v+)_DSEc0oQ`!luWh@ErMNN+&Vj25k)uv4}t z>#{%IfBmxLi$Ndq@iz_C*n8u4e;Yat+1-Etw-TGfo?LUaEM~u;IZ1aOx;KMr{+FXrodCr%F~f_M|`hPNRq?9!RNW z*5w{mnS~Xm&hVQrF}9yEhBmkSLLDW(q==Z~JU`DF&1Y@4I`7ZqmVYj91a2qh0n&b! ztUeL3+wY&PjPwyUl^dChKBLpFv#FFLva93OW?--qJ;#dS-1f!ltq(%T`Gb`GIu@gV zSGwZfE7Ih$KT0sU#pPGw%dx=rGpdS;%$n*r<2_00BN&@L^17^yk_wVW;<(}HRGnOEU9b>#(d&zTQF-NBtd(6k#ZfD2%T$}JAZZ)qUKhE?uqFhoU-{9diZXtSy*hbdNI`r?w^RX@SWQ(Me>PG zZr5=$z;3^nE4&nh1&z#JzG0I%XxmZUzf%$T88z#%2T^M9(h5~u_$gIUey$5_31Gl8 zfNcTOG4%@gqPn8J{S`_}A}le3W;;oqh@BIdxJP|H4-QDEIH5C8Z@-0)y7XSJ&C+6R zy>*2Hvto{>c<~YAxP&UZS=Q(9YTe=ul5ptygXqDz@5kizc#Y|~Fg9HRV}o(>bwVI+ z0j!k*ALG{@aWL?59;}FGE^M3_AoVn&!Le|sI7A_NZ}YFdso9(fkI4Xg&4yx1ks9{9 z48_?jGLE+#y1b$qnVq=MPI97Hnv=yfZdjcTIuCQ+_pVV7j%Mwg%2KloR2i-KJfxoE{v zyA3Btv5dMzYK{sg)OTM1qw@1YjKYB z^ZJ#!5U}hjo7)r4v{YEs`KvQ__Jh!{@?EOA9Z$D6JVOnWJj;=3wuNCM`(FJFyjc>D zOXU#Em+9KV$q{A~Y6sSmoJSd(=Bpy9*^36M=Hghzmf1YqS*7-H`za?4+yWQkuQ@jt zIEg};)4bvDSk!wQxk`dWc4=xWPu85t9r{%`dAC z%-d;#aLiP~-HaE_Gw#eY3UZ}um*9M@ca1tce+O=gHqZ0h&*znT)H-hj6*8$ouKDvd zCRRDK1XA|KX8Pd%Q?si5XGBPA90rz0w!HCxovu^}RSI9zc|9itOmzD2Bd%0x6G05B z9-&ldXl8cHeON4KbI+g*AD#!RtDz!-E|Tx6Zk3iko*K^u z8sy9bQ++R7CD-XXw6t#TY-m!wkhC_3`Z$obvU&5##}aXrYX@q3VImpTqrO75O0S*y zV0>F>mp#1(7IcR)of;(ex7GUQ_bJRAmudLoQdo6za1c={s7T3vl(7k)R*|Q3Yj;_p z13%P(14P3wKx6C3rtA40lB-0$YgVHCnn^C}@x=Pd6}8RJFs|*s%f;U8_RPtWd7n`0 zT|mic&iC(Q@>+~H-hEJdCB+ej*i`U4i*`WX7|B?A`OvmpeCs?0YOk$pmp?N!$bOy8 z?%ux{Io5qrPye187+A#0&k!-tpqXjMMuW#sNO5Lu^krX@flE0X<=bCY#h2CE)+A{I zI@qs7y%oVqQD;4NUEaIBSpXXPQ^n$#^8IeXj$UU!5V{S`9^DBadD%!hYmU7D3!hDe z-fVYEKK7R@$dBssy76G`siKcFFTOZ2{4yPA+IRH-wB6K5#mdDG{dGB-n;7L8rr{!MxAukUCA>EcM% z;{dkwPM?MojsqXGEgTJykZI@=3BK|~l3st79UfnOqSSlARQp0FtQ4V}NrY)+D0B~G zUu4YiL&9P$u#qw{cb^YO-tMcs8WN62awEP{`?gvc4}IX{x3-pG{PcfPA_L zZG?@VqOhGfx{Q0t>Y(-er9G9?^$dy`r+6wy0}c{KJI1V`C|+OD zcD>DYx>HV?n}nv>B%hhg7wou2zdh)O2fC2G76wxBuXsHy>O4kXmFgQzlB~&3y@}~s z5j$t`=2{zjE{sVZs-jG|bg`Brl#eoNu`@s{9-NbLX*K%-y~(>Psvyau`Hq3@2O$rv zzzl)Cb#^7jSJ{#_$e-5q3n9&40x<8(oJ7S)89BqpcMPm0ueDYNT|kHnzT!9*PZfdc zr`Uc36?4dTaenHlML+NJVv_v4S+x1RBuggcSw2b9P$5o7HY;lx>zn~Z?Y+sKD)?yz z%SKxmvH?AIco=3^!K1YDU`Q1_ZG&gh48pM9Ex__!ZMzn`*&aad9I#6 zeXO@VX2*KGi6qbZMa%~I<;N5Mlj$FTzA30GN`v85#tzQMbwaZ{1@LCRYRdmQ8Mw0z zNCTvb-vZ3Dhlx+hzUJ3Q7gP2%%1t&qg)RVp+YieC%vb-jMPEf8>pb8kXC=L;l5&arr-jEe@U?W_*8`?S3bE9+0dD{w6*BAXEU**c~QU zEe@Xl^?$S=G$9J>)a5d4XheKZ-WMu4rc2SvLa9E{59sYUc58C_rRQ(u{X>T zWmXK*E*CPChD8})9V@XubrXM)CI7_a4E@bgiOOaISc1;Mgh-*1?5egQ8)*((p1Q82 zA3!}La-Ypy?RXh_?!n2!CV zPfFM$1pcI#Ib&;)Yf-Xe3#VNR%DV)Bk9#cA{ew`~&Rmz9pdhcSgnEIDzB;+XGh7+RjwGhs7eaE&}ZIuPVF z!iu$Q3#rTr4Tt7US4u^wq5#^>f@-(h@FEv>+aiqmys*}TTy3}ySvUEK_cw2j&o`> zVdqLK-fHVyN6E#h1l)|KJR1zR9_~)~#t6*DBiG7_*L*8eh~=jf^D6{(wq$*O zvND>7X2xK*JwnXD#^k<+(XoZb6l~B5u_Qe>6>@PbA0AL;^<|6Gy;0Xt6I6#0mnzB8 zkh)@$XRagB*k-$Qt{RHT){eXeR#)1eimu&tTHHX?uneRNcoH;&_@`LUi)FR#P`!hi z&YcQ+HNP&o9^(YfHII!C_iDjO0&E8qHNULczBkeCgaes*lY@*8LPM{2-285(jNKa? zvBi84vYecsE6s2{hyNkA1D- zZ>$~8m#^dH7t?Vf!5c@Jxpg+K$H}jW`#+C<5Sj>#-U<02R3rGUKX;$%0AJ!c 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

c5%MOtRr6=!V+!ZF|K3u%c4>(O1 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�li5KAouab>iK`qY_U;xXHnG6F1d@JC|K9 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

xCr;lHxor=M>H~#!n+0ZS`Y5%e@Kai{^whB)w zEE1;fnIfW^ANitZ+1S%VWfY2*3{QX`q4@)L)? z*D~EmTnMldVawQ7SImKh)WpDYYLY0M$*r)#lrFXQ3|)q^mR+?c33~+ME^V17tlOp> zQX4V01R<=8-Ko5LTxFbk*6(|=1<4R^%8DgZ^|%?lt|p`6$$p>3_45XN32rfENbFw! z;0$(f6N;KT*6mP1ySkS!&_RRveLWeXSJGF^^SmTyhCn}NNq)kTw5M$ z-APuHWI8l-#ZFtKtL<_8kjw-I1m7z)wpLV3G4H4aNLxS#zRHU3)v!E#i z7ZiTAUva%XIV=R)g`uts&C+`F4NsCjAKZF6^sJ&>W=h`Qo33cYm8!my*m=rk>Ww(R zK-Ve6rH3fTx96Z^XQ|)Z#((bu)id zZ*~7ke3pMOW28 z&7zk^d=`HJ%D&~(t79r^bt(?5>|4igfs@o^cwW~fhC0T?2_GB|KjoX%%&|$}n3PD@ zE8{TzQU|o$?NU1-r*${Sy>#+Gei+l z9z4^R7@1?i&ri&w!Fe5%W*-ImV9JR@KWhov7cffHpy{!fEvghc%{{c5akUO)x{~)r zeU^O>*>kpeSWznmd3F4djE9-gxK>hv0>B_R|Kl6|J~o~o63DD1o$D|{7V4D}XH++L z`qiR_I*QldraLe#OS^qzqNCH@HdS#`)z*W_*B`gKGBd2) z99dKy1)I?oI+b#v`ASC${z0mRQO7jHO{g8r~X=H8pQwo)H>FE z+>CfLjP`oglc&u}$V*&|Hml6^4|^mYd&=HlYC^z5B zqVZ;y04*;AcZql2RAUFHuQqI7h9Vx;Dc*QcoEl^qD{GO_=H_-P6`p~}xLqSM9MQkS zCC^sU)Yq<1rh5zcvxA6O)JK6&&F_bm_-iHR($>V|^x5`^-3m?hQoO5-tZ_lcRGNYe zZMiEmB0x6)e~WL=tcXklVUX|h*mv2vTXtq!>o@fi>fbPc7xUQXc*@}5oQ8;o$l8ni zW*gky@@M?1O0CABb^ zOT})6!yKZv;8Aw$@Bkf&)3~}sBZ{wvzujq7>>08oo&$4K3p5SOJ@a#`u+6f7QTQF+ z-bw#fz#JH_*jIPq)R@Rp-g^=q0dOKifi3zW)zL?_`R%Nbo3L5i2kCr2|sb--EJ!l;`=qQtZa;90+ywO#yi<@B2m1?X!EWG~?N%Xks3&NPS$#$lj8)Lr2UR|mLeduqm zKTYB6M*HTCV?5-Z7RnebCO$A#Po7*RB#3X7+yd?{`%K0%DmY}OO~uA5#KDu*=&;86 z1_0jt^S@93fDLr(hd)pEUyA)BNv`!N2>r?@XBw7n3cV8ei_k0K-YjrIH2FyTeO#ZF zkNw-10tc6V5jf{?#3>L+An|6oNtI69~*XlW2N{E)_pMsPvh@$y?D$fbn>W zX-z=M&i&-G4+K6JQI0fJMK|Zp8lQxxfXyXl0>VsxxG1PP3iFA)MACIf2aH!`93=d* zVd?9?mh?(M04V2^+}-YmC4tY+{?O2@{6^p+Krq`qV0jYfogunT!moZ?K*3XOJ1O96 z`0r$RTheqT)yy>&fiIK<0Qu}%&6fh#%F}%0DaPq;?&;RXx3KD&rM%E~fiD!Ch5qu} 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 Y{E5Jy2>gk_p9uVkz&{Ov6YmE94=R#@djJ3c literal 0 HcmV?d00001 diff --git a/docs/screenshots/sales-filters.png b/docs/screenshots/sales-filters.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4a82cffa54afc5034a0f3c6b60372bb5472d4a GIT binary patch literal 31081 zcmdqJ2UL?;w=f*LU`Ihf$|xX&5=QCW@)CwH1PGzGQH+!rO6Y_#4j@V$DPe>FLkS^N zfrJhjQ9y`*KmZ9%dXa=4N+@4&-gjo+d;f3!>#jTh{nxsW%ZKyqv(G;J?6dbib?4yI z!Dqll2v{EsIC2C4IKue{I2Z!l2b?^9;^c|rCr_R@dFs^3)7%%ixw*KwubjVd_Ttqm z{QOt1@bL)>ONa_y6BFX&`$qN~v73@WX`q0p+_!R4-%3aUr4ET4Id$q3_i66S+}xL? z1o;G|{>#t7Z-7gukA6G>ICkU);OM0z$1WW?cn1*TFnRRYkwbp}^&C5X^u);{r%rQn zjV=O?9yxaO*om*t$>S%F0gfC!cKp%_p3B!?p1frOOSp0Of#>+CE4LLMiapIL>*nRV z2Y++b6rGqPuJlt_dCzIZ>}3h%e>i%rcsKQO2nup)`uhB9CaOGl6KTt9xx4{ErU36d|Q$TDxa!s`sy#3TWvT`etGIb>lUN zkjeLpKOf^JyY%Sy5l`P-u2L-D1$+Pi_+iD6ic~!8viEd3=26C=zs||WfYuimGy{LJ zn3ZbY)T~;$CK+D7^7K8IKc{^DA=z9@{-b8FbE~+(R~Hpi z-+tE_#nCB9_o&{a$8yeA@1;Q&U(}#`_wr zvMyQ5aVhez7UOT*YtIX57XF&uf8=WcM_wotqG1#LwzVco&Y8FJetYd%sfWf>y_=Y3 zzVZvN_G*z;JJ4uHcY;NFT^&&ZhF5ukin2}Ibkg~4%Ys#seE`@C9^0J{HD!3~Je=*D z2bb);2vDkh-$O;&uukiU8~|JwbY__cfLVi`c!r(c?%r4I!7ZdbZ9CYuaXCJMeOfer zlDL3|c{bF$%ElDn;cK?I1NW}j!A$D5KWdO@Hs7NlaZ>7corjf9Y9(I%#=F7s;1-0Iv$ zux#Gm(&M-y*U4HDCpvQTMcZ9OhWv+6iTylY_WS{$c|T^Q7U$kAKfY(=KbGzAcITJW zp@pjTFXrYXyYCjCwXjGTvvt_1F3!BD?QM5RjK_%KFGy7^pI_)(=HC7UL$2|60s$@dTl(@M;Q09B`_NKJ z6xh#2FG46cZMfHnzO2u#qta0Z^eD>MTvMW{YsSEsNRbIDb*B7j#D({fyHcz)H=NCq zi-7qZ06-;t?5Ula{>`cWVCwLRAMbW`fpRW%f$+Jc&taUuhw1ES=;;SQuqV`zK+UXP zC6G-BTQKGo;v1Vsn)#cDDg~7Lfp^PewInj_`n25%zH;vQCrP#eUizgxZ>|82zyU6Q zn*HCA;`{L=Ts59lTkzI^y*|J4nIPzuBe_^j+0a0f_ma-Gf4<1XN6pQkq4dJD;MReVE{52(6V{63?pKDzz$sF? zLG|CuYMder+V!V%nZc!%Kxb0K_k*|8hcv9sNsiDMvD2U_?0Hp;d7g5=Fm z09Hx9(hi>LGG-9Cqv{LkwSn?{OH3celcXir2XCLYgvE>RQQl=|%94WTE_)iiV4cr& zDGKRcnj~7gCMjO)fXtAbpkWZa9|S95!!?m{nch28qc|qU_>t%FdtIBg>#L!2E_H@Z zGF0_j5d!@l1%ygz9*2k$&oqcZrmsbO^@v%te-dV(?%ms=1ArgL%I-`OZCFtWsV2B@ z^1&B#^jjYV{~~*H8b_!b>FOBPN1;mg#)5~LL(p5^^R%CmvR)xd{71Gl#(aZkZ5RiD zx|HSpoPUv;T}R5@qaOfbteI~~t{*%iNrAQ9k&SFCxf0e&}vkH3> z5g3{x`tpacNY&M-==eJMqo?HD^H|Tc>Pv$yOtR#7%)7&#rO#;+4H>&ZsUK{xY9*Fa zXyM$&XA}p<(OJ75MsarIieY!@^8zYgPZS16k$*vk@KbHOH`2+PWgEdK=^2(gjS(-h zGjI0FvV+fHB=YA<$f@-pXiGC`rorZX2ENjkHNrQ2j3mS{d(r(hmE zmqY09q%a!Y8Z(NJfxqbfO7#2GHZ-`1cez#~RG|hg40o+{U%Qdhsj(8HLLIJ)mjhw= za}1V@D?H75^NHQXHI26e;=I@(5%YmA?TJ=4KjXr7hs-|8XfJFp#y4_zCiwuMOxS-r z@WtEAzWx9Zs;8AYcB-xPS!ouCy1*SS%W!8F6CiM6Phmq>?A0ros`*c%mIB&=NL~%4 zy@;Haw(j(GX;XG5-RGNOWsIwp9lQS8mSgqk0iZ1I;{gEILz$r+06yt_YIP3nba7a7 z4P8`;H|=&*5gcVNtuKC<|MGpvJ$%Sp$i%9fdDP{s=l8D2U~V@Xy_NL}7~JRIWv`i% z0#gvB>m%l53GUit>jduweR#|eOSzh@+H$2l&3=Dhm%_S57hOxW*rjK(PyMBhk(xe% zvgnwGfXU4rCDkwAn>Wk99y6CHxMvTtS z*pAx_PRD-9l$FnC#z!q6mF#Y-M?lQ9H()VDFywriZ57&`AU|rE2n> zg$Nxwf1fZsclcr@1%GdoqbfLTSQKdDOq=Vo0*}VnLpmu zC2BLg%jAV54nSMi)7G3KV&pu$sJ*z044 zK+KB5$x8ZJC`ie)X|ei z>{J3ue><%$&m%vC4y~Y1q*`uzbrwQ<*>=IjbACGwjalH>^ggZikTpFGyTS;4vVh`b z^K8s4kH5XB>5wT^)Z*jsuFb&OQGWRV@Q(88hi8g2Q#e*`hDQeadwpZT-M@Vjd)YGu zdq1YW{QA-GVZ`*$lk&39?_|jfYFmk{q+tK?jd2<$PY5yn^7NIPoV-YZfJgUEa8*;O z*IVqZE@cav|sKNB=m%rTX)#_H)ncQ^A+`uZU0Ff4_76UF6I4 zfBaya_~L@t+)u<4Bd5AA{eRzl&BOlq@z=j&weq*qSd)2o;qHvZ^Y)cv9|MvnZr9&g z7eV;PlwQ<2^@6aZ^|#k|NYK+lm{MNG2&u|-eN8|h@bvB)Vlb>!@|`PCbuvY{W;&g? za)DIx);H3szs}vkuy>0_mecNuD5|DSzQaj3!EC3>BCd{wS-vy!PU$8F|H^_EH*5r2 zZ^XgxrfBqdY2MzIFQwvBD>Lygp7=M5!m^${Ft$Hx)uQ?(jChDJ6xO(1N^+NNibzPhpWgr@$h_=6w7~EXAKje!vDn){qtSSiR3rRA@al0!I zfT)<9xb?B8YiBY#Ss7#Iy-GWFN%;Ksyl3mFbd*gh#GHI3vkJ?qZu9qIy;2$M8f+>4 z)wi@FnT)YkQLYq}fLtz_767NeE0HvPWEwCnFsb@mzTEnIR%^v-uVcQP`QTvtEYq_v zCDNvCBz^3d*-*w1d~u(U=S&ADn_3L`2>0Y51q+fKPj7a5xr~Q`gR1_~lU1-+W$(O$ zvi8$Te@(-e^pCH_YNSVLh}KEx1^7#T_8W5+jy03xFVA52BKqrWe1^_BlFi}X?K=%oWfkSIW@bGm z?{d`I(4BM5t6R8Dwj#s6^pl`mkw0;w%;T2!2)m zwFzSuQRuv6Mkuk;(lUoj*n~>ag1bZ3_aD*SpVVm))uUR?D~slb>S`V|!cE_1>MT$D zWnQgis}5`ktM8A`4g6ePPkT}T&*3OZDGV=dQw6nwKYX3RLq%cYN*VEG>iziO2bfPo zu8;;Kgl@J7&oKm#610ZtOiT?ZsQE7Xi(=!jrK{k`hPp+dS2ttv0p=Rnfrmb1*e)ll zml9&2oK9IR9!~`yCs>Hs3Q8m(~l1Gz!x}%9Se(G@wN?XP^+TCvEB3YxBY$okp?UoGGl~jA| zW|OxZj;9?6&0mW?Mn~pZh zi7P{j1{Hp1Vqq$@9Q#7-Oup7HNmm}RYC4twbvW|+uwyJo9>a~f)6Jwy>`Q6LlIb}{khbw6ymzzb{9oq*8zeVG-5;$av>UeE32K?UsHUgZW-U@z9M5#UYBf@duthhX|csng?Mg5DO^#pG=#Z zBPdt5CHElH2J{>M5V6!d*tE&beb5GBNZYs zwxpZGeE>+l?))S8cILQky``+lZhp|qNB5gD=ND8tVl)6?3wD9~899eye0?J7e==PT zmFKZMJ|LQsd6M#q>%rfsE`N|ZiVSUcP}zO2Uwi-n292$WM`>l1+Q+4sSheJqxRN26 z7p^5HwoGT(VjZ+?W6ueP!U-YOi)`wv|1gch`KHMiv5BiE2mp7#ysHVZ+;;DI^pUGRVu>|mQIFvB#W2RK){cw zW(R;%QnGA0w*+d}c&LzNigT$%<)sK|kcOjmF+?HB#ent7@MguS#g(e9RO_kvYHQfPrJ*(Fw`Mc@j;ms#;YDI3FFYS=( z!;1uSMdFZKywtJ;u-8>_YG}4=Mc?sE_2Q3|PkCV#n-*&|=`uB7JXiaK_jDOi7hDl# zSlMf+6vs3eb^lF#^;f`;e+uh?%_@FX;oIVE*!Gbl4^yV^Pen~fIV4|5kj*hH9T^?6 zw<;9Unr|lRwgYREa-Yd5=*+fXE4**uwv znH_$gQ@T)Am6ye>RIohpdd^TK6=JK`bri3}H&-v48a@aPwlJ$MD;BgV z97#vrC;fr0Sl~r97nz&|!EBK(Yuzn z4>@u>9rH_*(xa({i1407eSFGjO7wR5*5z*iH~u0|fLQe|Va?$~IACg+mRM3~r^GKY>QwB8(e zPy7BKm(Q;Q9^Cm)&HH~e%8uY1=M?n=fRnVfai1HBe#@=+T`}j}N{K6^%WumRgC3}H z9Q7uJO6!PGQ*TvQ7T!bU!^6Umlyg7$CI>AY03xlErT60JObgZEX+CQ}%_??a#@hVJ z_%f|m6^o&dixmx(@qv}tpt>amL`NPkE)Blmhle`pZ2QdZiv1Iw5 zFY*CH;M(7nSmL*hw{Ns-`>@6lC7jhuFsQ4Y{GCj7=V}jq+NQrIJMqJHoprr7wjABX zIrC9EF%Xnf+)XPkl0$4>+d2TO4jaDq$v03Nl#rv=3B`XDE?>mHq7Mo3?Gz!wz8hx9 zKo)0#KzdAR7647^4(gOMPTl<|ueh*WnBPaKj36_bKMdo|Z^iZTc72N4lo+9Aio4!^ z9;F}WpiJtXXI&wZ!w0})`{$Z#V^yf33B7iYd} zw9HGeoLbh;-^0%P(Unu2Y)tzb*?I7E8#~h_tGX~;dH=4L9hHCcTsJ~nrQi#_6oCP< zq6Zn0#6n5wd*(k zX{NMq{-YlJ9p8rT+XgcSfLB}`JKf*hZM%VO@bp1Baar9nEtGy4C&nuoITlX0v&xBd zb-(Tc^YI?05ug{OG4QD#cdWvd)s@T(my3^zqq|5ckou`b%EN>xLd}vXnzP72Q-|32 zgc)Mdh^1YBQ;D7U$p5T5f4Ve(k1jeiASK5k!AzPPa|eI zXRexoagS3o6kdt1Q4_2>9iHBd%pV!E8(?=_1!tbW93!|ZmrL)eA35^Fzq>R5;8x+b z>GtiKho!&IC6m?ZatjYM@gE+>4s@k>qsQvx{IV^-T=le$aVj?hR=pWINi(1KE7@h(lr1?Z zVv34c6+{yMt+wVX(r6rm6AJjrhqh#k(i#wXBcnm|0 zV&xsa&7aqi9>ugJ4Yq6Q-$kXl=}VC#VrJ8(nXNh@>OX=`DIn=*>Izui`?G@F#orNC zwAk6hi9-=_Hs%3E2p)?8W)`g8#btrOjW%M%qNDP+*;-2voAwMg*YDW+3(D!)6J7FY zl@SGn{JIcBL#BR}qZemt&F0vm(tq;Bf1v(1 z5+Y5oFgLBP28FjR%g1pp0aqQemIUo}7j`artx|is0=5zJ55o`Pg>$MstMV2f<1?}L zShfFo@B`_WF_T=HP^%%nntFfk%PaUP`_f-04c<36+|v%R3bdS^PQgdWDwkxq1` zWO)6h&xa&`f#f=>HW^*U`ZkxiivaYw+J!$M-@N)-eU_+>Y=i8fpngk?mA|nOeCl`6 zt#Kf&hgrt|E5T2ZotJGNWR;U zIg#U?JagueNXGuQ`RzEiUFiOJC2X7)mS9&|kur*hrt8CERXZaL z6NZ%MYx3JB2ZK_T)%9FRd(b7Ow`(Z9Piys=$nAvT#LY?cwMW(NN2oTe0jMu+*0TlX zO`DbW&i$N5c-IuVJiR~B4E;2>zQju^q&}beoY5LXRNdS~@KHR5B;ID7QVs9s8|UB+9o5{bi_i=3NZ-%0(2*(8S}-)eES zd#;);!#LX6P|WM)?!jzaEbM~=nNcYhUX;nsYJ~7_I!O$5_DkUB{aDImnVz~@ZwUy9 zCqE&4=q+pr_x9bWok*pEX%x8R@>QONyYFpS6YV}kqG_qR1@8my+r}|hIF~R|ho`mO zS%nF+V^l0Sb10BE-#B?BqK~W7GDEptF?*rbBq@VAD-ox^spEG`ON6A$(6ZI6T}HDS zNafWLxb*Z5`9|>NO0(-{`(U^S$uG1SZS|8Ww`Y-LgJQA!wT%^35%1=7J6gQxNib@t z=*xH~T1*aC)T{B}?_J01l?MJ4Tm!_g1aWPNJ!yCV_;3K|aWtZ==uC7yes?S_hYl$= zuPy#zJh#aQ*fOI8$NysFW_znmIYX_H>924JrGCd5>01aT_%j}UfsU)SK60t*JV)3y zIam5bai_Afudrz%x){v+C|$WvtK01snn^YBUzwgzZnssx2J{(LKt|>ZK&M5}3Xdnb5ATwir=d;^~ zU$@(3_PH*2mmsYB%`39(;lgT$`m6fWlh}Ywuk9$gYQUvC&TIp^pf#_-X&U|=yW`N{ zmdD#5p+X4sRd9v{v9RFBXT6>525Ycx7BSFZwl0t=%)QKqk4`dpi7nmx@=PpD>f#=54z zNN#4_oK#LMh;6~;CIk=nwAibGSkmT07hNdzJ5X!(hgGb@qSM&;$X289>`MkX9#{=t zQc@;98SnB_POxn8LzFsEGChcLwI^S)attD@OpC4YdWB3v5b^Qd>zS9z5rlKL(DT1TY~Y^$T__@(a;ckK^%8+e-jO>lqH$MJveGW?ui zf-}=pUQ1zay|{cuN%)!(tw24c|6?iWNtbv6g-N z+=inGq@@B2LUI%i)b899H&&|@H!E0S=oLNHJG~|Lad_olg`3;q zia#&LMW02HuzkXH{(V9o*%LKxEijbiXt~|%ZdqB7lYLJNvC{x)tFOu~r`a^QpUJpw zKcUyW?)XCVYIk(vvy#Zi>jhWFq3PMiVTO`w+6!)}OCjI^T1)0*?^MW7c$Ad1;+CgL zp&|}Vhs`p)5`)%8QPnS3g82`rJeeSWR154{d>^mr=l&x<*r-UkzNdpbq0eo7S zy+zVZ#dt0->9Pq?Jt561Do!hJ^>u>5NF2E9kbyYyAO|oAD!6w{FDrYV;+-X_*=Z)J zoPbWsaF7`JobuB>b%`V&y?kj0R^D1&P#F$|9>O_s$xf;&3w^iM81q$*XpatAF+0w| zXpjqKJ9Eci_%Mg|<*GM>d`7U>OoCrJHvewB(cq?hK!en)_MFWFz-3TJ`gHM`Ay@1s zJjXmjx6(MF-ML?{d`H&qCTT~5XyA?LQX9r&*E*&pKSZ+o5c?LU2Y_ti-l@$3>TU_) z0HABSBkb8b&?0l~nUkz!gY5kZYfVAV-Z@#*akRsD%dq!!#x9@K+)nVdz$-5F-dJfR zVQXX)N^v?9gTZ%AAP)cy<_^<7Iy=&tA43C+DD4ZO>t;GxPUo{RgMpso4}6h&kW}m7 zE5z#RB2A1mFlagJ`~g5(%MRDW>*^C)G3N>FphdTOoPgf)$?NBFK{#bxNj2QWymnLlLrbTn1#279dR$vfh|am0fnF(WvQcY$!rtK0 zZTzn;>sjXC5-gNlmI*5MZf+Vl%H@D1_soFuznDolA0OXNaI%JtdXT!}TBVwML*;g( zd)gCg%WhJ#i^;PA>zqPu)Qk~VW2m^%p;HOkfgf{5BQPWk^o7!tlQAZ^A(Lf-%aTtlmB&lXov&3#V zt78~hwFHlG^-7C8SG5$c=}p~!ME;}G zu1e#DFB`_d&CiJww*j0oyw=)n+1pqDsORAnY`?j;swLFt zrzBfzr1o^gE{}uI4LcnuskcuTaqkM8jyBnxOqjF$qi^E$Qbd#Xk=s8fnB(j;WoKnZ zR>Wk#`J2Y2eiZZy|b+RJ-tl9{j>%Hw5~ zHIEIHiz2-aAHS=aPa0K|82|k8^@QF=pr!c_Z(oS^&2vVnzWJ{T8)|`%6AzJ@Nj+Lp zNF1D3rufrjS|Wtoucf-DZK4&PQF*i9o!lYlfc zUzIj8&Z*gpsaBi*wA(3IBb*6$g%&NmsoZprj_Vue#o;IUxA>%djA^n3;`1XzZE7eR z*XHR-)upA@TkiQ*!^7%)n{erVV>6-aN|NNt3hGGGz#+AWkCI+c%F!Yxu9_kz0Urs| zIuRGA)&ym1QK$70o(UiCEwj8?Ls&w9OYUmJ*j1YG=tWz)&4|?AOpG*xIb87*RQzk} zIIrig;(mbdzwbQ&w0&I9+Iz_vXcDvLbsPUcNZn9a0~!;tGZgr9#w5a=u%q9zW zdL;>&i;ebMD6Lqj^OGf#R?$^4%(LU3ZR+i*nH3rYj^OxhM!>Gm41Qd9g{ z)?h#f_%<0u^G+PER|76{Iy7Y9#-6&M@b?~l;cF5nDop|snGV|D57_#u=$67v(=}q+ zZ8F3Mv}Fp%XP!j(UcM9C+~EANSfCr{s&{VkR#I+x*`&$}^V;f~#C_B~Y=o!hZ&l_> zNL5eeyDdg;o*DLwt8xc`M=qR;@pFMDB_G);_&GoB%5-khRDOYKfJ?I!p1F6XPzCqh zeyM>-UI@aKSEpQ&b5!81CDr*X)5+Zoo`Zs1w(E)Upb8!0e0_<};@Iua9#c&ENh8Wd zE@Pu6RX8k+D2wnq0MK`?CQXc94Q>9R$2YM;-NIS&o^>&h=A9#T|4Hh!Bp;hHZs+hK z`H4BfvCL=*+b%By%C;Q{+#A$OCfjL80BOa+C~glJIsjaoy=HrhYytO-0l%=wA?Cyn&gr# zdD3p39OGDPQQ59$04nmtmN)F5&_dqr^>K~M%h83WRTa8sHhxQtkoDIDtyyU|&w14o zz0{QuYBV#Cp&`D!+3>QFT39GW_!DGV{W(M-9Ki(y8vqGO-7ig{Rau02R=;n%Yea); zPhKi2zxhGvagLkg81vyE^Dhnm`EVrKv&VjYokXC(tTAYLu^+~ib2Onr&{QG&uX4t% zvE;SyBTdLToJAVlcJ`@#64B_wg(p~1oy2298dMA&!zgIUZbE^eYF1W8snZjdN`mI` zj`-10J8S8J;$A4GyoZGc+1B?a?(Oq~dk?(`;{VRYUwq9Ek1vQxNF;sm(_f1*wU_&R z_RTY=!@v#&9Zo>V9fgzE^6EZQytGDsA@JfRMLyp?_IspAB>}5l`YS;BFOeyLf6sDc z0HxX_k~55M-Z^y24=k4VH#ol7bzgLp@@o7m>=6EUKCG1Sy`}98k)Bgo95YtXm&V|0F6&t0q z!LatkdZKBx`U2V%S9Q;p9^j(x(G-O3dw;>T`KpTFYqCYTkIC4%|1v%QwE|@h5hKG<(dN z)T~V<5X4t-N@2lHUf@-FdNYYON3)7aXbHq^fLeUfi3Ri4QtGj7jOzTF>UOzOWTGpY zxzZI-)AOW=l&&2c8}10{k8-^@Ivv9ax5{AYmwMF0h(xQxu^LD@yVph95|d%>6@T6+ z)9+>-)%GyRxCM&c+kcy%7=;vQ{n5lLR)}+!_CAX)jHccp;l1)9o&*@lx%H8sCMC2@ zd}^%bCUt8_FyH`iA@sgoiE}Er0h+G$us>o%9aGs<_`x*E)~40hgWeTL{Y@9?);FK* zlwXjT-k@=zlV~Qv%eGFcc|ci#rN9l&)0`8DkV~}U;ey=H6|sW}KRIZ1$ol2A_pyOF z(5BV?sPxk#`O>`+0cvgF+yW4)UaL2)D^%yF<}+gz`<)!e11G|>>>Ge4$^OF-Q8JH^L$6sxd(byDQlJ%Hm70K# zibmB3sXMmH2+yq&5Z>Ic#+(fEdWYU&)zl5qowrgIw?i_cKlrA{FEa3_yR)2=RT)h_ zv!Hn(XxktE(L-5XyCLt35Q+UuUn+sS{Fz`9JUh2M)9YPgYqNifyt~{Yu?0V3*-ZdS zEoDmOvCG*hOPk}Ej>j(t8Djbke!hysAYuNYrSt$=kZNvHFi}TZxldU7=Ok%$bU0QB z@$40EM6s*iMYH_Md0JGGjUhrOL_iJ%&so*`nS}>}7R8^>3Ywu1_bT2wo#K*^D?RsM z&353!dGt_~weANwN%zecEi)B4r^;lt<)mHe8)sVx;(IFr%DfnhER#l}lLfpoqFGI~ zlLxCz#!YWxUYQS+jiiy%)vR6Cr97s&z>1tm69_2H$ko5oxp#JHsB6@~ZxD5o>4W!j z;f||76KjjgZca_DR!j`~>muVuov*lprI}`?pN8k(R5wG=KT)?->q`y*Pkn=nK4uBV zE?~PJMq>~-X3MR~(Ym^d4?hi+tDmSk7WQP|gv8llcyJHe>O;+VRm>*h<^8f?TsYii z2*NEbeT@@aYs9~M&S22pm1@~V5qnzx5p$P-B#D_Cl@KH$ya>a6DPXg{B(qbn-RNbd zVycQ0DVT4@PtZq%*Qz_>l%%yO>zgwE;*LqKYhNSpbxp~%V)@)j7b~+QK`(tB$BbL@ zr`lG7sL^YPRfmNKQ30+AaR><@YLjyHV;fm8wryPT^(R3)ce1)~e6Wm0mDxZn-k>E* zsQ72YN$tlu$|;mb^=Ic;nULgkjnvIsWCG{c0=}IjUj^PPB9M{S)rORhrA0t1JL@JqS)GgopD)5nnucuRW;3>R z!rodoy$yFd-#6!l6FUb9$7`kWP|>3mLg?9~h87tz{R|#j%1S>0#cRuouO{W-5Sm`! zlr4rjJ@JtUMLG%knRvRolIWJvQBCMpuaL=8pBg*bC+Kw*wg#?>jCq}Uqrq^#8)bDF zni%SDFFC#`Ilwex%JzDsdg)-eX?R|Sy+XS@=N4D>r+GT_717p1R^EA_@U5Beo7qbt zI--#QMWvrcJ1t_r>#K;#G1bWa(shoFR2>;(P%}gQerirvs7O_Q6$)W>Mn`n0i~5C6 z+k3scoo0zD*%%vzo?PcY{IvsN@+oLwgZ7V7)%7)LsICn3ex5JA$Q*YwQLh4&2ft;Irh|nrQ%Y1tNn%aZBF}XgW z8cfe78rb@JBsE64rQbysWZ@IatuGa#^X7T$Ad_VQ(jC7#=IR~gHoJ7yqv|u%Bjqxd zQA|{tNQ_C@=W{Y8?Z~M?6==o1;gtq-W(X&cZ!J@&XO~-aL`!XWa3DFL6JG=}(_&kX z*&BAE9Mfi&>uMTxt?eRufHtrkXoDSzG&uhn?U^{FJiMS;>gq0^Hr;7kQ}){zIgsu%(a3M5qSeNW}!L9;*5#h=)|{)m^_-fn1HtX$WNoM zkf^-*{(kdv$l;9W86qY8b@|@nnlXt?AwaL*PFb9N7f$R;Rs&lirA=Hml_>$d78UB` zmQsW@p7qMXpf<;>Tyd#Os;;%-hD^KfhIHP13&%;|siJ%-9rz^~V}@Ip zrw@c4M?|Uj*}}yHoO~BiZ<({T+W3iR^=Byr*Q<(dp!pWOtLh*~%<|o&((vxb=)IQO zv2yiuWI;Fsl?>vE%IkAcIahLCK5bLoIB1u`rwUeJG`@hEzby26>jy#s$Df2d!fd9y zlC1GJ8VAW;xu6mT@lqaF1OTsJ^`DQ+vDU#XX4m$I^RdAxrm^ zSKKB%IrlS(MAa63H53lJ=#=?B?n_yqF7nKfs(C3SVnhNGS~(`Q-*4t50Yos9@>bWV zXZYXvUz74JypIF6tEX2E5~LbFO(kGMgi=H6>jf=ScYt`+!9^VUM-apv=SnUQ2J z`QgqGcA2{F7h1Aa+kNBox?=w7+$_CoKh&U&gvKzo6~n0YV396^#y-#-e8j=HsL%|J zJafs!B+9Ps0R@+~nfSEQor`iTak12O`TxB45KkA2$hvU<}u$i;mPb+|0UVJU)%?s%JoBo$cV9~6tzIUC9eZ{K?^ zE5}e|e`jNLFa26zz!3C80+qTim)JTOZd-%VU)z3Z-8q1~DyU12CWSk}W~PllU*>O8kzx8&wa}Cc@gPfa z;~bkRy3aM&s>>wG=kAzfm;C!IA4h?<9;B~r*{P9VW`(w~S6y9OT1hHO>xI!ixxJ%V z=D7+MEJ&Ufc6od9?bgK5V*ihW4E?l?M6drgs}$_z&{HfXlV%`b5WFFo42>3Ek-ImJw>WRBFmklP#btW#@I zb5v~=b3{23=p&so^oR!OH9Yri9FJj>z>sLdaO=@#hmOcy`Mo34`d~B1N`1C`&2Idi z!!<}#>G<9k&f1}mvvvqoX!`LG_IE#ddl|E%dt(=!^p-<5cYj;cIrS0YuN_%Y4B-{y zqJ=xjzr8A+wk>wT&uv_wFbc|p?UVa*ZY${h?e^v1lNMof0oS5#CnX_G-Q>Xf`e@Yn zP2s-dJwEd{dlR6@8o$?C|3t%pi`74lfpewx>b^~I{&0G=Ui5DA=N%q^SXYxBKL?2m zaB13KJ51)yx)#wqUF8HU_nVm&Udh<5H~gJ5;Wwt$*K>HE4W$}nil3^nzwj%k#96zM zaxdsal!sNqXhUY^(}Yspq5{$ib=P2Qgm%cwxT~Y+TXlg zR~ffAaK*g!#be}P$c5j|mj8|?0-1>MtR*YGLRlqnqy(uaCR2e;K@R(9#%`dxwBrn~x^43AE?`S1R?`OgAVZq888 z7$htyuSyqqlfI%?AE*JZCN1~6Fzu-I|LP_Fk)cjQ@I*|izl)(}=w{@{R5^V~zSN*z z`(?5J)J+^7b|t!Fc18b_wEy3_;!t*Ba~O^aD13WTV9Oxq@V^4!!J$rk1s+!ttr%tx z)J>fI5^{mFCGhml-)(M(^g81|bG8J25$J{uw#g#c`!~R)rXS~B)sxTEZb-2CQ87H6 z>xqsnk|fhW5vWoK7Md0$RM`i%#$Oh>o9 zw%62!zEZfn9PjY!hy-w+?^dt(g7Rz6guI$IJ-2|(&(*j7s3+X`_v*eP1O9;D>2s|$ zXl$sej)fRRUgZK8gKoIA%io$QlXs%LDl8tf>Z>Y*S|kl&9QA9BKE)uED_(eol7hBD zcCDr_w)9FrJ`B0^WgRpRah75EDonKVx=5FMKf>kbr4eTIiwNWI@#kCf2eM2Y^rg`R z;9b*qkH_VxoP$|()27pBpI1!qYhseh}iUEIqo&GcZ^u%6mU0HQyqP{sn+FeE_wbf57oiJ$Caz#w$y@3-@ zMK41&t-rPIR!~_Awv+Hx4DWWu2IeeNfz*M;W>=PPf1kT^wQ=~oe~y|{&1&hdH;Y36gn zG8DB{@0X1!p|%vcNkC@9?D6m19AV#fwt+PhteB(II=e?GW4KX-uPm4bFY}L9=f0KI_k&)p5OWG<2TPh=<>%Cv-(T_w3wQ3gGL(Du zc-_b+koHXJe!jh2QF2KUMt|0Ntf!iZR)Lc7340ie_P=Om7BTTqEa*y|HWCOXr?^Cj zbK~S^408E9$l#AfePoZk$PMkt6_q+ru@TNkNG}Nv3kRG|f5m5vzuJt`_g=A2ixu0{ zbwD`1QQji=a(clEQ(ls%KF9hKfCLKbj7nQAAv>{I11|_?hc;Mv2RDyG<;4|Vtw}5V z?@ghEdEsATAZ{3PA?{mB}isVC@~$;k6f#F|#K?Tx-A zP|*=?bMdlecS+m0!1U$s9L%9b5wP&Q+rd+10eaOYxc~&|v@{{5IpE#P9dF4A95ly= z+Kvssr!dtwCdMFAd-d?9Q+GitniVT zAGxHk@Znam`y9?&-j7YUhg ziVjoTs(y;6&gIeXXJi>j6|YrtXOjXSP787#mIYwsX%g2H&5KYj6gnz6Vp6NCUa;u! z-0-Sk++NTn5@Fp$dOkoptZEc_>zJGO2{r2Jfr;gIKv83WTp6CJL`rjU%4}Ab{|UBM zqhBl(WSlp}b3Cyiipz_ZF&SA{21YQMX#JI*KdsjKapDE9ZmGtA>`5b`j zMPWo15ns@l@?F2L?u(TQxCoN0R$@pnWP2i=V~&1rYI7-^92PvjZg^ppp2_QPfBulu ziQ-pQ=b?Fk$b83;pH`#BsaXaS#mDPqRx|H{Urz`I--+y|;(T=~ocb#3 z?cdkuq`gy=f+HH}+U*xc*B90-NgaU|nkjWc(phEuH|NtjbnWTPqy`VxSNP5bXbQRW zRtzcj;qTM8g?X%|d8dC3z~I9Cd#hw@9k67nQ+r0PhKEXj?90zT;I$sH`9Z<2iO~6^ znuE>(MzGQ0H@=}Wbr#4zGtMPQuC5!?tb;zr)Ho*r%V^e7PBZV9VqCFeU(ZhPn#5vBxnJBl5wT1C!@9s9i4EsD(aNg9MjCq zg{e_VA!nHy7I{2@J&XDA{QNamFT`8~R-ZnUK1}gGiE^pM+tUFZ81KP358sub5|SII zuM`PFROJK7=%O@C3G(pqD0lUY7PZ4>(m?8!RW*zA@$Y@A>k}O@gaL62JPPYw=o-m7 z=jJ+&GII*?^%`2LIn{1idhgd{h0ne)2jpbNb)_BoFQgkq4CcSOw`iSKu&MpLR4t6w zcY))FmM4)cDQ03`aPYRyD?id#GxH1{(C7;?2Jw|(WM*ok4_A722p;AJ6c`Fz-4x|T z|71fkcF`96dP$)}*Xg?R)>mZ;g^p455HmvYv};w44%y;v8rO_e;XFC@$Kh|Y_60U~7DX4;E8+B06r=mV+5yt{%hcBdR;`j+-&IUT z{Q7>WM3?8Qf~)YkSK9-Uz$b>&%prw>vHtE1qWpN<*iyE3ZfOxG&JzA65B5Zdbce$Z zyy%xjbH#6jqXh#9lMf2UlEA$sm4ox0mj2qQmq=Re7GXs5M(hWL3U2I63q4o*P&C46 z?_85S9p^a@G^86X6pUr(D0vBztz@pyh-AO9CvEibTl;6p;xOo`L5qW!5)fZpBV<3x zRReg;Q)6O?3CDbz(~eh)qK?oGjYOB)PZVpO)4&IxgX%0XQp1;n@MN*B<@M)IKNQA6 zTaN$wueZ#r6O>iBye8)WQ_P4)_#XymfGb*96Pur>Ikm5=(lIMjy@|kg!M2IT2i3jX zaM_8$_QV`WyFd1qtqlLN*8c7zfmscGBR4O{*Y2B<-VQOdA~A{ zT#6o6DOGNKnq|@u+o5V1jNHgwk%r?t0gUWb6^M=Lf|)*HXrO}|gBmWLb#n(q6*9Hh zdiIR{p17=i+!@KzGffu0LF)2DUT7$)_|1?@zHbGqoNmenlZS?99IW3hTF6vNZ(4=; zogH^sPWWtV$zLA0Fwj^REqG(kK~nV2Ry!9K46-3=1HO}D%ki34)p~W`=w)OjTer8e z!SNRQ#!q>BSWVOcvTrZO>DWx&lG9zQ6x8%dF>ZQXJhaGOYy5f3^yfE929s50y#_qI zd+4Djan8u|*ON)qb!gzRwic8?D}OKrFij8g#2(b|?FXuivFOm z7PQ_081M{g4-nU#PL=75+qJH$fGrcQJr%D|=ejX9EcAeQs?ul*1HYf`=8|Lf%u)Rb ztnK*IVi_sG>_s&TUWo_Li_C9((axh%(vLwW)#Ljbzs%}Msx`NQO`I56%o|@<^+%nK zb-LT+$TKM`oYdF9Ghlz64NQ9ij7I`)nqH7_+btu!7oSf>B5bMbK-;BZ$Vp^AE~HnB zh6itmr=&y!?04;UfE<&{;e1_!!j}$rKjrXz)c4SC{1v}V_WnC9{)Bd(Sy3zzCXsDw z-L~`O6t-Yz02Qn98CtajV_6JZElr zhFdIBxvtK@WHGbzgTg#@GTyRl+Vn~LvHJoX#A#Nuw=v3NY*SEl9pTdEbQL4j)?NLNY)cnpMLC>zt#O8_F3@U!Z+@2<9g>Rvx`?|sZ)gh8%t#s z$2;p@1{+tWWiWup_foEwe>y)$Hj zAwa(#;oJ(m1bDmji^J-R+UjE}!TycP&xi|p9hm1iA$*$GRCksxbRhvm^td{FrC|=I z+N_CQjmsB>Cef@M1Hh(Sh-Wah16+in{$uiS?)#e21_b0*E0?quyRTYU?b)=;F^_B`ZD<{%V5qE0sWaBA`J-d>oa`a})rxQg!{QR@!e zZoe6CJCD8RaI`4Y5a;FH?WT*q&O+^T{c&yAj6g^&%t z9*=2zd_Zm~;Ovr}+zC_r0!#OAjU{9`zdE zT#MDJ`x+P>=)eJz+5US4%)_<>R0i>SdSC7p8On>l*rqeMy|8;&8$Q5-h2QIGAI^(= zz=Ap|>5XSk9&G`sW@-OEbZ1_Uvi;Ve*T3=Ka@r9&YUiQZt;K9^Z7mbts2X|5=lhF9 z@iWu;2Mxg)FP*#+m(wuu7-cj?6BgpQ@~i#nVAEA%cdO;7^vK3G2vi}xedZlfC+~4g zk-E3e{oGS`<4=#Tk{UFmS(U-q{q<~VkEa7}_yJY4RE5Vi_IF&>8Q-4reZikO=pSL5 z*D3n&gWAp2x@Nu=>FotyW_^@(sZXPEz!mq|wR z0XE^>9X7hQ4y*q_Rk5IRloNWyiLq?S&;_L(Qe>#qLjM z!;vWJ>tgbbhs(fV=b4opb=Mn_?|}#P`RvwEJvW?+(^!|9g?>R(s-B@q3hPU~a}YYz z!GC_kvccipHX~ekmDo6{$wd~cze$(|P}2jt>NeZ{-KQ(r1Ew+bBI;;&GDYiAxAguF zf03k#*`oB0sAzYX>#SbM>0c6AzEri)7#5fe_*hId2lE89+iy_t@wF|o_toC%JHXWCS-L)m5`%A@5PQ?0%vlM&D% zhmEeThIw-(_&qifi`N~eAq;F{bb1dPg+86yc@X*q_pGvHR+jPLs>{l0Ieo*12Eopy zNtz2Dv9W?RqK|ULgH@pQyXP4@v$tGsvw7ZYtiBTLd+mZD9CM>M7`}vn^^n^-#5D^Y z(4Ueu?+8a7lQhk5snP~|(SRp@2E^9tksW7A$~8CQ*DFuY3}*wwZWQYYjBnhlpe_vi z*(5+1cgwnGg8PLm`(YZ>UbD-`k-ts6eK+i&xB!Z4+ox!DL52|iNJ!T%HLHz9Ata8S;gYF z%!k1}x=pO%3kP-Qp4ONxb=s)DlPYG0M9cdqmn}WKS&JEFXlP6Czzt1nLHc^kTSp}s zDABCG`RzQpisGAz9`LJyRsTk*;_c9oc+S18@tmn8p_)dfFAJyOG)}qka}lN!GWRO3 zaC(Inj}4zTMeP$m`Qvp^l$+H``h7#!=aHucE7q@e9m|V$i6zba+%8m z#4Ows66E@44ZDNdPRa?*dqL^PlwgGXC=l2@?_>8)^lWqzGLkGZoYbfx$knfShz&d4cfvMBI5NsRI-=OMNZ5q*YPnI=aqrO~ow@o{e zY#JR_Q$@?sYmL{bmmCvfrg>4tc?CljK_zn~h?mZM z3SO)}*nK{76~UY}^H&#-48=t-x3uRyY$#%Uo#?1{!7@oO!ytUCA+q)` zhRtLNxQa_NvI_eCeV@Mi#jq`{93wK|1q7XkqZXVu+#+Re5Eu%5nvoD&G7AkwWvtXZTf~x_7~J8g_@LNE$D><~ z;WNb5yR5C(Hpz`2ITQ5B)8%_VI}SJo61HwN&)~oPi4f#fh-*}{wU{eX|7JzteL$^c;@$Q`!dKAxkNg%vr$#E)pLhA>{v>z%By22>ky?z~)2$e*?p{ B(#8M) literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 8d9204b..099a12e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vboxstock", - "version": "3.2.0", + "version": "3.3.0", "private": true, "type": "module", "engines": { "node": ">=22.13.0" }, diff --git a/public/app.js b/public/app.js index cbecfcd..3d18384 100644 --- a/public/app.js +++ b/public/app.js @@ -1,5 +1,5 @@ const $ = (s) => document.querySelector(s); -const state = { products: [], models: [], warranties: [], tab: "available", query: "", page: 1, user: null }; +const state = { products: [], models: [], warranties: [], customerDirectory: [], tab: "available", query: "", page: 1, user: null, filters:{model:"",payment:"",fulfillment:"",warranty:"",from:"",to:""} }; const PAGE_SIZE = 10; const money = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }); const today = () => new Date().toISOString().slice(0, 10); @@ -32,8 +32,10 @@ function warrantyBadge(p){const w=warrantyState(p);return `({Shipped:"Shipped to","Dropped Off":"Dropped off","Installed At":"Installed at",Meet:"Meet"}[method]||"Fulfillment"); function warrantyOptions(selected=""){return state.warranties.map(w=>``).join("");} -function fulfillmentFields(method="",p={}){if(!method)return'

Select a delivery method to enter its details.

';const addressRequired=new Set(["Shipped","Installed At"]).has(method),casual=new Set(["Dropped Off","Meet"]).has(method),nameLabel=method==="Meet"?"Meeting place / venue":method==="Dropped Off"?"Drop-off location / venue":"Location name (optional)",noteLabel=method==="Meet"?"Meet details":method==="Dropped Off"?"Drop-off details":"Fulfillment notes";return `

${fulfillmentTitle(method)}

${method!=="Shipped"?``:""}
${method==="Shipped"?`
`:""}${casual?'Enter at least a venue, address, or detail.':""}
`;} +function fulfillmentFields(method="",p={}){if(!method)return'

Select a delivery method to enter its details.

';const addressRequired=new Set(["Shipped","Installed At"]).has(method),casual=new Set(["Dropped Off","Meet"]).has(method),nameLabel=method==="Meet"?"Meeting place / venue":method==="Dropped Off"?"Drop-off location / venue":"Location name (optional)",noteLabel=method==="Meet"?"Meet details":method==="Dropped Off"?"Drop-off details":"Fulfillment notes";return `

${fulfillmentTitle(method)}

${method!=="Shipped"?``:""}
${method==="Shipped"?`
`:""}${casual?'Enter at least a venue, address, or detail.':""}
`;} function bindFulfillment(form,p={}){const select=form.querySelector('[name="fulfillmentMethod"]'),target=form.querySelector(".fulfillment-fields");const draw=()=>target.innerHTML=fulfillmentFields(select.value,p);select.onchange=()=>{p={};draw();};draw();} +function customerFields(p={}){return `

`} +function bindCustomer(form){const name=form.elements.customerName,phone=form.elements.phone,id=form.elements.customerId,status=form.querySelector(".customer-match");const match=()=>{const phoneDigits=phone.value.replace(/\D/g,"").slice(-10),found=state.customerDirectory.find(c=>phoneDigits&&c.phone.replace(/\D/g,"").slice(-10)===phoneDigits)||state.customerDirectory.find(c=>c.name.toLowerCase()===name.value.trim().toLowerCase());if(found){id.value=found.id;name.value=found.name;if(!phone.value)phone.value=found.phone;status.textContent=`Existing customer selected${found.phone?` · ${found.phone}`:""}.`;}else{id.value="";status.textContent=name.value?"A new customer will be created.":"";}};name.onchange=match;name.oninput=()=>{id.value="";status.textContent=""};phone.onchange=match;match();} function idCell(p) { return ids(p).length ? ids(p).map(([k,v])=>`${k}: ${esc(v)}`).join("") : "Not entered"; } function customers() { const grouped=new Map(); @@ -48,8 +50,9 @@ function filtered() { const q=state.query.toLowerCase().trim(); if(state.tab==="customers") return customers().filter(c=>!q||[c.name,c.phone].some(v=>String(v||"").toLowerCase().includes(q))||c.purchases.some(p=>Object.values(p).some(v=>String(v??"").toLowerCase().includes(q)))); const status=state.tab==="available"?"available":"sold"; - return state.products.filter(p=>p.status===status && (!q || Object.values(p).some(v=>String(v??"").toLowerCase().includes(q)))); + return state.products.filter(p=>p.status===status&&(!q||Object.values(p).some(v=>String(v??"").toLowerCase().includes(q)))&&(!state.filters.model||p.model===state.filters.model)&&(!state.filters.payment||p.paymentMethod===state.filters.payment)&&(!state.filters.fulfillment||p.fulfillmentMethod===state.filters.fulfillment)&&(!state.filters.from||(p.soldAt||p.receivedAt)>=state.filters.from)&&(!state.filters.to||(p.soldAt||p.receivedAt)<=state.filters.to)&&(!state.filters.warranty||(state.filters.warranty==="active"&&warrantyState(p).className==="in-warranty")||(state.filters.warranty==="expired"&&warrantyState(p).className==="expired")||(state.filters.warranty==="none"&&warrantyState(p).className==="neutral"))); } +function renderFilters(){const bar=$("#filterBar");if(state.tab==="admin"){bar.innerHTML="";bar.hidden=true;return}if(state.tab==="customers"){bar.hidden=false;bar.innerHTML='Export customers CSV';return}bar.hidden=false;const models=[...new Set(state.products.map(p=>p.model))].sort();bar.innerHTML=`${state.tab==="sold"?``:""}Export CSV`;bar.querySelectorAll("[data-filter]").forEach(el=>el.onchange=()=>{state.filters[el.dataset.filter]=el.value;state.page=1;render()});$("#clearFilters").onclick=()=>{state.filters={model:"",payment:"",fulfillment:"",warranty:"",from:"",to:""};state.page=1;render()}} function render() { const available=state.products.filter(p=>p.status==="available"), sold=state.products.filter(p=>p.status==="sold"), month=today().slice(0,7), monthSales=sold.filter(p=>p.soldAt?.startsWith(month)); $("#availableCount").textContent=available.length; $("#soldCount").textContent=monthSales.length; @@ -57,6 +60,7 @@ function render() { $("#revenue").textContent=monthSales.length?`${money.format(monthSales.reduce((n,p)=>n+Number(p.salePrice||0),0))} in sales`:"No sales recorded"; $("#availableBadge").textContent=available.length; $("#soldBadge").textContent=sold.length; $("#customerBadge").textContent=customers().length; document.querySelectorAll("[data-tab]").forEach(b=>b.classList.toggle("active",b.dataset.tab===state.tab)); + renderFilters(); if(state.tab==="admin") { $(".table-wrap").hidden=true; $("#adminPanel").hidden=false; $("#pagination").innerHTML=""; renderAdmin(); return; } $(".table-wrap").hidden=false; $("#adminPanel").hidden=true; const all=filtered(), pages=Math.max(1,Math.ceil(all.length/PAGE_SIZE)); state.page=Math.min(state.page,pages); @@ -78,9 +82,9 @@ function receiveForm() { } function sellForm(id="") { const available=state.products.filter(p=>p.status==="available"); - openModal(`

Record a sale

Enter the customer, payment, fulfillment, and warranty details.

`); + openModal(`

Record a sale

Enter the customer, payment, fulfillment, and warranty details.

${customerFields()}
`); bindFulfillment($("#sellForm")); - $("#sellForm").onsubmit=async e=>{ e.preventDefault(); const data=Object.fromEntries(new FormData(e.currentTarget)), productId=data.productId; delete data.productId; await change(`/api/products/${encodeURIComponent(productId)}/sell`,"POST",data,"Sale recorded."); }; $("[data-cancel]").onclick=closeModal; + bindCustomer($("#sellForm"));$("#sellForm").onsubmit=async e=>{ e.preventDefault();const button=e.submitter;button.disabled=true;const data=Object.fromEntries(new FormData(e.currentTarget)), productId=data.productId;delete data.productId;try{await change(`/api/products/${encodeURIComponent(productId)}/sell`,"POST",data,"Sale recorded.");}finally{button.disabled=false} }; $("[data-cancel]").onclick=closeModal; } async function submitForm(e,path,message,method="POST"){ e.preventDefault(); await change(path,method,Object.fromEntries(new FormData(e.currentTarget)),message); } async function change(path,method,body,message){ try{ await api(path,{method,body:body?JSON.stringify(body):undefined}); closeModal(); await load(); toast(message); }catch(e){ toast(e.message); } } @@ -89,7 +93,7 @@ function viewSale(p) { const link=trackingUrl(p),fulfillment=p.fulfillmentMethod?`

${fulfillmentTitle(p.fulfillmentMethod)}

${p.fulfillmentName?`

${esc(p.fulfillmentName)}

`:""}

${address(p)?esc(address(p)):"No street address recorded"}

${p.fulfillmentNotes?`

${esc(p.fulfillmentNotes)}

`:""}${p.fulfillmentMethod==="Shipped"?`

Carrier: ${esc(p.carrier||"Not recorded")}

Tracking: ${p.trackingNumber?(link?`${esc(p.trackingNumber)}`:esc(p.trackingNumber)):"Not entered"}

Delivery status: ${esc(p.deliveryStatus||"Not recorded")}

`:""}
`:'

Fulfillment

Not recorded

'; openModal(`

Sale record

${esc(p.model)} · ${fmtDate(p.soldAt)}

Customer

${esc(p.customerName||"Unknown")}

${esc(p.phone||"No phone recorded")}

Payment and sale

${esc(p.paymentMethod||"Not recorded")}${p.paymentReference?` · Reference: ${esc(p.paymentReference)}`:""}

Sale price: ${p.salePrice?money.format(p.salePrice):"—"} · Sold: ${fmtDate(p.soldAt)}

${fulfillment}

Warranty

${warrantyBadge(p)}

${p.warrantyName?`${esc(p.warrantyName)}${p.warrantyEndDate?` · Through ${fmtDate(p.warrantyEndDate)}`:""}`:"No warranty was recorded for this sale."}

Product

${esc(p.manufacturer)} ${esc(p.model)} · ${esc(p.condition)}

${idCell(p)}

Received: ${fmtDate(p.receivedAt)} · Cost: ${p.cost?money.format(p.cost):"—"}

${p.notes?`

Inventory notes: ${esc(p.notes)}

`:""}

Transaction notes

${esc(p.saleNotes||"No transaction notes recorded")}

${state.user.role==="admin"?'':""}
`); $("[data-cancel]").onclick=closeModal;if($("#editSaleDetails"))$("#editSaleDetails").onclick=()=>editSaleForm(p); } -function editSaleForm(p){const historicalWarranty=p.warrantyPresetId&&!state.warranties.some(w=>w.id===p.warrantyPresetId)?``:"";openModal(`

Edit sale details

Update fulfillment, tracking, warranty, or transaction notes.

`);bindFulfillment($("#editSaleForm"),p);$("[data-cancel]").onclick=()=>viewSale(p);$("#editSaleForm").onsubmit=async e=>{e.preventDefault();try{const updated=await api(`/api/products/${encodeURIComponent(p.id)}`,{method:"PATCH",body:JSON.stringify(Object.fromEntries(new FormData(e.currentTarget)))});await load();toast("Sale details updated.");viewSale(updated);}catch(error){toast(error.message);}};} +function editSaleForm(p){const historicalWarranty=p.warrantyPresetId&&!state.warranties.some(w=>w.id===p.warrantyPresetId)?``:"";openModal(`

Edit sale details

Correct customer, payment, fulfillment, tracking, warranty, or notes.

${customerFields(p)}
`);bindFulfillment($("#editSaleForm"),p);bindCustomer($("#editSaleForm"));$("[data-cancel]").onclick=()=>viewSale(p);$("#editSaleForm").onsubmit=async e=>{e.preventDefault();const button=e.submitter;button.disabled=true;try{const updated=await api(`/api/products/${encodeURIComponent(p.id)}`,{method:"PATCH",body:JSON.stringify(Object.fromEntries(new FormData(e.currentTarget)))});await load();toast("Sale details updated.");viewSale(updated);}catch(error){toast(error.message);}finally{button.disabled=false}};} async function viewCustomer(p) { if(!p.customerId) return viewSale(p); try { const c=await api(`/api/customers/${encodeURIComponent(p.customerId)}`), addr=[c.address1,c.address2,[c.city,c.state].filter(Boolean).join(", "),c.zip].filter(Boolean).join(" · "); @@ -102,11 +106,12 @@ async function viewCustomer(p) { } function restockForm(p){ openModal(`

Void sale & restock

Return ${esc(p.model)} to inventory.

`); $("[data-cancel]").onclick=closeModal; $("#restockForm").onsubmit=e=>submitForm(e,`/api/products/${encodeURIComponent(p.id)}/restock`,"Product restocked."); } -async function load(){ [state.products,state.models,state.warranties]=await Promise.all([api("/api/products"),api("/api/models"),api("/api/warranties")]); render(); } +async function load(){ [state.products,state.models,state.warranties,state.customerDirectory]=await Promise.all([api("/api/products"),api("/api/models"),api("/api/warranties"),api("/api/customers")]); render(); } async function renderAdmin(){ const panel=$("#adminPanel"); panel.innerHTML='
Loading administration…
'; - try{const [backups,users,audit]=await Promise.all([api("/api/admin/backups"),api("/api/admin/users"),api("/api/admin/audit")]);panel.innerHTML=`

User accounts

Create administrators or read-only accounts. New and reset passwords must be changed at next login.

${users.map(u=>`
${esc(u.username)}${u.role==="admin"?"Admin":"Read-Only"} · ${u.enabled?"Enabled":"Disabled"}${u.mustChangePassword?" · Password change required":""}${u.lastLoginAt?` · Last login ${fmtDateTime(u.lastLoginAt)}`:""}
`).join("")}

Database backups

Create snapshots inside /data/backups, download an off-server copy, or restore a previous database.

Restore replaces the active database and all user accounts. Your current password is required. Everyone will be signed out afterward.
${backups.length?backups.map(b=>`
${esc(b.name)}${fmtDateTime(b.createdAt)} · ${(b.size/1024).toFixed(1)} KB
Download
`).join(""):"

No local backups yet.

"}

Audit log

The latest 250 security and data-changing events. Audit entries cannot be edited or deleted.

${audit.map(a=>`
${esc(a.username)}${esc(a.action.replaceAll("_"," "))}${fmtDateTime(a.createdAt)}${a.target?` · ${esc(a.target)}`:""}${a.details?` · ${esc(a.details)}`:""}${a.ipAddress?` · ${esc(a.ipAddress)}`:""}
`).join("")||"

No audit events yet.

"}
`; + try{const [backups,users,audit,diagnostics]=await Promise.all([api("/api/admin/backups"),api("/api/admin/users"),api("/api/admin/audit"),api("/api/admin/diagnostics")]);panel.innerHTML=`

User accounts

Create administrators or read-only accounts. New and reset passwords must be changed at next login.

${users.map(u=>`
${esc(u.username)}${u.role==="admin"?"Admin":"Read-Only"} · ${u.enabled?"Enabled":"Disabled"}${u.mustChangePassword?" · Password change required":""}${u.lastLoginAt?` · Last login ${fmtDateTime(u.lastLoginAt)}`:""}
`).join("")}

Database backups

Create snapshots inside /data/backups, download an off-server copy, or restore a previous database.

Restore replaces the active database and all user accounts. Your current password is required. Everyone will be signed out afterward.
${backups.length?backups.map(b=>`
${esc(b.name)}${fmtDateTime(b.createdAt)} · ${(b.size/1024).toFixed(1)} KB
Download
`).join(""):"

No local backups yet.

"}

Audit log

The latest 250 security and data-changing events. Audit entries cannot be edited or deleted.

${audit.map(a=>`
${esc(a.username)}${esc(a.action.replaceAll("_"," "))}${fmtDateTime(a.createdAt)}${a.target?` · ${esc(a.target)}`:""}${a.details?` · ${esc(a.details)}`:""}${a.ipAddress?` · ${esc(a.ipAddress)}`:""}
`).join("")||"

No audit events yet.

"}
`; panel.querySelector(".admin-page").insertAdjacentHTML("afterbegin",'
vBoxStock

Administration

Manage product models, access, data protection, and account activity.

'); + const bytes=n=>n>1073741824?`${(n/1073741824).toFixed(1)} GB`:n>1048576?`${(n/1048576).toFixed(1)} MB`:`${(n/1024).toFixed(1)} KB`,systemSection=document.createElement("section");systemSection.className="admin-section system-section";systemSection.innerHTML=`

System and data tools

vBoxStock ${esc(diagnostics.appVersion)} · Database schema ${diagnostics.schemaVersion} · ${esc(diagnostics.nodeVersion)}

Database${bytes(diagnostics.databaseSize)}${diagnostics.dataWritable?"/data is writable":"/data is not writable"}
Storage available${bytes(diagnostics.diskFree)}of ${bytes(diagnostics.diskTotal)}
Backups${diagnostics.backupCount}${diagnostics.lastBackupAt?`Latest ${fmtDateTime(diagnostics.lastBackupAt)}`:"None created"}
Time zone${esc(diagnostics.timeZone)}${esc(diagnostics.dataDirectory)}
`;panel.querySelector(".admin-intro").insertAdjacentElement("afterend",systemSection);$("#backupScheduleForm").onsubmit=async e=>{e.preventDefault();const data=Object.fromEntries(new FormData(e.currentTarget));try{await api("/api/admin/backup-settings",{method:"PATCH",body:JSON.stringify({enabled:Boolean(data.enabled),hour:Number(data.hour),retention:Number(data.retention)})});toast("Backup schedule saved.");renderAdmin()}catch(error){toast(error.message)}}; const models=await api("/api/admin/models"),modelSection=document.createElement("section");modelSection.className="admin-section model-section";modelSection.innerHTML=`

Product models

Active models are available when receiving products. Archiving removes a model from new receiving while preserving inventory and sales history.

${models.map(m=>`
${esc(m.name)}${m.active?"Active":"Archived"}
${m.availableCount} available · ${m.soldCount} sold
${m.totalCount===0?``:""}${m.totalCount===0?``:""}
`).join("")||"

No models configured.

"}
`;panel.querySelector(".admin-intro").insertAdjacentElement("afterend",modelSection); const finishModelChange=async message=>{state.models=await api("/api/models");toast(message);renderAdmin();}; $("#createModelForm").onsubmit=async e=>{e.preventDefault();try{await api("/api/admin/models",{method:"POST",body:JSON.stringify(Object.fromEntries(new FormData(e.currentTarget)))});await finishModelChange("Model added.");}catch(error){toast(error.message);}}; diff --git a/public/extras.css b/public/extras.css index 403bbe0..b67fa60 100644 --- a/public/extras.css +++ b/public/extras.css @@ -7,3 +7,4 @@ .auth-pending #appShell,.auth-required #appShell{display:none}.role-admin #authScreen,.role-readonly #authScreen{display:none}.auth-screen{min-height:100vh;display:grid;place-items:center;padding:24px;background:linear-gradient(145deg,#eef4ff,#f8fafc)}.auth-card{width:min(430px,100%);background:#fff;border:1px solid #dfe5ef;border-radius:18px;box-shadow:0 22px 60px #17203320;padding:34px}.auth-brand{margin-bottom:28px}.auth-card h1{margin:0 0 7px}.auth-card>div>p{color:#68758b}.auth-submit{width:100%;margin-top:14px}.auth-message{background:#fff0f0;color:#a51d1d;border:1px solid #fecaca;border-radius:8px;padding:10px 12px;margin:14px 0}.auth-logout{width:100%;margin-top:10px}.user-menu{display:flex;align-items:center;gap:10px;border-left:1px solid #e3e7ef;padding-left:18px}.user-menu span{display:grid;font-size:13px}.user-menu small{color:#758197}.admin-section{display:grid;gap:16px;border-bottom:1px solid #e3e7ef;padding-bottom:28px}.admin-section:last-child{border-bottom:0}.inline-user-form{display:grid;grid-template-columns:1fr 1fr 180px auto;gap:10px;align-items:end}.inline-user-form label{margin:0}.user-list,.audit-list{border:1px solid #e3e7ef;border-radius:10px;overflow:hidden}.user-list article{display:flex;justify-content:space-between;align-items:center;gap:15px;padding:14px;border-bottom:1px solid #edf0f5}.user-list article:last-child{border-bottom:0}.user-list small{display:block;color:#7b8799;margin-top:4px}.user-list article>div:last-child{display:flex;gap:7px;flex-wrap:wrap}.delete-backup{background:#fff0f0;color:#c62828}.audit-list{max-height:420px;overflow:auto}.audit-list article{display:grid;grid-template-columns:140px 180px 1fr;gap:12px;padding:10px 13px;border-bottom:1px solid #edf0f5;font-size:13px}.audit-list span{text-transform:capitalize}.audit-list small{color:#7b8799}@media(max-width:900px){.inline-user-form{grid-template-columns:1fr 1fr}.user-list article{align-items:flex-start;flex-direction:column}.audit-list article{grid-template-columns:1fr}.user-menu span{display:none}}@media(max-width:600px){.inline-user-form{grid-template-columns:1fr}.user-menu{padding-left:5px}.user-menu button{font-size:12px;padding:8px}.auth-card{padding:25px}} .inline-model-form{display:grid;grid-template-columns:minmax(220px,1fr) auto;gap:10px;align-items:end}.inline-model-form label{margin:0}.model-list{border:1px solid #e3e7ef;border-radius:10px;overflow:hidden}.model-list article{display:flex;justify-content:space-between;align-items:center;gap:15px;padding:14px;border-bottom:1px solid #edf0f5}.model-list article:last-child{border-bottom:0}.model-summary>div{display:flex;align-items:center;gap:9px}.model-summary small{display:block;color:#7b8799;margin-top:5px}.model-status{display:inline-flex;border-radius:99px;padding:3px 8px;font-size:11px;font-weight:750}.model-status.active{background:#dcfce7;color:#166534}.model-status.archived{background:#eef1f5;color:#526071}.model-actions{display:flex;gap:7px;flex-wrap:wrap}@media(max-width:760px){.inline-model-form{grid-template-columns:1fr}.model-list article{align-items:stretch;flex-direction:column}.model-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.model-actions button{text-align:center}} .conditional-fields{margin:2px 0 14px;padding:16px;border:1px solid #e3e7ef;border-radius:11px;background:#f8fafc}.conditional-fields h3{margin:0 0 12px}.conditional-hint{margin:4px 0 16px;padding:13px;border:1px dashed #d7deea;border-radius:9px;color:#68758b}.field-help{display:block;margin-top:-8px;color:#68758b}.warranty-pill{display:inline-flex;align-items:center;border-radius:99px;padding:5px 9px;font-size:12px;font-weight:750;white-space:nowrap}.warranty-pill.in-warranty{background:#dcfce7;color:#166534}.warranty-pill.expired{background:#fee2e2;color:#b91c1c}.warranty-pill.neutral{background:#eef1f5;color:#526071}.inline-warranty-form{display:grid;grid-template-columns:minmax(180px,1fr) 130px 150px auto;gap:10px;align-items:end}.inline-warranty-form label{margin:0}.warranty-list{border:1px solid #e3e7ef;border-radius:10px;overflow:hidden}.warranty-list article{display:flex;justify-content:space-between;align-items:center;gap:15px;padding:14px;border-bottom:1px solid #edf0f5}.warranty-list article:last-child{border-bottom:0}@media(max-width:760px){.inline-warranty-form{grid-template-columns:1fr}.warranty-list article{align-items:stretch;flex-direction:column}} +.filter-bar{display:flex;align-items:end;gap:9px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid #e3e7ef}.filter-bar label{margin:0;min-width:125px;font-size:11px}.filter-bar select,.filter-bar input{padding:8px 9px;font-size:13px}.filter-bar .button,.filter-bar button{padding:9px 12px}.export-button{text-decoration:none}.customer-match{min-height:18px;margin:-7px 0 10px!important;color:#1d4ed8!important;font-size:12px}.diagnostic-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}.diagnostic-grid article{display:grid;gap:4px;padding:14px;border:1px solid #e3e7ef;border-radius:10px}.diagnostic-grid span,.diagnostic-grid small{color:#68758b}.diagnostic-grid strong{font-size:18px}.backup-schedule{display:grid;grid-template-columns:minmax(220px,1fr) 180px 200px auto;gap:10px;align-items:end}.backup-schedule label{margin:0}.check-label{display:flex!important;align-items:center;gap:8px;min-height:42px}.check-label input{width:auto}.export-links{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.export-links .button{padding:8px 11px;text-decoration:none}@media(max-width:900px){.diagnostic-grid{grid-template-columns:1fr 1fr}.backup-schedule{grid-template-columns:1fr 1fr}}@media(max-width:600px){.filter-bar{align-items:stretch}.filter-bar label,.filter-bar .button,.filter-bar button{width:100%}.diagnostic-grid,.backup-schedule{grid-template-columns:1fr}} diff --git a/public/index.html b/public/index.html index 4e199e4..ac16416 100644 --- a/public/index.html +++ b/public/index.html @@ -1,5 +1,5 @@ vBoxStock
vBoxStock
vBoxStock

Inventory Overview

Available products0Ready to sell
Sold this month0No sales recorded
Inventory value$0Based on purchase cost
-
+
diff --git a/public/theme.css b/public/theme.css index d095c23..f390991 100644 --- a/public/theme.css +++ b/public/theme.css @@ -26,6 +26,7 @@ th{background:var(--surface-table);color:var(--muted-2)}th,td,.records nav,.back .customer-notes article,.backup-list,.user-list,.model-list,.warranty-list,.audit-list{border-color:var(--border)} .model-list article{border-color:var(--border)}.model-summary small{color:var(--muted)}.model-status.active{background:var(--green-soft);color:var(--green)}.model-status.archived{background:var(--surface-soft);color:var(--muted)} .warranty-list article,.conditional-fields{border-color:var(--border)}.conditional-fields{background:var(--surface-soft)}.conditional-hint{border-color:var(--border-strong);color:var(--muted)}.field-help{color:var(--muted)}.warranty-pill.in-warranty{background:var(--green-soft);color:var(--green)}.warranty-pill.expired{background:var(--danger-soft);color:var(--danger)}.warranty-pill.neutral{background:var(--surface-soft);color:var(--muted)} +.filter-bar{border-color:var(--border);background:var(--surface-soft)}.filter-bar .button{background:var(--surface);border:1px solid var(--border-strong);color:var(--text)}.customer-match{color:var(--blue-text)!important}.diagnostic-grid article{background:var(--surface-soft);border-color:var(--border)}.diagnostic-grid span,.diagnostic-grid small{color:var(--muted)}.export-links .button{background:var(--surface-soft);border:1px solid var(--border-strong);color:var(--text)} .note-category{background:var(--blue-soft);color:var(--blue-text)}.backup-warning{background:var(--warning-soft);border-color:color-mix(in srgb,var(--warning) 40%,transparent);color:var(--warning)} .auth-screen{background:linear-gradient(145deg,color-mix(in srgb,var(--blue) 10%,var(--page)),var(--page))}.auth-card{box-shadow:0 22px 60px var(--shadow)} dialog{max-height:min(90dvh,900px);overflow:auto}dialog::backdrop{background:#050914aa}.close{color:var(--muted)} diff --git a/server.mjs b/server.mjs index 5aadc54..6900235 100644 --- a/server.mjs +++ b/server.mjs @@ -1,11 +1,11 @@ import { createServer } from "node:http"; -import { readFile, stat, readdir, writeFile, copyFile, unlink } from "node:fs/promises"; +import { readFile, stat, statfs, readdir, writeFile, copyFile, unlink } from "node:fs/promises"; import { mkdirSync } from "node:fs"; import { extname, join, normalize } from "node:path"; import { backup, DatabaseSync } from "node:sqlite"; import { randomBytes, scryptSync, timingSafeEqual, createHash } from "node:crypto"; -const port=Number(process.env.PORT||3000),dataDir=process.env.DATA_DIR||"/data"; +const APP_VERSION="3.3.0",SCHEMA_VERSION=3,port=Number(process.env.PORT||3000),dataDir=process.env.DATA_DIR||"/data"; const databasePath=join(dataDir,"vboxstock.db"),backupDir=join(dataDir,"backups"),restoreMarker=join(dataDir,".restore-audit.json"),publicDir=join(import.meta.dirname,"public"); const SESSION_IDLE_MS=12*60*60*1000,sessions=new Map(),loginFailures=new Map(); mkdirSync(dataDir,{recursive:true});mkdirSync(backupDir,{recursive:true}); @@ -22,6 +22,7 @@ function initializeDatabase(){ CREATE TABLE IF NOT EXISTS customer_notes (id TEXT PRIMARY KEY,customer_id TEXT NOT NULL,category TEXT NOT NULL DEFAULT 'General',note TEXT NOT NULL,created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY(customer_id) REFERENCES customers(id) ON DELETE CASCADE); CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY,username TEXT NOT NULL COLLATE NOCASE UNIQUE,password_hash TEXT NOT NULL,role TEXT NOT NULL CHECK(role IN ('admin','readonly')),enabled INTEGER NOT NULL DEFAULT 1,must_change_password INTEGER NOT NULL DEFAULT 0,created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,last_login_at TEXT); CREATE TABLE IF NOT EXISTS audit_log (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id TEXT,username TEXT NOT NULL DEFAULT 'system',action TEXT NOT NULL,target TEXT NOT NULL DEFAULT '',details TEXT NOT NULL DEFAULT '',ip_address TEXT NOT NULL DEFAULT '',created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP); + CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY,value TEXT NOT NULL,updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP); CREATE INDEX IF NOT EXISTS idx_products_status ON products(status); CREATE UNIQUE INDEX IF NOT EXISTS idx_products_uid ON products(uid) WHERE uid!=''; CREATE UNIQUE INDEX IF NOT EXISTS idx_products_sn ON products(sn) WHERE sn!=''; CREATE UNIQUE INDEX IF NOT EXISTS idx_products_mac ON products(mac) WHERE mac!=''; CREATE INDEX IF NOT EXISTS idx_customer_notes_customer_id ON customer_notes(customer_id); CREATE INDEX IF NOT EXISTS idx_audit_created_at ON audit_log(created_at DESC);`); const cols=new Set(db.prepare("PRAGMA table_info(products)").all().map(c=>c.name)); for(const [name,definition] of [["customer_id","TEXT"],["ship_address1","TEXT NOT NULL DEFAULT ''"],["ship_address2","TEXT NOT NULL DEFAULT ''"],["ship_city","TEXT NOT NULL DEFAULT ''"],["ship_state","TEXT NOT NULL DEFAULT ''"],["ship_zip","TEXT NOT NULL DEFAULT ''"],["shipping_notes","TEXT NOT NULL DEFAULT ''"],["payment_method","TEXT NOT NULL DEFAULT ''"],["payment_reference","TEXT NOT NULL DEFAULT ''"],["sale_notes","TEXT NOT NULL DEFAULT ''"],["fulfillment_method","TEXT NOT NULL DEFAULT ''"],["fulfillment_name","TEXT NOT NULL DEFAULT ''"],["carrier","TEXT NOT NULL DEFAULT ''"],["tracking_number","TEXT NOT NULL DEFAULT ''"],["delivery_status","TEXT NOT NULL DEFAULT ''"],["delivery_status_updated_at","TEXT"],["warranty_preset_id","TEXT"],["warranty_name","TEXT NOT NULL DEFAULT ''"],["warranty_end_date","TEXT"]])if(!cols.has(name))db.exec(`ALTER TABLE products ADD COLUMN ${name} ${definition}`); @@ -42,6 +43,8 @@ function initializeDatabase(){ const addWarranty=db.prepare("INSERT OR IGNORE INTO warranty_presets (id,name,duration_value,duration_unit,is_default) VALUES (?,?,?,?,?)"); for(const [name,value,unit,isDefault] of [["No Warranty",0,"days",1],["30 Days",30,"days",0],["60 Days",60,"days",0],["90 Days",90,"days",0],["1 Year",1,"years",0]])addWarranty.run(crypto.randomUUID(),name,value,unit,isDefault); db.prepare("UPDATE products SET fulfillment_method='Shipped' WHERE fulfillment_method='' AND status='sold' AND (ship_address1!='' OR ship_city!='' OR ship_zip!='')").run(); + const setting=db.prepare("INSERT OR IGNORE INTO app_settings (key,value) VALUES (?,?)");for(const [key,value] of [["schema_version",String(SCHEMA_VERSION)],["backup_enabled","0"],["backup_hour","2"],["backup_retention","14"],["last_scheduled_backup",""]])setting.run(key,value); + db.prepare("UPDATE app_settings SET value=? WHERE key='schema_version'").run(String(SCHEMA_VERSION)); } const hashPassword=password=>{const salt=randomBytes(16).toString("hex");return `scrypt$${salt}$${scryptSync(password,salt,64).toString("hex")}`}; function verifyPassword(password,stored){try{const[kind,salt,hash]=stored.split("$");if(kind!=="scrypt")return false;const actual=scryptSync(password,salt,64),expected=Buffer.from(hash,"hex");return actual.length===expected.length&&timingSafeEqual(actual,expected)}catch{return false}} @@ -50,7 +53,7 @@ function cleanUsername(value){const name=String(value||"").trim();if(!/^[a-zA-Z0 initializeDatabase(); try{const event=JSON.parse(await readFile(restoreMarker,"utf8"));db.prepare("INSERT INTO audit_log (username,action,target,details,ip_address) VALUES (?,'database_restore',?,?,?)").run(event.username||"system",event.target||"",event.details||"Restored database",event.ipAddress||"");await unlink(restoreMarker)}catch(error){if(error.code!=="ENOENT")console.error("Unable to import restore audit event:",error.message)} if(db.prepare("SELECT COUNT(*) count FROM users").get().count===0){db.prepare("INSERT INTO users (id,username,password_hash,role,must_change_password) VALUES (?,?,?,?,1)").run(crypto.randomUUID(),"admin",hashPassword("admin"),"admin");db.prepare("INSERT INTO audit_log (action,target,details) VALUES ('bootstrap_admin','admin','Default administrator created; password change required')").run()} -const findCustomerByName=db.prepare("SELECT id FROM customers WHERE lower(name)=lower(?) ORDER BY updated_at DESC LIMIT 1"),addCustomer=db.prepare("INSERT INTO customers (id,name,phone,address1,address2,city,state,zip,shipping_notes) VALUES (?,?,?,?,?,?,?,?,?)"); +const normalizePhone=value=>String(value||"").replace(/\D/g,"").slice(-10),findCustomerByName=db.prepare("SELECT id,name,phone FROM customers WHERE lower(trim(name))=lower(trim(?)) ORDER BY updated_at DESC LIMIT 1"),addCustomer=db.prepare("INSERT INTO customers (id,name,phone,address1,address2,city,state,zip,shipping_notes) VALUES (?,?,?,?,?,?,?,?,?)"); for(const old of db.prepare("SELECT DISTINCT customer_name name,phone FROM products WHERE status='sold' AND customer_name IS NOT NULL AND customer_name!='' AND customer_id IS NULL").all()){let customer=findCustomerByName.get(old.name);if(!customer){const id=crypto.randomUUID();addCustomer.run(id,old.name,old.phone||"","","","","","","");customer={id}}db.prepare("UPDATE products SET customer_id=? WHERE status='sold' AND customer_id IS NULL AND lower(customer_name)=lower(?)").run(customer.id,old.name)} db.exec("PRAGMA optimize"); if(process.argv[2]==="reset-admin"){const username=cleanUsername(process.argv[3]||"admin"),password=validPassword(process.argv[4]||process.env.RESET_ADMIN_PASSWORD||""),existing=db.prepare("SELECT id FROM users WHERE username=? COLLATE NOCASE").get(username);if(existing)db.prepare("UPDATE users SET password_hash=?,role='admin',enabled=1,must_change_password=1,updated_at=CURRENT_TIMESTAMP WHERE id=?").run(hashPassword(password),existing.id);else db.prepare("INSERT INTO users (id,username,password_hash,role,enabled,must_change_password) VALUES (?,?,?,'admin',1,1)").run(crypto.randomUUID(),username,hashPassword(password));db.prepare("INSERT INTO audit_log (username,action,target,details) VALUES ('system','emergency_admin_reset',?,'Console reset; password change required')").run(username);console.log(`Administrator ${username} reset. Password change required at next login.`);db.close();process.exit(0)} @@ -72,7 +75,15 @@ function requireOrigin(req){if(["GET","HEAD","OPTIONS"].includes(req.method))ret function authorize(req,url){if(url.pathname==="/api/health"||url.pathname==="/api/auth/login")return null;const session=currentSession(req);if(!session)throw Object.assign(new Error("Authentication required."),{status:401,code:"AUTH_REQUIRED"});if(session.user.mustChangePassword&&!new Set(["/api/auth/me","/api/auth/change-password","/api/auth/logout"]).has(url.pathname))throw Object.assign(new Error("Password change required."),{status:403,code:"PASSWORD_CHANGE_REQUIRED"});if(url.pathname.startsWith("/api/admin/")&&session.user.role!=="admin")throw Object.assign(new Error("Administrator access required."),{status:403});if(req.method!=="GET"&&session.user.role!=="admin"&&!url.pathname.startsWith("/api/auth/"))throw Object.assign(new Error("This account is read-only."),{status:403});return session} const backupName=(prefix="vboxstock")=>`${prefix}-${new Date().toISOString().replace(/[:.]/g,"-")}.db`; async function createBackup(prefix){const name=backupName(prefix),path=join(backupDir,name);await backup(db,path);return name} +const setting=key=>db.prepare("SELECT value FROM app_settings WHERE key=?").get(key)?.value||""; +function saveSetting(key,value){db.prepare("INSERT INTO app_settings (key,value,updated_at) VALUES (?,?,CURRENT_TIMESTAMP) ON CONFLICT(key) DO UPDATE SET value=excluded.value,updated_at=CURRENT_TIMESTAMP").run(key,String(value))} +async function backupFiles(){const files=await readdir(backupDir,{withFileTypes:true}),result=[];for(const file of files)if(file.isFile()&&file.name.endsWith(".db")){const info=await stat(join(backupDir,file.name));result.push({name:file.name,size:info.size,createdAt:info.mtime.toISOString()})}return result.sort((a,b)=>b.createdAt.localeCompare(a.createdAt))} +async function pruneScheduledBackups(){const keep=Math.max(1,Math.min(365,Number(setting("backup_retention"))||14)),files=(await backupFiles()).filter(x=>x.name.startsWith("scheduled-"));for(const file of files.slice(keep))await unlink(join(backupDir,file.name)).catch(()=>{})} +async function runScheduledBackup(){if(setting("backup_enabled")!=="1")return;const now=new Date(),day=now.toISOString().slice(0,10),hour=Math.max(0,Math.min(23,Number(setting("backup_hour"))||0));if(now.getHours()runScheduledBackup().catch(error=>console.error("Scheduled backup failed:",error.message)),15*60*1000).unref();setTimeout(()=>runScheduledBackup().catch(error=>console.error("Scheduled backup failed:",error.message)),1000).unref(); function safeBackup(name){if(!/^[a-zA-Z0-9._-]+\.db$/.test(name))throw new Error("Invalid backup name");return join(backupDir,name)} +const csvCell=value=>`"${String(value??"").replaceAll('"','""')}"`,csv=(headers,rows)=>[headers.map(csvCell).join(","),...rows.map(row=>row.map(csvCell).join(","))].join("\r\n")+"\r\n"; +function csvResponse(res,name,headers,rows){const content=csv(headers,rows);res.writeHead(200,{"content-type":"text/csv; charset=utf-8","content-disposition":`attachment; filename="${name}"`});res.end(content)} function validateBackup(path){const candidate=new DatabaseSync(path,{readOnly:true});try{const tables=new Set(candidate.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(x=>x.name));if(!tables.has("products")||!tables.has("customers"))throw new Error("This is not a valid vBoxStock database.");const integrity=candidate.prepare("PRAGMA integrity_check").get();if(Object.values(integrity)[0]!=="ok")throw new Error("The backup failed its integrity check.")}finally{candidate.close()}} async function restoreFrom(path,res,req,user){validateBackup(path);const target=path.split("/").pop();await createBackup("pre-restore");audit(req,user,"database_restore",target);db.exec("PRAGMA wal_checkpoint(TRUNCATE)");db.close();await copyFile(path,databasePath);await unlink(`${databasePath}-wal`).catch(()=>{});await unlink(`${databasePath}-shm`).catch(()=>{});await writeFile(restoreMarker,JSON.stringify({username:user.username,target,details:"Database restored; all sessions invalidated",ipAddress:clientIp(req)}));sessions.clear();json(res,200,{ok:true,restarting:true});setTimeout(()=>process.exit(0),250)} function confirmPassword(user,password){const record=db.prepare("SELECT password_hash FROM users WHERE id=?").get(user.id);if(!record||!verifyPassword(String(password||""),record.password_hash))throw Object.assign(new Error("Current password is incorrect."),{status:403})} @@ -86,6 +97,8 @@ function allWarranties(){return db.prepare("SELECT w.id,w.name,w.duration_value function warrantyEnd(start,preset){if(!preset||!preset.duration_value)return null;const [y,m,d]=String(start).split("-").map(Number),date=new Date(Date.UTC(y,m-1,d));if(preset.duration_unit==="years")date.setUTCFullYear(date.getUTCFullYear()+preset.duration_value);else if(preset.duration_unit==="months")date.setUTCMonth(date.getUTCMonth()+preset.duration_value);else date.setUTCDate(date.getUTCDate()+preset.duration_value);return date.toISOString().slice(0,10)} const fulfillmentMethods=new Set(["Shipped","Dropped Off","Installed At","Meet"]),carriers=new Set(["UPS","FedEx","USPS","Other"]),deliveryStatuses=new Set(["Awaiting Tracking","Label Created","In Transit","Out for Delivery","Delivered","Delivery Exception","Returned","Unknown"]); function saleDetails(v,current={}){const method=String(v.fulfillmentMethod??current.fulfillmentMethod??"").trim();if(!fulfillmentMethods.has(method))throw new Error("Delivery method is required.");const address1=String(v.shipAddress1??current.shipAddress1??"").trim(),address2=String(v.shipAddress2??current.shipAddress2??"").trim(),city=String(v.shipCity??current.shipCity??"").trim(),state=String(v.shipState??current.shipState??"").trim(),zip=String(v.shipZip??current.shipZip??"").trim(),name=String(v.fulfillmentName??current.fulfillmentName??"").trim(),notes=String(v.fulfillmentNotes??current.fulfillmentNotes??"").trim();if(new Set(["Shipped","Installed At"]).has(method)&&(!address1||!city||!state||!zip))throw new Error(`${method} requires a street address, city, state, and ZIP code.`);if(new Set(["Dropped Off","Meet"]).has(method)&&!name&&!address1&&!notes)throw new Error(`${method} requires a venue, address, or fulfillment detail.`);let carrier="",trackingNumber="",deliveryStatus="";if(method==="Shipped"){carrier=String(v.carrier??current.carrier??"").trim();if(!carriers.has(carrier))throw new Error("Carrier is required for shipped products.");trackingNumber=String(v.trackingNumber??current.trackingNumber??"").trim();deliveryStatus=String(v.deliveryStatus??(current.deliveryStatus||(trackingNumber?"Label Created":"Awaiting Tracking")));if(!deliveryStatuses.has(deliveryStatus))throw new Error("Invalid delivery status.")}return{method,name,address1,address2,city,state,zip,notes,carrier,trackingNumber,deliveryStatus}} +function resolveCustomer(v){const id=String(v.customerId||"").trim();if(id){const customer=db.prepare("SELECT id,name,phone FROM customers WHERE id=?").get(id);if(!customer)throw new Error("Selected customer no longer exists.");return customer}const phone=normalizePhone(v.phone);if(phone){const match=db.prepare("SELECT id,name,phone FROM customers").all().find(x=>normalizePhone(x.phone)===phone);if(match)return match}return findCustomerByName.get(String(v.customerName||"").trim())} +function saveCustomer(customerId,name,phone,f){const storeAddress=new Set(["Shipped","Installed At"]).has(f.method);if(storeAddress)db.prepare("UPDATE customers SET name=?,phone=?,address1=?,address2=?,city=?,state=?,zip=?,shipping_notes=?,updated_at=CURRENT_TIMESTAMP WHERE id=?").run(name,phone,f.address1,f.address2,f.city,f.state,f.zip,f.notes,customerId);else db.prepare("UPDATE customers SET name=?,phone=?,updated_at=CURRENT_TIMESTAMP WHERE id=?").run(name,phone,customerId)} async function authApi(req,res,url,session){ if(url.pathname==="/api/auth/login"&&req.method==="POST"){const v=await body(req),username=String(v.username||"").trim(),key=`${clientIp(req)}|${username.toLowerCase()}`,failure=loginFailures.get(key);if(failure&&failure.count>=5&&failure.until>Date.now())throw Object.assign(new Error("Too many failed attempts. Try again in 15 minutes."),{status:429});const user=db.prepare("SELECT id,username,password_hash,role,enabled,must_change_password AS mustChangePassword FROM users WHERE username=? COLLATE NOCASE").get(username);if(!user?.enabled||!verifyPassword(String(v.password||""),user.password_hash)){loginFailures.set(key,{count:(failure?.count||0)+1,until:Date.now()+15*60*1000});audit(req,user,"login_failed",username);throw Object.assign(new Error("Invalid username or password."),{status:401})}loginFailures.delete(key);const token=randomBytes(32).toString("base64url");sessions.set(tokenKey(token),{userId:user.id,lastSeen:Date.now()});db.prepare("UPDATE users SET last_login_at=CURRENT_TIMESTAMP WHERE id=?").run(user.id);audit(req,user,"login_success");return json(res,200,{username:user.username,role:user.role,mustChangePassword:Boolean(user.mustChangePassword)},{"set-cookie":sessionCookie(req,token)})} @@ -97,6 +110,8 @@ async function authApi(req,res,url,session){ async function adminApi(req,res,url,session){ const user=session.user; + if(url.pathname==="/api/admin/diagnostics"&&req.method==="GET"){const databaseInfo=await stat(databasePath),disk=await statfs(dataDir),backups=await backupFiles();let writable=true;try{const probe=join(dataDir,`.write-test-${crypto.randomUUID()}`);await writeFile(probe,"ok");await unlink(probe)}catch{writable=false}return json(res,200,{appVersion:APP_VERSION,schemaVersion:Number(setting("schema_version"))||SCHEMA_VERSION,nodeVersion:process.version,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,dataDirectory:dataDir,dataWritable:writable,databaseSize:databaseInfo.size,backupCount:backups.length,lastBackupAt:backups[0]?.createdAt||null,diskFree:disk.bavail*disk.bsize,diskTotal:disk.blocks*disk.bsize,backupSettings:{enabled:setting("backup_enabled")==="1",hour:Number(setting("backup_hour"))||0,retention:Number(setting("backup_retention"))||14,lastScheduledBackup:setting("last_scheduled_backup")||null}})} + if(url.pathname==="/api/admin/backup-settings"&&req.method==="PATCH"){const v=await body(req),enabled=Boolean(v.enabled),hour=Number(v.hour),retention=Number(v.retention);if(!Number.isInteger(hour)||hour<0||hour>23||!Number.isInteger(retention)||retention<1||retention>365)throw new Error("Backup hour must be 0–23 and retention must be 1–365.");saveSetting("backup_enabled",enabled?"1":"0");saveSetting("backup_hour",hour);saveSetting("backup_retention",retention);await pruneScheduledBackups();audit(req,user,"backup_schedule_updated","",`${enabled?"enabled":"disabled"}; ${hour}:00; retain ${retention}`);return json(res,200,{ok:true})} if(url.pathname==="/api/admin/warranties"&&req.method==="GET")return json(res,200,allWarranties()); if(url.pathname==="/api/admin/warranties"&&req.method==="POST"){const v=await body(req),name=cleanWarrantyName(v.name),durationValue=Number(v.durationValue),durationUnit=String(v.durationUnit||"days");if(!Number.isInteger(durationValue)||durationValue<0||durationValue>3650||!new Set(["days","months","years"]).has(durationUnit))throw new Error("Enter a valid warranty duration.");const id=crypto.randomUUID();db.prepare("INSERT INTO warranty_presets (id,name,duration_value,duration_unit) VALUES (?,?,?,?)").run(id,name,durationValue,durationUnit);audit(req,user,"warranty_created",name,`${durationValue} ${durationUnit}`);return json(res,201,{id,name,durationValue,durationUnit,active:true,isDefault:false,usageCount:0})} const warrantyMatch=url.pathname.match(/^\/api\/admin\/warranties\/([^/]+)$/); @@ -112,7 +127,7 @@ async function adminApi(req,res,url,session){ const resetMatch=url.pathname.match(/^\/api\/admin\/users\/([^/]+)\/reset-password$/); if(resetMatch&&req.method==="POST"){const id=decodeURIComponent(resetMatch[1]),target=db.prepare("SELECT username FROM users WHERE id=?").get(id);if(!target)return json(res,404,{error:"User not found"});const v=await body(req);db.prepare("UPDATE users SET password_hash=?,must_change_password=1,updated_at=CURRENT_TIMESTAMP WHERE id=?").run(hashPassword(validPassword(v.password)),id);invalidateUserSessions(id);audit(req,user,"password_reset",target.username);return json(res,200,{ok:true})} if(url.pathname==="/api/admin/audit"&&req.method==="GET")return json(res,200,db.prepare("SELECT id,username,action,target,details,ip_address AS ipAddress,created_at AS createdAt FROM audit_log ORDER BY id DESC LIMIT 250").all()); - if(url.pathname==="/api/admin/backups"&&req.method==="GET"){const files=await readdir(backupDir,{withFileTypes:true}),result=[];for(const file of files)if(file.isFile()&&file.name.endsWith(".db")){const info=await stat(join(backupDir,file.name));result.push({name:file.name,size:info.size,createdAt:info.mtime.toISOString()})}return json(res,200,result.sort((a,b)=>b.createdAt.localeCompare(a.createdAt)))} + if(url.pathname==="/api/admin/backups"&&req.method==="GET")return json(res,200,await backupFiles()); if(url.pathname==="/api/admin/backups"&&req.method==="POST"){const name=await createBackup("vboxstock");audit(req,user,"backup_created",name);return json(res,201,{name})} if(url.pathname==="/api/admin/restore-upload"&&req.method==="POST"){confirmPassword(user,req.headers["x-confirm-password"]);const path=join(backupDir,`upload-${crypto.randomUUID()}.db`);await writeFile(path,await rawBody(req));return restoreFrom(path,res,req,user)} const backupMatch=url.pathname.match(/^\/api\/admin\/backups\/([^/]+)\/(download|restore)$/); @@ -128,6 +143,8 @@ async function api(req,res,url){ const user=session.user; if(url.pathname==="/api/models"&&req.method==="GET")return json(res,200,db.prepare("SELECT id,name FROM product_models WHERE active=1 ORDER BY lower(name)").all()); if(url.pathname==="/api/warranties"&&req.method==="GET")return json(res,200,db.prepare("SELECT id,name,duration_value AS durationValue,duration_unit AS durationUnit,is_default AS isDefault FROM warranty_presets WHERE active=1 ORDER BY duration_value,name").all().map(x=>({...x,isDefault:Boolean(x.isDefault)}))); + if(url.pathname==="/api/customers"&&req.method==="GET")return json(res,200,db.prepare("SELECT id,name,phone,address1,address2,city,state,zip,shipping_notes AS shippingNotes,updated_at AS updatedAt FROM customers ORDER BY lower(name)").all()); + const exportMatch=url.pathname.match(/^\/api\/export\/(inventory|sales|customers|warranties|audit)$/);if(exportMatch&&req.method==="GET"){const type=exportMatch[1];if(type==="inventory"){const rows=listProducts().all().filter(x=>x.status==="available");return csvResponse(res,"vboxstock-inventory.csv",["Model","UID","Serial Number","MAC","Condition","Received","Cost","Notes"],rows.map(x=>[x.model,x.uid,x.sn,x.mac,x.condition,x.receivedAt,x.cost,x.notes]))}if(type==="sales"){const rows=listProducts().all().filter(x=>x.status==="sold");return csvResponse(res,"vboxstock-sales.csv",["Model","UID","Serial Number","MAC","Customer","Phone","Date Sold","Sale Price","Payment Method","Payment Reference","Fulfillment","Carrier","Tracking Number","Delivery Status","Warranty","Warranty End","Sale Notes"],rows.map(x=>[x.model,x.uid,x.sn,x.mac,x.customerName,x.phone,x.soldAt,x.salePrice,x.paymentMethod,x.paymentReference,x.fulfillmentMethod,x.carrier,x.trackingNumber,x.deliveryStatus,x.warrantyName,x.warrantyEndDate,x.saleNotes]))}if(type==="customers"){const rows=db.prepare("SELECT name,phone,address1,address2,city,state,zip,shipping_notes FROM customers ORDER BY lower(name)").all();return csvResponse(res,"vboxstock-customers.csv",["Name","Phone","Address 1","Address 2","City","State","ZIP","Notes"],rows.map(Object.values))}if(type==="warranties"){const rows=allWarranties();return csvResponse(res,"vboxstock-warranties.csv",["Name","Duration","Unit","Active","Default","Sales"],rows.map(x=>[x.name,x.durationValue,x.durationUnit,x.active,x.isDefault,x.usageCount]))}if(type==="audit"){if(user.role!=="admin")throw Object.assign(new Error("Administrator access required."),{status:403});const rows=db.prepare("SELECT username,action,target,details,ip_address,created_at FROM audit_log ORDER BY id DESC").all();return csvResponse(res,"vboxstock-audit.csv",["Username","Action","Target","Details","IP Address","Created"],rows.map(Object.values))}} if(url.pathname==="/api/products"&&req.method==="GET")return json(res,200,listProducts().all()); if(url.pathname==="/api/products"&&req.method==="POST"){const p=productInput(await body(req)),id=crypto.randomUUID();db.prepare("INSERT INTO products (id,uid,sn,mac,model,condition,received_at,cost,notes) VALUES (?,?,?,?,?,?,?,?,?)").run(id,p.uid,p.sn,p.mac,p.model,p.condition,p.receivedAt,p.cost,p.notes);audit(req,user,"product_received",id,p.model);return json(res,201,getProduct().get(id))} const customerMatch=url.pathname.match(/^\/api\/customers\/([^/]+)$/); @@ -136,8 +153,10 @@ async function api(req,res,url){ if(notesMatch){const customerId=decodeURIComponent(notesMatch[1]),noteId=notesMatch[2]?decodeURIComponent(notesMatch[2]):null;if(!db.prepare("SELECT id FROM customers WHERE id=?").get(customerId))return json(res,404,{error:"Customer not found"});if(req.method==="POST"&&!noteId){const v=await body(req),note=String(v.note||"").trim(),category=String(v.category||"General");if(!note)throw new Error("Note text is required.");if(!new Set(["General","Support","Follow-up"]).has(category))throw new Error("Invalid note category.");const id=crypto.randomUUID();db.prepare("INSERT INTO customer_notes (id,customer_id,category,note) VALUES (?,?,?,?)").run(id,customerId,category,note);audit(req,user,"customer_note_added",customerId,category);return json(res,201,{id,category,note})}if(req.method==="DELETE"&¬eId){db.prepare("DELETE FROM customer_notes WHERE id=? AND customer_id=?").run(noteId,customerId);audit(req,user,"customer_note_deleted",customerId,noteId);return json(res,204,null)}} const match=url.pathname.match(/^\/api\/products\/([^/]+)(?:\/(sell|restock))?$/);if(!match)return json(res,404,{error:"Not found"});const id=decodeURIComponent(match[1]),action=match[2],current=getProduct().get(id);if(!current)return json(res,404,{error:"Product not found"}); if(req.method==="DELETE"&&!action){db.prepare("DELETE FROM products WHERE id=?").run(id);audit(req,user,"record_deleted",id,current.status);return json(res,204,null)} - if(req.method==="PATCH"&&!action){if(current.status!=="sold")return json(res,400,{error:"Only sale records can be updated."});const v=await body(req),fulfillmentKeys=["fulfillmentMethod","fulfillmentName","shipAddress1","shipAddress2","shipCity","shipState","shipZip","fulfillmentNotes","carrier","trackingNumber","deliveryStatus"],hasFulfillmentUpdate=fulfillmentKeys.some(key=>Object.hasOwn(v,key)),f=hasFulfillmentUpdate?saleDetails(v,current):{method:current.fulfillmentMethod||"",name:current.fulfillmentName||"",address1:current.shipAddress1||"",address2:current.shipAddress2||"",city:current.shipCity||"",state:current.shipState||"",zip:current.shipZip||"",notes:current.fulfillmentNotes||current.shippingNotes||"",carrier:current.carrier||"",trackingNumber:current.trackingNumber||"",deliveryStatus:current.deliveryStatus||""};let warrantyPresetId=current.warrantyPresetId,warrantyName=current.warrantyName,warrantyEndDate=current.warrantyEndDate;if(Object.hasOwn(v,"warrantyPresetId")){const selectedId=String(v.warrantyPresetId),preset=db.prepare("SELECT id,name,duration_value,duration_unit,active FROM warranty_presets WHERE id=?").get(selectedId);if(!preset||(!preset.active&&selectedId!==current.warrantyPresetId))throw new Error("Select an active warranty period.");warrantyPresetId=preset.id;warrantyName=preset.name;warrantyEndDate=warrantyEnd(current.soldAt,preset)}db.prepare("UPDATE products SET sale_notes=?,fulfillment_method=?,fulfillment_name=?,ship_address1=?,ship_address2=?,ship_city=?,ship_state=?,ship_zip=?,shipping_notes=?,carrier=?,tracking_number=?,delivery_status=?,delivery_status_updated_at=CURRENT_TIMESTAMP,warranty_preset_id=?,warranty_name=?,warranty_end_date=? WHERE id=?").run(String(v.saleNotes??current.saleNotes??"").trim(),f.method,f.name,f.address1,f.address2,f.city,f.state,f.zip,f.notes,f.carrier,f.trackingNumber,f.deliveryStatus,warrantyPresetId,warrantyName,warrantyEndDate,id);audit(req,user,"sale_details_updated",id,`${f.method||"not recorded"}; ${f.deliveryStatus||"completed"}; ${warrantyName||"not recorded"}`);return json(res,200,getProduct().get(id))} - if(req.method==="POST"&&action==="sell"){const v=await body(req);if(!String(v.customerName||"").trim()||!v.soldAt)throw new Error("Customer name and sale date are required.");const paymentMethod=String(v.paymentMethod||"").trim();if(!new Set(["Cash","Venmo","PayPal"]).has(paymentMethod))throw new Error("Payment method must be Cash, Venmo, or PayPal.");const f=saleDetails(v),preset=v.warrantyPresetId?db.prepare("SELECT id,name,duration_value,duration_unit FROM warranty_presets WHERE id=? AND active=1").get(String(v.warrantyPresetId)):db.prepare("SELECT id,name,duration_value,duration_unit FROM warranty_presets WHERE active=1 AND is_default=1").get();if(!preset)throw new Error("Select an active warranty period.");const name=String(v.customerName).trim(),phone=String(v.phone||"").trim(),storeAddress=new Set(["Shipped","Installed At"]).has(f.method);let customer=v.customerId?db.prepare("SELECT id FROM customers WHERE id=?").get(String(v.customerId)):findCustomerByName.get(name);if(!customer){customer={id:crypto.randomUUID()};addCustomer.run(customer.id,name,phone,storeAddress?f.address1:"",storeAddress?f.address2:"",storeAddress?f.city:"",storeAddress?f.state:"",storeAddress?f.zip:"",storeAddress?f.notes:"")}else if(storeAddress)db.prepare("UPDATE customers SET name=?,phone=?,address1=?,address2=?,city=?,state=?,zip=?,shipping_notes=?,updated_at=CURRENT_TIMESTAMP WHERE id=?").run(name,phone,f.address1,f.address2,f.city,f.state,f.zip,f.notes,customer.id);else db.prepare("UPDATE customers SET name=?,phone=?,updated_at=CURRENT_TIMESTAMP WHERE id=?").run(name,phone,customer.id);db.prepare("UPDATE products SET status='sold',sold_at=?,customer_id=?,customer_name=?,phone=?,sale_price=?,ship_address1=?,ship_address2=?,ship_city=?,ship_state=?,ship_zip=?,shipping_notes=?,payment_method=?,payment_reference=?,sale_notes=?,fulfillment_method=?,fulfillment_name=?,carrier=?,tracking_number=?,delivery_status=?,delivery_status_updated_at=CURRENT_TIMESTAMP,warranty_preset_id=?,warranty_name=?,warranty_end_date=? WHERE id=? AND status='available'").run(String(v.soldAt),customer.id,name,phone,Number(v.salePrice)||0,f.address1,f.address2,f.city,f.state,f.zip,f.notes,paymentMethod,String(v.paymentReference||"").trim(),String(v.saleNotes||"").trim(),f.method,f.name,f.carrier,f.trackingNumber,f.deliveryStatus,preset.id,preset.name,warrantyEnd(String(v.soldAt),preset),id);audit(req,user,"sale_recorded",id,`${name}; ${f.method}; ${preset.name}`);return json(res,200,getProduct().get(id))} + if(req.method==="PATCH"&&!action){ + if(current.status!=="sold")return json(res,400,{error:"Only sale records can be updated."});const v=await body(req),f=saleDetails(v,current),name=String(v.customerName??current.customerName??"").trim(),phone=String(v.phone??current.phone??"").trim(),soldAt=String(v.soldAt??current.soldAt??""),paymentMethod=String(v.paymentMethod??current.paymentMethod??"").trim(),salePrice=Number(v.salePrice??current.salePrice)||0;if(!name||!soldAt)throw new Error("Customer name and sale date are required.");if(!new Set(["Cash","Venmo","PayPal"]).has(paymentMethod))throw new Error("Payment method must be Cash, Venmo, or PayPal.");let customer=resolveCustomer({...v,customerName:name,phone});if(!customer){customer={id:crypto.randomUUID()};addCustomer.run(customer.id,name,phone,"","","","","","")}saveCustomer(customer.id,name,phone,f);const selectedId=String(v.warrantyPresetId??current.warrantyPresetId??""),preset=db.prepare("SELECT id,name,duration_value,duration_unit,active FROM warranty_presets WHERE id=?").get(selectedId);if(!preset||(!preset.active&&selectedId!==current.warrantyPresetId))throw new Error("Select an active warranty period.");db.prepare("UPDATE products SET sold_at=?,customer_id=?,customer_name=?,phone=?,sale_price=?,payment_method=?,payment_reference=?,sale_notes=?,fulfillment_method=?,fulfillment_name=?,ship_address1=?,ship_address2=?,ship_city=?,ship_state=?,ship_zip=?,shipping_notes=?,carrier=?,tracking_number=?,delivery_status=?,delivery_status_updated_at=CURRENT_TIMESTAMP,warranty_preset_id=?,warranty_name=?,warranty_end_date=? WHERE id=?").run(soldAt,customer.id,name,phone,salePrice,paymentMethod,String(v.paymentReference??current.paymentReference??"").trim(),String(v.saleNotes??current.saleNotes??"").trim(),f.method,f.name,f.address1,f.address2,f.city,f.state,f.zip,f.notes,f.carrier,f.trackingNumber,f.deliveryStatus,preset.id,preset.name,warrantyEnd(soldAt,preset),id);audit(req,user,"sale_details_updated",id,`${name}; ${paymentMethod}; ${f.method}; ${preset.name}`);return json(res,200,getProduct().get(id)) + } + if(req.method==="POST"&&action==="sell"){const v=await body(req);if(!String(v.customerName||"").trim()||!v.soldAt)throw new Error("Customer name and sale date are required.");const paymentMethod=String(v.paymentMethod||"").trim();if(!new Set(["Cash","Venmo","PayPal"]).has(paymentMethod))throw new Error("Payment method must be Cash, Venmo, or PayPal.");const f=saleDetails(v),preset=v.warrantyPresetId?db.prepare("SELECT id,name,duration_value,duration_unit FROM warranty_presets WHERE id=? AND active=1").get(String(v.warrantyPresetId)):db.prepare("SELECT id,name,duration_value,duration_unit FROM warranty_presets WHERE active=1 AND is_default=1").get();if(!preset)throw new Error("Select an active warranty period.");const name=String(v.customerName).trim(),phone=String(v.phone||"").trim();let customer=resolveCustomer(v);if(!customer){customer={id:crypto.randomUUID()};addCustomer.run(customer.id,name,phone,"","","","","","")}saveCustomer(customer.id,name,phone,f);db.prepare("UPDATE products SET status='sold',sold_at=?,customer_id=?,customer_name=?,phone=?,sale_price=?,ship_address1=?,ship_address2=?,ship_city=?,ship_state=?,ship_zip=?,shipping_notes=?,payment_method=?,payment_reference=?,sale_notes=?,fulfillment_method=?,fulfillment_name=?,carrier=?,tracking_number=?,delivery_status=?,delivery_status_updated_at=CURRENT_TIMESTAMP,warranty_preset_id=?,warranty_name=?,warranty_end_date=? WHERE id=? AND status='available'").run(String(v.soldAt),customer.id,name,phone,Number(v.salePrice)||0,f.address1,f.address2,f.city,f.state,f.zip,f.notes,paymentMethod,String(v.paymentReference||"").trim(),String(v.saleNotes||"").trim(),f.method,f.name,f.carrier,f.trackingNumber,f.deliveryStatus,preset.id,preset.name,warrantyEnd(String(v.soldAt),preset),id);audit(req,user,"sale_recorded",id,`${name}; ${f.method}; ${preset.name}`);return json(res,200,getProduct().get(id))} if(req.method==="POST"&&action==="restock"){const v=await body(req);if(!allowedConditions.has(v.condition)||!v.receivedAt)throw new Error("Condition and return date are required.");db.prepare("UPDATE products SET status='available',condition=?,received_at=?,sold_at=NULL,customer_id=NULL,customer_name=NULL,phone=NULL,sale_price=NULL,ship_address1='',ship_address2='',ship_city='',ship_state='',ship_zip='',shipping_notes='',payment_method='',payment_reference='',sale_notes='',fulfillment_method='',fulfillment_name='',carrier='',tracking_number='',delivery_status='',delivery_status_updated_at=NULL,warranty_preset_id=NULL,warranty_name='',warranty_end_date=NULL WHERE id=? AND status='sold'").run(v.condition,String(v.receivedAt),id);audit(req,user,"sale_voided_restocked",id);return json(res,200,getProduct().get(id))} return json(res,405,{error:"Method not allowed"}); } diff --git a/test/server.test.mjs b/test/server.test.mjs index 73419e3..a617ccb 100644 --- a/test/server.test.mjs +++ b/test/server.test.mjs @@ -48,6 +48,13 @@ test("authentication, roles, inventory, sale, and restock", async t => { response=await request("/api/products",{method:"POST",headers:jsonHeaders(adminCookie),body:JSON.stringify({uid:"U2",model:"V7 Ultra Plus",condition:"New",receivedAt:"2026-08-29"})});assert.equal(response.status,400,"archived models cannot be newly received"); response=await request(`/api/products/${item.id}/sell`,{method:"POST",headers:jsonHeaders(adminCookie),body:JSON.stringify({customerName:"Test Customer",soldAt:"2026-08-29",paymentMethod:"Venmo",paymentReference:"TX-123",fulfillmentMethod:"Shipped",shipAddress1:"1 Main St",shipCity:"Philadelphia",shipState:"PA",shipZip:"19103",carrier:"UPS",trackingNumber:"1ZTEST",warrantyPresetId:ninetyDays.id})});const sale=await response.json();assert.equal(sale.status,"sold");assert.equal(sale.paymentMethod,"Venmo");assert.equal(sale.paymentReference,"TX-123");assert.equal(sale.fulfillmentMethod,"Shipped");assert.equal(sale.deliveryStatus,"Label Created");assert.equal(sale.warrantyName,"90 Days");assert.equal(sale.warrantyEndDate,"2026-11-27"); response=await request(`/api/products/${item.id}`,{method:"PATCH",headers:jsonHeaders(adminCookie),body:JSON.stringify({saleNotes:"Left at front desk",fulfillmentMethod:"Shipped",shipAddress1:"1 Main St",shipCity:"Philadelphia",shipState:"PA",shipZip:"19103",carrier:"UPS",trackingNumber:"1ZTEST",deliveryStatus:"Delivered",warrantyPresetId:customWarranty.id})});const updatedSale=await response.json();assert.equal(updatedSale.deliveryStatus,"Delivered");assert.equal(updatedSale.warrantyName,"45 Days");assert.equal(updatedSale.warrantyEndDate,"2026-10-13"); + response=await request(`/api/products/${item.id}`,{method:"PATCH",headers:jsonHeaders(adminCookie),body:JSON.stringify({customerId:sale.customerId,customerName:"Test Customer",phone:"(215) 555-0100",soldAt:"2026-08-30",salePrice:325,paymentMethod:"PayPal",paymentReference:"PP-456",saleNotes:"Corrected sale",fulfillmentMethod:"Meet",fulfillmentName:"Wawa",fulfillmentNotes:"Met at front entrance",warrantyPresetId:customWarranty.id})});const corrected=await response.json();assert.equal(corrected.salePrice,325);assert.equal(corrected.paymentMethod,"PayPal");assert.equal(corrected.fulfillmentMethod,"Meet");assert.equal(corrected.warrantyEndDate,"2026-10-14","changing sale date recalculates warranty end"); + response=await request("/api/customers",{headers:{cookie:adminCookie}});const customerDirectory=await response.json();assert.equal(customerDirectory.length,1);assert.equal(customerDirectory[0].phone,"(215) 555-0100"); + response=await request("/api/export/sales",{headers:{cookie:viewerCookie}});assert.equal(response.status,200);assert.match(response.headers.get("content-type"),/text\/csv/);assert.match(await response.text(),/PP-456/); + response=await request("/api/export/audit",{headers:{cookie:viewerCookie}});assert.equal(response.status,403,"read-only users cannot export the security audit"); + response=await request("/api/admin/diagnostics",{headers:{cookie:adminCookie}});const diagnostics=await response.json();assert.equal(diagnostics.appVersion,"3.3.0");assert.equal(diagnostics.dataWritable,true);assert.equal(diagnostics.backupSettings.enabled,false); + response=await request("/api/admin/backup-settings",{method:"PATCH",headers:jsonHeaders(adminCookie),body:JSON.stringify({enabled:true,hour:3,retention:7})});assert.equal(response.status,200); + response=await request("/api/admin/diagnostics",{headers:{cookie:adminCookie}});assert.deepEqual((await response.json()).backupSettings,{enabled:true,hour:3,retention:7,lastScheduledBackup:null}); response=await request(`/api/admin/warranties/${customWarranty.id}`,{method:"DELETE",headers:{cookie:adminCookie}});assert.equal(response.status,400,"a used warranty cannot be deleted"); response=await request(`/api/admin/warranties/${customWarranty.id}`,{method:"PATCH",headers:jsonHeaders(adminCookie),body:JSON.stringify({name:"Changed",durationValue:10,durationUnit:"days"})});assert.equal(response.status,400,"a used warranty cannot be edited"); response=await request(`/api/admin/warranties/${customWarranty.id}`,{method:"PATCH",headers:jsonHeaders(adminCookie),body:JSON.stringify({active:false})});assert.equal(response.status,200,"a used warranty can be archived");