From a296930c96b94b8c6c82d85b82b003efc47dac71 Mon Sep 17 00:00:00 2001 From: ikkalu Date: Tue, 30 Jun 2026 14:22:58 +0100 Subject: [PATCH] feat: implement delivery route distance and ETA calculation endpoint - Add GET /api/v1/deliveries/:id/eta endpoint - Implement routing service with Google Maps API and fallback Haversine calculation - Follow strict Controller -> Service -> Model pattern - Use MongoDB for data persistence - Add seed script for test data - Add environment variables for configuration - Successfully tested with real MongoDB and API response - Response verified: ETA calculated successfully for DEL-001 Closes #22 --- eta-endpoint.png | Bin 0 -> 39580 bytes package-lock.json | 2285 +++++++++++++++++++++++++ package.json | 61 +- src/app.ts | 80 +- src/controllers/deliveryController.ts | 34 + src/models/Delivery.ts | 52 + src/routes/deliveryRoutes.ts | 8 + src/routes/index.ts | 5 +- src/seed.ts | 41 + src/server.ts | 4 +- src/services/deliveryService.ts | 84 + src/services/routingService.ts | 139 ++ 12 files changed, 2691 insertions(+), 102 deletions(-) create mode 100644 eta-endpoint.png create mode 100644 package-lock.json create mode 100644 src/controllers/deliveryController.ts create mode 100644 src/models/Delivery.ts create mode 100644 src/routes/deliveryRoutes.ts create mode 100644 src/seed.ts create mode 100644 src/services/deliveryService.ts create mode 100644 src/services/routingService.ts diff --git a/eta-endpoint.png b/eta-endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..7492a4eea3f5d5422c59b406ab8117e4cb0868b9 GIT binary patch literal 39580 zcmb5WWn5d&+BOOlDDD(*u%gA?DNv-vp;&Quw_w3tTA;X7+=>*3K#>$L?(SY(LXyLN zp8f9se$SWlJNdA(CNpc+%w*m7T=zBCtQd7w1zapjEF>f(TqQ+0O(Z1Lv*+^w4D{#Y zS|;M)`3u!UMoAmv`4fO)8U385@O-c5spVqr>0{<@g=FLG;$+3)Vc~9N8oWIHsyeWwDdBEV z@11eGVOs+h#ep4_%vY5eTVMahnGbSss&S(5-&yc`lsye8=KX12=35#6NmPK3Vdksv z2YJ-g0)i069vH)Bne?wZndAK%aq%SU^R8P1hq|tYJ7$NvQ@)_5`&Z!vG8lCKJ}|_d zyV^+qCn2vpqRDFj&|sw{ z$h6G8TSfKX?IK4RF2E?FPwmSaj4s8Y_ZzBP$RLOquEISb0ky`AEi&0ZcBrXfXi)Nr z>2xa^J2VL}CgM_AU`!&dxAo+j(_`mnE9i9*qmZy1Rk4UB%Z9Wiy78r7%v>YosH(H{ zJbForL{0qslqc%Wgy~U?iDzpBr-(|-Xx&03Nzu=E7AN ziV*yxtB6IMq@=Tp^?ZJR~*Vsc-T__#2Uw~1^dp^Boe{&BHFmRi({ zVt*(9Vx=FYc{lB+72V~ew)u$h_IB{V+fH5VVd-C?8y`M#;Moh`z@Y()=Q`&!y8asK zCg+bJ*@tv$G56R8blpswTHnOXVK)2K{e;F7^7Gf6Htv@nUSm|3tRa7Rqc`!|3>1=y zKFD*|2GoWLW^+-kh-s{UyyWW*cv>RVU7kFO$rVax?LA8z*BG}sKZnfxtTvFS$MlH7 z!*f0DxaFcAmJD62Fn#Juy8L@BhM~=7c=Pl?=ic2JPi(p+GdEVdm1~4%=qwTN72DT& z54h%wpdK$6daFkcp{cd3;DTlN;OCbitL-ZQCPG30d28>-ciSSQP<^C=ZyYW?@H}eK zdt_;T-qNWuH#H;rL~>Y?b|!Zg<=ALxg>k%$MCSZlvyy%sr?x}Z}iw57m$Bw{;iJSQ_22I;Wktd|`z{ zb<3#Hz!?!p1ER)`Wq{4uOUkIeb$D6+OB9Tq*Y5N!=< zzvU0zQUoy&jy!&{%=}DznlY}fll*U!#-U%;-bx@n(aV|w?wBZ2A0F0|I4`ceHtdto zPtuL`PL+VUm_&?T80^oV z_)n8ctH)=LPvm{*c^vG}Mnlv5hM+vp$_Y-3!Ol0k7^XiXdqb)doA?8W(+==)XLZ!^U2%WjKIbKL0EB>56^gz&WXP+9in9Dqxxgays+ z=69T`vu$uGj{zd<>=w5Lt)>rzLo08tFh)U9LgTZop^Ek#N41mrb2pOyQS-{RHzf7~ z!gL2~`4^Vgz_pR_UH2CSD!#mmuYGh;cXJ_E8zHsiPQCW`#O&j#fyaDt}CZm)in{L1L@^syNtAw@{+gtrRIXQJBOw`M9XH_+{s#F zAIP3c=}FSS@g|N)xA=T26df;UdUq11eM>0J;wOo+{sXQFWy zgRRGYX>3IQ{S4A08kMi0PLw9vT(Q{iQGsoY%=brEanb5aJsQflaf>9y^o+N_W=iRj zkl4<2qhmaCeHYAc501uVmruT~_{e>mQ*|xFqIFLZ9zR8Yg|>56Y(Fi!qcDUaqY(o# zl=^I-50@W~PrYC4F+f?d5*hqf#tzwLkXb10E4qMRZ43mkJdiVW+qy$ z#!Bk6wbHpV@0O9Y$~+EUAS1n-98G-6%IVu{HjTfEje!B?xnUtOVRxMkSG*t|F-$xy ze4SX?(IL|5AW2RHU1LJv??#z~Gz0riTNe9m#~{6+=$yF%8fn>8m0p3H9lanuIFCr_ z?M)6Yt}w;K=*yX$CD1R@FDS0YdoyriZoXH64$1pcO!XK1^ z8>7K=sa!Dal^z$gUOzv&uygkr$wO8#Fa5* zci)9Ay>T>NKsdQKc9NxuIP>8J+OF05+<1Opm|H7T+3JqVbIqSf zn9vOiTS}J#yKuQ`+(fvXR)^}45 zRxCoI|E}y9KC*7yoYriqlX4T359 z1q^l;|N2|sk5DIy-W{}3Vqw2MuqZ-$^LVd4#mD=5AtRheE=m>cTLjv|zPQ>^sBL@h z+_>2 zg;fQt;%)TFem(lSgE4ov9&4D}A-`KK(^T-K$w~+Ojsn-DG+xB_WlxDZ#4Z88eL4nS zXEFn?v*(3ZMmjxKC7H_cf*;Y3#&Zk!1=EI>h!2=`+~_+JA5GP(NP|-vh|ez#CVk_l zw|$S=^i;c2Bz8PjSR?tR53oEbp3Mw*?`f5q{RI>Lu4I&^PttI^B$sWVwoajy`!BvH zM{5d~yq-9b2}4Nt?EQje(MW@c<5|P7w8$8>q`9SjDB)EMUjBRz!`;{w>S1wAZcFmZ zVf>5bKApPpq&%FF;)YP7pWTFf^n#QK?BT02N3@^Qn~#ig!*fjFWVOilCn3e)w+ z4@X6YR|2>F$sJ)&*ZgVZymlaS9of+wme{N2O{CEWG!`w3nBS|Ajc$_<|BJjgHN))A z1#jh@-aIVojdx}!?3#*8P<-vl62@MhbLrc{pmVG8FBSO6nLYQ4h$dg|=%dGPAWzCK z&g`XA-v^?XEzW!1$F}yzInKG>Q`1k*f^SRkh~~tTZfnwq_&U-Yt}m+f%{P>FHWmHq z`u_fTM$~E+cxaZ+!|q*$Iu@3|LG-QPHY0v_Ht%?<#}%z2Ig-Y*8(0quw>t54XL5GC zgz$aDC~MzJW&5b8hL$p4Xpa|oXHi{OsYM4s~hZwJKnre^^y11KuN<+@7QjeB^hc zC{>~_uPXob+xw#X%Yc0iA6(sXbJ4HwJYQ>+CeUkY3_Nf$4Cd_hQS)(H8xmrfl^ZP!I4){z8;`?3YM;N1~m06vfES9QLBhNG8_~((8pQl{XVl!H=#N&fvH94+igpW1hro5o9_HJ5Q3yP~`}gR`aT3?50u4YR&9z<%h(* z*1^HqMH&`?*FnsUJC|v8MD^(Ne(!kd53mFq*{o=e=V~lg+ezlme-iVRb!4JO{4er) zQS=N&k-d|Q92-RtJULC*uBXgZG=FVKpwJjs@>7WQla2kWvc@(xxWXHh)|BjE9!~-SN;ka}&Yq9-7!ADFFGt znUL66D=AJZ%5j7f6%_O?iWZ$wLruiy)7Z=UVt5sC-$~J$ZF(A%eRJ2FNN!x8j`s^I z4Dk@@Fmp!vs7Y-2&DdnTBF9m+b)DsyA7F-P8xYSFr9paMllcTII~d7M5Idie8!uFR z#ijJ-6%sp0!iG;l5x|MPPb=%$>n`6>xn_JdBD8wI+v`)-5*-4F?Ie$l$ZTd z7|Dvm27E$VA6n3ej49l=TEDqEllXX> zzKUCTT(TDVRnQNY%gN=@g19<{1g0wH}=`^Q-zkeL4IK#eQm==LdeYsm7!CUMraEwDj$qRpz6S z@&6J-&Q>3Czb;^4cL=qGYQE#K>#XN#cKU)|((y2`6nHJFHSMLP}tB{Kjj^m!V@tPxjD%M*8q9!Uf$!$oI3&ol8KU5P=OF;%d zFA@7fvt%|AmxV^wfi~|e{oes@fc27hHn2c#?>`a!^=1}05!o%C;|l+Yb?s^;tmMS0 zrsH?IGL*~!3SwStd^EQopF?2}mX%9-h0}V+6Kina?y_H9<$n`lvR0CxH4XORBR11) zci^bggs#<;p4|VGKvlOGrjw$}O_wy7iK<~^@dW}%`=o?F2H+1BH~bd^=F1WmZG6ct z$Rv03=soN09V@lczvrm6zK&ghLudVLsjp9+OuRqf+cbz&xth8VzGnPyri#EE^^)cc z=bur)pmSyl5&MUaqm!oviagssQhGWy&DmR=ii?hY9H0MCde>h^-I)L3-}*5alZLVW zx%&Svo0t4w0}xKY@CEhkpSr`zLl|BE?|c2f8v6f1B=W3K{AYB-3AS`J+;%B95l?lw zk{#E_`92-B|M%VG3%3V7p>5)9?A@Q4DAY%@Lrqc<5owhNk~UQtLLqw%E`69;Un_xcX|8|rH@q|0Ws%f>rvL5`IiL4`SFxX zuxgXAz3rdn2shh1k17pi^_Xu;DCH-ILhk;$^lxn+o9mn(Gb@yD? zb~Z2TpX5W+a;;4f4e>?Ov)48SW31Faqa^H`LI|_`JVTno2T~W664b+F9J=)VhGo&PXeKU zvrGKDe|0Ik@cUm_nWsUwq{>w$!@V%2gi9fRaw!EJmB=?mj4n0jt`9>rBuHZFhLx@&h)zCBl?+Ys^IK7NrT(?i>9vU~pX&TY z!{c{Smagf2(j*4{h-s4YLE7jwnK8)B_L4hQH1&KcGmiU_aB$q{{RWL6i6I1dN`JG5 zUoM^|_DoFi?uDSD4Dy?EjTOV&Y5c96pyn{aGedqVuuD*1#NAq#okRX)QbFA3SV7Gs zP2_P0n+lPf;h&f9Mz_?-p&#k<^yQ)COY&JqoRjLEDI<^|p?HdpPbBrHhYyZ@ibr{# zGEw$I?=CDma}^gKtvZdTl6J$C@<+$h%~=dPVjUaHcGopw*S4*9=Yql8#JM@+$$Bpc z3k|fr*{$9%FLp4*ZNE}j79HI2)S2KRs;Jk}(3GAVsngOMD&RQppT0O}R)~oCh4Ll> z51;+k3-Rcynci;}9ZRoS_Uro6d~W~FJwdE|_o^EPG=kGz)|`SZUNF6i| z?^#Qqx-8Gw?LPnV`3tVLmu*eftr48z z1nWF1Vp?4WYMaFrVG~_$_fMvjDuAv~H7Bn+DqC~nm`}N8Bbi?*$VWKJE&OGusR5%@ zM}_+xxBKP$kJAA=!nn+}y*nKm5`qA)0r2GCkXa9umgqfQP~7S4=J~9Qp7`|$`hquA>eoTH*R>0LvN)Rjd1tKOgt${a(?CBzxI_45IQTFibbp46Qn{Zs=M406i}t=h zjr}-A%Q`4s{;KGXQC&Yrb~x>P?r!Gp{b-TMfpUj`=izme;q}*9ncg+=59~FW!CP%6J$t6Q;5<1QB9$jV0O&Pg&Yif;yMJ!;+>OBOR0t+YaLv%YqYCH$Vj2 z8|{qW>@06?9~53n!Fso>9>B-Yb8Yau+6m>3`O7q=_u+Jj@0GyjNt;6AUAw+e`4W-N z*5cq>F=nwhZv?`U^O5rb>)&qQgcG#1He-Y&S>tr`Af!i_7rUGZh#gR;t(8|{MI}7R zIo*-I#dy_kc5Gmg)iU#BTI!?jd1|qAY%)=JVx%PzC(B>o=e5Bc9OsU3()!z-9go=F zrtX}WYB@vI_y+rN->PvF6>6E)vCv5!TQ#&leYa<2DWW&Si=k^fIX;}9I}2Bp{t2fe zA%3!J`)iX!>QnSMM4lz}D0H-5{%b!ZzrY}Xth-~5G@n(*$(!2H2O(!4e>Fryya(E!maDBS%QyB=Nj~wgdaFOrWSHFpSQWl~# zd0&?uV#3mtBRQlp_L(A{e)nA}U*F$Z84rC56@ST7{;e8?IiiyZ&-)l2e##pcK>q|> zms0AOo1T-N5>X~=+oq05EF=16Q|#S~Td@0fCiOgGzLwFn7JdC97>(rW*F|q6!?sC% zzO&53^3QU5#LG$wNPYf^_z@=~WAyMavLUzqtHKVbH>Fxx8ys}#L798OB2$V~`_(ko z^+k|$*aJ3FYQ4w`VX@1{qKn4&dhkES%#vmwF@ro=vv@Z6!DBb$7s`M6h=lLZLYXMl zD|&%9Z@uzu+<&%ycWM(nL-S0*DJR(|f6B>vGV$nosuY{R=e2fbv$*z4#hQ<<9o%wC z1wdy!9^}^{6HYk1nX% zXnO56kwGRD|1|itoi>9t{2$*AD>Z6VIkZjE1=bmg$v-I6c`oIzJ8cKYy}o+6LG|!) zP~tB}v5YeW0z`w9Sm@n4bpxe>?)YvioDO6PFOux^5(AD31A(0RWw%u(-6;a-#MxSS zd^QP*U0m7G8IvvbTEo%$Z%y+0aV!`qtF=>e7?&mN={aFYBTm^s-f4+p23zFM>#7Bo zFy4lhsG%QzWE2`e%U5z=n^+=QX!KP4fqsE^y$RiMw31$!O7$AHjwK|WKQo;m>~xG@ zPhGg^hP%=(O2S&5aaB%y?InP0_#+OqlG{j1x5YV=%2xK_=p|#yYl-V$j66N0_Ub{{ z`qJj{xuGg(u+M8@&BtWla$~3HZ%=(Q#XX=xN-mIz>|=%rzj6@Q)%^BNdfE1TNo7YB zqG;vq5(Mx~y_%P(!;L6Xom-z)a1A3Odok_YzFJ=&t-q6G!oE+^n2X~6a-5>`;oh$j zq;{%CkvqH$&I-fp2}&M|Yq=Ibsyc@IlXsEiy9Ixb9TV@W!T8|5sDr{{!*lbXaCj4f zI9sY4>d$RyG&cPGWnI#pV(@}l)_UqOdJiY8k6MED^X8@x zb#nx#d2#eCl41K6g|vJTB_Fl)zzk7ScqW~X{ilwKf84DhOqyw>Ki-rjW;7)*9(P#w zng23R>ajgp7Uz$>xzbRblQt6IFnCd!?-`UGH8HAmZ|BIL&pGI}LqE3Unp#DquHq1g z#EWWTbSJ1|@qe@c0%P8|u@LJm|F)c0gGB)+wRjbBMFEZ^W6YdW)s$gd^{7vPzYw21 z4jA7HlNGuBbdWvKqt|xC7NVbeP159_m2a-a>VuZ194(q?IenNASUFi)TZ#I zO%~hAyD|^ZFSi{v;gNQE&%e&lH5LZ-8W6$z@03Ti)4X=CDl?B%tL~lrP!Mfj)iolw z@2r{*u2~Rw=GuIZ#!`|=t6}+ASs;^{Lyv)W{d*mf$=0%|Pl{uRZ84#hET33(F3x!*q1-3a z!&0ur&l-0xCQ?_U|4sAxQ&iFmxIC=nW9?Hq&2|}VJ0*;9Bzw+RhIcU%zhs^!E|3% z$Gw!Bui*h2YmM1-WyL=}TsNz7l%tRw=(rS^n>s;lLYFzqoNLbOdt&{|dVAb+P)kF2 zzbc4l@(c@&mi-@C3oq0}4EX{>*hjr19zB4De7owpM%eS+1#_v8pHtvT9Ce?x<5Kb3 z%%G?m${y)pxOc(V#|aa=k3UO9)2Vi8UjN+nZj$N-K3^1m(4x#0?a<>xFovU3>vI11CS4Z-8OVOrML*0Wwvlt-C}~1bAOA&w zY^~)6{ZPX6;j~bWA{4#5Gwv+0ZvXMT3nmiVd~yBsAl}>-+@2S=27`|+k{HOu#GL-6 zAtF($?j6jWJ1>wts14w85WI9ujX1esS6a+TViQbDG%B8-pO-lJ`DC0ru?)ML0Rf-g z+@XIv;^22SyjMqCF-C$YjORPV3w?|>ACTv%3pYNVkAquqKT6Ssx00?rDI2@+7lt35 z=+#I(VQFUdl?K*wnSY#fE*)P`3~R+dK3)0j69Te(W>{F*kc|`x^x}SV zx+946>g2aKLd#}kpdj~wyS*g_sw-vPlI5$KED^9#TS$Jn-+kNJx}%bDpYaBls)p(%P;M+ zT8O~;+M5A~EROn#U}wjufCbm?YvkK$m3zZ`R^+N*7f>bCv9I=76L3h+06DhymiP=Dr+9)`>b=0GXd(g_YJHlME$HCK`VyKJQO+c{MTKeFr+>0$ zynXJ6(^88(FkGfFR^A^pMQVC6X@@jXi~{@hsxa5KXMf4gzS}-uchsdir1S_6Oazq* zJ#&^w+)DH?H2%IhwN5Ke?WIVot=0#smf}xUH#)<5FOX@n8B3wvc=cz++kZbdN-ESF z=agaT3Bc&P$R0n}o}LsKT2Maedh-Gba2G%jYU8gfZ1lMhlivv)O$7cf z5ueBC7#wCNc&%ChqE+$mz)0k`2(%$h{Nn1GS5it;kbe2%26S(81PtGZxhvGnZoAH> z0el-P5#=JgUj8G$iZ=_?-u24a=A@30>LERu?LwQQv=hE1*#%))j%u~VW6y6(>7dPe zQ)1_B6`c}wXNg_hTtW6abC=5wG5=5%jLtwW96V?~2eIkG4L)uxG={HC=5_1N`0=NF zKA)+bHXYvfD{=U&_JDnVf$~JU!3|4xxm+n`ft`hyCPMKnXI6Co;@?1=A8m#cTj#H4 zxy={8n{Ly za5i$|C3W*m*_?s_uynFR|5bR`DZo*uS};2L5AvBtU`pQZMz4)nwf3_=4dY&4HqCo> zG0WZPYeDF12u!;EnnI6_@vVv|?IP5JTgg$?+>$=rnBwRutPDy*WbL9ENd42IoHaT9 z@Bn9b|YF8iD_ zM8GDjg)|rZMR@2};_T~)YBSR%9EUn>~+m5Zf^23P>$)sh7buKcvEJ_H}U1$-4UC>E9 z>yNGBtqATQW551B|AgD}XYwA2qvpn;Ls6@qcvsnHRT;y37I9x;E19p&E=^n}Jul zjYryevpi>;7CI0mclV_bk+ogE{ElYAi+e{Oo4=?n1F+=BD;qcaQi6hqRK(is>we9Z zE|P@Dw|fk^fDq4&kG5IfVwGa08yM$%xGRM zKD;fV{k?2=bxMw)qTYh_@C%p{+e(KtrATJ8b>QC?%5`)89`4r#KMGqrTGz-JdNc`$ z{vZ_7`kgVYE`}Kt2oZUGx=Mbs6I7NhVNekj!@E z8;uq)6>DsPvf4dn1=*4mvat`O-3BbZeZ_Xt-n<*w)_s;_JVLe!gF|OQKn+QkWf1r= zO2=rwwQ-r{Pe^V$<$gNXL5Irc!cS;LNX$z(BMLd(=Es@R3m3ve_ zn{uwXHJZm_$7*G!Tgudt^%~r8`9AohwDIC=mAv4;usl(+H|fn8d1UtB88?u=o~h_( zv>^a=gfY)|fEMd@T^Fia2q`A*dUYnFTztM&QHo0B*`EJZ-20xt0Y2djsNWR#jV(2& zQqGP5r9(bJ72Yj}6R}D4#7qamR<~>^ksqi~86-e8H|GcHW!}s}xQbnlgKq6tBcBb} zh98^Q2Rg+r3X%5<@o+_WaZJ9UsbW@Vh(HrXY{5`fEUw12VO z@y$$7+H`l(It*1MTkh(iDSOJc?OG&Zd@&x2rvO8!0Oe#)vU{k4@{(Km;G=9w zI>U-VgcBp<*|~;W1XbC3;n@^v08=f!@8#)+khtzRF6fCG!Y={$8IAk_?V2zVQk(MG z5zdcd;LX#xE9=d)$|bv9=M96cZK|45@_$KVw4{3_wlw_ z<@<>+W+eF*zw~?7R~?B;Yola@B=5=xBL`NZgtSsWO{3f^w@&BYnLeEz5@^R#A5%_h z-r7)_aQu2u!W_HpmasY@ibu#6BmK>#h~eV4Pm$u#`HMN*^X%9$-*xem^Y^m6#_~S* zxxbv(JPp#1+@`;c;4<@Xg-t9^dK>RgYZgto+x~h!0@|Jm~4?Mk{}YkIWfTP0=ySEYZ;j9Q~fy6~VPEc|*|=tYH@N zTI+^__zX+K1V*z9Su1T8P9GfHq`^Gq+Y@|Rf}gU2-tg;~yc{g#SzCwKg9|@af{M?s zK&3}l=2^3M7d}ZGNS(GOuYK*oLXDc9PhOX!Z1gx9UDfmBn&!Q)d44*LH`G#liz>YG zEToa=^c@Lb#rv>Jpz?MH$&V^x{@9&#DH_kKB%Y3~Uo~QP51`t9>*ACTVJ5QRGBtU3 z7ow>);$IEOj^NEs!;pDR5=9TI zj8EnZ1j-tpQwzL$n>Gi=1CoEg>PuN$O4q$v)cf z+waSp6B?M`xmf6`ek4Zszv*ZD_?xX9H5)BX1@fI-A~oZk1+9oknmTn8p8Pz7%LdOz z*sqj?y>K)-LB@fDaUET~KMMHD_``}~r9fOD6Z^2b#GrnC_$%w=PcuOw#XR!GEt$U$ zN0PpkK-`Qo677F6%3C?uHYB{CG=mFsYEQ<$2LBP$kkFP-84kW=hLL+mQ-Z%C!XJ5< zyNL}$zLlzRPKh@nult{c>Lyu$5S%k{2+T2a+X|1w=%<^A^HBwij1|f2?)1)+L^MXL}MG@k`D~~|NZo^$+rl*-)YJ$_e`iIR_PZP~i<+9&T- zF+v#pD?mS~UG62l@q?tVVmNz)8zFXvtDDHhcKF0UcAW#pY0BvONbl|1xv{~Rcie1Z z8BA4_;311%W2NbHBXEW&zL8AZTk74?{O!-D=UI*C?n5drskz^Rg2_tLJfVU;YZMe$ z+t7mR`58~KqN?!7OLhX$h@P0@!cB7Bk?CpA+L3zo_+}^M zc%iPn`3|4vrC}lbN#EA7KL}So;>b?4B_;CXM!Y`?h_a%~{?-s~0r2y|s5L6WR1cSW ze=kM;LukqFX}hkXrfK>p@PaF5E-yruLg01GG37A&poP8m5R ze)*9<7%PnDt6mq)#}FT`s2|j@FMOC2jn)?QC!7T{rF8Vxc!h8DcfLv6DX~_D3tOX+ zx_6>)5m{i~n3L$~GR5VJ)MJvzxpV73&b;%rt}FOe+RM#Osk|yqe_{uWI>rvvAoXrKoGJbQhSg1ZxCaZ}3u9_iC$qAp-`E7moQ>hM8 zH*;qF(S0SAR}0iL&N0-748zYHzVR7e_$QZlq{wyb=t$aXRn4fB-k zbG`+Zh;F4rirAe%3@6X%)i0o{RT8b!9wc#D6sV7d^@H)v4iV0qG5 zbXt0>utL1g5ojM1itnyzAVchaX-(m%!e@SAo-$k7O|5`aS6@(|#20uWI)y&-u6! zSj50gFkKx{LG&uu{@-6&IBRh}rj0tL!($K<(&gr#HL9}OQ&*O6=L<^`W2a=i9oJTy zS8{THF@2^SQleUTU5Vy^mNvx~pttz&nb9wiaCs=(1noR#+XQdx3Jj3rp~G3n1`W8; z4z>h*cZLc{+mv?gKxCZ^yBgpE&@$_LULAY2O;vRpa_ytT80Lsm91+-SRs3 zjJjCP<#;@B)MK_8&QStsM5a78$QspGh!f2_Q}%fI5{(p=_l6uEHrDN^p~96>^cPg; z-yc@;f4IP!?&P37cePfiYqvu7_;*hk(OuVXRiv^KWN^pU117tB)ROiTFg`z$vq}|^Y?3^4D?CPpbUHtgFuI=o#+={Ja!j*#7pB32MJu9VMyLZ}gJ}ffJ zo@;piugKg4PSZ*t0N$b^Q)1f>yur3d{77KmGuYry(4{hqm%4QspVGukz*Q^IG%2cI zI(z@ng|qSr{Oj8w$GTRGk)?aGcOYOXEWQ(9)mB%=d=C&#{kkm zrd@!b`|=5@{Hh?Dz`UFBV=BAVYAX1Ue{LeNFfc%{c)wKhW>3oB)}&=MN51S@^6pPi z;V(^vry}h=xmNjK1LVWpyH*WD%Ll+QH{SWaO97>7pdF@Yb?Ubq%R1;l(>Lf`{d{Yj zfD0JXNNPR4ll$HGXl8BtWbmT;t@U>fW>~`ea_$?3o^@;mLZ~;{mu5?bmw-?2=CA#Y z&f2?wj4E0|8w(fMm3J(=PrTMb_ZW$a*(^UB-!YhqbGXcE!BQ=2wydnsKTb6_Dq_z~ z$*e7PhW(oBxL!-l@4LGBS_bpqVg=>Zf{`X5bJHVMPV7QXHkmoql?op{d$*^ z)tX;(`1eLXAi7KWiFPWfueGf)5uO2N0JKLk1*NMrj{!Y=eK>w0e4-5J$gKZ(!x22^G`(1KB zK4}K*;gD*aGH`cwb)QwhfNbEhOJD~g&vyx2b}jJ}sb3zYi@h}VOV1}BGC(-|`d8$0Gd4eps)6T_%>$yuLqW?g4w>q2( zAU@^G>(WY48iN);*xJ!9*|UI4`&s5zxZRn32bLl()VQA;2_KyV8ee>V^}SK6)j|Or z>fH^#7df(1%^I!^6C?)@+5a&41@sGk$HOH6zOLg>eN$lYgn{hD#o{^@@EvD=D6TJ0 z$_@JpoV({D`Mq*s-Po~XON+SUeg#Ubc={P|b}vUl@9}QnQ5^y6KL2SC z;dc{;v+ksTy|F$-jMxQD)nF8Q*2r7oyMWN*>`CXqIS8SXq=wmjc@96BZo==U=e@zY zPp`OxPObg2-5Mo9$m!#TPtER(-C^jWTT0O(UvB@U35+iMlTPUKKgvcP%ha#<&0Tc2 z*4~uEl89Fx4FA>;_PP89d?S69PIhjxKvR*s$<+TXdvw;^ccq|%cc2k6lKkEfi3&Ms+hR$I?a5(v(fwFWHD2Oe@?OA+6{ z5>xHo>UnAS$&xS6QYY;g)gnS~)c6pG%CVy2FG$maf^$c12%3Ux80x2@7J^3rBx-{p zM%98iO1J2azmv|9Mx@9esPb-&`kTx4`9N^LM1#|=+QV{g4L#E$*Ki4c^2W`sX0Ekc zFwWy8jrgC(Q#WXVFR#Is=LV9$xAPm0`YVpn>gyM)I|$m(WT?oddR=j09XfX$vPR@7 z(~E8UNH6g_A+_enh!THb5qa-SFQP8SPc5dvd)8{yB~C@7@>w3we1fKm;X23{`XEepi?ia?Y-?%^$1ZNhaVs zDe1Kt&`Sv#kQ%xt0x7(oF{L{Y|0N#vPLF@bLbqtCQ>KVN>D9i}c$5Hoa=hBaH*@Xft+W)9JX#Uqn&f9v$D&uZQr z?;lgvKYkdHBqhAC>m<+`PE>)i{QS&H@ov_3sVl8T`8kSpd;8&$)E@`DdB_1-)@2#n z9H2pKvRPDBQW`5b5o44L!^M0@a;7(trb%<*psBR1H?++P?KB{pD*VrT0TMr8k}_Rl zeTWH!Pre&UxqnSr2h5!Jj>$hj{(EmHzqEQz|N;QP0z~P zB<;aB-X0 zSn@LIE(#SR%rnuGk&1c0@fD~ba9q+KbaywuXpitOJE&ScSu(V55+`)s{BYIfBC)3-(pMp%I3WZY{%{1=20MAi*hG-Oz zuQ#w1LtyuB*fxm>>T>0aF8+@Hhpn@Kin8tAy$S*<($Xm{ASp-=4U*C*-KBKLjDU2B zbPkPlcMM2(OLw<4GfbR$zkiL=golIH^a%E=3dumnH)>>_nA1rW=cD?L#uB*lIHl zSJV4-Qwtlt*57~e44;kj%3UTLL*C$e+AlBJmUE(e0S3H`4Rs8Ut|!+HdaZfQWnWWY z^9%BX3z2BeqN4Y0hA5#`3XL$X8PG>okdYjfjd5u=4!u#%{$W0cx>bd0rpR6|$QjU+ zo8-3Au`Lklw~(chyjuy@g~ax7RQ+M_Jk13#k9g8bD2D-m6t@;d$Vq>H{Y@*#JKCAP z>&?hVdb&b3O2|7!#ZCHL$;^+Erf=;xu5;zZ{!n10Sh9qqy|8qeP;zde**MPyiD;lU za`5+gg|JU7GI0k}h*Jvyj}A(IeE~fQfGNL|Ca2+ zCe*{SH7FKBKpQIUn&qzhL3$J>D z%4A1NgnHA+o>*e_O}QF&Y4yZy3amP1IQWTg~UI>ZDBL2wAT zBBj(iOLt66Q5AxnLB0<Z0j6qgKig$1YJ?hndQFG1_VoE>3`S;!w_D9iBgPYOa? zj^sI}Pae%EkNp^;3lkO9LK3IW3*X-|V5^dnlXjc2Gl+>s2>oat9z76v`R*oh*lp5PoCvc9$OcHI?D2!k^wfOLOCtVAHK zev!Asg^c*T?>unyd+)X!VS8J(yHJ(~Ju43p$E?;i(9@ zOd17!Ut;OX0Hq~x2})VpBhGDalwqZ$%#zWf{%onQ(gvHLfX9h?rLWQ`qOhk4>t#n_ zw)}ut@C0D2(nx*kPX1&3{SK_^y9&ask=m?E)w0=*u0nj~!07F;W}ZxhMwmD7M`v)w ziQTEWcKxCkm5YM;($DT8uXJQqeHvXkYVu}uzbZ212o)bgrJlaq!4v^S2yGwG>ZAy zi-=MFcAm#)vA4VPJ&6k@AFP;JoLJkyK9S>B8}@d_YsZS?Kt34u(;K~dbp6W0x6}~# zhnAapu4U1NWp+@#5#$Q(E|qahs~=pEfFhaMwBhklajvlZUVsb?ZXvU;_k1EQ6D(QX zd{IuEFmtCai4!ztX5ja;FLaFlHRcZSYAPg-q5HdE6;)YXuzcI#!p600%c|QOc5v{C zo%pcqsMLt^srJexOY%=Rj}Rh-H37bZ-p(yI-#<}oziVRqPZXCnn0$h=vL~Vv80ny4 zOGuptpX&Qqe&4c<%S05HMQPt@`1akKk+FH1D(=VZ@=PVsb-8Tv3a?%%L!--xw6r&* zNk^>amhMgmO?Ixe2<>*jp77m|eyAKbO|zs_{B%3NT>+bk?A_~#9s!;5(*hCj6T z0xaymSZ^P{#>iL8Jmv6GMO(y!**#S8eO%g(e${tp2C*tBjZcKZ-KL#dkozByX{p(- zO59rYKfCI+&V+~yj{G8+xP%=ar<}J-CKO{8JK}+;amOjCFN9%9V!V1ebU8qHtq6dW znGz$a4@Y@oc=(R*U4zhW4*DbGuQo+I5ltRVenT|X_ug}Yy*2AG3}1~nDzMKsky~ML zOow5&_z$S80VM1g21*t;N!_u$e3pG69tPROanxgDf<*nLc(J=8b__F}qNJc7HB~u={=@Q+ zKN0v|AArn$z|pw*bwxj;r@;tzpClDjdr)|{9X2NJE7f}8U}|yU;PIm_l9z9QNnd=O zN$w(8e3!3fJF?h0>qLJ< zgmyLPxOZBo2R3p_*3@R_>%?4y=bJLRdy0iGVcO;m#@eO_eG;{cI+7K@l|#53`|%Lq zKhkKo>2LkK0p0z6z>@mDSfUVh*NjWJq66z%;yuYLIrC(tbZTPU7Y;XSm14y9d-%Hg z+@0*vaduZtwVZIjvmGrIiTcW?47H1~P(J-kn_pM{f5@Ig+c8)CC;(p-a4?@e=g0M% zcbho2s4wW&ijO65p6|A5%C+T^D=_;KNl#{bJ#p% zJA%9!6&!`JU2R1&49Lb;*PDBbIK0d5xH+j$DLi>fAg6sl4qm!SQDg<_z_{j7(j#;P z34!H9BBRbYo~wzEn(?=0!9YRBPKnhDMs_hlT+y^W zd)Q?pQz+9be#ClEEy)vAL&8dN`)=}>gq&P8O_fKVjbAZ5kOa}jR7)_Y<;dSNI*hAd z1pktn z)eqDm^=!*1=7gVH`J)vYnr8ESu>?M-V-+Yw-rz?rnIAzObK*Qr&S4?m?+H4qB7#aw z8b<}>Pj=wo{#`jYsBfD)Ed2pnyk?OB_EV5bL_(==kfAiI&|8Z(x*rjM`;4*vu2Zci zFOJL!Dj99)qxNeIK+-pW3pF6U@W{{c-g+z04rU!FpQSl0ba8rVk@ZO=bdo7+LS^e$ zX<=S1k&PC&0LKlJWBsnRQxYu!hU4!gT_5MJ)z20P(!Ov(2H}u$;6Z!lPY~#qEBSpph}z|4)wA@uo&c}V7sK_x13mz(~B z@`Jx++&ZhdXX~$p!{4-7R@Qc?2+je(*W-4waAEsjWo~Bp4~gp1gF~#!wSOi&c(mWw z9FyUU?wu#-UnsxMYrak)n%&~Zl&uyS)&tfFS0DCZVx;VhTt!ntt^SD$p5o1h*q-3+pCfTQ~MhL6MBp}rn($S_l3I0L#$F9)F-$-6;T)j}C zrDHL*+mRi{3ciFDRtA*ph$9CVQ-bablptrxa3zKrCmj71^^c9$!G@?Uew;jtjO7q6 zzJXud-wJC@dXaVwNNOM9p4gf0jQ-yh z(cTm=>4z7pX}b01YF})JZqeBRwS~;DKU*H?EQIWv$o!yxKlQ<3-Te>LgazRxt`TAU zckjAz{-~$;A~k^el-dyZittg^V;Rb{16+rfZ@f_P+lYy;!zTY7GAV7HOAlf9xZOPD zTl27)zW5YsSsk|F*2v z)Hv?`s`rr=yq&4ns|otvXpc>r@U$#HatR~sg2~G%*#T_WqRHn7WDj{ZfV)ukrnZcP z0?K}XB8qJ!9M3!)JIa66Yx8%!&v~{&O#N3`Re|LpI5nJ{U-L{w*S>mYw%*r2@EW1# z+xcWikZ$Y)WETbwfj`ywy;s^}HpC!&10@)HS3kQPF+N^?Lj1GuhTl``eFWenC%2M% z3L>&Wu7Y;Qh?3^hx?_!cih4Tm5hf<6lkRl-l+$)B2F;yyeOi`x8d2LKlmFDv0bWxH zS&a>VPDB<8$VtG6O7)VKYu-?^g7qHR5PzNX$}l0VknPp(}sAwR>Ovt)vnoPMiTGjL=-}WPVNr+Bs1clqi|4 zYGa0IDvkmoOwPM%m?WPfUSQ@g7^xL3etP??E#T?wN}FWTx}!=oxAH8_rZt zJbMF57bd-Kn=ug>IaC8 z*$Ab};x8-9`};M02pIw6v&V0SP<(Uv-wJ7)jFcX_n^m9|IsUWJZ$Gn=qUvK7s1G95?F9#Q1M2o1+xbAWK^)Og>kfm0Y8hsIz zabmvZInvXmrF1Oh_#>sYZKjs0Oiw9~JMQ`xiYZ?i;JWL>AThA;BQAE2QAIqLHDe-v zWC;BQs7!t>^5ZSx(B;dHmOxthPO}qBKd=ZPfq?$BJ43>i5FD>UOBg6j9|v~tS9u|j&v10%2Zf! zo5UG*jUhf3zBdl#N>$up^K=E3xc*I?eO}(a!nJNgbLn=%jl=}x-mSz=D#j8`7z$TH zP!^&oXM*l!nd84)kN@ZnC=cjzS+m0XrLqkof%0Uh1CCQI8w72icTI#Ny+wuXkM_P5 zqn#r}o8RI(J9+zd^)ueX$3l~Ia9?&%JA4aqo2UcnL*@NjmYQCpivIxl?*YOnPXoA{ zJX0RoIOExu?OtPkO|+(beqVd8>i}}S%^w6v6iJtQM>hr`SrOuZP zv<}yR#qpI>p%9Oq6mC~Xa5U&gLe*y|*(|7RylQUQX>EuPWo(Xsf9mjm9`glR{HSd? zhHKBpR=jXD5fGcc_{mJ(#JmVvIGakg>%Z>^drE$GD6>8-YjIarf51#i_9PS35|k4G{K5_ITW_q`62|ZclA4ywE@^%J?eRFJieahw%W?#tItRnWOcDv%5shU|WM}k!H)#hO%TLFYx+|ZP4f>ziD*Glp1 zyXWE7>y(Gpx*7&n1Dd5WdPg~(QxR%^tx~S-VTF|c?1Wda72$Y&Yxhh33gpG>H7#)! z5AhGL5zI2Tx6cfnew2UQUPP~lXN!ai{=A74efcs5pRS=wrDncSaZ*Uq0o00L$RU; zid9$s?vI0F~}d` zu)>R$enpKpuNPg4iu#59V3@1erDyJCj`&zY9a>r{G4&O#@xso&ky@&{4QR6gyagtlNAwfOl~`Dc$5 zd7s252Fn=39?oSs__xmviWUV1KBDNQ$)ia{$FufCSId{9raolNbghiqFF#YobzNIk zwQzengK&$Wt5EgM+&HF^U$9N6_WJp3Ww5vAbb98ZA!%}|GSf?Tk|wkal>#*X93U2wJ9m@^%p8duyuS!r5&nQ7csuivSn#il! z`3Qc$z45D3md?n~Z^LK_(C~#E1vmQv=~mOaGb=58*4j$ayDpa73n-R*i#+fkApHvq zYF+}fsbHUBJunJR1^zUX<|=5^$} zuL<#B6jbEBR7xz~SfUMIzY6Fk=f;g~i-MxGk~y$X{yzjo*4bs2u3u}v%Y2qG1VaU% z)@Bl7uA_tPYv;Mho6=>j&&0zkId3WH(xOQ+Bow00RDZH!K2A;`gNubz5FJ>V7sJmz zXNvjb?c~+<)b1yTf0&BMm+(BoHY-BZf`Et@V^SzRv4SXt+L~}llKN-&x%V`_)^T(; ze2c%(v!GW-k9tZ))h18s&BC8vsE=CMuY9O>5MmAK{nE+$r-wgaD5BzjfD*>@>lZh$ z+~;=jP)STbqj#e!m2ab7;Nrs;7pGKadZ~LDoXqApt^?BFe95)fq);tjNQO z@C;4w?>{8VR*NBhBb=RMYXY~uWjK`B^s+UOe79L2APgmR)0h_TOWaarmJYzx(v!)Iy*R6B6DDcx;oB9GccSn_fbi*;i|1%I*qAF0|hT3Lp9I}Px;yA z;)nJR3S#^ssxqqLyMi#%zWX8g)y z71yt>pE@|I1JfVBLn=fde%+k^0H896(@~?5W$}R@BhI%5Bqlneq|zMZd8l(Ju#&oXQs)k(zpt8IRc?FX zA5d|!IHR=Rh1s2`Hk>qaV-n$?lnIXgA7pYY78XK8(>+BdEKxi#cfd61_2Y4O^s-SJ z8Pt+RUS-;%#JxcL_nEL<6yvb$yu@wC`{BG1IUmv~Ej38;pbp?tY6p%P)E8ruC1Qb; z2*o5m>u@X|$D=%bZ4o?E7N?O*SG%90J2mAOo~6R??2P~L*^fMH-r~b}_JVlv&u!2T z@d|~saA8}YlC0;!wU^A(Lnh;$RyR~^CFQ+4rQg?nhFoJKe$1A$af9R)ZJss9 zi;pqcN2##AY8>>o=K2bA!1xazkLl>WP#j^Op*#5?ov*ZR6av)yw<_lZol!lz#rBK;_LJc8i zv}}<8{D0Vu!?uOQwK|$|w0*CfRZ?vT{%QNeR9`A!2-vG7$Mr$cm*1-Kd$0zdL|VVz z2jOpM*zwn0*ZjZc0-z|9(BOkF28}!OyCjl&2Sg9S+EBfx2)zutS0ZR(u_@|4;I*LM z)52JLY7M&11ErFs`_%Y0dI{1cK-rl3>`@ib!`S;yK4?}Rys20I>-ndnn;Ep?Ag`Ep zl~O||41F6v1Yx_FP#P3LvdP9E(I>=zB6;Yr>L*;n1{D;I?0bs!z#2YZKb72WYT?Hy zzwQEqr#Kn_(+~aUkP7|4S=gOFbX~<3$q%~1_5tbqX_$GkCGcCs3fYNZ()5VWf6!AG z313UVErJ8Yclu6C^QW=gy5E$d;X?Q0_CV!tgI&LfZTvLfh@@TW;A9?y4e{Rm9;H5b zWBZGrklZ(RbLTmW%Ox9erOV1Y-B4^9a@9hDEDP_q!o<{s&kASX=)Ii>G5-<=FisKF zNr!*q4YI`NBgHWz`hDOGu8)p{t zFkK4M*Na(wg8V25tHJZBjq_jdszmDH>0A!=+^Ej2p1gZl2oS(*H89QTXbD#aZUnF+49g_I6`E?y}yC4-4Nknd4v#qUT(F2ayjkNi@ zGsAU9EPU|Z;IUSOPrg!s)1}w&43;=;B<0C%pq8 z$I(9twy&~74I0`l>U?VR%M{zzwyE6;Z= z`TbHMxkP?wKxvo)TrGd1XtE&p)ejTYd-%24%^8Qjk!c>lCc&(&jF(o`?U6gk4JOq5J`Eec*N_!AZ8ZC%kVd9Qw3^CBl>8HeLoYjs`64!q@n~2JeMcsNC zgxs@d;;@~2j=4CGmY26Rvbpdo>e8Krr^mMwJ4GFf->Zrh_P#u0_l>X>kmsELZm^#- zZpGrg)^=p$VjXS8^%4`OH@e-oH)cSh-}KSRP1U6B3%+Y}eChh{m#r8A9kWvR(EL$L z=o|UUg1K|%hi63#>O6iAfuk2gE~ektSbusb)wRRj$@rUMWhkLfdJzHc5+J;en#`kq zc`+`>B2m_P>L%L!02zIe^tAM)7o4>l8U1vE79U_lEf?`rCM}n<68{$`c@&K1Bs&Ze zyCa=1w!n`0AXW9ye}WFb@Pb<~jCQ1wRIzFUp6Cd93+ zHlMOh|2#jiQQl{V!*?{+Uh|ogoC)2Ol8=Y`mXhi#CblQPa0<`pWEXvGe2VR_8lHqx z7FRF!tNg4JgU*RhvWBc^1DO*WNzlh|$&X>DH}WEx#xN3pX--n|{Nom0+(H)fl-D_B zTYsBYW%D(7v~9#C%KE*s$V6w7jx%WlMDsF_{ei2mJkYL|d_IX+OPx9o#iA!BGe2=7 zpT^LUhN1Hgy}Yygw|O{WdkT73M@8aD)ec8<@ODZt!X{=3E^CFlGJ{Zr3C!FlwLX4k z=Kk$4?LF@Rj>6~9f5+}NQ`}s9);Zq>W}?&-DlZh?@xk&Jkkbc7n^#T015PD0I)d(X zj|x_vnD$!p*P3T&Rwu0#wg|)|BKlidT|(p{Wo2a#;E?p z%k|+kH4`TVZu{(rz+6(cR=X0yD(C9Yd7G$5uFRE4!JOA!?cYLee`p1iUIX-2VCJlxhe9iBty37Bxy+^3g>US3cg%fY%x zy>M+76xiT}mv+5=Bg^dD&GAskoi!GkMjmgwRZ`5L3ib$Xz)ENXDe_CWGMyHWHo6)G zkJS!?tYtou3s zkQA9*q)t=QM+Uqp=p}V>5#CWn6RvUKrPe3cLBJV_mnBmA3j8VIE>5d=+eK1c_lTUB z&_aGVYbXnb>zSTz$k`TnkGs}F9^0C9L+Wvpl*q=F!YDByToqo3#Q8dh$I0?SSK(Cy zHs1D!Gc{WezrW2K)#*y??-om37TF>qRao^ThLSj#xidif8DfL1{I9%?5BDU$zIx@! zq3ieb41?7PSSL#>09BrOh-@9&{6NqiQ$dTkSTq5XM1{S!Aj||*0q8f|<2UpKGzT{Ob#r7ScZP`{SRJG3mKDFX&Ib?8DoXDY)jF|QvzehHC+{;I@u=+z{586~MjqZC zRyzIqRXB9oyXm}9{&kyKo!JG&W&b1R~jLA?_q%Ag#3Zkz7d>XG4egi4<0x`s>ka zULKo*8btCdt*4{v{69lbEm}JxD0?J7K2qzk59)m%-(va4*a=>D{~#Hzj!ch%2)Q1d zgc%&c`AY^j4Dsm3242@jT64lZ8=Gg#qmd)KI4_%~UmfR^T=1}tG84RH#Ig}i$qbD7 zcj|JrJA5v1!&+q9SOEv^v}rxUoH*Ui3DWDH8)oHq!;yaJan{kC9+P;$ocH2MXUape zQ#(fR0|ifZPRoN1rG*rncxKc<_nMLK_DO#1Ons*C$eMHbr}L+K90`6K?33IL2$SDA z^MURWik?mf6)bOgT!4Y;q427fk(PiI>w{xVb!A4bfplIXD+cGlsU2}|Q)j?{M~8q{ zW=<|to zOY4^M^z=ReHateSqGm^mCuQ5SsNZ?GbFp~aFe1rzXPOv&RDN1?`4aPB)Lim;#0 zDL=1}D_<){nFYC3O}(qGMU6SD)4`HiDBDa5<+y8_2{zy(0huJ1$8_i(aOl+@mLIvj zLw?B}ZuWxMKC3^cz|xNTD5Kpj)fI6O?cJLFXg|@l=5Gn(V@k`mGr+%Q*2Na8RDi_-D5J{p^#KPm`S&|^VG{3#s)-UG_B}L+ zK;^2`Nb8sO& zF0U<|V!Y8BQ~~`mL^^*KwG;UnmCcPRgQ|NVuj;^vlTvg`-8Nm7UyCXo;y}UajZ>Cb zYb2h0tbXd*i6xISw&2$Ez4H%$?0{Uf_T@A~o38X8Em|w(ChWt6KIUuwC*uGK2~zbV zslP_MQ&B9fCf#W1#9YtbW*2^<+$pKN5wcF=Sm%Lh&v<+A9*Km zsJ#HHEwClw)}|t_aX7Y6JFIe6Dj=UYYh#Ax^zwVdA&HjOwm>2lIn9lY5uQIAylxLH zAjnDgb#-hips<^2FuWd0ro2`5C8P>x9 zL45?8hy3S?5tSC?IQ!qvpfAMW<7#PXQH*$D7RJ%lQmS^e+9ZZAP_)ape>NSzfL}zh1734VsFa z5h<;9M90-@Xym|B1Se>P=TtjZe|WTn%AaXZ3i9>MYHwA|XE`C>xFdv3?Y3s`pB-^| zwK7meYqDnRsqss^>zkeZBtmj(%q`RzLWlYSx3KdNVyv32f>pHoWyUv3`*>NE&%ceq zC(VH9%efqrO$D5-{WdPHd)fn_wmgP#oOnolArWt-n*r0Aw|OY^Z#TB0(!xa7%m<43 z>Aad4=22X6@Ry>~l+ zkHf(Gn=PqZu-o6^G)j0yMRde)*@Qb#ZW)Jrj$Dt1P8{{R?O~r}&S+{@wQeM~&oIb1 zvX-E^>!6FC-(1Y)+nlO_+dI#U7`}Yk&HEYmwLNv1)e*?n8_*V-+jz%07NgeRTBMi7 zp;vheqr-Y$0?}FBrY<$i&>n-_a;^=}zgl)eM7X4LX{;$)1c#XYgJKQ_q?Q$h_F_Im zqCwLi;~H|GHJK%6i}#GmCBhV1F2*MA%Pznp2h;+BO9WUCu3zLfn*~<;Li!2u^n8Rx z-0lJz%&+tyLC7J6h1w3B0`hstU0geAtm)jnj--cNXOlNyoLdr(WcJt~jkhB_XZh z@UnHltGZ=}Qiv2db`uYhg_*fS+qoXHrBQu+g2z=Z+ozAFIRG22-W@yvtss0+q$>bk z9k@=}**%b@TOf2-{TCsWaJt$Pn=E+t>H6|^NG8NihT+5Ex@aBb`vYY3miu(SGtPj0 zi*J4n!K^2}&Txqs5;LCdZUmHVXMfd;4>GPaO#bm2q|e@XdleDNUA?<*ymwlM@)%pp zI79LEABiU>ewupK-QcypHBI%k{oz(e*OBB~Ri1m$0ci4BTbvS8_)7qh~<%o_Wr=jJ{CCXqyyD>)9Fu2d5EOzC3 zt|}K)Z>##!;4>;{Yl5P=rMj!3DQXdJOVNsIj-qmkb5>Q!)PwKf337Fg+(h+#@wuM) zBJLZbKLdDGpwKstb>@RoXcvD_X3N-5pNU+v#3my4%8P@;_` ztI7@&l_?DHrg4Hq6|vV-8pxeYd(&TzN~ad^RvaL7^8#WvaK7)eUku@#eCotK_q9Vn zYp|rOCKUh71=?TT60I&A4v^9kN0ly3>AiJGNcFsyO#d#BVwLz?|VK5SV^=vIo6xxe}vxrA=l z`Ke8FP`H?ca}s41-_`rbDB-c(ZlN0fX^h$zQbu{E-%-IL#lWy^bt4D%2$ zQ#W`0y-2uc9NsA_LZZR7*uT11QhwoA=$U@sZM4a8@P_+ z&i!x8?D^0FGScQJ_~)hc()y9kYFKKz2qx#2pNmj{o6FpG2BDUCRr}{K^ahb6CWm7F z$#@8Qb*q|I{c(VZ5gviB{yZ}kwSY&{h9@}#rK#^!scnSazLyvz78l zHDR$LPY4j*c@;$>Za6yDgbH!kRL?=J2s--TIkj9KIW1n>fMrnEj9&z)77U*VfrvMk zyim^$&w*n_RlpcOFvr$XT-3s)H}51C(M!pUO-M@B@aX=jc+-}0=7wh){&gV1BDaUQdQ~q`ki*PQxA97$4)l@w7 z6%_7o|_}?-`rzg9wNFdb-T-MFdy^sdooCh4a3b4Z6Vq8rNrXwe( zbHEOEnQnU_Go>VKgoIH@ulmLSY!h|;q7untC6`$kw6)6O*hv!@rdn3I0Iz;rVDfj( zM2!gvXpZyiv^2d^cuW}CSsSd{8-9l*D-f#6fA}MHZ3T)3?&D5}%$1$F#!e`cQ}O_h z7%Dp#~2U9l>ODj-XdczvXZSP@A$|c06`-0cOJY@HqG<6oIvp8P~&co`=1F6@P0SO zy6N&Ra1DqUEwvXEcm1g@c0*CA0t{TwFrJtMi55;|Z3ki}E75Il?nF*;p#EB+&$3_u z>@&^CObZ>Lw}&R|TUjp)Dsg>OnFKWi#ASBgzFTK-Z)J5soHndzaaNG#Hw4q%c#t?D zFwP-RJ^0dHey?{D-DWocsukHJt~jOJjC2fN$OwRY-l{&`-ba@&s9_9zcqE`5O4^F{ z7JD4id2<&6<=P(tfQVJ6^47IvY+6hp`?AEhF)Ne(ZomWIT{^A#Ov5@MX#XMHLfoOM zZdZK~`2`@)Z-@Yi5ET#FRtr5rBtKhr?#IYXF)+i=n7QEB3}#B zd3X2~@L_q~TyXykr{ae7y&+kT=%kzpPw3R5tib?bL2w0b7$zF(y#KQ-p8-iiwvfl1 z#*hbyw{Ji&qo-OORBmeS-2%+q~ zl7#yLD47N?AeV%Rr|%5&$6vtsPAAGuBE%mp8}UrdN9th)_r-F^W$g|tM~n1c1xG)7 zz1jR&A%KdDyMbVBX24MF;?0fmvRIV|jg=bOH1bC}4Y*sRQW;Q-P|uSG&DFXU#|(Y} z5K6r^Ezcj~8?Byx7@vM4;)}0AOKrZ96KA>--mw(Zha4{oy9OAFfz<8d z_3p=V39 z($F)pV!hPS7B%(kg7~M}qe{xU%z`IvowKCH`?KCHgu=YdObHzVL{DkL2<|+#bkHc` zQfCYNh~TO0P)v`RDQ8p#b)<+_u3vq41{vcDXH7oH{kZf}70hK5wP{odY3cH?-=8A-&UpDIz7ff?2ut*mrXunSGm;Yo2Q-aHVle7}Oe{0SR? zBE6VcT7+kSHiy@ZtY`E(r7yBw8xwn*J0E4>E}wfpR3e>k$}(GilmtvWkv89UaDCxR z(YQYR`la*3$MIiL8%$K0fh%JgD>PiX?A>%m1kxCF*!Hn8 zW-M+EpG=p9jK9yO@Zb%&&-s+K{Zv`3cMoRJPWHGb)>Wygr!cD8V<5Pzs`+wUG~$-q zAMEu~lx^waDK7rXrCB@|X!v$X@N5}Nh*V|;z5r}YDWJW2rj#ufGUN%E|BV{m{m9$* zXX4{$zsNB?s{5}8cPj>d&#zd|)yu=%yy;*xCL4?a*Yvb^H63Y$z!0i@%6Oz%xn*ITeWS9X`XeDRc)^LX3qMM<#vJ~A|gH(ly; zdVRticN(&TqZndZmm2X@jgRczM~v_k>F_mze=2S|!9Sf^KVGyxr#w=@49&J!04tjJ z4dtse_q)vNQ_$iP;^WQ;9c?7t3Z`3g%^tS9zhqkmI6ecd1Bse6(7k*%kb%!dSB(E3 z?D;!&3+6G7Rvwz!9v4){ZD(N&voP0o>Cbi7Bz|bK%44t&A$V+oIYev8N${KL`_#Fi z&sXILcwV03sOE`+lXRfRI3od>VZ26T`5 zt?(J!S)^4gb-(2H+nMQaviK*bW4*bUn&%G%;1MwJwYzRcU+PRsw7}-_N&{TC0hYN- zc9K<`?~)!pqUie|E2T|N-9@E%H1W$#4n#s<3~?PC;VwO;!<>&d;W@LLg!UQwi1u;r8 z52=mg0zYug$7Y4)(?-TDYb_COFV&pWclczfI)P&RZqH3e_BmJBmWN}SfRFbE*w*y^ zIfH(?LlH*a`qN%}bq2scA|(9MmIlfmZw)-DzTzMW@TKB}znHF>^P635|4Ur(q8bY2 ziyUsOs5DFj02t$v>vr?I`h3I0oELFYqTW{$$qgs4%p9z zAW7uZC4$^HO%hF%ZKUpOmIHC-k-%M=epM3$B`l1a7zF^0#{5iwS8N0j40ONdo&*^7 z@9}*jpWjQ^r-~#_@Q*szs&^8CWyS9f^{UEa&_muhj|@<U#kp@BGL<(xExs!{UYceG-ePPVdNJcM%&~XH;4B^dhfzu zkFVxX5O@~_a9+P{;tB9a*GXR*%)Q<1o?P>tzc7BQK(s&HaGnh)DQw2s`aKU7a&qPK z9AVw?J!&}LUgHi3Hh1Iw`B#tApW7!h6Bx3WvRvxFma`jn-<&1vut|{?SA@Bxa4P2Y&JCz)uvY!{*z-O z3-?qn$Akf#^39KXyZ96*@c(pomTysT-5LiT1e8`{0O^wMjzK^aNkKr$0qI6*1O}v( z?uG%BE{6_bC`suanjwao0qL4KJm-3^bI#vz_Q$o?eP8S2{;=2YW_fNIVOjGtAjhm_ z)FjrfLMYU(cq&oSWsaPPhW<2LLxbUGl9g zv=1+aD<1NsTU;(zxY&6E{-G&YIx*+eSVQecXJJMPRgDQ)&%U!CNSxVr^5l0^`mV1wJn(yT9iTXr z#&>_7t@7U`b0p3u8}Qf^_d2DyVc8bW?>FvuM4p*`Q^N+ zsJ$6&bgT1|JCZ~yhF}gr`5I;5c5=QS>{d4@@$H)h{3Wv_w}W&u2rL3sr@kP6n;3Qr zH2Jp9?0WTj@_h3kPwy(AF{$v-{hs&2*-`H$z**7se$-#xQk{KeUaGwNMCd2{x0!}3?hmEFU z(E`wuvav?TjzsST}e-9vFr}#6x#;`=1GhFkp)hBnC$o zy?@d*Q>we>d7lyX1_h?x05iv9wTg8(Zb$zCZLQzuxG4H%=VD>)pUGYKTAxT`W=vVE ztgJW=<^@D`GmWi9%EFI#H#CzF~NJJ%KrQowz? zyAz5W2E;=(_QhFs4>+ZXeeoO#KkIQkmf?DAfryMbtGytn<45$jH->z@|G+pw^4-JB z6V>w4XuD)phS15sa%nYNVb0h{XWEZELY(jjXjW12eK<|y?{{?4G^$|gb50tf4SAm` zt-qYV<6}$uehe=OWj@-xOAJ8pTMpGf$N~G2T7uXUzOf3BTiME9|M-|8c9@VvB0&50 ztjpdZg&bG#$!Qa=(O2)jyoqy?k5(v}N@7&cyi_7>m5d*t%AS3ao&mj_*l|{|@j3V8 zvlU(F_HV+$jFTrF>g*6hCIfrOKl&!3?wOsSjcU`=ZY{Tjm_Y)HAH%CRxdqZ4%}mV< zm$&uX1^q%wD!=QTi^HfjcGd^fx5l%FrOl1C7gp9e!9=XR%i7o~x4`K7dhx=EXON)l z-2taZS1CS)Pa!(4G)lZOGG!cpt7&kX7?|sR7Sme*_FMhrnT~u*eHaG(tR56yr8>h5 zCL$8z%MWWd1h082UPqPbCX-74`F%=qRaE&&(!=7U4_9n2Wyq~%|ImmYl=nyy`x9@c zTiJFbPYW~T!p}E9NG@em&I@X=`R8Qm^L$73<8&ZNnvL^flX9TkObm9>B|!o;onf%X z!Xxp`C32&dTKS5~WVKj%tKYM1;S7a{b#PCY4tBX$Ap;dn2_xX(#|KczSCM8-8)tb0Yjq!Li|m*`>3 zJAg9kT3>?Q0NHi`D{R|A99WR5>D3#Qk4RN!R2ojA3if5aAdUykhijBpCWyTd%}A`q zNWnV!1baaC@=1PRlTu+5+8-NSPhF4l2_1o|Lk@1izE_LFldkD_#4?Al9L-U zTl(^3;1Pd(FQfd0C4UXqlgl|W5_02-95Cdlj4VHNK#o>;^iQk}KSmP3z@Tnh*pE>? z1=vdk$<20j)mkC!kH!t5S;ejT$V&30)7+UKnx-)#x;l%{(00PTdq|nKpgAPvyyAP? zv2@qKhdvWVq!=S0B*892?xt_V5fz6YlKrJsfV<^deU&B9XH8o7$2%|N_x_`6qhwJl z-0cJTK5g(9==op{_^NCrG(s8}jG9H%8!(nsIf^2pRy(uA(hu;sS9IjVK3d%NJ*`iZ zm8BOGu~B^GBkE~>0NXyVntLUU!%<|VDHa0GSRJ7={VCW&&Yr$2eMWE?n?9jwI@Y^; z5sWefzbTu#I{w)0agfmg1&Gp=x~+~lv9EC4s&lR%*uTL5d5;%b966$Lk&=OzbcT=IC5H=Co4MRfH*ejQ^!`l1i=>=$ z8vE(G+&XWC(8wX$6n1NDZ4{rDq8Q53!YCok%fN2#l#fEX#$idU`z74ZY`<0r&(Nf2 z{?LWN&q=+(daW1*M8D%1uFLs-4Dwjk%wE5F zgG&aQ`TFHZWrewCra91JWRQL>RV}G@BTwoNTR%ZZM1*BP5W(*1`Vyqi&aw{Q{)hze zQo`-YauX-Y25u>CP6b&an&mzwO}6twc%>b zer{FQDI;Y5PNXJ}DD4{(4Vgdb0KLCy&Gxqy2@|5Y?x%eyKYpW|?NZVjxc-VCM`98N zAqWht=lzQrBa0%_?*MW)3Q z%o~dPrp56Edyydyyz9-1PsF@-|C$TLdg8+Cf92WbWK_0izF*d&_1_RlZ~0{HghtHc z;^oz?UG#RqE2CY1_2n=uK4o9>T<`Os9CNL{4I+iWWNBe?MBDOQ@Xv(9`8#$dz0C{J z8+px2%@Qo4biAVDMUYs-OpV^INYd5--G(%4*yY{?_;Nk+ zdkv@AaL5qBd;S$=bq^W0wk(nP18G_si;4wpKbMTkZkI~0W}elzA;X}qQNJ4f>(fUo zEA>rHc?sm8&M#K$l`Aj0BOO$u2^nmmwVskA2Gw~IC|hWN0d88W!d>wo**h2~q=8dA zz(7#mD7!1Er+b5Xv$4&W$5qiiZTTMV5-nh!mm1nLq1`#B)H7pgyLrXu=isI&R3l*H zGQxFEf}T;S>r8NB;7O6wIET78$Pr3bquY>I_N4&Oxs8+YkOLXSdnzW@?|}@5#GHFz z;2G;MDXBQV-rz`+N;@GxnPD}5ry77(sX1#Xi+e%uSBMSjlXm3O%4gmmekrz?yttXB zpV^pGW2k!?*Ie;LPojgQZf9M*bpd3cgLWPzDBqj?>)9n=`gSzRQ92-a>V;07rH05s zSvTX)gj5)nX`oE1Yd9tr;Yb9n&nL1wd~WtpUn8;-#EwlR$THKh)R+5ZcGPXl?Y-XvjC2?p?T~pYptK*jnnz?-1 z3Z7Yo@Q)hL|0767#y#=dTx;{TNkn_l=HNZ?gcALA^BF=K{7vux>6|RGg64Gew75jQ zl9U$xZhFD~Cth`2``ZJB5d2NgIrL+O(BP4Y91Rb$rIq~#{?@=Vy+re&5)C=>>L zT;&u#ZC$Tld9)H#-TsMEqCWnQDxqhfufFh_vqV?P2G`F~zhDs{BxKu6B6slvxbwxB zkgAjom(_(f2i#drN`X{4s1O`i1){xDVULi=1PlemG!9ak)}f=XgXD(dZf_RUhkUlb z-1t?KWlR|8?ED_K7`9rfw?@i$r$*1kXZJLtsV(tN>2`6DpXQSDCJ7Sj%oNWBL(Nz_Bz&%i-@l(k#J4+V>`&*^?r++mm<4j=x?8sh@BU4`z5XpO>t# z&C8NmZ7V>}wzPkX7WYwOh03<;%ub{pbLK)bx$+a;htDL*J_h;AA<|MT?rsc~jXu;! zElh?Co84^kO`y^t*#^6RKa#=t|7dlO0#4A_l=y->*5J69LO$v00+NQs)xGICe;*?SFAAG z9qsb>E8W#4j>cHWF)*;Z;a7V})TDu_^l2db8vP8)d@r2Ufo52WpIu_`Rq1kM+quM$ zcexovP&YLGLz+ShzNzEmK3zFQAJUrC)RV5W#zmvQQ$}eX2=v0%qVGo;Uvg*bJ0dnS z%#i5N$*Q%=pvid(A9Ic27_TO~U=x6pqBRQSr?6v5=NN#C4;R?1^v!Z{(pP7j#mY6I zT8^(-hkF_h{B~J@3qNC}(!(E$-?$qD1oPeFf%ct-n`%pbgrzQe*GcO3uZJ4=8f})k zt}-U-_rhTFKJaLC{Mb)5R<8l$HI6}_jHqlyyJ{2i$`QM7MS3!wpBl0bvn>xJsGWU3 zQkRJ%?#Xl*`nP9jubHi_KYZrH9x#(Q5zGnj?OibT&~5=8kW1ROx~UF{oJ!>`%~mkA zx#L}w>b+Cny`DoY4PlZVpSK&6-~zo$bP&UDU;>qsmxl7-aEv}LtO^38R`Us*NjI8p z<{648A4(JmuJQy|)>IZ+8smn~Mr9Z0N7^fX1YG=j{N8txK#?|e5&XR9o=6?QdsYL# znW`+(#^VlByluF{ASklHreQ&^3E(GS_FGGWh$|jw4402Yf%zbS84|U=z~=d0XhL5L zxn06zv=kY6gu-c^X&GNp-n{F9GMZ-Z?_Q6|YXYTJ+%MdazT9-NBCmYf9%?ym4!fM5yIkK;Nvm;RJnSq%3Deb`*au0}%{r~X^ zZC_#J{9EDZX+u1rlljPQ^sx-qg+$+QvF@F)JkI zklX`-@dfCT>9k#qW4nt8k0gs|-0;iS_T|2ecNghmTszPCA&mK3$=&l2PjJlg4|C5v zg?KD)r{(`leVR}+d3Y5+zWvQbeBuq1X*CIwkhO22$rTp((%v8KXY$!rl2D=K>r!^4 zOH$$2|USuj=B!VSmEU#pQ9G~~7os!LK&@rj@ z5Rk<3X^Vr=v3Nw%r5{_O$tCzs>Gird|Ghox*doi;$nVbe&DyB5-GR6q1qU2e&~rvZ z%NLLLGSZc~^Y@{dJcV`l23w!@K#wM0V&8Wtqn#U#!iy6qJBLDR#wI$|eRmG14*)&6 zo|`D?Ks-Xw29O@|o4)U!tbA7-*wGVR@k!1`RLhX)SmJx8xPxBPU(1dCLife&%15au z_6wbDT)e5kvujq{Hpx2MmmB=@U{h(0`3p1N&zLezuh|3&HmHoo`LWq7E>oblb@n5k zWoF#J8W+%7Kfe7Ll)q<*HT6k1aov^0)OKF*`oM0ZYp492=INHXC#Jy4GnKB`;(D2U zoIwGf>2f(Z(jIapvW?FC+M%y?sUWnB%b4|x&VEtniOdA{4()l`^VvYz zf?A@D(iZK{TjyclZRfXetf`ZoK7Mq^8VTFmfnHgrK}^yam|Li-2Kv`{)AMsFK$M0% zuMM{u+*8S!JQ-rjZ>-|8=H7R=zP*d<_8GdIrjU^HiF;;WvV3Xv$Ae9^y(&SRa@kWX zjQ(2=y^XGBQ8g_#TicDYub6 zK|%LOY}GFbF>=ii|%Gt zku+>h{NesRp{6AO!ZJpGa`+vG0 mzQXhQU#&6+%l{8ChS@GA_P1DR+b+)iQGcPWTCHsH<-Y*j@ppp& literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7139882 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2285 @@ +{ + "name": "swiftchain-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "swiftchain-backend", + "version": "1.0.0", + "dependencies": { + "axios": "^1.6.0", + "cors": "^2.8.5", + "dotenv": "^16.0.0", + "express": "^4.18.0", + "mongoose": "^7.0.0", + "winston": "^3.19.0" + }, + "devDependencies": { + "@types/axios": "^0.14.0", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.0.0", + "@types/winston": "^2.4.4", + "nodemon": "^3.0.2", + "ts-node": "^10.9.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.11.tgz", + "integrity": "sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==", + "license": "MIT", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/axios": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.4.tgz", + "integrity": "sha512-9JgOaunvQdsQ/qW2OPmE5+hCeUB52lQSolecrFrthct55QekhmXEwT203s20RL+UHtCQc15y3VXpby9E7Kkh/g==", + "deprecated": "This is a stub types definition. axios provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/winston": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", + "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==", + "deprecated": "This is a stub types definition. winston provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "winston": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "license": "Apache-2.0", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "7.8.10", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.8.10.tgz", + "integrity": "sha512-d+ASyz9FjXnzA9yrgbiAKP3DX//i0QA7TgSOPmU/ONqbUP7v8tg5HbbY28a7wtOKiPYSaP605JoRLFelU7wKxA==", + "license": "MIT", + "dependencies": { + "bson": "^5.5.0", + "kareem": "2.5.1", + "mongodb": "5.9.2", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", + "license": "MIT" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/package.json b/package.json index eeeb8c4..1b124ed 100644 --- a/package.json +++ b/package.json @@ -1,57 +1,28 @@ { "name": "swiftchain-backend", "version": "1.0.0", - "description": "Backend API for SwiftChain - Blockchain-Powered Logistics & Escrow Delivery Platform", - "main": "dist/server.js", - "engines": { - "node": ">=20.0.0" - }, "scripts": { - "dev": "nodemon src/server.ts", "build": "tsc", "start": "node dist/server.js", - "lint": "eslint . --ext .ts", - "format": "prettier --write .", - "test": "jest" + "dev": "nodemon --exec ts-node src/server.ts", + "seed": "ts-node src/seed.ts" }, "dependencies": { - "bcryptjs": "2.4.3", - "compression": "1.7.4", - "cors": "2.8.5", - "dotenv": "16.3.1", - "express": "4.18.2", - "express-rate-limit": "6.11.0", - "helmet": "7.1.0", - "http-status-codes": "2.3.0", - "jsonwebtoken": "9.0.2", - "mongoose": "7.6.3", - "uuid": "9.0.1", - "winston": "3.11.0" + "axios": "^1.6.0", + "cors": "^2.8.5", + "dotenv": "^16.0.0", + "express": "^4.18.0", + "mongoose": "^7.0.0", + "winston": "^3.19.0" }, "devDependencies": { - "@types/bcryptjs": "2.4.6", - "@types/compression": "1.7.5", - "@types/cors": "2.8.17", - "@types/express": "4.17.21", - "@types/jest": "^30.0.0", - "@types/jsonwebtoken": "9.0.5", - "@types/mongoose": "5.11.97", - "@types/node": "20.10.0", - "@types/supertest": "^7.2.0", - "@typescript-eslint/eslint-plugin": "6.13.2", - "@typescript-eslint/parser": "6.13.2", - "eslint": "8.55.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.6", - "husky": "8.0.3", - "jest": "^30.4.2", - "lint-staged": "15.2.0", - "mongodb-memory-server": "9.1.6", - "nodemon": "3.0.2", - "prettier": "3.1.1", - "supertest": "^7.2.2", - "ts-jest": "^29.4.11", - "ts-node": "10.9.2", - "typescript": "5.2.2" + "@types/axios": "^0.14.0", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.0.0", + "@types/winston": "^2.4.4", + "nodemon": "^3.0.2", + "ts-node": "^10.9.0", + "typescript": "^5.0.0" } } diff --git a/src/app.ts b/src/app.ts index ac1ab58..79ea2fd 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,73 +1,47 @@ import express from 'express'; +import mongoose from 'mongoose'; import cors from 'cors'; -import helmet from 'helmet'; -import compression from 'compression'; -import rateLimit from 'express-rate-limit'; -import { connectDatabase } from './config/database'; -import logger from './config/logger'; -import errorHandler from './middleware/errorHandler'; +import dotenv from 'dotenv'; import routes from './routes'; +import logger from './config/logger'; -const app = express(); - -// Security middleware -app.use(helmet()); - -// CORS configuration -app.use( - cors({ - origin: process.env.CORS_ORIGIN || '*', - credentials: true, - }), -); +dotenv.config(); -// Rate limiting -const limiter = rateLimit({ - windowMs: 15 * 60 * 1000, // 15 minutes - max: 100, // Limit each IP to 100 requests per windowMs - standardHeaders: true, - legacyHeaders: false, -}); -app.use('/api', limiter); - -// Body parsing -app.use(express.json({ limit: '10mb' })); -app.use(express.urlencoded({ extended: true, limit: '10mb' })); +const app = express(); +const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/swiftchain'; -// Compression -app.use(compression()); +app.use(cors()); +app.use(express.json()); -// Logging middleware -app.use((req, res, next) => { - logger.info(`${req.method} ${req.url}`); - next(); -}); +app.use('/api', routes); -// Health check endpoint app.get('/health', (req, res) => { res.status(200).json({ - status: 'success', - message: 'SwiftChain-Backend is running', + status: 'healthy', timestamp: new Date().toISOString(), - uptime: process.uptime(), + mongodb: mongoose.connection.readyState === 1 ? 'connected' : 'disconnected', }); }); -// API routes -app.use('/api/v1', routes); - -// 404 handler -app.use('*', (req, res) => { +app.use((req, res) => { res.status(404).json({ - status: 'error', - message: `Cannot ${req.method} ${req.originalUrl}`, + success: false, + error: `Route ${req.path} not found`, }); }); -// Global error handler -app.use(errorHandler); - -// Database connection -connectDatabase(); +// Connect to MongoDB but don't start the server here +const connectDB = async () => { + try { + await mongoose.connect(MONGODB_URI); + logger.info('✅ Connected to MongoDB'); + } catch (error) { + logger.error('❌ Failed to connect to MongoDB:', error); + process.exit(1); + } +}; + +// Call connectDB but don't listen +connectDB(); export default app; diff --git a/src/controllers/deliveryController.ts b/src/controllers/deliveryController.ts new file mode 100644 index 0000000..23e3a65 --- /dev/null +++ b/src/controllers/deliveryController.ts @@ -0,0 +1,34 @@ +import { Request, Response } from 'express'; +import { deliveryService } from '../services/deliveryService'; + +class DeliveryController { + async getDeliveryETA(req: Request, res: Response): Promise { + try { + const { id } = req.params; + + if (!id) { + res.status(400).json({ + success: false, + error: 'Delivery ID is required', + }); + return; + } + + const result = await deliveryService.calculateDeliveryETA({ deliveryId: id }); + + res.status(200).json({ + success: true, + data: result, + message: 'ETA calculated successfully', + }); + } catch (error: any) { + const statusCode = error.message?.includes('not found') ? 404 : 500; + res.status(statusCode).json({ + success: false, + error: error.message || 'Failed to calculate ETA', + }); + } + } +} + +export const deliveryController = new DeliveryController(); diff --git a/src/models/Delivery.ts b/src/models/Delivery.ts new file mode 100644 index 0000000..33eab81 --- /dev/null +++ b/src/models/Delivery.ts @@ -0,0 +1,52 @@ +import mongoose, { Schema, Document } from 'mongoose'; + +export interface IDelivery extends Document { + deliveryId: string; + driverId: string; + userId: string; + pickupCoordinates: { + lat: number; + lng: number; + address: string; + }; + dropoffCoordinates: { + lat: number; + lng: number; + address: string; + }; + status: 'pending' | 'assigned' | 'in_progress' | 'completed' | 'cancelled'; + distance?: number; + estimatedDuration?: number; + actualDuration?: number; + createdAt: Date; + updatedAt: Date; +} + +const DeliverySchema = new Schema( + { + deliveryId: { type: String, required: true, unique: true }, + driverId: { type: String, required: true }, + userId: { type: String, required: true }, + pickupCoordinates: { + lat: { type: Number, required: true }, + lng: { type: Number, required: true }, + address: { type: String, required: true }, + }, + dropoffCoordinates: { + lat: { type: Number, required: true }, + lng: { type: Number, required: true }, + address: { type: String, required: true }, + }, + status: { + type: String, + enum: ['pending', 'assigned', 'in_progress', 'completed', 'cancelled'], + default: 'pending', + }, + distance: { type: Number }, + estimatedDuration: { type: Number }, + actualDuration: { type: Number }, + }, + { timestamps: true } +); + +export const Delivery = mongoose.model('Delivery', DeliverySchema); diff --git a/src/routes/deliveryRoutes.ts b/src/routes/deliveryRoutes.ts new file mode 100644 index 0000000..d35622a --- /dev/null +++ b/src/routes/deliveryRoutes.ts @@ -0,0 +1,8 @@ +import { Router } from 'express'; +import { deliveryController } from '../controllers/deliveryController'; + +const router = Router(); + +router.get('/:id/eta', deliveryController.getDeliveryETA); + +export default router; diff --git a/src/routes/index.ts b/src/routes/index.ts index 68e0f11..cff571a 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1,9 +1,8 @@ import { Router } from 'express'; +import deliveryRoutes from './deliveryRoutes'; const router = Router(); -// Define your routes here -// router.use('/auth', authRoutes); -// router.use('/users', userRoutes); +router.use('/v1/deliveries', deliveryRoutes); export default router; diff --git a/src/seed.ts b/src/seed.ts new file mode 100644 index 0000000..09d32f4 --- /dev/null +++ b/src/seed.ts @@ -0,0 +1,41 @@ +import mongoose from 'mongoose'; +import dotenv from 'dotenv'; +import { Delivery } from './models/Delivery'; + +dotenv.config(); + +const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/swiftchain'; + +const seedDeliveries = async () => { + try { + await mongoose.connect(MONGODB_URI); + + const delivery = { + deliveryId: 'DEL-001', + driverId: 'DRV-001', + userId: 'USR-001', + pickupCoordinates: { + lat: 40.7128, + lng: -74.0060, + address: 'New York, NY', + }, + dropoffCoordinates: { + lat: 40.7580, + lng: -73.9855, + address: 'Times Square, NY', + }, + status: 'pending', + }; + + await Delivery.deleteMany({}); + await Delivery.create(delivery); + + console.log('✅ Test delivery created successfully'); + process.exit(0); + } catch (error) { + console.error('❌ Failed to seed data:', error); + process.exit(1); + } +}; + +seedDeliveries(); diff --git a/src/server.ts b/src/server.ts index 4f34316..41dd1ee 100644 --- a/src/server.ts +++ b/src/server.ts @@ -3,9 +3,11 @@ import logger from './config/logger'; const PORT = process.env.PORT || 3000; +// Start the server from here const server = app.listen(PORT, () => { - logger.info(`🚀 Server running on port ${PORT} in ${process.env.NODE_ENV} mode`); + logger.info(`🚀 Server running on port ${PORT} in ${process.env.NODE_ENV || 'development'} mode`); logger.info(`📝 Health check: http://localhost:${PORT}/health`); + logger.info(`📦 ETA endpoint: http://localhost:${PORT}/api/v1/deliveries/:id/eta`); }); // Graceful shutdown diff --git a/src/services/deliveryService.ts b/src/services/deliveryService.ts new file mode 100644 index 0000000..fad1621 --- /dev/null +++ b/src/services/deliveryService.ts @@ -0,0 +1,84 @@ +import { Delivery } from '../models/Delivery'; +import { routingService, ETARequest } from './routingService'; + +interface DeliveryETARequest { + deliveryId: string; +} + +interface DeliveryETAResponse { + deliveryId: string; + status: string; + pickup: { + address: string; + coordinates: { lat: number; lng: number }; + }; + dropoff: { + address: string; + coordinates: { lat: number; lng: number }; + }; + eta: { + estimatedMinutes: number; + distanceKm: number; + durationText: string; + distanceText: string; + }; +} + +class DeliveryService { + async calculateDeliveryETA(request: DeliveryETARequest): Promise { + const delivery = await Delivery.findOne({ deliveryId: request.deliveryId }); + + if (!delivery) { + throw new Error(`Delivery with ID ${request.deliveryId} not found`); + } + + if (!delivery.pickupCoordinates || !delivery.dropoffCoordinates) { + throw new Error('Delivery does not have complete coordinates'); + } + + const routingRequest: ETARequest = { + pickup: { + lat: delivery.pickupCoordinates.lat, + lng: delivery.pickupCoordinates.lng, + }, + dropoff: { + lat: delivery.dropoffCoordinates.lat, + lng: delivery.dropoffCoordinates.lng, + }, + travelMode: 'driving', + }; + + const etaResult = await routingService.calculateETA(routingRequest); + + delivery.distance = etaResult.distance * 1000; + delivery.estimatedDuration = etaResult.estimatedTime * 60; + await delivery.save(); + + return { + deliveryId: delivery.deliveryId, + status: delivery.status, + pickup: { + address: delivery.pickupCoordinates.address, + coordinates: { + lat: delivery.pickupCoordinates.lat, + lng: delivery.pickupCoordinates.lng, + }, + }, + dropoff: { + address: delivery.dropoffCoordinates.address, + coordinates: { + lat: delivery.dropoffCoordinates.lat, + lng: delivery.dropoffCoordinates.lng, + }, + }, + eta: { + estimatedMinutes: etaResult.estimatedTime, + distanceKm: etaResult.distance, + durationText: etaResult.durationText, + distanceText: etaResult.distanceText, + }, + }; + } +} + +export const deliveryService = new DeliveryService(); diff --git a/src/services/routingService.ts b/src/services/routingService.ts new file mode 100644 index 0000000..641e8a6 --- /dev/null +++ b/src/services/routingService.ts @@ -0,0 +1,139 @@ +import axios from 'axios'; + +export interface Coordinates { + lat: number; + lng: number; +} + +export interface RouteInfo { + distance: number; + duration: number; + distanceText: string; + durationText: string; +} + +export interface ETARequest { + pickup: Coordinates; + dropoff: Coordinates; + travelMode?: 'driving' | 'walking' | 'bicycling' | 'transit'; +} + +export interface ETAResponse { + estimatedTime: number; + distance: number; + durationText: string; + distanceText: string; + route: RouteInfo; +} + +class RoutingService { + private readonly apiKey: string; + private readonly baseUrl: string; + + constructor() { + this.apiKey = process.env.GOOGLE_MAPS_API_KEY || ''; + this.baseUrl = 'https://maps.googleapis.com/maps/api/directions/json'; + + if (!this.apiKey) { + console.warn('⚠️ Google Maps API key not configured. Using fallback calculation.'); + } + } + + async calculateETA(request: ETARequest): Promise { + try { + if (this.apiKey) { + return await this.calculateWithGoogleMaps(request); + } + return this.calculateWithHaversine(request); + } catch (error) { + console.error('Failed to calculate ETA:', error); + throw new Error('Failed to calculate delivery ETA'); + } + } + + private async calculateWithGoogleMaps(request: ETARequest): Promise { + const { pickup, dropoff, travelMode = 'driving' } = request; + + const params = { + origin: `${pickup.lat},${pickup.lng}`, + destination: `${dropoff.lat},${dropoff.lng}`, + mode: travelMode, + key: this.apiKey, + units: 'metric', + }; + + const response = await axios.get(this.baseUrl, { params }); + + if (response.data.status !== 'OK') { + throw new Error(`Google Maps API error: ${response.data.status}`); + } + + const route = response.data.routes[0]; + const leg = route.legs[0]; + + return { + estimatedTime: Math.ceil(leg.duration.value / 60), + distance: leg.distance.value / 1000, + durationText: leg.duration.text, + distanceText: leg.distance.text, + route: { + distance: leg.distance.value, + duration: leg.duration.value, + distanceText: leg.distance.text, + durationText: leg.duration.text, + }, + }; + } + + private calculateWithHaversine(request: ETARequest): ETAResponse { + const { pickup, dropoff, travelMode = 'driving' } = request; + + const distance = this.calculateHaversineDistance(pickup, dropoff); + const distanceKm = distance / 1000; + + const speeds: Record = { + driving: 40, + walking: 5, + bicycling: 15, + transit: 25, + }; + + const speed = speeds[travelMode] || 40; + const durationMinutes = (distanceKm / speed) * 60; + + return { + estimatedTime: Math.ceil(durationMinutes), + distance: Math.round(distanceKm * 100) / 100, + durationText: `${Math.ceil(durationMinutes)} mins`, + distanceText: `${Math.round(distanceKm * 100) / 100} km`, + route: { + distance: distance, + duration: durationMinutes * 60, + distanceText: `${Math.round(distanceKm * 100) / 100} km`, + durationText: `${Math.ceil(durationMinutes)} mins`, + }, + }; + } + + private calculateHaversineDistance(point1: Coordinates, point2: Coordinates): number { + const R = 6371000; + const dLat = this.toRadians(point2.lat - point1.lat); + const dLng = this.toRadians(point2.lng - point1.lng); + + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(this.toRadians(point1.lat)) * + Math.cos(this.toRadians(point2.lat)) * + Math.sin(dLng / 2) * + Math.sin(dLng / 2); + + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return R * c; + } + + private toRadians(degrees: number): number { + return degrees * (Math.PI / 180); + } +} + +export const routingService = new RoutingService();