From b7f20fed6c89eb69f5ae8e163115535e35690ead Mon Sep 17 00:00:00 2001 From: Skia Date: Thu, 2 Mar 2023 15:11:23 +0100 Subject: [PATCH] Galaxy (#575) Co-authored-by: Skia --- .../images/{6.jpg => sas/Family/krophil.jpg} | Bin .../images/{8.jpg => sas/Family/richard.jpg} | Bin .../images/{3.jpg => sas/Family/skia.jpg} | Bin core/fixtures/images/sas/Family/skia_sli.jpg | Bin 0 -> 58159 bytes .../images/sas/Family/skia_sli_krophil.jpg | Bin 0 -> 98308 bytes .../images/{5.jpg => sas/Family/sli.jpg} | Bin .../2022-03-02_In-Bloom_by-David-Revoy.jpg | Bin 0 -> 59334 bytes .../2022-12-06_Rain-City_by-David-Revoy.jpg | Bin 0 -> 27752 bytes ...ffron-steampunk-clothes_by-David-Revoy.jpg | Bin 0 -> 24396 bytes .../2022-06-30_Asleep_by-David-Revoy.jpg | Bin 0 -> 31281 bytes core/management/commands/check_front.py | 9 +- core/management/commands/populate.py | 195 +++- core/static/core/style.scss | 915 +++++++++--------- core/templates/core/404.jinja | 7 +- core/views/__init__.py | 4 +- core/views/user.py | 72 +- galaxy/__init__.py | 0 galaxy/apps.py | 30 + galaxy/management/commands/rule_galaxy.py | 61 ++ galaxy/migrations/0001_initial.py | 113 +++ galaxy/migrations/__init__.py | 0 galaxy/models.py | 379 ++++++++ galaxy/static/galaxy/js/3d-force-graph.min.js | 5 + galaxy/static/galaxy/js/d3-force-3d.min.js | 2 + .../static/galaxy/js/three-spritetext.min.js | 2 + galaxy/static/galaxy/js/three.min.js | 6 + galaxy/templates/galaxy/user.jinja | 108 +++ galaxy/tests.py | 149 +++ galaxy/urls.py | 40 + galaxy/views.py | 104 ++ locale/fr/LC_MESSAGES/django.po | 550 ++++++----- sith/settings.py | 28 + sith/urls.py | 1 + 33 files changed, 2030 insertions(+), 750 deletions(-) rename core/fixtures/images/{6.jpg => sas/Family/krophil.jpg} (100%) rename core/fixtures/images/{8.jpg => sas/Family/richard.jpg} (100%) rename core/fixtures/images/{3.jpg => sas/Family/skia.jpg} (100%) create mode 100644 core/fixtures/images/sas/Family/skia_sli.jpg create mode 100644 core/fixtures/images/sas/Family/skia_sli_krophil.jpg rename core/fixtures/images/{5.jpg => sas/Family/sli.jpg} (100%) create mode 100644 core/fixtures/images/sas/Pepper/2022-03-02_In-Bloom_by-David-Revoy.jpg create mode 100644 core/fixtures/images/sas/Pepper/2022-12-06_Rain-City_by-David-Revoy.jpg create mode 100644 core/fixtures/images/sas/Saffron/2020-05-09_Saffron-steampunk-clothes_by-David-Revoy.jpg create mode 100644 core/fixtures/images/sas/Shichimi/2022-06-30_Asleep_by-David-Revoy.jpg create mode 100644 galaxy/__init__.py create mode 100644 galaxy/apps.py create mode 100644 galaxy/management/commands/rule_galaxy.py create mode 100644 galaxy/migrations/0001_initial.py create mode 100644 galaxy/migrations/__init__.py create mode 100644 galaxy/models.py create mode 100644 galaxy/static/galaxy/js/3d-force-graph.min.js create mode 100644 galaxy/static/galaxy/js/d3-force-3d.min.js create mode 100644 galaxy/static/galaxy/js/three-spritetext.min.js create mode 100644 galaxy/static/galaxy/js/three.min.js create mode 100644 galaxy/templates/galaxy/user.jinja create mode 100644 galaxy/tests.py create mode 100644 galaxy/urls.py create mode 100644 galaxy/views.py diff --git a/core/fixtures/images/6.jpg b/core/fixtures/images/sas/Family/krophil.jpg similarity index 100% rename from core/fixtures/images/6.jpg rename to core/fixtures/images/sas/Family/krophil.jpg diff --git a/core/fixtures/images/8.jpg b/core/fixtures/images/sas/Family/richard.jpg similarity index 100% rename from core/fixtures/images/8.jpg rename to core/fixtures/images/sas/Family/richard.jpg diff --git a/core/fixtures/images/3.jpg b/core/fixtures/images/sas/Family/skia.jpg similarity index 100% rename from core/fixtures/images/3.jpg rename to core/fixtures/images/sas/Family/skia.jpg diff --git a/core/fixtures/images/sas/Family/skia_sli.jpg b/core/fixtures/images/sas/Family/skia_sli.jpg new file mode 100644 index 0000000000000000000000000000000000000000..817b320ca1156f5e10b40475715409682c6e4810 GIT binary patch literal 58159 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%0D(9b7s%tJjus}e>vuf$e zwc<0VzD7L1&l1F73&f0G`aYjG=KMIT=d-zwE-WN!>-*d9#$ge|V*s%S0clOrA7imfHWW`b&;dYxRf zswb4BQT91{=0B7E#4#GHxFa3*og3|Uc}#BUi`*c1FWG)MPIT*kuU7W_8Wgq;t0g(LVa}4PW1^~==CTK*ew6R#ykn7`-4VS3BgwNEiBs= z@+^fRk>b%Cwh(rC3yY8?v3{7@{GgZCD`JjHdPX*$$p&f+H9{c4zBAl(vi=wBzTWS@ zy39N!>f^g|9=hq*GY9FSC4|aTcw!Ek4G!hxM&+D04-VSEoL~^ZMG{Hj%r`zqMa^0= zNT)=T*>`Ng!<4CdcJ#%#zHzKp6I#>Pydtiyp5I_@i0qPf%l`+H-f!J=y= zu1dLL<0`<7L~KO9G&)tWVj|ae^{V+o^NH>r#f}%Fa_9S>#V(62P-r)c*oX+}|3l&^ z@R+;=m|T@(SPyhN>U|Sjq#+Z{Qcle@^~GyPDD9nHBfAOHc~@mR<87s$^k>Bv?RnXC zS83kkZRYRvXQp*mMV|EMrgb>ZBq!}%an=DSwT6-xliH~z^4}er1)=*0!Kp$uTgBow z>BgK(JlGJmw-)S<@`D;(^|V+2sybJlYcF9tM>}s?YcDM@4$)uf$cCszM&rjaqZ;&KG?xdQV4yNsgR%f@D&s<#*VCJlHZNw^REBVAW{$)0eJahotq zq=%(f;4PovB4oDzC}2xB-}(}XrfgF}iOXX|wMzA4BrY0kKSa%0`hr$fdUKJ4$djzM z$;89Y0C}XRcZUe+_mAN$k|7nM&rNL=N;!d@&Obc7X(p#yWE#~A55x>)BQrCkBYZI z=O4vjUJw%5i|~vlaI;fqertYeak>W$GaiCEd8}I1?e33(@A7>|BajJZ-b6H;tqZyg zBpD#_rGDl7!qSQ;|EYbyK_kGyLBT-&rd-5ms{a&#T+L`N?Y7w+D^M<`fWrE3ceCXH-!C|Cnmf{NJ`E6LJ#5N4bde zB=|6{X*c|C!<85?5fQ^klPl817$8$vwKLW|EE9l@ms3~%83t4G>I!wglMn?z% zFM`6?28G?1E2H8%T`g^NoT~%?O8JQ9_@$CgYnNfTl(yazWuum&zYA!=x5IIo&x5J0 zeiX;IxB$U(6zzCASvHsh6&9dVl!WTq z3AK{YY*h2 zVt(3N!C~<>R*<6eS>Hz0XyTNF$q@d= z7r{dxabm0^c|{k>jNM)@LBY|+4z)a^FFVDq?es1R4C)B2d0`E{p52nh%wD##?6|H> zR9P~r&hAi)GjAUKi_tF>8)zP$@zWw)N+Xlt=oTwB8(ufrUb-V=Od2bzZsYvVPlPeN zVN6+BKIdzU>3f>=b@=owcR9`+RdRwJGt}Q09Y+PstwYjHEI>HBa1kf7HO?I+Kyq_m z9VGQ~hEf&at}rbgM6KAbm!_$r539*dL&9j2+GIo8_r_*Z`antr{U zmD1b}z?3L5cuv7AU-&$TpWyVFl6ROvs8Hb4OFcP_TQj4hhmEHJK55PpR>Zki%7T}- zxT2YotZsfZshEouFCv|Htg$#fJ1~BA75}|8iN-T{7in^`HNvakeTFkoUQcoz2nz2D z3Zb#LOmSCV$Tv&bQG3{@-d!LYq8*HBbR3Q<05U+#k(SETR){8&%Sf_&R(S?ejZIES zWr91Y`IkB@yz%rKYX>no(pG6tNtM<`bW*+a z5gOteY2<@VDd4(}W_7V5;nqNq3$JYk2ZdefyRZx;D)&-(<@ST+Q+9pi19d8EP){m3 z`VvY=8gswi^$oP47-H?{kS+9^HWCL|=o>coi|`F(?c(W?8q%2d)8+ zGEuGu+H5+PXrAM*FZZZc#4t-o(_9Mq{!YLG?m%K-6>!k+=f6ktAc0DdKO|#4o7(n{ z&6j_Vq^VXy0g+UB4aO^#@?M6U9U7EGzRg!LJ2#XejZkThXy@)rn&rZi^gYT*PI*aOrv8g z21-dz%QSYCBxn9$xh(YHQ*}1TS@r=aocP_pqpLR=&hR17RNxj&V z%kqYtX^aW;x9jlwfrv|6=Z@;%T2*h?cMc!T@b56kLuOei1kcD3(DUigBjXM#$=ss+ z$v!Kk@(z+oXThRiPnnhLpX*9SDkBXZ#0+ftkBH3Y1pd_qH948DNuoQOkz z=zHLM^D`mmQeD-&{|dHwZ?;!arb2K1shCFSNjQit2zuTS=C=2u+goGGC~PNpo?ylC zYe4LyfKZyjlOb>|+M z-<(n6Z6}?z`6ok;wc}m~Ebj@exwfl_!a`o`Az(3=v{3_*zrE(u7*`e= zxt9E+EKx2&l{J$mGG!r*c{Y;Uu2@UH!xhcN5HKh>!xGbZu+14E7C)U@Vp(dhjD(jd zk!8912f%VEELTG9URoFP8|?8~U6rsbOpd#*bEguJ38O4S(raF~R=x_CZl|d&6XS>guB|Cyf|4#Nd$fjL5dS(* zkyvhAa7d#OT6)d>G~pBPdP4xI=e(Z^mvg=r2G+dXBk`1SGYvb~R6ZN2E>q=8hRSJf z$Qz6(6wDMT&FCN-kV&bsQYtnkdXR~_(~f}=7;j7tL1(`!q%WmmJ4k+~dJ{m+E;8Zg zP_KEm43b}K^k-CI2>r6woevcvPZgN=85l@N6dYhlKx0YMaeY1d1=;rdggt8Czor<; z`I1dTTnhc?BYt-hC54!ax>BY;d}t~ASA-t~Pa9IJib)e2-~+n}&bl#hNu#jE1#rM!fQ%^FN>cxUvG~9ncpXh*1p$T2AqPglCa`HS&A<8M)Wl$OjNSU0*GdxI zqhI;J2{)Z2;>}t%!|=^&Qk=Qs{z)o7WYAUZPWPc^4{(x^1UxdHrBUY0K|^A~(@oSj zrgW2cPVy?y7x73~vr(7D)}FNY(NTS-D3@}lk4{eUi(4hdluxz2SVnz9uAA#BR=IlWr>NpyBGw$K!88urF+4STW9P_oraDQQcE z#9q4y`EkCC>jdc8-^djuHE`uPcoO;@?k_?RD4}ra0!{ZbJM>$|g^GN^Bs>gB7!>!Wc?a!H4FOsb#8z-KJSPIl-to?w6u!`3aDjn^Lal#3x<@`jm zVZ<0vmSAAxVWj3^@75QlnEIE48XX^-Pgt6(!%zu^)lnBeZEojY#_)&P*rd5VX|6UY zG`G?B$WuwYIyr59w67aq6Eg~liHG0RN|CHEuWuj@3(+qGVQ}mz3UJY2k*8P(T3EB} z@e!<43`A+KY2J15szDUkMC&f*TT#lhvsWqLVS<#dia-YAdS}Z`n!j&L$Hk>FVg#{K z?3lxV4fr-h`i*p4X%QcLxJk%8*N_*Dj*huQ}t~n@8fM{WCZuHZ@gznH>S-=4X8>^SXV%{s&f-qBVXEu(4L( z)LD`{kH6d#g$MsFp9>=mRrtVJTjsE@)et3jjPcD^3wl+C%Xi;mDjqXAjjlMZVJQZi zv7ROOAU(bV`;SQP-E47z*eQ4HQL}r5avSxS!c=ADEcNLR{XH9}Xj|O)w}p4NbX_gp z;D|8~@fEl9PO|kOqrZ)OTNKMn@6ou4r+obbo9}#^yRYeNVNm_qjQ+=g$9J^hjOaX* z0S}Q!7m>!vqE*B%!*osEOA<#&+ zfitO`vWr6B zDZ9@tecN=6z3fW{6wS*T_QEN6k6}o@Jio+;dRNR1smpkKQlPW8@sNxkQEtX{vE4EH zX^Q?2Ox~8fG^oFX3jtGt|8IIX&Un1Num*EyYyv31@TWMUPJ_GDb=WV8yVi@jZ$(L| zPG`7cwBz|y$M&iv*JztQfw$~$ogI3CVKXW}Psg6^Sv}0R-QX_5L0s(lXxo-IS(J=1 z07*oS-onK;luE=x$!E`(jF|;G7ra}L{9InpFFQ@jFs?-^e`~V*2ztGx>Z9tP-qGla zSajqLEFD4FLNgv|L`H(tM%tXf~zQq%-J5tHmY*#C`Hf=*4*44QbO7-X=4dFnM8Dg z3-Jfp@aNzkvcn(ty0EX}8>)Te2yK@u@Rb7=+Y{i?{Fh~X3eVD7mmYbCS^XG|vatgt z8Mi<{F|_?U0n6KLpLiwqUb~2iX@fXa)yhu(QWV%@e!%m8C;L{!w#P58lgVw|_Wgiu z0;HE)uiL%$y{Gs6!Dny#z4!b<%Ef4mXcf9&t=TLBQfoGi161h~Hlss`;w)}~!=c6M zQQ(geCc2f_psbeH-lx31>q-K4Ps1V3O(LeLliMg)@dyVV!_L`$*ESAYmyliVH8Sqb zykFesqL;1bDV_04`9wdRQ(BXTm9-L{^jlRe!c2Gs#nt!2f|kdAbKf#4Wo!?FFLrG; zM78Yp=9PIc?ro62X6M@S>y&I9s9Cw6Q?N@w6FgvvKu$DW#2yk9Jd3euFYs+s*Q=pj zlYl2nz|}FxzG|Zs75Z4G-Mhh^GB#&v$`*_zA}toCZE_ z;-{DB=DC(nlFrZ5He_0=p%kgDQj2HH=U6w-6%v*8?6(xNDas&I9FjP~K@zRtlqP9a zlj~h`EtWB;s^IOUW=s`O61xwx@O-S74-hXNzDg;~g414jeoK=CcuL!}6Vkfh8oh7YS)Q0uEba zvLmoGhq$8i^wb4T`EjJ$sZMmVVJz9zeaB%D>-L*a62ic;U&0XjZQ4)&X#dek*~QF{ z$;XAEGL@KOTR9yz%kMGfVdsKGr9WMH0y?N0fOHyZR)06L+}9&nx{I1{@XoB4VY93y zE~js~J)F%Oj3;67YIq7pV{qlX(DvU2zerL0ZjDn-jR7w7ej~9@ySRxgFA<06q7T{<5<+{kEvkiEMU1Xz zgxmSKY7bo-=4GROAWPbL+cv^{oU<$K{YB22d=0t zq_@f5YF0<|@vf2XpmkXdeT&IUj3k9u6*%*J3Qb55(p|+2o7KV!s=onE%5=1b2Jj^+sW8teqb2y%k+3zXr$_l0u~`Z{kQ8a9$y<|N(W#3K z=G{QuwWpf0Y=DdW@J5llxIekuIIomeszGztLT@65sW`>4ap&;tIUk%in|+*ltxp$B zxk)rja))S&|G>n?1TXw66_k9b#5mwf;|R{?(V0!pl`i;B^5(EO2lWy!tZFG`X~nOO z+VY16u+_e=Z2vvs=pM`zg_kyNmVHIV9c$o0w=Z@SQd^mP-WsV(9|L6gb(O zz>%BATN=93k>n9_=Rr2vS?-c&lUMt5Wq&Umjj`6Qtea~^S+Ua|VgG@_PW^PRUw$W9 z$A_z@<(Dj4BoNn;2C_%N$u;Mpy_+<(@0Knx`;OXoX|RNtIH>pRBZW&asR4T6A~FCy z`|5M0L91tNEf{Pmg<*vfbs`kAw@7NLT#mNJk}SVFhF^m{zt%Mrv{(Up{K4CFs1+d? zs5Ou??9VjtjQ)7AzY~#D+I%)$@mVMkUa-@0i%=iYx=T<*1t-hZAxwA z&cF6sH~!j1Z0#$fT~R%Tm$ks59hs(A&nq{ETYf_|l&m?!7xpW51o54BZLr0zV$>MS zy)&}2Kuh(Fb&|YY1)W)(bEkE#&!tO@|JfTBOYycBI=C`>z6M01=9^9H*7U@gD|>sC zw4Z!b+ns~7l_ZhO=;_lyhC}UT=lR2JT(;2(oU7olslY;`uwrQvu3(}Ry)6PkIVXrv z!rHy~b1|kwtOR;C%nWl7mXa}EUeO1_ z;$@+RKkRvdIzj9#_nC|X-3d^@Q}Zop)JD_lRdj}2mBRH6b*?#<$F!8HWy7_<%*q~6 zf3M#l@4?g&yBho^HJeh;*ehezrpT8sLI*AMkUn?S>h*Y-@}}eT=_?cl(&3M}oz zIJ<)dckX-TtWps8!UZQ=i;d}NmP3$g5{s4;owvV>77Kr*SxXU3`+R=$RJ@?MifsN$ zvrwaaQIx>HK|%aiC;tC&m{GrqzoRJpFSAlh%-B17BXGO>|LgquN#2vc+pW%UO;Dta zRA(crJq>sN_F-pQgsN+9W{#_@GQ#pOQAI`6>+h!8?5Ke$fd^gs-HF@EKV=#wAhT`d znL%Fn>+0EV*zlY$eQ!+FUiPtHLX+-;`6_KCg{py2&cfmn=AyLuE8219*;6}D?Yq-A zg&j_V(#R1w1>-})n`>AbSK>s+_pLvA-6O-kcnYsS&@IVy>VO9UtjxySo&(2XIJ^tX z6X=9LX~g~K53AhkW5i~A`nK91G*4t;Ua#0D9KVlvyQKP1RS;RaK1xDlpwX3J+o$Fq z)9lX1qS}iP5zT%`{Rg%_Fp^n4OD%!WQr@h-^a_(6iXSbq z`6C|fD_J|f#pQgMr1}(BxmXiL?Rm_N)aVd!i@2Ivr*1iLOR3tRb#+9b!%7s(3b>Em z-4&-!z8=epLYYk33$g9|=`B$?9&othH4l&W`HfH;2aSG*xh-zqGzBxpL%AC~U+MaS z^WYK+ax-szx#&x1I_l8zi#}lg^|8`HY4pU(3FHrk#R7fL(?3Hqh zgB8nNB>}tij`lvJuh`R{b?^a0#b@Mb$EaSb&A~N1?BbqDAlY%=d)AFTKBvV$(Bkh_ z%!^@>{zDu3H2u9DqVL4#f{YC=kc|bpBg9Oy?HGSMmR<|DC|n|WTp@)0GIJO;e$bd_ zEr5JzIp*+)BYEI8ZZ^}%ofznd(+wkoW2Tv7n#0=|rg+g^;Kk*bDlJ~0y}KS`+8Qb{ z*ull$yY*wQC8|<={OAt9wp^P(p!he5NK4sJyo2%Z;y5ZTU;R1+`cLlwD0zz}WOq~T zr4rv}RyOI$%$u~!cR@{MHD7o=#G_(JMlU^zs*J;w8Vea0ygm!0M{aBwno#PGsH6KI zDfNk?la6WpeM2KFt~=q4AGtV>^KKA&GhD(_T;sG45N>SY_|FAmPsVPRul<&U_G^BXl72Wc9&$ zrjG=`CnE~?W{J$6j-hAl;(W~P+nx3I7{<#xF^~tj9rSP?prgh1NjhayV&VUZSA^=% z>n;##DR~j9Rm-s9{W0H=cjm<3!u}V!;BJM^Z`Spvdcgf;6Rtfv3O(MjSyEyduEL-C zh0nAgI7D=0xwFh3aH5HNX_P7rt{UIh=nVBwaHLDrpzkN%mTodUiJfDmPas21P|V+w zXW0RhC5tN*aAolhyc@+|7Cdc3lswTXXSkco6P%8C5ylq}BU*&k8xs!s0x%-Z|G>UY zs+50rP76+<+Ca}9_6^`BOLyUG^$H=yZ_zDNteZqH8nwp1pb zo=WXh!Jr<-TV!a&mYm+cd{Sck=*Px=P0*f?<I>?FmhXlzcdsG@Ck%>Iq>NwaYhFL3 zHu7^C8#xP)J;dqZ&ftT%Xtsk;Bl>a9KRJj!KqMu{(C0^Nwyu0(2}W zR;-I_&)$%djl!gy#1sSbz>o*8XAZ(k)zOCtw4DjHU56LiR)-g@mMT);7|v}!r-?CR zk4fs4Z;L7DD%uPW%X5${b}sDq$^P|UuCL55Z~bx|{KWF)!#uDogMmP|eTT!FR)@nu zbS}|`K|2xWCX`K-KvJ%H5tUaUBJ^j&J?_!DR`Kp@a3Mi3!v~+*J)#5Snn0S@VN0D0 z;Ikn0E-3DWw!1L7@9<`u$5G`u0{Cl=>KJdHj#DQ_z6R!g;vi`5)Rp+{sP*FWuVb50 zjD%=^O)4L=$V_2v249U!H@Yj@cKpFf&OwXvqK+SdhO5r)SZ*jK)KEo zv+(z$y4$PXw<@ic8@0N_!3ZXM38@L_zoeH@sVN=fWYM&SSBuBACQN4yI%nE1eD@V+ z;3u&%VoSTa-Y;6q67}?`b3L805G8Ob4BV&xz$nVjDBZ4uTq=-xwnNOH)ksr>d8V*reeB?N5o>yA&u4MNfFn0Rx*bKp$2D(zNIvy_CbfHs@Eh@ zpYZIp?9FIKf&EM5w5>j(H!Y?TiypG=a}@9wV_{QHzci86T>vZ99q5DUi8q}yV-5af zBI-74%(V?&uzZ({^H)r1W7lo`DV-BSJy_Ez@?;?t<=m+=H*VwU8EvTUZW70k5oC(5 zcoU=IJQRC8HN+h6ByB>rDApmYZBpM05Zu0d{3+gjPJQ!q2geJ}(lZMD>wT1&a!t6a znY8De6<-z1jl*(PX<>X!0G$<1WlrmFje>+h3a4P^(5fKggN}jq60PD6?syilbX|cY zpBFmj#21)b*WtApc!VrS*%;WuCCJL26mx)r#bH{3S(s7$M~eT}f94nAQKsQ|UxwyN z3*Q=bFiatf)PdTV+N}p#hpDLS6dBHrj#kLwCG(`cKRe0kPp@r9@*oO`hR^XEXE}4R zhTdj~N{KvO1e(%Q6df<(HW>eok+@SO=x8-S&_+a$3f&b^6}hX<*aN>qc^b@cw)-rd zTUuk<`ap}Ty7yuTw7lf)81L+t`U)RL>$0B%mH{b^ESzN_3GLBlm93aWo#5E*44 z4UHre`1l`zbp@4VXn;0g!gfpvV}@b(g7n zD~9tzuy}K^aler7D>M=*M0pckf1hN`BuH65DzyEL$dFdtQEd9?9H8cdNKP5MqW5=1 zuERBl3#*YL&LxpKSVW!-LK)WSX?nBFc|M}>o6-cbn>DiTDzoS)bJRh>yI53~ZbvoN zU7U-pUs&bm*8{Fo)~uVhRSW*Ak=acaHEmX?VS=vu;GB`*OjC17b7WllCfHdv3$b%0 zM0>i^HUlg z=Ggv(JIh`ikc|1RArPmK<)i-~jkc-RF(z$aU~ml@1vzDasH1As<-}ul~XIt?2Xi$s8gsW1;XzXzH`yH#jGcw3uS>P z;>2ttIXQh9e7jq%m4n0C#rwg*BXSigO-9cvu;7hWF-oIOF*cLP)tG9*_a!RdDf|!bA@^>4BNJPaFv{`9AE61C7IQGLkf*O6A89zdVJb1OE2uSai z*26Vp%DkST^OOoZfG0bO1G4jdWE`m9M2taj)EQurBMW$cSel+=ohE0xRrXX`yj@X0nwvZH$w=ts{5Bi^%prbpHoUX_>%6*a#@B1m23iwe~qZr;h_J8(;6KgZ&D~WPYzA zc})i?z;Ik~uQ?tzFW7!hzGAzhCcu|hb=x!m8u5{TTZp&YWly%iXK$B65ZY+ES+1_d5)!f{AZ z1OJp|4@+bFfrySa%qcTzNc7FbP6_nLH{@HOvP35<3lkWY#XZb7cs{_IHb?c6+_^53T89OcGrK;n>NZxu3DVo)zk(ikQm% z+sHF)J1FVK%`a*UBmLrpfxlpUcZ4Iy_Z!@J@btre?3#84NVD#Aix%(v1EW+MbO!G^ ze-mpfz$XBx?J%tLl$z>(m_CDXQmU`}57M~Tv;w-ZRGU^@8lq6c6moA>hl(apT1-95d? zn!ob~?0*>QlE3cpL2^L5Db6lz{C`ZnWmp?s*RUO2gF6&0?heHzxVyW%7b))U5Zv9R zSaH`DcP~)fN`Yd1)2sLM9bb|knaR1=+Iwa)GkeVv^P;LZn*iz^8O>OJ30pMemtu`; zRB)rs>MuK|ft_2KRJ50$Mq_w_=;&QZ5ObET=d(8=r;a~@cSkXUhDK%buBtRX2_qC$ zUC`$+C;Q9XzF`BnrTivbd;laP2|P+VhvcTQkMr@&`*Uojay`BG6`}o^MK)TU3Qy>d zq1Z$U?zM9Gtl{YM=mbNkY}Y7cg|hBiTnwEb2I=ide*pdfkimMwfS$w>fidWmBvV)t zkZ>U-JtTw+>6HA-i#+v~K@R#9`gIGppoy42V_QDOfO*z0q+O0FCRS{gIAp3A1-2*Y z>SvKr6b-MaGwytRFNfdsKL<3qGQ`3NT@#x*%_?A&q0tM#k$HnKT zGmM_YO3+`#>FN)?4{C=PTVP&lM=Vr-i+V>UdOTqCX_?OAt|Omrcf;J~A$nXVL~pR- zJAT00M0PXdrGyi5;Nh?_ZY@RdcoUl#1lK zn@ny}KdoB5%#Zmh()tGw`z#lze1Rs=SzxhHou2XsFjRoRDuzwC&`H&h(sS$CtX5CF z*v)-Dqq0wRLaO!^3N$QV3haWarAmm0WU!wVvVJVcS*wm#o$*Wrhjj+-HZLt-ymQiT zIwEac)BY;5TQdELrqJ-9=a}`0v!pBVG$7{>plZV3xTD^fb<^ld`;zJpKzUOurR38u z&KY&3BeeF(z!mY5W7f?dNj265ul=n-?k=v~^7wS0%J_^9fnBl)N;;gTG@ zW3Ar8LFebMa|_-kJypxCM>;17vk8M?9=C~$iZ6Yo^2)|{8Mdzi%8$;A2P`{}(XW31 zrEg+4A|*nF4}tY+TiQdvxTCI~%V11=uBNGeCjJO(5q&L$r@LXlU^DzKo9Em0darwQ z-q&Z~k#)xWgSEE(h~5{mAU9+!Dy}b3X@iyS#&2A_Yd@nMxzhU&;q*-_bd zP~zxp`?3Kf{ro?|*3ZVASJ+28kYh1?kSHEHxVvf z{Z?y?{7N85sM&e;lr9+VC5@gn0}|o4(#AiLo>ki>v>Hr=xc;5644u6u&!Di`G5-7{ zH?&2tKClKW7m~1}(ovVHh@CFg?W^D}u943#f39FWdqR&`&oH`^BjIKGB8qlJ8=`8& zkZ@ZYkf16Ph@0;I+VP}>KKn|G?o*T_uOuGy+HahZPJo{!=BhPl%1cyp>h%>@A*BmxeOP>AUl~Q8Q6eA1x*~&{E57Dvolb; z`^3q7Zme#A>yF@EbcC{bL8k)OTkNiXKx!xorc<-(W*Won(YIngMJpiecvkN3Mzik6 zF3>r3dwPZD#>A>KB;0JLpBNrkXxk24NJdv6&nak(+P(YuLMD}qMvH&pcn4b#-+Wq8 zM}p4MdD$TL5P`{Xo>SwRQ~3Q@IMz}?!#PZaK9C>c% zZ7X;Zhudda9V(Q4ilAYfwIAG-e^mB0l`7)%N(4NXj+XV>xqn&SkQlbsR+OTbq3o~h z6Cbjy@;<*nPBEh)bSNj@{db0Wlw+aX`9n*ImQQ0H*o|-L!%q+=>Mz(*PK7Vig+6$c zKXBVhr>2l{m*ak<_aj|T?IbNh{G8Y{`tZruo3PEa0p;))bq(So01kPN&3D~1ys^Z* zh35@3!j`W+y`wv_W8O?4I;la|Tgfe`8e_BlM*Cx5v*7xfDf4ix*8PNIA;46Hr~41y zB&ed4o#Z2IQ=O>^Qkm7L*#0(zyXVgyP!3s*xKI|u~5VTP9@E1=m#*HrBnC6A@+Z^Pd7ha@deQtS&> zxnz%9KNk~ShejLZ_HP2>+{{Vk7f7wL6SF2Cg_AQ0-A4=A0R>^qW6@QG=}x>;K|hUr zcwxWI+~d=mu<-bAo$i-@HZyLIjzXx$IL7AF`wDqlnh`6y8&ONFcwG35fROM9@KMG^ z2T}Kjhk_uz$Go|Lj%0kjA<$Y`*9pDE;{tC$zxF2w+%uw!AT$EDsmP&OS);E164}nO z86L`S3lSqr&gBy1U!R6*?ip-zRGi)xy(4D@y1som?Pv;#l%1Diay_*E<+B@WdV%+x zFet|nUDsF0oR048d;y)P>Ck5w9Is_+?l0 zq~FmyvR=3MSHsIqK>U86A#T>g^w-*-qNqXvJw+>La%l6Gsl10-eRF*%yJJ!SL$gVT zn385w&0X6-Vi9cYR5Hm<}YG_I-*}N?+wn;cG=HH0X?f@tAi+7n`cGw3WbT($0*5=j=Z*jAz<@__&G8A&07L%=ppowDiB^DE`~vX) z0aStAE$ob(vedc%RFrdVZ^__8uGRQ~aQ|r)bsk^@qzd(qBftI=G3B2l1yDLM4Mw*e z{@VsILbRhWSO+!)dLHpV9c30>{ZLfSR%wyR8h-(#H+gbEk|=qz0%y=)fbs$gvdHRe zDFk$%{tJk0PmseV$-tH)C2;%&Xz2T4lN9dH5yi4Z!u|q);aLD|iVT2=J`n3KKpk*? z!qd8;oCYt+`yU_^;DY!*1dxljWD)Wg5Y7i~T-+2hGo2l5!v2+j=!(Zg9`3}Sw{C&) z7x*B}R~c}w@v$}j{vr+nB#BK1d~hVMgn)estd##YHMtZP=D5^wJv{OJ zG(_P06wxp?4gq;)!jMh?)?XFxk@^u-bGE;jc-|%d2OvI-@#>g5d>hyB{|ERW(PAM9 zb#H$ZjQ$Uh1>H9bA~CV{?aclaDEr<9iNDCJ;YR(H@xR3sv6&wSy-0Lq%BxEM0NIZB zxhl5g68>vB-{Q6h~7K@0a)-c1x{f9H*DGW ztDTL2>QNwu|9#Pagcz1X-#dpzJs5AVe*IbO(_%paUs6;-auBS`5zGK_(6}{ z)9Zr`;2$81%)Y7GlOvnsg7Xi+BsroYh+A*VOU3+8g_um>crU#eW*EvC*54-NEe{>+ zX-UI!cB|f{f14nSq;Z%sOa4#@pxuWYf|7-fR3k%&ylE51PShFmkTsS~i*S%zSc}Hm z{0GQ^pA0?x2QaRF`L^)~a4TRh0lJkX#}ItJdiw)#gm@_UKWy@ey~ld6a`IJ}Tz)sIA%7eb^FKvNSvw9C3ZwZNy4k9ip#Z!=I^uXR{|27En z2U4weZXSJQ!@qZDfcZJV-0$k#J}|U9$La5He*h3oZySMqkP#xi_xjra(nXR_JHLNA zzh2k}LQR7&pCNjlU)weuA;0*G0U(|OG?cd3dGcpe|k*$?)0^ zb%N>~bBMO_+Ee;Ne+U?p8Li2G0vwTp#IcWRcdItL;B8~yWWbj~5!754?-qOBA}$S? z4mYz7q^4j<&&k+2H`NtHVW2j0^JUUVe#azFQ;*>>NV7`_Qiv-R)rcWPL5q!V8A7P;3U$R^a`7(V3RLdJ7oSs94=0X4G*JD zDX!tCDsWPdIBeUL&4wic$o`}jC05caeNx**GKd$Ri-jLfiZQIuxF4*HYRkqOX#q)P z6(?@VA}cMUJfC+P!@esaA>kiwm{A=J7L2Z>Avx9sZp$W9u#lDBq#3H@coXHaqgrrB zPf|0Z9}~5!1S3w#I8@wn#d(V~fdfh7%9BQEc&It{3@HmFl*YO-H5{h3RDMr@4Je*u zwGo3IoTAJ$fj)$2@EEzh1UtYq9|EZAJ3^>0LmCFrf*b?`+j!mJga|$AVV zoL)kageh*@QdwmK@e8$N6Ctrbj6$2D5d+YGO?1Y27CI&P!;fWj zJIra7c5xAs;JqAS4`JfFQ>jP0C#t!KG0M#N8#%Si%o)1TA8>A(xN)_ zpbd|ay}yb**xb_vd2$(8z{=3Si(m?fo$a8Kq=HK>SJjAX1`0@sC2LtEhHRmFaGxt0 zVPV)crO=Hg|aYC9J#F{)P{l#g;&FAir+@juVMHlHN)3_#9gPyQc&7@j+bw&ku z(@=~#_M$^xKLo;;?m7q1T86zrY;wg|159@Q-XEY9X_z&v(J0E-ZP%jtTl{s#2(qHV zkt4tJrDH~l2yMVwDdIKn8iCn-2$R9;hRGyFjYoWjYW^9NmaTFd(9t37j-jsqdfAq^PsBd#{1PYR!{J%jDGySc+u=yEJ7bJ zTK8Ts0qQfA;x5=A`g$}bR-`>3t(?Ud`?^7#!;ft|Vn1Ru%AoStxrrsp#j$nz^>(yJ zYT*U6s*BHP@kBw_bWlgOggNBRAVr2A*59}Bu&^+AGstM(K&QA4q^^*j?p~ntqo^4= zOpIwi?jgI`58v%HX54!<{#KnCE0GGxzA+46GE80hXwx=EKJb}DbAmO4lPEi&Li}1n zoXm_i*4ClMiY%5i@%+u7y4Uw+R#Ae(4s*^VMPMMDy${&TUWBWFQhAS_Aq;aiKlc{6 zHygeip@@6|zl;{!0_|Hh=O4NNKLfg8iur;u@}(C&vgE0+K-OUnPf{Es6l5731@mexH8#LkRMcg)n5*(n{9odZ;?@llvU zPGBQ0S#mV0k?j5iD@OVEJnP7)mEhv>MDz1U+E@cxY)KBP@wH&x;yZQQWNmd8Y$|&= zo2dbB>+~@YU8L0fY8%bevBS};;<2Y5ZuuWT@DP(z6VQp16>kI>L)U;2!acs;jPenV zIsKYpN7)QZp3Lmw5!!*fv036e42u?s5r(zrnAAEd>!5Jk^xd4b$}YiT)Tc2UeNh!# zOAKQ+%02=yDvp4Sj|(0s_4EPTp7gW4c@7m|2}>)6#)}1~9F>60Bs`oAlLu7NmrG!g zUj_n!Bp_xzhv>A{5<)p19<})0rGiU8RO51ZJAG*oHfxYV8Qq#3``euS$lZbvQa&tu z!gohGwy|H|rA8ll3{WPd5sm@`nf-x6J@k^_iocD&M3n@8h991U>^fFt9y7~Q5vpst zqN?LTcuKe7QB_W*SR{5Vp@OQXf{umAerL9=artgx`gU{Y;@kbA9xQQ}egh7B*e0TY z;lb^WtLC?F4e3@RH_exXrml?v5$gNc;2m@0CQz&SafGC#B;7FWvE!VvWgz73QTqlH z7|u#BB6b!fRz$%k(wy^ytjr%5?8p9Oem5YeriL;5=D}1{b#SA)!;vIZPZlA0?i4Zp zZ6sOsC3fV6$?QALr{i=SkO47pn>ECo>XL=7Wtaj{iIsVn3khfMQ7ar?l7og@@c2iJ zMu>t^t`Q0b1_qKc_n*J%-@8T(cF0|$D%)R|(}C-v zrn$YF|1T>Z#xMR*8#>2|Zy=V&u(^yO*Zy1rlmpq8F9DI%v*`pfS(nQe=4Nh`t6C4s zXR0!k%zWVo8fm7FEA$s-mt-J)kLkEl4nHsv!I$W3p{hQO?15NElUzMs^1BuB3xamS zUFW%+VijLEc3Xbzh$k+VHCco<$)wjVYKHiZd55TpdN{&RqE@jIJn#iUtBp+da zHKr&Xvd;5k*)+L#jwQ5GQ+51H9;KW?{t49PA5Cp$GbE#8QNBhd7nv)`jm;+A8K(M0 zOj2X`(t8@>DA?p-7g3;2BW>Oz>qJn2I=10f6i35aeVL77n{Al=QHniTqFBzywwuaFbciGCgXlST*$26Nb zd^7x2Kgt=J>_rUJ2c3v}h-0kEkeC=u=fV$%u?$+nMH~qbgF)k?$922eECWAGYmOu4 zu@&;vb>|S`M|)6ZEcS8M%)Bu&VjJ_p=RN`XW(+Soda#yis;@Rwhb}IL(q7c=TJb$_pmCs}Gl|e0r$B+=iO5u#7^OJfB)5jn{>; z?bF*F(`b6Z?r<;p$}Zozwpg?3QA{}{$&L^E?X(b(&^V^RgTnU8{P zYxcfw2eV!IkTAzrgB^Tk|382tV=ad-lqy*i)Su9OyCbF;CBSDqyN=Wbqa`7dvy+~q zC4T^!5O;6fmW?+s<*^^3VBDz>j%|gmPL|DV8di~6$S?2%57HqzBq~L^^)>b*MdM@J zK}%F&;_7JC5tfY4$DvzV?KxglIYv0ViYvFsjdMxXv-Iz8z$sm9hNzo?T%>z`I-PQa z+GK9i)JeLFK-84mjDV2&v{jVM9B?yE#TL?@m@RrTu?zK+36f`&Eeex8F7R{W#)=uJ zmO_DVBp@*P*2Y0$wDK{zyKn3Uu_0-7K^)fdjZ~zWK7OJG9}S;uwvCIY3{n#&BAcLh zEwHaYnn@a-ee{;Xi^s!>a$aca9pkzbHM-^IqLb%Z<$f(tr+e( z)%p9fG}P>?)iDOW1!~W?JaU|rJhZkzY_eb_6gmGn<*bVmJQu@10DYX$Y0@jGhVfx~ zu2C#L>`bfu9^X2?N`iPLs(#<|5hRsR zG`LE?k})A2Wol6KipfseH$TH1NZfLl9GGL14usqX?xw@>T7uFuA0ZYH1Y-$*!j3R) zl-J*wz^3P9rbH#4Vk7C#zv&uhXSG+&*jOpoy?En!@;f7|@d(P|$CC+#l@M-81OwUO zVMUleDXeNAtRha2%f9`MiS!FR(#Bai8(@DHSIB51y$^_RGk=M`=>I=WX(L>Z5Zk@ z4IRCJyE*m zSdYSHb&NSLk!C~U%!)9w!d4yHqvj(M0_U-wy9fIbzT zJy9~UM5$6`k|woku!zF0>Jx=$bZk2OYj9{sFGkDKg-(rJ=*4QwLZ&R9M#d2q+m z8#ieLdyNbGDZN6)0aGh$vZMO$?CL3@WEe+*OUxR|#qSpaWW|)#x;_!IJdDqd*2jh#6CI zba;w`k!C2rZn(|M-~>&)e{?z{3sp#BSvWB%M3UE#DdF-1yl#t7j5)O2TnG~n(UFDh z0GMwxNzbH5Mxi@;i(Gbcc!iZh(%52!l6IM$65aJeQY}-CcLft8g$TSD6-OZvq}*bc z*aQe83w`^g&fOoLxGzBA``>s)H*Gp_inU3MtK*`;|Ak z1J{#Bge42kPIP3vCu6WA4Gj)2zPs_q8!_X7Iv?0IX!(>RE6MGJl~+psgBr<9W)#&H zmKh6+ymfa*IOMf{Yk>yu5M@=0ETizr>`ns-Nu93lQ@B4R=X+Y~j?BIM>ud74ffycQ zjca<{G9L0I1#txh8VgH~d@Pa`=(Sd?5upM8Nk^en4Pi0hcHX^N`lf9!mo_N&+C)fy zF_ZA-OS*6(eVm4r@tG z6-lxv2RRGB0Z8MBXG{h7Mi2m%NSiV`lk?ts;wL`mybrj$n0Su9g#*JPIMxjsSx$%W zDXnY4F=jj6Mq$;*VjvMFAK_X~mWVtUQCQ{^L1Dy*Mfti~T5k@GhmLavMpC(mcPE!n z7g35bk(rbr@-^4A%I3X*#CL90s*z54I%4U40yjzmx(|93zapJ7iVU7e)HO zZ-7sU;ck2I%wHjl0%^7juV#TLo=1a-nk!o^dNCybqQ8#+Qtg+bUiyK|gB)wsD)S}% zYCKZvcmzw^q$+yV(^-*+p|;dIsu-m`XpR!yr4$DktpX~>#K>dS4;I|@tuq?L2xG)I zWR+6HFMle6TWs}JE8Bl-tm{JMqNYTO{;kYn<)5mKRyJI(_ zm-^}f3C24G6I?$T>tab3bNxoK44?UAAdkNj_)!9b0xB zrKl6$F|yQ2o{o!|<$TPIPR-oJvlM6Opzl$ZhxbYnXZRCee)IpL(V!vI16YVn`TrM< z2C*k&K=S-G4P3K{lK%5#V^Nl10n!yliLbjhA%1V z+9soE;k&iMwbS8s;w7@5EJI`dk}ir*DpZSkn}erS>MM0r`WbsErW3r3e8ZI689gSm z{M1_ zZSYW0<}8kM<;+Qk$y;-1>iR=Z6B^}Kp(jHPkNR|XQl!Q_Ax6?@~m8NOr$NpN}{=yCX zFJ9cG%{t7p9+cLS_rdE5HmiqY>7(@_do7_ z!gg}U&&q%lI;#gJ8DG@1j<>@F9!R*I(HKgweHqmnJ3_>1@qf?UP&Vy#MTiCJ${lSL z;87TtVY9|9*PX9WC3+DByV2eI@kj%SP~lY$?664N!Ii%P9fywA zhU}^&cuL?hAbwtkT_nw7waLzXxSMV^P{VLL`!1b0`qGJ8jE@kzR%+n0&Ep7oNlgIM zG(s#&e0#!BoiKo@E6x>HGEMxJ&FHo|d9+qu8xA*-@DEvA=6znGp)K%g=`7GFN{Z7P{!a^LMmTIs$KztLqgq?0I84S$0O zi5U;B+LwOFRri%4Q-_!^ngn18)S7`Ju0+(4Q`(gRLuJ!OKOpD@#2@Bq5vCavlFfT@3C$s z1Iy_*INkYG4_7dD0aO^@(-o}kY5-bp@4;)0@-k|95mDdCMH#={RZ1{Cr6Kv-lO8%E z`BCBtAOH$y0jG5?i86;D!AJ^C^rWR``*7-8x|a4{QTOcd#KqT?QR#)_ewcF-aD2O< z2yaMt(7TyzCkxmoIGSuf_(^gkbPg+qIaFt`AIIa?6#9+n+?9HX;dcFqOtTTSkD4;> zT#N|Eo>rv6e@9CnIM?eF=7NGzSi*>F^D4rM9wAMIskegl?U+g%oKS{~)u1iO3J6-$ zQfm@b?Pq|GYjB-E%m&q!eFTfvm$^y|g0}Dv{q^;t&?2}6Eq|w-btfu&s$wvAK|j-L zUzwJi_`34Mot~Vh9ECPc++}|C`sf5@nbmv1aH+8Mv46*^>;j}=7cqZkpEqnHj#j3Z zz0StlI@3U;b`RUqNg%0sV2N#=8F()0d5B`%Boif29TmtzsF_zsR??qZ4RW=)n!7^|nLi?B&>t}Pbu?%I|4Y~>YU1FvLYWXy@-WK) z{p+>S8AS)$J}PH~qhFv`muRM3`@8+7O*Xpz0L&irxltyq_}ZK^7?2L}8To9Y%asLk4``}>9-2PPK#!V_ z9c#MJ&a?f*o3@JjozB5MEX(fp9jXZ)(sFe4xwBEE_kshe)xGGi+9I1jfaTZS$d5Xw zUmKTx#S(6cDZf)W1}#^Wf!2WoIx-An{tSd~E>ufqn`*?$JY2c=)Mp|(AIgir5Lirb zVweu>>jDQ!*b!zo1FoMqo2R)*AAno zGc0hPM0_evpQCFP&$ELPc~w}aSK+g+{uJ(*l78Z}t`!raHYt^0m*5&cJFbi$!Ni!2 zsfJS-OK4S+el$89{8n*FHm)da+gvv1cMSAq8v|7>xUvhB^0*C#7BA-v7WXe#IH%dIct)EO+Qe$FF33VON!%FntO4Mr&;P!m82e8JL9WbXOlaQ%q-@Tv7G!Dkn9dCUF zbv9(LH$NxTA>_}__grSFrak#Vm} z_J6^GLMv|r1$0*XIjWCQ+SEs}_K~LsaoF44$vwai8BbV2h^nJ7`tFTlIN-MkgTA^a|=zd$Bov& zxt6hg^St_mOo$dmR|F+CCL0{ZOJ`ai0-)FK_{@CA7S;SacHef_a(?%;P}(m%j*MeM z|Aqrk8+-|!306pX9^SChl*YP%tDE(w_zo?$Sjy;)PFK^Ps-$>!<muC-FLxV6X@ z$QVNOIn!$>RHNt=tNBciJ9|as8TG@6gzCvMvYdgjp(tzdimLZc*%J!JmrxZvLr(Vc zf{^cp>?lq9bSnf(x7o*bnxzB&Fw-5TmqFk~Y`hhj?$J#gVBJ1fd8Na*jFr~A@O62U za7vmS-gP_$XHWp@O`dn0Db2s=cm_nptun}up|#o_*yilBS-bK~=thSaRPxqazS(Mi z{cPWIN-udN-C?#Ip)-3c2I|zesy*gSTygF@Tc|Ys*tR`WVxL9m z9?cuN>EjNpVz|nYc5r#@dQ@AgEpGu_lBd}8jEuht$M#8R#|dkU!u>7ORm)BjQ?vQi zz9U)vJJy15u0V!G{y1{0#15U2Vouc;8VvW30x6Gn49z!qB^^!MY#p06V|4AXr53OR z;XnkLXBsAU#Z(k!FtxtBTJ4a-XJM@f{yYVx+f^UJUTwbg@A5E3Ozd<&x9DDbCAnX! zL5W(>G0Y#_YFc3l@%^owTiHfp4)J0`-LWPDBECmi!uOyefJXGXBW@Ot>o(Wox`(K_ zKp?yv1^&pY0`y!tI?r-O*$JK9y>7FuGWTG|!CXN;p+@Q8j-So}$-DzxBI%-AkbO0~o!bM$&FZm~zaWt&D86T~iIV0IDjVR+pt zMBP7`N}&ktTe`CzeJp9z3r7&3){XdutX#N>m5a~|LWua@G#pXC)b3=)`beXvp%1fv z+91aC$;^oj+!roCBEJES2xxEfXNgtNP zasm6H4DHIH+YqGreq!pQ(!P5VZ9WXSZrCVjwPUKNxOJP3n@DW8gnwEm93 zZ%_UGR1-q6ZrKffaXEa+B)F!b^n7xiU7REx9RSH54x4@}B^C5B5{@N{-9c_o^DcA0 zf475Ob*3`oYf70JR2T&OivvPYts{^eR0oBm4DJCBx zOdYoYC&gs8A7|rAPi%(XP4a~4(`mC3(gTgukca+sQlxB`#;&x<2z6qpRj)pB`3KOc zZs4JRuEZXNbOm~}yuN6+?!w4FW-EDeVY~ffizp`CbFh)k#ph zQB*tz-OLBTiDZ)++ytiTA0p52q1ZIWU+ z%_7h4W=?fRDTA$6T}Ew2!ihNx7F+qiKU zG0SV|Wm_b)mjctYYj39CnX5GF8k9Aa3C%h2B!}yo^Z5mtw9;T7C9*&_N24&x>IG5F0C6F); ze$jGqgzXU|UH3M z9fY65be=zx2Di2HFeG%yqn8(rgAj4Rs#oB4mI&mLd%JJCcP;X7(yr(gEKy_2Dt!Iy zY?gpdaX5x*{r2ZvOJ4vWGl|1kw>&1-Z#jQjG@zBD&30z{l^lb%=#A5ll%o>uoQ3Kdvokv8D_>Bw zO7UpZBwI**f|2?!MY2f=J*qEH!;PeMi=O)m2i=jn(m2*B*(Qts5U_$qWlVO!)B=)PO|ihY<$+Z1s*^ zYr{KpHc#Ffslo<^Avai}2h;W(pxxnN{r*FGulkh++zR>> zwihl67`B#`v@AEq0haGX=c4v|15w(P&I7c?jECCZ+!*;z%iO$ARY>G0$QZ8DUWxHH zj4L!V>Y4ISp^Ry{?P5)&9PiluxSWCZ)s8uWisJJl^vK{`z7rpKX6(W?sf=;I2qy-X zf$U(vKLEPxRAlZi?YRZIpo-ew+cd9d?V1t47wPcw<*{HYjt>qUTMW?k({*$@ThAH* z%T{C6+Bma2kDwZkI)9M^SJ66AOs1x~H9EYqXSPa|l9U=Z(@*G8vU7xv6ltU=pp6GodAp|nM(9PF$I zcCvmGiV79#Xy&eArs9Ok2#n+k=~eoZhVSaH1$}7H53+}Q*wiVl$yh%(Mc{#F;T1Zr zURA+eZtAwIcC?bG!&3yW$iqfUp@n$(j^c;Y+K^y0JZ6Q#9>M<(8CUplz6rDv@&1vd z|E=E@=JTlGD!B;{QY>ObOj(8eS@=2!(2yT_1#^f|TH^)B)y!U8262>8tr60J)dOQH;$?2z1^v1}s&#q6~8 zO33e$Ih^UKn7-ELlpqs8$ur}9qu^5I)aaRw?N(b*`mWVo`|b#E&6BRe5?js4(Bf+E z75svZB8T%?M<5;NS!DmPD3U6khUSA|5LuFaF;x!vy`bnjgF1VR!cmjnS=AW;irO*s zrH;#?#!>}!6M#N_RiIwMJp49mz{tiSBibo_A_sBrv(9N05dRf;&z- zr=aJcJkP0~^3Ej5QqPkPF1)KG4Q@mQk}OxrIY}D9&1j#T#g>M!`eA~XfWc&aZ98%2k7mZxm=%jf3k zCPk#BXB(u6)P<9h-ASwMtzO8mSr7Z>2nak(7S<_$8~N6lH1ncqpzV{{w8VJ_W!M(O zc`&DICxkIh;^5Fd<*I_MxhlQTt0L8d5896ueJMl<4S*bJ89jGiSuKoev0HZf23@cr zJqg(-yb{{H1xMbNq_b+Y3PWfLI6UYd?(3VUbLz&bY@SgAEbsC*0r$bTcM+P{@MT@{ z+2#W2aIatyn%D8?Cc!JSI{C|VOb7U9AZvAJqKDx%5=<|X)3f|`pdG*$7Tva@Rimry zxXL$n*&LH*RIZIBep_fX%NJiWIunS%;1c-hr`HN(?xMiP&#%V8S2E}SJCS{DPHozA&3hi^Y zzC%MK7={X39i^agi%Tup94#O6P=7G(QA$}duRQm`Jkqf3!0keYx0~XWb^T2OJjTIc zBHZxK6UN!s%16JTrEMKq{{sj`aj9G)SN^T)=RdBuMFyz|kIP)FG^eLmgh9oCGYL@u34p&osuKM}bJkHqHvb*(@sqfpRu`o( zHr7{ML$hqju$fLXdLr2E929~YeWKuRmzK$Rkt*oRT7;7F#Cgb?OL;dpI9|Km9DN$S z(yb=_92;2yHJHpb4E0U<$8<(AO7QcYs$$~RHO%s3KSQ}tzZkUAsM9caP{dNgZ=)qD zW1^91`^MbH-q1m5uESFVyKZv+s2|pA^7z7`3EwT~3PfXbQsKrKp|mZhhOYd2q9U~G zSRbIdcF3<)i-!a%GKpcSGwHq-{jF4}w?S{GS9Zh(35BWsvD*#_t0;N_WxEX8KwKp$&JOEKhPxRCYHyI@MArO3*mPzeM*@5NV>X zkOa7Ei$u>6P|P3|U+1bM zzDG2wN&3DK+A)##r)i)S=V~P9Y8O@=YP8$}HJ!mElQZL-zP?tQ`$NPfgJacP0=h60 zpsagFG@B0?{dnO5fg$MtM7=^1S#4%WgrjL=%T9y?co&4|asrg2_f4O-XNdQ0w77)i zF~?9ynLps?ET_9<)xyK4Xd7gR*Akn#c8CK2_y#_?78muYS|CT@`+j$?d|9xWZ5q&{ zCU=OaDRQ1r`n}kQOut}GaJoxZr@W-3E>0}#0u0V5b4D{hfxl8Q@~y~}Bnl}m%yhY8 z<#;-qzu~&`WF^hyS5lYDk%&O-l&@!a3HY&YAyQJpG2${YltJWNjZtgbboK1|m1X&YhurhaC&lvOXp^_8T&QPH1iHdkU|sdB>?hR9v?5 zgD@|guO2)3;c@Ueid2K_BSlUiXz`T6Iqdt1!O*lO%auw6B0sg8gb^5Y#8P&6=lO1w zgfv5E9YJ#{^UhGg(Mui2is^_rp+Z@u5l zSv(UyR6kK}g(;P=4Yx~knvxLt)iP=8;8){b>ci!?NUt&835f6IhQ`7-5)DZ%3Gt!s zp%I$GrRvyMt|1o&O3N%l$0ChAlW&A~=1D|xNNbYLSEVxXLkwI$hlc{n5ZB8rc~!qG z@cEJo2^MJ*$c^0 zC&8FY98LZ>@m)!wkkA0UKt zz(Y#*$Y&(kKivr%Sx)2TWYAK&g&8HO8?WXhwxtBPraSc&V? zhTHJaYbf()t*|4#n}wpj&mEdyK8@;J#sn<<^zH4ivDg((msr#I1jD*)rY=>xsB2B% zXT!kM?d!CXDQ)jd^cGr9ByuzKlLOp5;rhM%J2N-d-HO@9QijS`NO1XQuzFKgOMrq3 z_MQ*R(j{is%p}aQ|85Ju=*qH*luyN8WVrUOpIUbl((){;TG+@EBu?(OXpIY!$+6xH z$_Om&Fq_k&94P)GQk>MkuDh#!%)T4lDD)%Hi_+uJi<;(Z9^)Ef z&1f1`<0&+GZBgcar04o7oyB-KR=2e8VF)dXxLn*fxI3;Fn9njj^*w?+<~(j&%YZ3ne3F+!+Aw|ke9Z*Y`VOYK&zAk%W3chPe(?iG zNHiB2@Ti!#FbcLTD&}9rrf2Ujhk*_^Dl)^SW$0$I)*_8%(g_Nljv?^1TX+jRWJ6p- zdZC{I?J_^2Er^iw8&?VnN~7e39L?pXK4tiTJj6=8%XN>SaNM_kp@v%(VyO4pE;@sV zofu%dPNpCZEWrT~abeuN3|9~<`VOJs80=~fWM!{WC^>!fj*v5nWd&kvgN^1Pxu-dl z?F4fL)+Kj?>pbCpVQy!f^N)0Uqo!D~sOq=5iK~P?xr}c5_n}&KY4;K0YW|CS5gcM> zEog&Qy(m{ey2R^RKs1L4l`wrOUZV+iOFf{gaaFl`+*234ZZ{sVM5y%$u<3)uTFFs; zu2gh$weJ1Al~h&OLRO6c6aZ*|<{JKksBN<~GPT<`1Q|u4v}i3N(hC);;=6v)Oc1#5 zL`SMUFiq+RmXKP5Al6=9B(-i|yt^BP-dZJh#Ml)@DWldm{3UX?4s>riT^8{Je8B)v z2L~R|*Yw4bu_-XKX82DxdZ|*?rnGbiEVY=jsO(r{V%{lHRf1L5b#kj}wyszDf<#G5ODZy= zK67nGg-xr5f@?6{C&PL~P2@$8T;U6@ATMyamvIhQ=u%U{0%_eZuh9lwnfM% zV~&Uip6^6Rv}>#%U_8Seh^|CM+*636@hsv2hBa{9Lvb!(M==4Hki7o*fRLe)p<=D; zec)2EjTrFV;#sar=AdUJ6n{?hQPeom?nmo}X+IYz+pjW?6W%=q_lX-Gml)Xjj=@6|1T~UZ zHt;Kftwqh@OIQ_Qg3x0!SxuX4^|M{^$K{L4ri zTg0cts&5*Yl~?+p+^*4TI{uZHSDC?%881P#>_r0jC||YCx3dD86Qf1KanQe+YwQMS z)h|@bb$1eXGUIo|Ue3`&7jqh> z+OPD+egpkbyNg8&?kWlhj%{Fm$Bp4AP?UX$$@&_AznOD=SOk&TWR z8sCyUiyF1~iEonA@=E~M)z{ZByg01WcmvEW!{x@tR$_~>!j9U5m{1o-IApxM`H0|) zqT;W#4ZCua>>wafxkd?1x+>#qq$1QXZpu(zDl6$L!?YNt%e6{{o6~;>U%4ZoiJB~U ze*D8xiUt5VaG>wqL{$>`VR%&BPNX$k=OP zzla5^1B0owr0y2_47(!QccP+p0p@gQ9z`*3tHfmi^^a~` z#kQQm)Ps%&&4f7Jbc;)x^EUcA^h^H$1C?^kZx^fP00LU59oJs*mpYHb$BHIwderXR z1i*zHn=IU|LDILQ+__|P=qQ!%8v-T%5nj5f1T!P#n8d$MiDU_|uOQq`%n%6J{{WKI zqs;ML(GfkeADY-5w-cuNHDpSxsK73XSGTBORr*^3{L1t-IbpIFdN14Y0k zLvi9A7~Bq%Z%#1f0^@4IEMfx8L!fXB5iZ~{p}e|FF6sD(1azypf8l4M2Cp%;>6Q2B zL5A~yo;3T!K=4#8#f6BS=V%Ixv2irO-qbH)msv$GuYf4Da1DrRa3RB>Q@Y$Ji`E0| z0zMdQz~u(Zsn0{h8bahiYoO)3x@5U1gL+1V!n(4D(R`!h@N-q(DA`}&y7$yX*q(hU ztExNVFa#Fbu9hcYid;|xd)I-gd5Xg{-ZP7-Dd_f;AR99aYZ5yE!<1kX#A*db46Egp zXk$19A4AhO0{w1{z|9y5F4J*c2O$JY-EjO|A$O_(>YG;>$5EK7=no;u+{fBb!sn;> zBH5N=VyOX2SXpkYD6+%Zf(xy~iqOTFxueHtUQOqQA~ZPF_ps?4W-0{%i#ZcLBHjXz z+{&ZS)VuUaS=>x|uQ->E{{X-aCeynwtn&@cAYy4wTvgmQ01vp5yY2LsXjxFI_|3&> zZ*p`|o>Y2Fc3>LNZK^rs!WWXla6GsjWP!*_D|mx)vvEQo$me#N4!(8vvKKK`uPeE0 zZAIX%Ob}RtZT!p0TPx}R0I__K*cC0ApL^{nkpkk1Uw>@}d;7(1A&if|NPypZW$_xd z8{xbE0Ov@y>J6(ba^?1x8%N?65{&?B0gi&XtR5e_xdl1|i_1~h)but2V{Owb@|FtS zUGqIQXX2sWD0>sP*%_i*2K6(>P_zK9>?+>rKss)*=Sn*$I2b%E002eFRh!pO1-+qe z)2CE?O1yXGEigLD#X;$T4N*&6ZdolMp%^rImhzAFG{^?6chY=Joi>yI01qafMjrQg ztu;LC;tigPm2ZoL1?;Bip{CTBEC^nLY%RbZj3BTArIcj3+82Sv;#g2UkLEN94v+B! zBI2@m71!f7{e4yp9%7C2E7WVyYt%4BW!$WKrW0XMK7B%-j_KDB(^>xjCL3t-UuXlG z%JSWV?oK9xr^lQKIx`Q(EMz#Q_6AT%wA$(wppxmp!cb`o0y3v8HgT;6zyeoG5h!!M z9#?PAmKN!1>~E_bFuLgh6dDW(-WO@9jfOB@g~X!uj78D*v_DQ|y+&QXd2kZsL%dcQ zYn;s;VxxcL=)=}VGQ55=dnR_m+in2!P7!FO!`UWq`EPpx`o{0|mZ2L{_hvHRx4D{{ zp@+O07GNpQV2P6P;-=igUW+3}PBM>>KV-@=q^FD@RH{Dw)G3x-e1JDw=$u!1Q{FW7+08*5e2^zT?P@TrlmmnVBX!V`#xwL0U0n zv5x|%01yBOLfha%8rr1=Q3-0os%Tp`3L4n67OI963fB1jsadnkp%D7A375@3JQOl_ zetxjCuTB{En5;pY&!eIlxZ@J)DKl^up})-La?7BVh(-FFnq~>;6dsw3$+RvzC5bwR zhzwY_3)a93;ND!uV1*BM(BbsaB)q6=t9NhHk%4^B;;Q~@okO)K( zHbby%Lo|qFLCFwMD=vVJTecV2{{VjRjAdNLN`?-R!P9(YvtIO3$6cjpFbMXB>AJm; z(uoZHiq24!00X2mvT5xu&ix`{?&T-~)m1onDH;Lxe(^mvy;`@2#E@AOuyS=HT76v+ zE-iY2%MSx1peS2W4-$&u&fwm@XCco~6WtxP832n_;0OSsgbLb1C4yLN1P&Ac4JCVP0K4M5w*I(< zfUus*g;FTSkeZ0KDnYs`+BMm$Q#Ac`ycLDC0PBJodN9FBFv;AzXIO4lUrVAcE)Pj| zcaDk5a+hsRdwSm!NtDd<>4@y~XhjD77Nh3nwQ~S823LXukOZo_x^F%L>=#Sd^A(pz0#V6U4J+*H4+3;b+6u zkIU1K+{(t*4F*rc2v)>bD*a2Zt;D7Dz@0OnO{0U->!-YW$H8Q;(LNcf3dx3{crtf; z`nx?cPogU$!`P6E7DZlS&U~-fsEe`!)cFYy50V(PD@98m zLvr4A8iWcz!1$S{;vTT?zwi|Q026+Le^?9&Z0?iu5tW}q%8UBL00qs1@edUcw9>?) zsWcO$yGXsKo>U8U_^GT`BQ0S2MHgeXrH{mP zM3!h{?mnj+#a_P5)94TT9v@Ra3JN*fz(&5S}6)MVATtmTVmN@b~|r>?rx9*ZDdpgqu)PTYR+3>WEF#HIs#^%`z{{R}bx00F3N3Tg_> zrk_Ke~C>fMX;f6>LAXuHb%NIoW{*^ K^8*VbQ~%lLqbZO8 literal 0 HcmV?d00001 diff --git a/core/fixtures/images/sas/Family/skia_sli_krophil.jpg b/core/fixtures/images/sas/Family/skia_sli_krophil.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8feba4ea66505921946654c96145feb890cf21b GIT binary patch literal 98308 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%0A%8M(x!zRqcKFpeQ&+T`>TA|eReiQ$L`?(;s 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 Mka~?Y$^JC|+5bYF7XSbN literal 0 HcmV?d00001 diff --git a/core/fixtures/images/5.jpg b/core/fixtures/images/sas/Family/sli.jpg similarity index 100% rename from core/fixtures/images/5.jpg rename to core/fixtures/images/sas/Family/sli.jpg diff --git a/core/fixtures/images/sas/Pepper/2022-03-02_In-Bloom_by-David-Revoy.jpg b/core/fixtures/images/sas/Pepper/2022-03-02_In-Bloom_by-David-Revoy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31c45e38f61250c64ad2955a532eed7cb7eccbeb GIT binary patch literal 59334 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

-$44%AfVjE@m^?-e}hA7{p~#uH&0y+P2uJeug+gJw(OP z7IpGPrpq-wCssNBGI-*6))z2C;UkI6uX<7L0_Rb-WqF`JKWYrnWCwp4W2v8Mm2hlr3_=oU`)Z{@(5oQ{m8=aO(i}l^tE&%;B&R{ziGkQ0qS7;l0c$pQ zb&1QW2AT>5=RB+iiMQQvcYc31>C%l@YUSw2p4C6mZR2a5zV{_Wyngs}`F$d?Wr@`_0zzB2h&PcomxCZUb`YF{r247v#pn1 z7Jc^<+!XOTOSM#%h!8*BEZWO1<`O8m}$3r2gpc8ywu~s2ANlQP`_ccUM zp$gko!`)FCwce#S5xT|gk^5e;c4P4f<&`fwOP9>jBi+;b(M-~&dC55VCIhx#zpa}e&g6e26LMtJ^HlX`#I){F)B+&j+pcR6D z`Z{g`V-z~>_lKYAA=J~82}#b>x=OJ0J#eC$gWwN;KC8^s3%!WLRu!pz#d>F$PB|qW$BpBp75&%tG?o7H;G$f+5$K!r+wR<^?(U5C!Wu z5qD(Ep5^dA#QKlF0?=Ne*DpUO{eWnvuhL*d9nTjP6*Jgj6wu|{p9I}-4si?-dfYhJ zMKsu2fMxAiXOKna} z^!NArfnW1q|2&V$X_ntbFjK$ntf#iuZhr^l_dYTb%I)#xc(33zDso!SXZoa>fkFd> zX#sq6LRNx3pjR@38oDc_l+8be+ZT+rFk$R^g+1g>1(&5Y?Qufis2Pb8ey7R5YzNOw zo`}++ce64L_H5%1CJi$dFQ?ur^;WSW1#-|n0l6*IF|-^=b)ujWDhb;B@0g0NuaCn% zg1Au4KhhgwmvqtHdVrEkiv@F@MsvhQ{A` zy%i8Rpt@t95(M5kz<@hlbON>#+2GFw&-vCTaQU3@IHB;8d57q(uQ9@(XVPC%F+-uR zpkC>HjZIv1>b672yZ3xzrC`S*a9<-A=aO(k9$URGR~=mM$cM$Bdc#Q&`IR3xyi;=O zD#@2LR;#Y`AjildX#q66v&6*Ts!{$PT86$bjOT{T;d)6?Nr6pL4l5+QPfZQ_$IQgY%kM5eLGGOpPWZVa71h&o1Nzj4{7r`?OPN#9_${7A*uUlE}Ck zwV>aZQn~$V(O4FS6z#k!=Yux&rCH!eYT^wVBhooYv%=^6azC1six*2&6oVs5q^ir~ z*d{7F7_w1mB0>40UktD1IOKU++n&n3UFKL>&!ZFEx>&dsNi0OeD!o2~^E@Ys&X*k2 z&fB$*SCLo+xz45&_Cqm{*VKe0K#=^ zZRPt!Un%U84uX16AM(1Y3Bsq z0N)EM9teOOi(V=XF-s1X;BN4UeNp0B!})d*4l;>peaFoG&9Tg>5hgXCE`eo-mEL~f z8N5L9d3e4WL(hKyM-bjE%YzFpyb>e4go5)L+Xss79btIJb+%?h*WGC)d0n^3=70JZ z;CcJXriYH0VDBJh7NK^>$kEgg!*B9K)x7vtVj(q&3f zJl5^-82jN6B~psO2Y&OQBF=p4i?$|&pKZ(UD>Si|Flb8~*m2;%wW-4`2>ZKp=~ zLkad?vu9`Uj}E~P*kVP-8)D&l*{=XDc&yv73`YmJM=4B{a@{bl;aSqtyNBx4mD8*I zc(|ZTWKYG$#qAgNULmB1syp}Wbgyi!{pQRo(W|pW$4DxNkIr8UWw4{L4$XEkNyd(= zAb6jGukhD-d+ki6-Y(tL^M+}@*kcH1Edims7Y`p&rKOMLSjDM1l}WSa(BjaWcl-tD zCcY^Ah$p%%@|pYd=esFfjS-v!94(8OVy6RsDOb$@ufFfPg zJ_q`&hZIGbCCUEshuIjh1Ez^|4jDMRHgIw->BXM$^E-7ssTJ_HI-UCyCd)GIaf7D; zEEbA3oAG@5i_`5}^55+5d7NfWMu}fLEZq3|bCy^zm@IPP)~DjcmBoT1nl#p5adN)@ z5MOzfZO_Q+T8_c9!8@{Efhf5$U9NOrZD`+*RCub_l)YfDTejg0(PHBJHkmG(qk)s| zS;{#thMDZKR01?yll@M}RWM1r)Aqo>vm4n4D6~Iuu!p%7mBzUQV_9Im!*tVDMy$)< z?B@kOcUaoPUH3=*_{p55XlxhMLqzmqI3Ry(xzq+vT#LNLA+Sn!esNU&&vzx4(ED_sr_*uAogtd3-Jf}-y&$c97}ii=N~M8&!77+{-<@+zs`!aF(UrI)nr~Hi zarSJ>v2fW~f;5xu35IWqonU8Y$6=tAW7s9E@)>wZ)tdZWZumJtHN0Fy(jfileQ0*E zdzuCd1#>8cE~Y2XTOgYRSln#cjCsA%)=wasIpwMz+}4`+X#(6Tp36X{&s4+jEt|`KmV|FP&#K%>d0^eja;$9*3BET zplgzMFLJu8)t^4Tj(G*Nz3f{my3xQw@ESvV5!5cJoFLoiRsk)FG^32NdT~JE08>OJmZ3$oI7TwL$vf68BAC8PnzPAn@P5 zK(B%K?Nu=bn!a6MVS3SdehVk@k?8hm@Z%CNWkPDEnHelFC9~A7F>&?fhq^S=;XyWJ zk@KI^;Y!TvA#PW^<1$npE9Or*bJ2zK&DeL{3ykP=d`qx^_L1Dc+Q;T!fmOz{qh1E( zsyf4N8Z)Ec)!~%@l$XZJeO{zCzMr&{U~D{KiI*g*Av#{<Ryw`HREP82OzyI$syXgkA|<5h?sR-t4vj=sKR{b_2RWp z5M5O$M@df}K`??AQ>L69;;3$qGxOX^9=tb1~5@GmwE*S6|nTJ+S9?GT?nV0gRO>BC z>uxV#ujEe-Ci@y>_DfT0LG=0@k!s6fLMA3Ap|&xX5lUZom&XYOi%jq`o4bj$x2LF` zyaB?}pnSZ>PY@4{)^^*EBe5*z?1xuS$qqlNhxnvFB}^%DhaT#HHqOlFTDj?jL;w=X z9+mU3mr*D4#kOzF?9dn?V$%Z=c?A?a=FgQK-l& zYBOwdv-hB+y7~1%o2$OZMvZ3;J!fE^Kf<-vbv*_=qOS`z-e945{pAXQVhk5B_EEGf?+u{G|Xiih#bZj z?Qm`z*S3T?K4=q(!mT=YWp6#GnTyon=OQ%wjv*!@|@g%u%*$&S_S| zDs?n`v1E-PHkz$R7uleg-Ehaksa1gzf~g>omnj2Q{s^;Er8ay6-^l~YjKL@Mo_X(D0_G3!&EbL~gg&Kx!^{xyNpMN~2Iq zqOn8!X%UMAtAbkB@3!yI5zU60z?vHwkD{{bI!>+9p$MGQ_VDA$MPzUVb8Y*CvxI-2cPFn7g^W!*7tZn?gqF1tE!>FwW=~tQ-gP}!i~Bsv z>U&?Z*ovSYAFwuUd$kfOpNY?ScmEoez}mpYh)s5+U6_I9rGNASv#uiN356L0eZ+M3 z)wsy;^qW4)t~BAJ^3%)$unX-3mvx8yZ8%8)2db?{?})6k^s=r&@r+9BiQ*L z9S<5Qvk=LDdd!f2&E@sb!XDE%!T-}$GKZ81a^F>e-+TvasKr$d;kEurt~#K3H*C$K zSfWT8$D~+u7=)ASg4(}*BSirmdL!@(ljKoA68~44Alty;)`VS^1i=y}oTTGPUP#gR zw~*0F_)-iBi!8)^&OvkFSK&8Th&4y+M3drIi01uZ{FutC5pKh*5dtHP5=Bq5Dy=P} z9kvfKpxM0E7u~T`Iv+x|v|L%A!AgiSY~d%tr&7tx?W~ayqz0ZK%&`FS)s*u!#oQ^I zG3GBa8FDH5fbKtui_1!>;vaN&*{oQ7rr7k7nST?}e-PrNVJWq-CkkC_C~S`Gf`|2xd@+db{0ZHK~6>z z=})7F$8L1i?4d>_s+go2n1#%*ara%K<2tU!;SwT&qgqX)8aQ2qB|5va++@0hoXrd6 zLnG&s`%yW$Zb?_id?Hox%^iept+EDHN%SMESE+SdCE>ItCs@2 zW|JqBt^p}!`Jbu11!v9Q+_p}sl4+2}k<7GM{{_Ge>Ho~%kpfWGrZB%h zvEm1zzzSv@Itr8!`{C$h`jhui_`PBK4LgLns#>x5qWTkbt+Atpw7v)&h_i+W1atXS!YfdXN39C{%h4h-wKSN9Cx74H1;+}cL z=`}56SZxna;2l~Ealu6um0e{cR5OR&$vJS83qQf1qhf1q&;RYL2{qn~;m5Ie6^D|> z{9SRl@nlk44r!p2d2w)U#=A7v7jDhJ86r1T-C^M+Ju?raDoKHwT5Mz*xZp0N=Qv0= zmE|aW_eue-%=l(^4iA^anFeP17f|#QU3sNd8@I9(d&hbUCB9uPAXCB2(WG)z6q5m~mLqri8u;8Qh~o-lqDK`7`JvjRQA-bO{>~i9`_frB^XuzY)kI!YrpN zth&u}NNgr}qv?iTK1Hq=+5Hw`d>{Hmib~mTeND7xJxo8$2E)v)p^HWC?_5ZFb&k(- zgpwdt>PYo|IGVDB9*K;&Crtk))4&$J=4I#AQ?yq2sk$7kN|8=ii>kgKE@!A?C(XKs zyl2}z;G)B=zcXYdRuBS#SUj6P8d2J0rzj8d@&VNbqg=8oSqkokr-|w&azBi+_z{$f zTX#9Gd70`DM`5X5!m)ay)sk7i<4xsqe*N^Kj?i4A#Of}EMSV|eSdumdJTZ3>K5nn! zs_UM(X2yo(#^%Cf_u%ElON*(96+RDq9B;@e^z)C?rpdQgkpT{|7?_vmG2d;ewfN(9 z?Y~Ph*DKR?3vHGDgjLf1r$D}hhr+!RS0N3exMd_tvyJ&~4ZbG9Y32Le-HE1&&5cZh zZiC{DK(>kW%ub!XLQPqG;)q;CmJmy6BEAN6aUD;(J!M3&iqQb2FghHx*spk zm94fxIc8W;=lAOvekY_b)os5E&4HNe=dCI1-qcOXV<)!Cip4dQ0zaYJf*PdQZU^gXR`>;TVbeYZsRb-ry%xhmue-%FRxQt=c?3Q(&fVv{ zJVCr{&eG=D-Kx~5F}}F-D>9=;ieb__~!MVqOMTCA4xfPSDDL;~-ERHDwf4>l& zV!`Zc*zAxdmMBRxJ`m2HL6e4DF5^>Y@_PuEj*+_tsk|ci%x*^$Ta#lUi371@A>Fl3 zUZ)ThW~`r17|f3wscfSsja2yfFOYo90iIKq#Thab3fVb|xf2p1`fu0|zvTLuFiXA- z!60D`Q&CNBZmP<4-+tTFj=4Mk#T#*Cv%f#jewN`$CfyS&dX-HXDSUkE%LSkP9CBhM zH%5=nE!i)nG-g#!sWCzr+iqYQrr1WW5H+1( zw;&H$3D>~!Z|8O`h-XTtQrHUChQ2HrTrS^3!s1u5b^}uDzt%GdB~x?ulpDlDkyY1*IRZ zRn%)BskX)LUVj1VN^ZsMKNDhJB@Nx-{{*`-b(*JOp6g!sU)!hP*th$~SZVQu%Uhhc ziMsv;;F-LaPr!H+dRh9uUT3g4UdPhomG(3uqH43+I3j^DzshKxrt3yVZ2-8$$x;1hK>@_jri95%D~V^ zm)=j(8{^pYh!)G;8BlCnFwQJE;QkjxFP@p8ZFFO!p5pBI1zlQdOP7+Dxnf`B_AR$O?5=w z7|_dJCqi)?o@0mbjqH(UgQ%CjoZkNs0&Ar-l=`a-K^@crG#vS6s%D?-`QF6tpP+ul zm&V4AOSDR?t24Dy#&BT8SABja!qCpwG3>)mCs&I;Dpo+E;FE5VB&-CYvc1-&r?9;a z6^tkO}f`T{F|6Y54L#A3Ka zPyGHTMb}w&R>^!mrUw2a(p5zwKK2!Ddfpp03tO6I{d$R~XvdjiKC)s`yRGHSgUgoE zTO@75Joo-En-k;Hc)F)#hnt@GZq|XVyaZ69_$<-|qsiNpG_@Grm6d>^xmTF&aXZQ`5VY){AjN7w}+svIxex57%OFsp(f60+7{(^FH(V@STm)Mbj~;?O>xK) zEw`vL8C?ZJSbDfedl1+zEJGN;58k{;p`vtLa$l{C*5~BK1}Di^+LK)d=#XFXQqcS8 zukH;!-n4I#I3GEv@uU~m*z)ZDW$G8I&g&6Upu!fvU@yOs^ydUI-^Fm-Yu(CTeXN8w$CUFolHZM%I3C!O8_jP-g|+ zGZ2lR{8Zeza--LVX||EaZaGWU(isKBk9?rQdlM4e25bAl?AC|tK5-jROh`2uHny^lm?11K z@7A;sh*y!4^h?gi-@B)peBe87tZr4B9Ackb!UJb)m3Pjyw}X%_^5(wM77ts;1FHKd3Y-;t;b;L<*@4wpQouZNiGBJ4f$Ym z$H>3qig10ni(x8_r%vsJn|N-u|K(cV^Rw7t7YI8s_E_q;L$-QCP<1gkvOM#I2urd! z9d8qx1K#=u1Ey&lucup7%dTNd_CV$;ZCyagG0m~HtyFxYpob`!1gSx6^YjW~tbI8ERkE0U>!GVL!Q za4@bKi|m16rfUJ%z<-$!=j3CD4elxx5Jwyv$8lD_svX` z;vyA4Gj!=X%TeNn^IUM}2=;|l^j{5#%#e@#ic0=^j1l24nnxmcAL-a+794&2XKbrQ zRp4zbR+Bt-I73ROc`WWT!630f!X3OM-zR)7ZdC5CYuh7p)C7B&d<{F90?kukqK`2} z@Qj{p(KZ+5kL0hZM?ZO6^P0rIYu3nqDs=jGIr`E5pJ{eIRvN{!!2Zgs@!C#n=1V$)qIY-&vnh7%W%GC@eba= z)Eypuqjqb>+v?LVAw{s5x9JporW3}JS|(azFWRwVCC27XPKC(U5m|JGdoLK2WaB#l zjBWV({ZOn6L4FqQojUKn9W)pJ8JO!It!oT;Vy~sJ1~qNC6cX=gONh$3p*#o7@T-dL zCDZn1QcR1FI?vt>G|rBI3PT|jZNOcp*=m&2Ysoc}%D(^{H3t}DIbmw0dJtrPAF-x4 z1XI2!?L5uLrU*Cn`4TZiJ0jQZlgy>lCyVM6R*dmX$x93$+10)4jXFvbk4?k@jfH7B zdSN7Zgzu|33UI{Yi5uAsp3Wp>7Q7l^`R$BBuKq9dmJ~%DGo|q|S*vxtT&(K1^tk!& zf%wy_`K&L5-E~wz)g`04?x58Ji5!^o{3n}E;1>3wiGnc6*BH|dyrWSPc|-8 z64{meURzK%{-=G{v4}SGW5HJav-HZrJ?{x`!%n|`D!ff~@yDTYqYs<0sa_WfrMgyD z(ha-CJlbaN7qZIBx`E0PZAF`dWck7Y(`-Byq!tk_w)esUk%tiRtTCM1J1|8|zD+-J*mu?{#i zn=|GoLnvhJ1m^g65ffe6TysK}AW0iK^>UJoP5#Z$ngUtqGmZUPi*q(6_nM{*dv|6- z<##}8@W>88r>DIlEj%Q#0;EvNP)rOZb};Y#f$7Ux@p-p}FdZKN+34z%j+0>>D$9*^7q>3CQzK zX1tY>h7!H97!PZiQL~iL+W3!a2t^wV2~Kg=YJxC92WUIXAxbSAJhY3dk~mi&A4-2_ z_ZGOu6vFuj$Eg`N*Z6(Y2C->5#nsdbU&nVTHxI3bG|1P_hZRQ}2TF%;8y}|cf8X;O z?Y!{r-;euoZ}0*Mip6>bwdn?>EebIFpl}cD-!%p4RSwVh+4nNWihv|b%6;l&}VYd%WyhI`f zDDSJ|K@8Cav2-rB{;#2PywtaY`yc-TMDWo`we{s{O!1p&iH^ViBOz_J{B?doxPJkv zul^U}N5lAM|72wUgZR+^q|7A$k&#{hWBg3T&Hotx|AY8RC|Hsk;)`&|0Phf+5X^DZ z@{%^3W`T;MVrd=6L*iFM=*tL#;1TfB>>Vf!fK+V)sIX-LtQ#lLJ+&zDarkA>wk9OS z<-BScUQH5LJv!%9ToWhSeVvJ#oybUak0R5NEG#B*Q|iBhNVTb3keRv$8CLa+yC3$)Dfh zFKW{hoqiWZ^LXu7ACT12&G3 z(-bn_PhO&A+n<_s&)x=6297wlw;2cavz$jU{`Bj?6Gjt8FPndztd35JEg!KV#2Gwi zDW?(CnR`(hQYCuDN6P<`K@vxCAK&=`}{p-vEY6-D0)BfF9i6 zLH{I2y(vK$AIf-5FJvG2H7Ml8!VZ28E)!Qm?eXO>$bT%8)MzKWZEZ9Of;t}_+o-6R zo8*5@vZMcSOQ!31u40vji@r{;OoLfT%=FAsfDWAewS8fV#Z_~&>yW2IE!8EY<7~|R zrz2nk4-JQNM2?^*upzr}@g>gOhd-R{EJc-&$|7!-C;&n31=a$SKa0KCK~cmzOq0Q% zF?JGP%9AOailWyGs&ppSlmZC2v=a;C2FRtOE@hpD;>#a{1RY*fyQOUvV&d7ca^POX zlvSYNtVpmwJ}=oTC#S`uFGgd_$fCDL=j~f8QrMD{CnW&*a^x`O$WN05y++@=*K&U- zI>;%7q3z9lnD6z5T$|~}YDm`!lKpVK+5ZuB5fiV7-EH$H#ZpWhPq;j({M~P+F0OQ* zM?n&@!qpAV7i#!fnv)J^>(eH=u|NO4RCf(6~{ZeQ#7^Qajq78^HrrtxMyb~

&*Psw>&--ZCk}FLJdb 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 literal 0 HcmV?d00001 diff --git a/core/management/commands/check_front.py b/core/management/commands/check_front.py index 181de23c..b6e24479 100644 --- a/core/management/commands/check_front.py +++ b/core/management/commands/check_front.py @@ -6,8 +6,15 @@ from django.core.management.base import BaseCommand # see https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string # added "v?" +# Please note that this does not match the version of the three.js library. +# Hence, you shall have to check this one by yourself semver_regex = re.compile( - """^v?(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$""" + r"^v?" + r"(?P\d+)" + r"\.(?P\d+)" + r"\.(?P\d+)" + r"(?:-(?P(?:\d+|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:\d+|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?" + r"(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" ) diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index ae83008c..8df2bfff 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -1,7 +1,7 @@ # -*- coding:utf-8 -* # -# Copyright 2016,2017 -# - Skia +# Copyright 2016,2017,2023 +# - Skia # # Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, # http://ae.utbm.fr. @@ -25,6 +25,7 @@ import os from datetime import date, datetime, timedelta from io import StringIO, BytesIO +from pathlib import Path from django.contrib.auth.models import Permission from django.core.management.base import BaseCommand @@ -54,6 +55,7 @@ from com.models import Sith, Weekmail, News, NewsDate from election.models import Election, Role, Candidature, ElectionList from forum.models import Forum, ForumTopic from pedagogy.models import UV +from sas.models import Album, Picture, PeoplePictureRelation class Command(BaseCommand): @@ -71,9 +73,7 @@ class Command(BaseCommand): def handle(self, *args, **options): os.environ["DJANGO_COLORS"] = "nocolor" Site(id=4000, domain=settings.SITH_URL, name=settings.SITH_NAME).save() - root_path = os.path.dirname( - os.path.dirname(os.path.dirname(os.path.dirname(__file__))) - ) + root_path = Path(__file__).parent.parent.parent.parent root_group, _ = Group.objects.get_or_create(name="Root") Group(name="Public").save() Group(name="Subscribers").save() @@ -84,7 +84,7 @@ class Command(BaseCommand): Group(name="Banned from buying alcohol").save() Group(name="Banned from counters").save() Group(name="Banned to subscribe").save() - Group(name="SAS admin").save() + sas_admin, _ = Group.objects.get_or_create(name="SAS admin") Group(name="Forum admin").save() Group(name="Pedagogy admin").save() self.reset_index("core", "auth") @@ -119,7 +119,8 @@ class Command(BaseCommand): club_root = SithFile(parent=None, name="clubs", is_folder=True, owner=root) club_root.save() - SithFile(parent=None, name="SAS", is_folder=True, owner=root).save() + sas = SithFile(parent=None, name="SAS", is_folder=True, owner=root) + sas.save() main_club = Club( id=1, name=settings.SITH_MAIN_CLUB["name"], @@ -223,7 +224,15 @@ Welcome to the wiki page! Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first().id ] skia.save() - skia_profile_path = os.path.join(root_path, "core/fixtures/images/3.jpg") + skia_profile_path = ( + root_path + / "core" + / "fixtures" + / "images" + / "sas" + / "Family" + / "skia.jpg" + ) with open(skia_profile_path, "rb") as f: name = str(skia.id) + "_profile.jpg" skia_profile = SithFile( @@ -233,7 +242,7 @@ Welcome to the wiki page! owner=skia, is_folder=False, mime_type="image/jpeg", - size=os.path.getsize(skia_profile_path), + size=skia_profile_path.stat().st_size, ) skia_profile.file.name = name skia_profile.save() @@ -351,23 +360,48 @@ Welcome to the wiki page! ] u.save() # Adding user Richard Batsbak - r = User( + richard = User( username="rbatsbak", last_name="Batsbak", first_name="Richard", email="richard@git.an", date_of_birth="1982-06-12", ) - r.set_password("plop") - r.save() - r.view_groups = [ + richard.set_password("plop") + richard.save() + richard.godfathers.add(comptable) + richard_profile_path = ( + root_path + / "core" + / "fixtures" + / "images" + / "sas" + / "Family" + / "richard.jpg" + ) + with open(richard_profile_path, "rb") as f: + name = f"{richard.id}_profile.jpg" + richard_profile = SithFile( + parent=profiles_root, + name=name, + file=resize_image(Image.open(BytesIO(f.read())), 400, "JPEG"), + owner=richard, + is_folder=False, + mime_type="image/jpeg", + size=richard_profile_path.stat().st_size, + ) + richard_profile.file.name = name + richard_profile.save() + richard.profile_pict = richard_profile + richard.save() + richard.view_groups = [ Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first().id ] - r.save() + richard.save() # Adding syntax help page p = Page(name="Aide_sur_la_syntaxe") p.save(force_lock=True) - with open(os.path.join(root_path) + "/doc/SYNTAX.md", "r") as rm: + with open(root_path / "doc" / "SYNTAX.md", "r") as rm: PageRev( page=p, title="Aide sur la syntaxe", author=skia, content=rm.read() ).save() @@ -442,7 +476,7 @@ Welcome to the wiki page! s.save() # Richard s = Subscription( - member=User.objects.filter(pk=r.pk).first(), + member=User.objects.filter(pk=richard.pk).first(), subscription_type=default_subscription, payment_method=settings.SITH_SUBSCRIPTION_PAYMENT_METHOD[0][0], ) @@ -514,7 +548,7 @@ Welcome to the wiki page! subscribers = Group.objects.get(name="Subscribers") old_subscribers = Group.objects.get(name="Old subscribers") Customer(user=skia, account_id="6568j", amount=0).save() - Customer(user=r, account_id="4000k", amount=0).save() + Customer(user=richard, account_id="4000k", amount=0).save() p = ProductType(name="Bières bouteilles") p.save() c = ProductType(name="Cotisations") @@ -825,7 +859,15 @@ Welcome to the wiki page! Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first().id ] sli.save() - sli_profile_path = os.path.join(root_path, "core/fixtures/images/5.jpg") + sli_profile_path = ( + root_path + / "core" + / "fixtures" + / "images" + / "sas" + / "Family" + / "sli.jpg" + ) with open(sli_profile_path, "rb") as f: name = str(sli.id) + "_profile.jpg" sli_profile = SithFile( @@ -835,7 +877,7 @@ Welcome to the wiki page! owner=sli, is_folder=False, mime_type="image/jpeg", - size=os.path.getsize(sli_profile_path), + size=sli_profile_path.stat().st_size, ) sli_profile.file.name = name sli_profile.save() @@ -851,7 +893,15 @@ Welcome to the wiki page! ) krophil.set_password("plop") krophil.save() - krophil_profile_path = os.path.join(root_path, "core/fixtures/images/6.jpg") + krophil_profile_path = ( + root_path + / "core" + / "fixtures" + / "images" + / "sas" + / "Family" + / "krophil.jpg" + ) with open(krophil_profile_path, "rb") as f: name = str(krophil.id) + "_profile.jpg" krophil_profile = SithFile( @@ -861,7 +911,7 @@ Welcome to the wiki page! owner=krophil, is_folder=False, mime_type="image/jpeg", - size=os.path.getsize(krophil_profile_path), + size=krophil_profile_path.stat().st_size, ) krophil_profile.file.name = name krophil_profile.save() @@ -1164,3 +1214,106 @@ Welcome to the wiki page! hours_THE=121, hours_TE=4, ).save() + + # SAS + skia.groups.add(sas_admin.id) + sas_fixtures_path = root_path / "core" / "fixtures" / "images" / "sas" + for f in sas_fixtures_path.glob("*"): + if f.is_dir(): + album = Album( + parent=sas, + name=f.name, + owner=root, + is_folder=True, + is_in_sas=True, + is_moderated=True, + ) + album.clean() + album.save() + for p in f.iterdir(): + pict = Picture( + parent=album, + name=p.name, + file=resize_image( + Image.open(BytesIO(p.read_bytes())), 1000, "JPEG" + ), + owner=root, + is_folder=False, + is_in_sas=True, + is_moderated=True, + mime_type="image/jpeg", + size=p.stat().st_size, + ) + pict.file.name = p.name + pict.clean() + pict.generate_thumbnails() + pict.save() + + p = Picture.objects.get(name="skia.jpg") + PeoplePictureRelation(user=skia, picture=p).save() + p = Picture.objects.get(name="sli.jpg") + PeoplePictureRelation(user=sli, picture=p).save() + p = Picture.objects.get(name="krophil.jpg") + PeoplePictureRelation(user=krophil, picture=p).save() + p = Picture.objects.get(name="skia_sli.jpg") + PeoplePictureRelation(user=skia, picture=p).save() + PeoplePictureRelation(user=sli, picture=p).save() + p = Picture.objects.get(name="skia_sli_krophil.jpg") + PeoplePictureRelation(user=skia, picture=p).save() + PeoplePictureRelation(user=sli, picture=p).save() + PeoplePictureRelation(user=krophil, picture=p).save() + p = Picture.objects.get(name="richard.jpg") + PeoplePictureRelation(user=richard, picture=p).save() + + with open(skia_profile_path, "rb") as f: + name = str(skia.id) + "_profile.jpg" + skia_profile = SithFile( + parent=profiles_root, + name=name, + file=resize_image(Image.open(BytesIO(f.read())), 400, "JPEG"), + owner=skia, + is_folder=False, + mime_type="image/jpeg", + size=skia_profile_path.stat().st_size, + ) + skia_profile.file.name = name + skia_profile.save() + skia.profile_pict = skia_profile + skia.save() + + # Create some additional data for galaxy to work with + root.godfathers.add(skia) + skia.godfathers.add(root) + sli.godfathers.add(skia) + richard.godchildren.add(subscriber) + richard.godchildren.add(public) + Membership( + user=sli, + club=troll, + role=9, + description="Padawan Troll", + start_date=timezone.now() - timedelta(days=17), + ).save() + Membership( + user=krophil, + club=troll, + role=10, + description="Maitre Troll", + start_date=timezone.now() - timedelta(days=200), + ).save() + Membership( + user=skia, + club=troll, + role=2, + description="Grand Ancien Troll", + start_date=timezone.now() - timedelta(days=400), + end_date=timezone.now() - timedelta(days=86), + ).save() + Membership( + user=richard, + club=troll, + role=2, + description="", + start_date=timezone.now() - timedelta(days=200), + end_date=timezone.now() - timedelta(days=100), + ).save() diff --git a/core/static/core/style.scss b/core/static/core/style.scss index a9e19f1a..3424dcee 100644 --- a/core/static/core/style.scss +++ b/core/static/core/style.scss @@ -11,7 +11,6 @@ $primary-dark-color: hsl(203, 75%, 40%); $secondary-light-color: hsl(40, 68%, 65%); $secondary-dark-color: hsl(40, 68%, 35%); - $primary-neutral-color: hsl(219.6, 20.8%, 50%); $primary-neutral-light-color: hsl(0, 0%, 94%); $primary-neutral-dark-color: hsl(210, 29%, 29%); @@ -29,7 +28,7 @@ $pinktober: #ff5674; $pinktober-secondary: #8a2536; $pinktober-primary-text: white; $pinktober-bar-closed: $pinktober-secondary; -$pinktober-bar-opened: #388E3C; +$pinktober-bar-opened: #388e3c; $shadow-color: rgb(223, 223, 223); @@ -49,7 +48,11 @@ body { font-family: sans-serif; } -button, input[type=button], input[type=submit], input[type=reset],input[type=file] { +button, +input[type="button"], +input[type="submit"], +input[type="reset"], +input[type="file"] { border: none; text-decoration: none; background-color: $background-button-color; @@ -62,15 +65,24 @@ button, input[type=button], input[type=submit], input[type=reset],input[type=fil } } -input[type=button], input[type=submit], input[type=reset],input[type=file] { +input[type="button"], +input[type="submit"], +input[type="reset"], +input[type="file"] { font-weight: bold; } -button:not(:disabled), input[type=button]:not(:disabled), input[type=submit]:not(:disabled), input[type=reset]:not(:disabled),input[type=file]:not(:disabled) { +button:not(:disabled), +input[type="button"]:not(:disabled), +input[type="submit"]:not(:disabled), +input[type="reset"]:not(:disabled), +input[type="file"]:not(:disabled) { cursor: pointer; } -input,textarea[type=text],[type=number]{ +input, +textarea[type="text"], +[type="number"] { border: none; text-decoration: none; background-color: $background-button-color; @@ -80,7 +92,7 @@ input,textarea[type=text],[type=number]{ border-radius: 5px; max-width: 95%; } -textarea{ +textarea { border: none; text-decoration: none; background-color: $background-button-color; @@ -88,7 +100,7 @@ textarea{ font-size: 1.2em; border-radius: 5px; } -select{ +select { border: none; text-decoration: none; font-size: 1.2em; @@ -143,7 +155,8 @@ a { } .shadow { - box-shadow: rgba(60, 64, 67, .3) 0 1px 3px 0, rgba(60, 64, 67, .15) 0 4px 8px 3px; + box-shadow: rgba(60, 64, 67, 0.3) 0 1px 3px 0, + rgba(60, 64, 67, 0.15) 0 4px 8px 3px; } .w_big { @@ -162,7 +175,9 @@ a { cursor: pointer; } -[x-cloak] { display: none !important; } +[x-cloak] { + display: none !important; +} /*--------------------------------HEADER-------------------------------*/ @@ -195,7 +210,6 @@ header { background-color: $primary-neutral-dark-color; border-radius: 0px 0px 10px 10px; - #header_logo { background-color: $white-color; padding: 0.2em; @@ -209,10 +223,10 @@ header { height: 100%; img { - max-width: 70%; - max-height: 100%; - margin: auto; - display: block; + max-width: 70%; + max-height: 100%; + margin: auto; + display: block; } } } @@ -259,7 +273,7 @@ header { flex: auto; margin: 0.8em 0; input { - width: 14ch; + width: 14ch; } } @@ -338,13 +352,14 @@ header { flex-wrap: wrap; width: 90%; margin: 1em auto; - #alert_box, #info_box { + #alert_box, + #info_box { flex: 49%; font-size: 0.9em; margin: 0.2em; border-radius: 0.6em; .markdown { - margin: 0.5em; + margin: 0.5em; } &:before { font-family: FontAwesome; @@ -369,7 +384,6 @@ header { } } - #page { width: 90%; margin: 20px auto 0; @@ -470,11 +484,11 @@ header { } &.btn-grey.clickable:not(:disabled):hover { - background-color:hsl(210,5%,30%); + background-color: hsl(210, 5%, 30%); } } -/*--------------------------------CONTENT------------------------------*/ + /*--------------------------------CONTENT------------------------------*/ #quick_notif { width: 100%; margin: 0 auto; @@ -485,7 +499,6 @@ header { } } - #content { padding: 1em 1%; box-shadow: $shadow-color 0 5px 10px; @@ -510,7 +523,7 @@ header { } &.alert-red { - background-color: rgb(255,245,245); + background-color: rgb(255, 245, 245); color: #c53030; border: #fc8181 1px solid; } @@ -554,7 +567,7 @@ header { } } -/*---------------------------------NEWS--------------------------------*/ + /*---------------------------------NEWS--------------------------------*/ #news { display: flex; flex-wrap: wrap; @@ -586,20 +599,23 @@ header { } } } - @media screen and (max-width: $small-devices){ - #left_column, #right_column { + @media screen and (max-width: $small-devices) { + #left_column, + #right_column { flex: 100%; } } -/* AGENDA/BIRTHDAYS */ - #agenda,#birthdays { + /* AGENDA/BIRTHDAYS */ + #agenda, + #birthdays { display: block; width: 100%; background: white; font-size: 70%; margin-bottom: 1em; - #agenda_title,#birthdays_title { + #agenda_title, + #birthdays_title { margin: 0em; border-radius: 5px 5px 0 0; box-shadow: $shadow-color 1px 1px 1px; @@ -615,7 +631,8 @@ header { box-shadow: $shadow-color 1px 1px 1px; height: 20em; } - #agenda_content,#birthdays_content { + #agenda_content, + #birthdays_content { .agenda_item { padding: 0.5em; margin-bottom: 0.5em; @@ -636,7 +653,7 @@ header { margin: 0em; list-style-type: none; font-weight: bold; - >li { + > li { padding: 0.5em; &:nth-child(even) { background: $secondary-neutral-light-color; @@ -652,9 +669,9 @@ header { } } } -/* END AGENDA/BIRTHDAYS */ + /* END AGENDA/BIRTHDAYS */ -/* EVENTS TODAY AND NEXT FEW DAYS */ + /* EVENTS TODAY AND NEXT FEW DAYS */ .news_events_group { box-shadow: $shadow-color 1px 1px 1px; margin-left: 1em; @@ -721,10 +738,10 @@ header { .news_content { clear: left; .button_bar { - text-align: right; + text-align: right; .fb { - color: $faceblue; - } + color: $faceblue; + } .twitter { color: $twitblue; } @@ -733,9 +750,9 @@ header { } } } -/* END EVENTS TODAY AND NEXT FEW DAYS */ + /* END EVENTS TODAY AND NEXT FEW DAYS */ -/* COMING SOON */ + /* COMING SOON */ .news_coming_soon { display: list-item; list-style-type: square; @@ -750,9 +767,9 @@ header { font-size: 0.9em; } } -/* END COMING SOON */ + /* END COMING SOON */ -/* NOTICES */ + /* NOTICES */ .news_notice { margin: 0em 0em 1em 1em; padding: 0.4em; @@ -767,9 +784,9 @@ header { margin-left: 1em; } } -/* END NOTICES */ + /* END NOTICES */ -/* CALLS */ + /* CALLS */ .news_call { margin: 0em 0em 1em 1em; padding: 0.4em; @@ -787,7 +804,7 @@ header { margin-left: 1em; } } -/* END CALLS */ + /* END CALLS */ .news_empty { margin-left: 1em; @@ -798,7 +815,7 @@ header { } } -@media screen and (max-width: $small-devices){ +@media screen and (max-width: $small-devices) { #page { width: 98%; } @@ -861,204 +878,211 @@ header { } .helptext { - margin-top: 10px; - display: block; + margin-top: 10px; + display: block; } /*---------------------------POSTERS----------------------------*/ -#poster_list, #screen_list, #poster_edit, #screen_edit{ +#poster_list, +#screen_list, +#poster_edit, +#screen_edit { + position: relative; + #title { position: relative; - #title{ - position: relative; - padding: 10px; - margin: 10px; - border-bottom: 2px solid black; - h3{ - display: flex; - justify-content: center; - align-items: center; - } - #links{ - position: absolute; - display: flex; - bottom: 5px; - &.left{ - left: 0; - } - &.right{ - right: 0; - } - .link{ - padding: 5px; - padding-left: 20px; - padding-right: 20px; - margin-left: 5px; - border-radius: 20px; - background-color: hsl(40, 100%, 50%); - color: black; - &:hover{ - color: black; - background-color: hsl(40, 58%, 50%); - } - &.delete{ - background-color: hsl(0, 100%, 40%); - } - } - } + padding: 10px; + margin: 10px; + border-bottom: 2px solid black; + h3 { + display: flex; + justify-content: center; + align-items: center; } - #posters, #screens{ - position: relative; - display: flex; - flex-wrap: wrap; - #no-posters, #no-screens{ - display: flex; - justify-content: center; - align-items: center; + #links { + position: absolute; + display: flex; + bottom: 5px; + &.left { + left: 0; + } + &.right { + right: 0; + } + .link { + padding: 5px; + padding-left: 20px; + padding-right: 20px; + margin-left: 5px; + border-radius: 20px; + background-color: hsl(40, 100%, 50%); + color: black; + &:hover { + color: black; + background-color: hsl(40, 58%, 50%); } - .poster, .screen{ - min-width: 10%; - max-width: 20%; - display: flex; - flex-direction: column; - margin: 10px; - border: 2px solid darkgrey; - border-radius: 4px; - padding: 10px; - background-color: lightgrey; - *{ - display: flex; - justify-content: center; - align-items: center; - } - .name{ - padding-bottom: 5px; - margin-bottom: 5px; - border-bottom: 1px solid whitesmoke; - } - .image{ - flex-grow: 1; - position: relative; - padding-bottom: 5px; - margin-bottom: 5px; - border-bottom: 1px solid whitesmoke; - img{ - max-height: 20vw; - max-width: 100%; - } - &:hover{ - &::before{ - position: absolute; - width: 100%; - height: 100%; - display: flex; - justify-content: center; - align-items: center; - flex-wrap: wrap; - top: 0; - left: 0; - z-index: 10; - content: "Click to expand"; - color: white; - background-color: rgba(black, 0.5); - } - } - } - .dates{ - padding-bottom: 5px; - margin-bottom: 5px; - border-bottom: 1px solid whitesmoke; - *{ - display: flex; - justify-content: center; - align-items: center; - flex-wrap: wrap; - margin-left: 5px; - margin-right: 5px; - } - .begin, .end{ - width: 48%; - } - .begin{ - border-right: 1px solid whitesmoke; - padding-right: 2%; - } - } - .edit, .moderate, .slideshow{ - padding: 5px; - border-radius: 20px; - background-color: hsl(40, 100%, 50%); - color: black; - &:hover{ - color: black; - background-color: hsl(40, 58%, 50%); - } - &:nth-child(2n){ - margin-top: 5px; - margin-bottom: 5px; - } - } - .tooltip{ - visibility: hidden; - width: 120px; - background-color: hsl(210, 20%, 98%); - color: hsl(0, 0%, 0%); - text-align: center; - padding: 5px 0; - border-radius: 6px; - position: absolute; - z-index: 10; - ul{ - margin-left: 0; - display: inline-block; - li{ - display: list-item; - list-style-type: none; - } - } - } - &.not_moderated - { - border: 1px solid red; - } - &:hover .tooltip{ - visibility: visible; - } + &.delete { + background-color: hsl(0, 100%, 40%); } + } } - #view{ - position: fixed; - width: 100vw; - height: 100vh; + } + #posters, + #screens { + position: relative; + display: flex; + flex-wrap: wrap; + #no-posters, + #no-screens { + display: flex; + justify-content: center; + align-items: center; + } + .poster, + .screen { + min-width: 10%; + max-width: 20%; + display: flex; + flex-direction: column; + margin: 10px; + border: 2px solid darkgrey; + border-radius: 4px; + padding: 10px; + background-color: lightgrey; + * { display: flex; justify-content: center; align-items: center; - top: 0; - left: 0; - z-index: 10; - visibility: hidden; - background-color: rgba(10, 10, 10, 0.9); - overflow: hidden; - &.active{ - visibility: visible; + } + .name { + padding-bottom: 5px; + margin-bottom: 5px; + border-bottom: 1px solid whitesmoke; + } + .image { + flex-grow: 1; + position: relative; + padding-bottom: 5px; + margin-bottom: 5px; + border-bottom: 1px solid whitesmoke; + img { + max-height: 20vw; + max-width: 100%; } - #placeholder{ - width: 80vw; - height: 80vh; + &:hover { + &::before { + position: absolute; + width: 100%; + height: 100%; display: flex; justify-content: center; align-items: center; + flex-wrap: wrap; top: 0; left: 0; - img{ - max-width: 100%; - max-height: 100%; - } + z-index: 10; + content: "Click to expand"; + color: white; + background-color: rgba(black, 0.5); + } } + } + .dates { + padding-bottom: 5px; + margin-bottom: 5px; + border-bottom: 1px solid whitesmoke; + * { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + margin-left: 5px; + margin-right: 5px; + } + .begin, + .end { + width: 48%; + } + .begin { + border-right: 1px solid whitesmoke; + padding-right: 2%; + } + } + .edit, + .moderate, + .slideshow { + padding: 5px; + border-radius: 20px; + background-color: hsl(40, 100%, 50%); + color: black; + &:hover { + color: black; + background-color: hsl(40, 58%, 50%); + } + &:nth-child(2n) { + margin-top: 5px; + margin-bottom: 5px; + } + } + .tooltip { + visibility: hidden; + width: 120px; + background-color: hsl(210, 20%, 98%); + color: hsl(0, 0%, 0%); + text-align: center; + padding: 5px 0; + border-radius: 6px; + position: absolute; + z-index: 10; + ul { + margin-left: 0; + display: inline-block; + li { + display: list-item; + list-style-type: none; + } + } + } + &.not_moderated { + border: 1px solid red; + } + &:hover .tooltip { + visibility: visible; + } } + } + #view { + position: fixed; + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + top: 0; + left: 0; + z-index: 10; + visibility: hidden; + background-color: rgba(10, 10, 10, 0.9); + overflow: hidden; + &.active { + visibility: visible; + } + #placeholder { + width: 80vw; + height: 80vh; + display: flex; + justify-content: center; + align-items: center; + top: 0; + left: 0; + img { + max-width: 100%; + max-height: 100%; + } + } + } } - /*---------------------------ACCOUNTING----------------------------*/ #accounting { .journal-table { @@ -1084,7 +1108,12 @@ header { } /*-----------------------------GENERAL-----------------------------*/ -h1, h2, h3, h4, h5, h6 { +h1, +h2, +h3, +h4, +h5, +h6 { font-weight: bold; margin-top: 0.5em; } @@ -1119,19 +1148,22 @@ h6 { margin-left: 50px; } -p, pre { +p, +pre { margin-top: 0.8em; margin-left: 0; } -ul, ol, dl { +ul, +ol, +dl { margin-top: 1em; margin-bottom: 1em; margin-left: 25px; } dt { - margin-top: 25px; + margin-top: 25px; } code { @@ -1167,7 +1199,11 @@ blockquote h5:first-child { table { width: 100%; - font-size: 0.90em; + font-size: 0.9em; +} + +th { + padding: 4px; } td { @@ -1207,11 +1243,13 @@ sub { font-size: smaller; } -b, strong { +b, +strong { font-weight: bold; } -i, em { +i, +em { font-style: italic; } @@ -1220,153 +1258,157 @@ i, em { font-weight: bold; } -u, .underline { +u, +.underline { text-decoration: underline; } #bar_ui { - padding: 0.4em; - display: flex; - flex-wrap: wrap; - flex-direction: row-reverse; + padding: 0.4em; + display: flex; + flex-wrap: wrap; + flex-direction: row-reverse; - #products { - flex-basis: 100%; - margin: 0.2em; - overflow: auto; - } + #products { + flex-basis: 100%; + margin: 0.2em; + overflow: auto; + } - #click_form { - flex: auto; - margin: 0.2em; - } + #click_form { + flex: auto; + margin: 0.2em; + } - #user_info { - flex: auto; - padding: 0.5em; - margin: 0.2em; - height: 100%; - background: $secondary-neutral-light-color; - img { - max-width: 70%; - } - input { - background: white; - } + #user_info { + flex: auto; + padding: 0.5em; + margin: 0.2em; + height: 100%; + background: $secondary-neutral-light-color; + img { + max-width: 70%; } + input { + background: white; + } + } } /*-----------------------------USER PROFILE----------------------------*/ #user_profile_page { - #user_profile { + #user_profile { + display: flex; + justify-content: center; + margin-top: 2em; + margin-bottom: 4em; + #user_profile_infos { + flex-basis: 30%; + border-right: solid 1px grey; + div { + margin: 0.5em; + } + #user_profile_infos_items { + margin-top: 3em; + } + .user_profile_infos_item, + .user_profile_infos_item_value { + vertical-align: top; + display: inline-block; + width: 49%; + } + .user_profile_infos_item { + color: grey; + } + #user_profile_infos_promo { display: flex; - justify-content: center; - margin-top: 2em; - margin-bottom: 4em; - #user_profile_infos { - flex-basis: 30%; - border-right: solid 1px grey; - div { - margin: 0.5em; - } - #user_profile_infos_items { - margin-top: 3em; - } - .user_profile_infos_item, .user_profile_infos_item_value { - vertical-align: top; - display: inline-block; - width: 49%; - } - .user_profile_infos_item { - color: grey; - } - #user_profile_infos_promo { - display: flex; - align-items: center; - img { - width: 5em; - margin: 0.5em; - } - } - #user_profile_infos_quote { - text-align: right; - color: grey; - font-style: italic; - &:after, &:before { - content: "\201C"; - vertical-align: middle; - } - } + align-items: center; + img { + width: 5em; + margin: 0.5em; } - #user_profile_pictures { - height: 20em; - flex-basis: 30%; - display: flex; - justify-content: flex-end; - #user_profile_pictures_bigone { - flex-grow: 9; - flex-basis: 20em; - display: flex; - justify-content: center; - align-items: center; - img { - max-width: 100%; - max-height: 100%; - object-fit: contain; - } - } - #user_profile_pictures_thumbnails { - flex-grow: 1; - flex-basis: 50px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - img { - margin: 0.1em; - width: 50px; - } - } - } - @media screen and (max-width: $small-devices){ - #user_profile_infos, #user_profile_pictures { - flex-basis: 50%; - } + } + #user_profile_infos_quote { + text-align: right; + color: grey; + font-style: italic; + &:after, + &:before { + content: "\201C"; + vertical-align: middle; } + } } -} - -.user_mini_profile { - height: 100%; - width: 100%; - img { - max-width: 100%; - max-height: 100%; - } - .user_mini_profile_infos { - padding: 0.2em; - height: 20%; - display: flex; - flex-wrap: nowrap; - justify-content: space-around; - font-size: 0.9em; - div { - max-height: 100%; - } - .user_mini_profile_infos_text { - text-align: center; - .user_mini_profile_nick { - font-style: italic; - } - } - } - .user_mini_profile_picture { - height: 80%; + #user_profile_pictures { + height: 20em; + flex-basis: 30%; + display: flex; + justify-content: flex-end; + #user_profile_pictures_bigone { + flex-grow: 9; + flex-basis: 20em; display: flex; justify-content: center; align-items: center; + img { + max-width: 100%; + max-height: 100%; + object-fit: contain; + } + } + #user_profile_pictures_thumbnails { + flex-grow: 1; + flex-basis: 50px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + img { + margin: 0.1em; + width: 50px; + } + } } + @media screen and (max-width: $small-devices) { + #user_profile_infos, + #user_profile_pictures { + flex-basis: 50%; + } + } + } +} + +.user_mini_profile { + height: 100%; + width: 100%; + img { + max-width: 100%; + max-height: 100%; + } + .user_mini_profile_infos { + padding: 0.2em; + height: 20%; + display: flex; + flex-wrap: nowrap; + justify-content: space-around; + font-size: 0.9em; + div { + max-height: 100%; + } + .user_mini_profile_infos_text { + text-align: center; + .user_mini_profile_nick { + font-style: italic; + } + } + } + .user_mini_profile_picture { + height: 80%; + display: flex; + justify-content: center; + align-items: center; + } } .mini_profile_link { @@ -1415,31 +1457,30 @@ u, .underline { } /*--------------------------------MATMAT-------------------------------*/ .matmat_results { - display: flex; - flex-wrap: wrap; - .matmat_user { - flex-basis: 14em; - align-self: flex-start; - margin: 0.5em; - height: 18em; - overflow: hidden; - border: 1px solid black; - box-shadow: $shadow-color 1px 1px 1px; - &:hover { - box-shadow: 1px 1px 5px $second-color; - } - } - .matmat_user a { - color: $primary-neutral-dark-color; - height: 100%; - width: 100%; - margin: 0em; - padding: 0em; - display: block; + display: flex; + flex-wrap: wrap; + .matmat_user { + flex-basis: 14em; + align-self: flex-start; + margin: 0.5em; + height: 18em; + overflow: hidden; + border: 1px solid black; + box-shadow: $shadow-color 1px 1px 1px; + &:hover { + box-shadow: 1px 1px 5px $second-color; } + } + .matmat_user a { + color: $primary-neutral-dark-color; + height: 100%; + width: 100%; + margin: 0em; + padding: 0em; + display: block; + } } - /*---------------------------------PAGE--------------------------------*/ .page_content { @@ -1510,7 +1551,7 @@ textarea { .last_message span { white-space: nowrap; text-overflow: ellipsis; - overflow:hidden; + overflow: hidden; width: 100%; display: block; } @@ -1720,7 +1761,8 @@ label { } } -#cash_summary_form label, .inline { +#cash_summary_form label, +.inline { display: inline; } @@ -1769,19 +1811,25 @@ label { text-decoration: underline; } .footnotes { - font-size: 85%; + font-size: 85%; } } /*--------------------------------JQuery-------------------------------*/ -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header -.ui-state-active, a.ui-button:active, .ui-button:active, +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, .ui-button.ui-state-active:hover { background: $primary-color; border-color: $primary-color; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-top, +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-top, .ui-corner-left { border-radius: 0; } @@ -1795,7 +1843,6 @@ label { max-width: 10em; } } - } /* --------------------------------------pedagogy-----------------------------------*/ @@ -1807,40 +1854,40 @@ $pedagogy-light-blue: #caf0ff; $pedagogy-white-text: #f0f0f0; .pedagogy { + &.star-not-checked { + color: #f7f7f7; + margin-bottom: 0; + margin-top: 0; + } + &.star-checked { + color: $pedagogy-orange; + margin-bottom: 0; + margin-top: 0; + } + + &.grade-without-star { + display: none; + } + + @media screen and (max-width: $large-devices) { &.star-not-checked { - color : #f7f7f7; - margin-bottom: 0; - margin-top: 0; + margin-left: 5px; + margin-right: 5px; } &.star-checked { - color: $pedagogy-orange; - margin-bottom: 0; - margin-top: 0; + margin-left: 5px; + margin-right: 5px; } + } + @media screen and (max-width: $small-devices) { &.grade-without-star { - display: none + display: block; } - - @media screen and (max-width: $large-devices){ - &.star-not-checked { - margin-left: 5px; - margin-right: 5px; - } - &.star-checked { - margin-left: 5px; - margin-right: 5px; - } - } - - @media screen and (max-width: $small-devices){ - &.grade-without-star { - display: block; - } - &.grade-with-star { - display: none; - } + &.grade-with-star { + display: none; } + } #dynamic_view { font-size: 1.1em; @@ -1851,20 +1898,18 @@ $pedagogy-white-text: #f0f0f0; text-align: center; border: none; } - } #search_form { - .search-form-container { display: grid; grid-template-columns: auto auto; grid-template-rows: auto auto auto; grid-template-areas: - "action-bar action-bar" - "search-bar search-bar" - "radio-department radio-department" - "radio-credit-type radio-semester"; + "action-bar action-bar" + "search-bar search-bar" + "radio-department radio-department" + "radio-credit-type radio-semester"; } .action-bar { @@ -1879,13 +1924,13 @@ $pedagogy-white-text: #f0f0f0; grid-template-rows: auto; grid-template-areas: "search-bar-input search-bar-button"; - @media screen and (max-width: $medium-devices){ + @media screen and (max-width: $medium-devices) { grid-template-columns: auto auto; grid-template-rows: auto; grid-template-areas: "search-bar-input search-bar-button"; } - @media screen and (max-width: $small-devices){ + @media screen and (max-width: $small-devices) { grid-template-columns: auto; grid-template-rows: auto; grid-template-areas: "search-bar-input"; @@ -1921,8 +1966,9 @@ $pedagogy-white-text: #f0f0f0; grid-area: radio-semester; } - .radio-guide input[type="radio"],input[type="checkbox"] { - display:none; + .radio-guide input[type="radio"], + input[type="checkbox"] { + display: none; } .radio-guide { margin-top: 10px; @@ -1942,7 +1988,7 @@ $pedagogy-white-text: #f0f0f0; .radio-guide input[type="checkbox"]:checked + label { background-color: $pedagogy-orange; } - .radio-guide label:hover { + .radio-guide label:hover { background-color: $pedagogy-hover-blue; } } @@ -1956,7 +2002,7 @@ $pedagogy-white-text: #f0f0f0; grid-template-rows: auto auto; grid-template-areas: "hours-cm hours-td hours-tp hours-te hours-the" - "department credit-type semester . ." ; + "department credit-type semester . ."; } .department { @@ -2005,7 +2051,7 @@ $pedagogy-white-text: #f0f0f0; grid-template-rows: 100%; grid-template-areas: "stars comment"; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { grid-template-columns: 100%; grid-template-rows: auto auto; grid-template-areas: @@ -2033,7 +2079,7 @@ $pedagogy-white-text: #f0f0f0; color: $pedagogy-white-text; clip-path: polygon(0 0%, 0 100%, 30% 100%, 33% 0); - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { clip-path: none; } } @@ -2060,7 +2106,7 @@ $pedagogy-white-text: #f0f0f0; "grade grade-stars uv-infos" ". . uv-infos"; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { grid-template-columns: 50% 50%; grid-template-rows: auto auto; grid-template-areas: @@ -2077,7 +2123,7 @@ $pedagogy-white-text: #f0f0f0; > p { text-align: right; - font-weight: bold; + font-weight: bold; } } @@ -2104,14 +2150,14 @@ $pedagogy-white-text: #f0f0f0; margin-bottom: 30px; margin-top: 10px; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { grid-template-columns: auto; grid-template-rows: auto auto auto auto; grid-template-areas: "grade-block" "comment" "info" - "comment-end-bar" + "comment-end-bar"; } .grade-block { @@ -2131,10 +2177,10 @@ $pedagogy-white-text: #f0f0f0; background-color: $pedagogy-blue; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { grid-template-columns: 50% auto; grid-template-rows: auto; - grid-template-areas:"grade-type grade-stars"; + grid-template-areas: "grade-type grade-stars"; width: auto; clip-path: none; align-content: space-evenly; @@ -2171,7 +2217,7 @@ $pedagogy-white-text: #f0f0f0; "anchor" "markdown"; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { border-left: solid; border-right: solid; border-color: $pedagogy-blue; @@ -2199,7 +2245,7 @@ $pedagogy-white-text: #f0f0f0; grid-area: info; padding-bottom: 10px; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { border-left: solid; border-right: solid; border-color: $pedagogy-blue; @@ -2227,7 +2273,7 @@ $pedagogy-white-text: #f0f0f0; background-color: $pedagogy-blue; margin-top: -1px; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { grid-template-columns: auto; grid-template-rows: auto auto auto; grid-template-areas: @@ -2247,7 +2293,7 @@ $pedagogy-white-text: #f0f0f0; background-color: $pedagogy-orange; clip-path: polygon(0 10px, 0 100%, 350px 200%, 300px 10px); - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { clip-path: none; padding: 0; padding-bottom: 7px; @@ -2261,14 +2307,13 @@ $pedagogy-white-text: #f0f0f0; a:hover { color: $pedagogy-hover-blue; } - } .date { grid-area: date; color: $pedagogy-white-text; - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { padding-bottom: 7px; } } @@ -2287,7 +2332,7 @@ $pedagogy-white-text: #f0f0f0; color: $pedagogy-hover-blue; } - @media screen and (max-width: $large-devices){ + @media screen and (max-width: $large-devices) { text-align: center; justify-self: inherit; padding-bottom: 7px; diff --git a/core/templates/core/404.jinja b/core/templates/core/404.jinja index 71894b2d..3846ed70 100644 --- a/core/templates/core/404.jinja +++ b/core/templates/core/404.jinja @@ -2,7 +2,12 @@ {% block content %} -

{% trans %}404, Not Found{% endtrans %}

+
+

{% trans %}404, Not Found{% endtrans %}

+

+ {{ exception }} +

+
{% endblock %} diff --git a/core/views/__init__.py b/core/views/__init__.py index df075b9c..5d4d2ea5 100644 --- a/core/views/__init__.py +++ b/core/views/__init__.py @@ -72,7 +72,9 @@ def forbidden(request, exception): def not_found(request, exception): - return HttpResponseNotFound(render(request, "core/404.jinja")) + return HttpResponseNotFound( + render(request, "core/404.jinja", context={"exception": exception}) + ) def internal_servor_error(request): diff --git a/core/views/user.py b/core/views/user.py index 3dc6c28b..62514447 100644 --- a/core/views/user.py +++ b/core/views/user.py @@ -189,78 +189,72 @@ class UserTabsMixin(TabedViewMixin): return self.object.get_display_name() def get_list_of_tabs(self): - tab_list = [] - tab_list.append( + user: User = self.object + tab_list = [ { - "url": reverse("core:user_profile", kwargs={"user_id": self.object.id}), + "url": reverse("core:user_profile", kwargs={"user_id": user.id}), "slug": "infos", "name": _("Infos"), - } - ) - tab_list.append( + }, { - "url": reverse( - "core:user_godfathers", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_godfathers", kwargs={"user_id": user.id}), "slug": "godfathers", "name": _("Family"), - } - ) - tab_list.append( + }, { - "url": reverse( - "core:user_pictures", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_pictures", kwargs={"user_id": user.id}), "slug": "pictures", "name": _("Pictures"), - } - ) - if self.request.user == self.object: + }, + ] + if ( + False and self.request.user.was_subscribed + ): # TODO: display galaxy once it's ready + tab_list.append( + { + "url": reverse("galaxy:user", kwargs={"user_id": user.id}), + "slug": "galaxy", + "name": _("Galaxy"), + } + ) + if self.request.user == user: tab_list.append( {"url": reverse("core:user_tools"), "slug": "tools", "name": _("Tools")} ) - if self.request.user.can_edit(self.object): + if self.request.user.can_edit(user): tab_list.append( { - "url": reverse( - "core:user_edit", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_edit", kwargs={"user_id": user.id}), "slug": "edit", "name": _("Edit"), } ) tab_list.append( { - "url": reverse( - "core:user_prefs", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_prefs", kwargs={"user_id": user.id}), "slug": "prefs", "name": _("Preferences"), } ) - if self.request.user.can_view(self.object): + if self.request.user.can_view(user): tab_list.append( { - "url": reverse( - "core:user_clubs", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_clubs", kwargs={"user_id": user.id}), "slug": "clubs", "name": _("Clubs"), } ) - if self.request.user.is_owner(self.object): + if self.request.user.is_owner(user): tab_list.append( { - "url": reverse( - "core:user_groups", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_groups", kwargs={"user_id": user.id}), "slug": "groups", "name": _("Groups"), } ) try: - if self.object.customer and ( - self.object == self.request.user + if user.customer and ( + user == self.request.user or self.request.user.is_in_group( settings.SITH_GROUP_ACCOUNTING_ADMIN_ID ) @@ -271,9 +265,7 @@ class UserTabsMixin(TabedViewMixin): ): tab_list.append( { - "url": reverse( - "core:user_stats", kwargs={"user_id": self.object.id} - ), + "url": reverse("core:user_stats", kwargs={"user_id": user.id}), "slug": "stats", "name": _("Stats"), } @@ -281,10 +273,10 @@ class UserTabsMixin(TabedViewMixin): tab_list.append( { "url": reverse( - "core:user_account", kwargs={"user_id": self.object.id} + "core:user_account", kwargs={"user_id": user.id} ), "slug": "account", - "name": _("Account") + " (%s €)" % self.object.customer.amount, + "name": _("Account") + " (%s €)" % user.customer.amount, } ) except: diff --git a/galaxy/__init__.py b/galaxy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/galaxy/apps.py b/galaxy/apps.py new file mode 100644 index 00000000..d3b3e849 --- /dev/null +++ b/galaxy/apps.py @@ -0,0 +1,30 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Skia +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.apps import AppConfig + + +class GalaxyConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "galaxy" diff --git a/galaxy/management/commands/rule_galaxy.py b/galaxy/management/commands/rule_galaxy.py new file mode 100644 index 00000000..1db3c975 --- /dev/null +++ b/galaxy/management/commands/rule_galaxy.py @@ -0,0 +1,61 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Skia +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.core.management.base import BaseCommand +from django.db import connection + +from galaxy.models import Galaxy + +import logging + + +class Command(BaseCommand): + help = ( + "Rule the Galaxy! " + "Reset the whole galaxy and compute once again all the relation scores of all users. " + "As the sith's users are rather numerous, this command might be quite expensive in memory " + "and CPU time. Please keep this fact in mind when scheduling calls to this command in a production " + "environment." + ) + + def handle(self, *args, **options): + logger = logging.getLogger("main") + if options["verbosity"] > 1: + logger.setLevel(logging.DEBUG) + elif options["verbosity"] > 0: + logger.setLevel(logging.INFO) + else: + logger.setLevel(logging.NOTSET) + + logger.info("The Galaxy is being ruled by the Sith.") + Galaxy.rule() + logger.info( + "Caching current Galaxy state for a quicker display of the Empire's power." + ) + Galaxy.make_state() + + logger.info("Ruled the galaxy in {} queries.".format(len(connection.queries))) + if options["verbosity"] > 2: + for q in connection.queries: + logger.debug(q) diff --git a/galaxy/migrations/0001_initial.py b/galaxy/migrations/0001_initial.py new file mode 100644 index 00000000..e155d1cb --- /dev/null +++ b/galaxy/migrations/0001_initial.py @@ -0,0 +1,113 @@ +# Generated by Django 3.2.16 on 2023-03-02 10:07 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Galaxy", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("state", models.JSONField(verbose_name="current state")), + ], + ), + migrations.CreateModel( + name="GalaxyStar", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "mass", + models.PositiveIntegerField(default=0, verbose_name="star mass"), + ), + ( + "owner", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="galaxy_user", + to=settings.AUTH_USER_MODEL, + verbose_name="star owner", + ), + ), + ], + ), + migrations.CreateModel( + name="GalaxyLane", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "distance", + models.PositiveIntegerField( + default=0, + help_text="Distance separating star1 and star2", + verbose_name="distance", + ), + ), + ( + "family", + models.PositiveIntegerField(default=0, verbose_name="family score"), + ), + ( + "pictures", + models.PositiveIntegerField( + default=0, verbose_name="pictures score" + ), + ), + ( + "clubs", + models.PositiveIntegerField(default=0, verbose_name="clubs score"), + ), + ( + "star1", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="lanes1", + to="galaxy.galaxystar", + verbose_name="galaxy star 1", + ), + ), + ( + "star2", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="lanes2", + to="galaxy.galaxystar", + verbose_name="galaxy star 2", + ), + ), + ], + ), + ] diff --git a/galaxy/migrations/__init__.py b/galaxy/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/galaxy/models.py b/galaxy/models.py new file mode 100644 index 00000000..a6f9c907 --- /dev/null +++ b/galaxy/models.py @@ -0,0 +1,379 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Skia +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +import math +import logging + +from typing import Tuple + +from django.db import models +from django.db.models import Q, Case, F, Value, When, Count +from django.db.models.functions import Concat +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from typing import List, TypedDict + +from core.models import User +from club.models import Club +from sas.models import Picture + + +class GalaxyStar(models.Model): + """ + This class defines a star (vertex -> user) in the galaxy graph, storing a reference to its owner citizen, and being + referenced by GalaxyLane. + + It also stores the individual mass of this star, used to push it towards the center of the galaxy. + """ + + owner = models.OneToOneField( + User, + verbose_name=_("star owner"), + related_name="galaxy_user", + on_delete=models.CASCADE, + ) + mass = models.PositiveIntegerField( + _("star mass"), + default=0, + ) + + def __str__(self): + return str(self.owner) + + +class GalaxyLane(models.Model): + """ + This class defines a lane (edge -> link between galaxy citizen) in the galaxy map, storing a reference to both its + ends and the distance it covers. + Score details between citizen owning the stars is also stored here. + """ + + star1 = models.ForeignKey( + GalaxyStar, + verbose_name=_("galaxy star 1"), + related_name="lanes1", + on_delete=models.CASCADE, + ) + star2 = models.ForeignKey( + GalaxyStar, + verbose_name=_("galaxy star 2"), + related_name="lanes2", + on_delete=models.CASCADE, + ) + distance = models.PositiveIntegerField( + _("distance"), + default=0, + help_text=_("Distance separating star1 and star2"), + ) + family = models.PositiveIntegerField( + _("family score"), + default=0, + ) + pictures = models.PositiveIntegerField( + _("pictures score"), + default=0, + ) + clubs = models.PositiveIntegerField( + _("clubs score"), + default=0, + ) + + +class StarDict(TypedDict): + id: int + name: str + mass: int + + +class GalaxyDict(TypedDict): + nodes: List[StarDict] + links: List + + +class Galaxy(models.Model): + logger = logging.getLogger("main") + + GALAXY_SCALE_FACTOR = 2_000 + FAMILY_LINK_POINTS = 366 # Equivalent to a leap year together in a club, because. + PICTURE_POINTS = 2 # Equivalent to two days as random members of a club. + CLUBS_POINTS = 1 # One day together as random members in a club is one point. + + state = models.JSONField("current state") + + @staticmethod + def make_state() -> None: + """ + Compute JSON structure to send to 3d-force-graph: https://github.com/vasturiano/3d-force-graph/ + """ + without_nickname = Concat( + F("owner__first_name"), Value(" "), F("owner__last_name") + ) + with_nickname = Concat( + F("owner__first_name"), + Value(" "), + F("owner__last_name"), + Value(" ("), + F("owner__nick_name"), + Value(")"), + ) + stars = GalaxyStar.objects.annotate( + owner_name=Case( + When(owner__nick_name=None, then=without_nickname), + default=with_nickname, + ) + ) + lanes = GalaxyLane.objects.annotate( + star1_owner=F("star1__owner__id"), + star2_owner=F("star2__owner__id"), + ) + json = GalaxyDict( + nodes=[ + StarDict(id=star.owner_id, name=star.owner_name, mass=star.mass) + for star in stars + ], + links=[], + ) + # Make bidirectional links + # TODO: see if this impacts performance with a big graph + for path in lanes: + json["links"].append( + { + "source": path.star1_owner, + "target": path.star2_owner, + "value": path.distance, + } + ) + json["links"].append( + { + "source": path.star2_owner, + "target": path.star1_owner, + "value": path.distance, + } + ) + Galaxy.objects.all().delete() + Galaxy(state=json).save() + + ################### + # User self score # + ################### + + @classmethod + def compute_user_score(cls, user) -> int: + """ + This compute an individual score for each citizen. It will later be used by the graph algorithm to push + higher scores towards the center of the galaxy. + + Idea: This could be added to the computation: + - Forum posts + - Picture count + - Counter consumption + - Barman time + - ... + """ + user_score = 1 + user_score += cls.query_user_score(user) + + # TODO: + # Scale that value with some magic number to accommodate to typical data + # Really active galaxy citizen after 5 years typically have a score of about XXX + # Citizen that were seen regularly without taking much part in organizations typically have a score of about XXX + # Citizen that only went to a few events typically score about XXX + user_score = int(math.log2(user_score)) + + return user_score + + @classmethod + def query_user_score(cls, user) -> int: + score_query = ( + User.objects.filter(id=user.id) + .annotate( + godchildren_count=Count("godchildren", distinct=True) + * cls.FAMILY_LINK_POINTS, + godfathers_count=Count("godfathers", distinct=True) + * cls.FAMILY_LINK_POINTS, + pictures_score=Count("pictures", distinct=True) * cls.PICTURE_POINTS, + clubs_score=Count("memberships", distinct=True) * cls.CLUBS_POINTS, + ) + .aggregate( + score=models.Sum( + F("godchildren_count") + + F("godfathers_count") + + F("pictures_score") + + F("clubs_score") + ) + ) + ) + return score_query.get("score") + + #################### + # Inter-user score # + #################### + + @classmethod + def compute_users_score(cls, user1, user2) -> Tuple[int, int, int, int]: + family = cls.compute_users_family_score(user1, user2) + pictures = cls.compute_users_pictures_score(user1, user2) + clubs = cls.compute_users_clubs_score(user1, user2) + score = family + pictures + clubs + return score, family, pictures, clubs + + @classmethod + def compute_users_family_score(cls, user1, user2) -> int: + link_count = User.objects.filter( + Q(id=user1.id, godfathers=user2) | Q(id=user2.id, godfathers=user1) + ).count() + if link_count: + cls.logger.debug( + f"\t\t- '{user1}' and '{user2}' have {link_count} direct family link" + ) + return link_count * cls.FAMILY_LINK_POINTS + + @classmethod + def compute_users_pictures_score(cls, user1, user2) -> int: + picture_count = ( + Picture.objects.filter(people__user__in=(user1,)) + .filter(people__user__in=(user2,)) + .count() + ) + if picture_count: + cls.logger.debug( + f"\t\t- '{user1}' was pictured with '{user2}' {picture_count} times" + ) + return picture_count * cls.PICTURE_POINTS + + @classmethod + def compute_users_clubs_score(cls, user1, user2) -> int: + common_clubs = Club.objects.filter(members__in=user1.memberships.all()).filter( + members__in=user2.memberships.all() + ) + user1_memberships = user1.memberships.filter(club__in=common_clubs) + user2_memberships = user2.memberships.filter(club__in=common_clubs) + + score = 0 + for user1_membership in user1_memberships: + if user1_membership.end_date is None: + user1_membership.end_date = timezone.now().date() + query = Q( # start2 <= start1 <= end2 + start_date__lte=user1_membership.start_date, + end_date__gte=user1_membership.start_date, + ) + query |= Q( # start2 <= start1 <= now + start_date__lte=user1_membership.start_date, end_date=None + ) + query |= Q( # start1 <= start2 <= end2 + start_date__gte=user1_membership.start_date, + start_date__lte=user1_membership.end_date, + ) + for user2_membership in user2_memberships.filter( + query, club=user1_membership.club + ): + if user2_membership.end_date is None: + user2_membership.end_date = timezone.now().date() + latest_start = max( + user1_membership.start_date, user2_membership.start_date + ) + earliest_end = min(user1_membership.end_date, user2_membership.end_date) + cls.logger.debug( + "\t\t- '%s' was with '%s' in %s starting on %s until %s (%s days)" + % ( + user1, + user2, + user2_membership.club, + latest_start, + earliest_end, + (earliest_end - latest_start).days, + ) + ) + score += cls.CLUBS_POINTS * (earliest_end - latest_start).days + return score + + ################### + # Rule the galaxy # + ################### + + @classmethod + def rule(cls) -> None: + GalaxyStar.objects.all().delete() + # The following is a no-op thanks to cascading, but in case that changes in the future, better keep it anyway. + GalaxyLane.objects.all().delete() + rulable_users = ( + User.objects.filter(subscriptions__isnull=False) + .filter( + Q(godchildren__isnull=False) + | Q(godfathers__isnull=False) + | Q(pictures__isnull=False) + | Q(memberships__isnull=False) + ) + .distinct() + ) + # force fetch of the whole query to make sure there won't + # be any more db hits + # this is memory expensive but prevents a lot of db hits, therefore + # is far more time efficient + rulable_users = list(rulable_users) + while len(rulable_users) > 0: + user1 = rulable_users.pop() + for user2 in rulable_users: + cls.logger.debug("") + cls.logger.debug(f"\t> Ruling '{user1}' against '{user2}'") + star1, _ = GalaxyStar.objects.get_or_create(owner=user1) + star2, _ = GalaxyStar.objects.get_or_create(owner=user2) + if star1.mass == 0: + star1.mass = cls.compute_user_score(user1) + star1.save() + if star2.mass == 0: + star2.mass = cls.compute_user_score(user2) + star2.save() + users_score, family, pictures, clubs = cls.compute_users_score( + user1, user2 + ) + if users_score > 0: + GalaxyLane( + star1=star1, + star2=star2, + distance=cls.scale_distance(users_score), + family=family, + pictures=pictures, + clubs=clubs, + ).save() + + @classmethod + def scale_distance(cls, value) -> int: + # TODO: this will need adjustements with the real, typical data on Taiste + + cls.logger.debug(f"\t\t> Score: {value}") + # Invert score to draw close users together + value = 1 / value # Cannot be 0 + value += 2 # We use log2 just below and need to stay above 1 + value = ( # Let's get something in the range ]0; log2(3)-1≈0.58[ that we can multiply later + math.log2(value) - 1 + ) + value *= ( # Scale that value with a magic number to accommodate to typical data + # Really close galaxy citizen after 5 years typically have a score of about XXX + # Citizen that were in the same year without being really friends typically have a score of about XXX + # Citizen that have met once or twice only have a couple of pictures together typically score about XXX + cls.GALAXY_SCALE_FACTOR + ) + cls.logger.debug(f"\t\t> Scaled distance: {value}") + return int(value) diff --git a/galaxy/static/galaxy/js/3d-force-graph.min.js b/galaxy/static/galaxy/js/3d-force-graph.min.js new file mode 100644 index 00000000..fef0d61b --- /dev/null +++ b/galaxy/static/galaxy/js/3d-force-graph.min.js @@ -0,0 +1,5 @@ +// Version 1.70.19 3d-force-graph - https://github.com/vasturiano/3d-force-graph +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).ForceGraph3D=e()}(this,(function(){"use strict";function t(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function e(e){for(var i=1;it.length)&&(e=t.length);for(var n=0,i=new Array(e);n>8&255]+G[t>>16&255]+G[t>>24&255]+"-"+G[255&e]+G[e>>8&255]+"-"+G[e>>16&15|64]+G[e>>24&255]+"-"+G[63&n|128]+G[n>>8&255]+"-"+G[n>>16&255]+G[n>>24&255]+G[255&i]+G[i>>8&255]+G[i>>16&255]+G[i>>24&255]).toLowerCase()}function q(t,e,n){return Math.max(e,Math.min(n,t))}function X(t,e,n){return(1-n)*t+n*e}function Y(t){return 0==(t&t-1)&&0!==t}function $(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function Z(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function J(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}class K{constructor(t=0,e=0){K.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6],this.y=i[1]*e+i[4]*n+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),i=Math.sin(e),r=this.x-t.x,a=this.y-t.y;return this.x=r*n-a*i+t.x,this.y=r*i+a*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Q{constructor(){Q.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1]}set(t,e,n,i,r,a,o,s,l){const c=this.elements;return c[0]=t,c[1]=i,c[2]=o,c[3]=e,c[4]=r,c[5]=s,c[6]=n,c[7]=a,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,a=n[0],o=n[3],s=n[6],l=n[1],c=n[4],u=n[7],h=n[2],d=n[5],p=n[8],f=i[0],m=i[3],g=i[6],v=i[1],_=i[4],y=i[7],x=i[2],b=i[5],w=i[8];return r[0]=a*f+o*v+s*x,r[3]=a*m+o*_+s*b,r[6]=a*g+o*y+s*w,r[1]=l*f+c*v+u*x,r[4]=l*m+c*_+u*b,r[7]=l*g+c*y+u*w,r[2]=h*f+d*v+p*x,r[5]=h*m+d*_+p*b,r[8]=h*g+d*y+p*w,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8];return e*a*c-e*o*l-n*r*c+n*o*s+i*r*l-i*a*s}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=c*a-o*l,h=o*s-c*r,d=l*r-a*s,p=e*u+n*h+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return t[0]=u*f,t[1]=(i*l-c*n)*f,t[2]=(o*n-i*a)*f,t[3]=h*f,t[4]=(c*e-i*s)*f,t[5]=(i*r-o*e)*f,t[6]=d*f,t[7]=(n*s-l*e)*f,t[8]=(a*e-n*r)*f,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,i,r,a,o){const s=Math.cos(r),l=Math.sin(r);return this.set(n*s,n*l,-n*(s*a+l*o)+a+t,-i*l,i*s,-i*(-l*a+s*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(tt.makeScale(t,e)),this}rotate(t){return this.premultiply(tt.makeRotation(-t)),this}translate(t,e){return this.premultiply(tt.makeTranslation(t,e)),this}makeTranslation(t,e){return this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<9;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const tt=new Q;function et(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}function nt(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function it(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function rt(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}const at={[N]:{[z]:it},[z]:{[N]:rt}},ot={legacyMode:!0,get workingColorSpace(){return z},set workingColorSpace(t){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(t,e,n){if(this.legacyMode||e===n||!e||!n)return t;if(at[e]&&void 0!==at[e][n]){const i=at[e][n];return t.r=i(t.r),t.g=i(t.g),t.b=i(t.b),t}throw new Error("Unsupported color space conversion.")},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)}},st={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},lt={r:0,g:0,b:0},ct={h:0,s:0,l:0},ut={h:0,s:0,l:0};function ht(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}function dt(t,e){return e.r=t.r,e.g=t.g,e.b=t.b,e}class pt{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=N){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ot.toWorkingColorSpace(this,e),this}setRGB(t,e,n,i=ot.workingColorSpace){return this.r=t,this.g=e,this.b=n,ot.toWorkingColorSpace(this,i),this}setHSL(t,e,n,i=ot.workingColorSpace){if(t=function(t,e){return(t%e+e)%e}(t,1),e=q(e,0,1),n=q(n,0,1),0===e)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+e):n+e-n*e,r=2*n-i;this.r=ht(r,i,t+1/3),this.g=ht(r,i,t),this.b=ht(r,i,t-1/3)}return ot.toWorkingColorSpace(this,i),this}setStyle(t,e=N){function n(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const r=i[1],a=i[2];switch(r){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,ot.toWorkingColorSpace(this,e),n(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,ot.toWorkingColorSpace(this,e),n(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a)){const i=parseFloat(t[1])/360,r=parseFloat(t[2])/100,a=parseFloat(t[3])/100;return n(t[4]),this.setHSL(i,r,a,e)}}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=i[1],n=t.length;if(3===n)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,ot.toWorkingColorSpace(this,e),this;if(6===n)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,ot.toWorkingColorSpace(this,e),this}return t&&t.length>0?this.setColorName(t,e):this}setColorName(t,e=N){const n=st[t.toLowerCase()];return void 0!==n?this.setHex(n,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=it(t.r),this.g=it(t.g),this.b=it(t.b),this}copyLinearToSRGB(t){return this.r=rt(t.r),this.g=rt(t.g),this.b=rt(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=N){return ot.fromWorkingColorSpace(dt(this,lt),t),q(255*lt.r,0,255)<<16^q(255*lt.g,0,255)<<8^q(255*lt.b,0,255)<<0}getHexString(t=N){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ot.workingColorSpace){ot.fromWorkingColorSpace(dt(this,lt),e);const n=lt.r,i=lt.g,r=lt.b,a=Math.max(n,i,r),o=Math.min(n,i,r);let s,l;const c=(o+a)/2;if(o===a)s=0,l=0;else{const t=a-o;switch(l=c<=.5?t/(a+o):t/(2-a-o),a){case n:s=(i-r)/t+(i2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=nt("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const i=n.getImageData(0,0,t.width,t.height),r=i.data;for(let t=0;t0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(300!==this.mapping)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case m:t.x=t.x-Math.floor(t.x);break;case g:t.x=t.x<0?0:1;break;case v:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case m:t.y=t.y-Math.floor(t.y);break;case g:t.y=t.y<0?0:1;break;case v:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}}yt.DEFAULT_IMAGE=null,yt.DEFAULT_MAPPING=300,yt.DEFAULT_ANISOTROPY=1;class xt{constructor(t=0,e=0,n=0,i=1){xt.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,i){return this.x=t,this.y=e,this.z=n,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*i+a[12]*r,this.y=a[1]*e+a[5]*n+a[9]*i+a[13]*r,this.z=a[2]*e+a[6]*n+a[10]*i+a[14]*r,this.w=a[3]*e+a[7]*n+a[11]*i+a[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,i,r;const a=.01,o=.1,s=t.elements,l=s[0],c=s[4],u=s[8],h=s[1],d=s[5],p=s[9],f=s[2],m=s[6],g=s[10];if(Math.abs(c-h)s&&t>v?tv?s=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),a=Math.atan2(r,e*n);t=Math.sin(t*a)/r,o=Math.sin(o*a)/r}const r=o*n;if(s=s*t+h*r,l=l*t+d*r,c=c*t+p*r,u=u*t+f*r,t===1-o){const t=1/Math.sqrt(s*s+l*l+c*c+u*u);s*=t,l*=t,c*=t,u*=t}}t[e]=s,t[e+1]=l,t[e+2]=c,t[e+3]=u}static multiplyQuaternionsFlat(t,e,n,i,r,a){const o=n[i],s=n[i+1],l=n[i+2],c=n[i+3],u=r[a],h=r[a+1],d=r[a+2],p=r[a+3];return t[e]=o*p+c*u+s*d-l*h,t[e+1]=s*p+c*h+l*u-o*d,t[e+2]=l*p+c*d+o*h-s*u,t[e+3]=c*p-o*u-s*h-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){const n=t._x,i=t._y,r=t._z,a=t._order,o=Math.cos,s=Math.sin,l=o(n/2),c=o(i/2),u=o(r/2),h=s(n/2),d=s(i/2),p=s(r/2);switch(a){case"XYZ":this._x=h*c*u+l*d*p,this._y=l*d*u-h*c*p,this._z=l*c*p+h*d*u,this._w=l*c*u-h*d*p;break;case"YXZ":this._x=h*c*u+l*d*p,this._y=l*d*u-h*c*p,this._z=l*c*p-h*d*u,this._w=l*c*u+h*d*p;break;case"ZXY":this._x=h*c*u-l*d*p,this._y=l*d*u+h*c*p,this._z=l*c*p+h*d*u,this._w=l*c*u-h*d*p;break;case"ZYX":this._x=h*c*u-l*d*p,this._y=l*d*u+h*c*p,this._z=l*c*p-h*d*u,this._w=l*c*u+h*d*p;break;case"YZX":this._x=h*c*u+l*d*p,this._y=l*d*u+h*c*p,this._z=l*c*p-h*d*u,this._w=l*c*u-h*d*p;break;case"XZY":this._x=h*c*u-l*d*p,this._y=l*d*u-h*c*p,this._z=l*c*p+h*d*u,this._w=l*c*u+h*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,i=Math.sin(n);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],i=e[4],r=e[8],a=e[1],o=e[5],s=e[9],l=e[2],c=e[6],u=e[10],h=n+o+u;if(h>0){const t=.5/Math.sqrt(h+1);this._w=.25/t,this._x=(c-s)*t,this._y=(r-l)*t,this._z=(a-i)*t}else if(n>o&&n>u){const t=2*Math.sqrt(1+n-o-u);this._w=(c-s)/t,this._x=.25*t,this._y=(i+a)/t,this._z=(r+l)/t}else if(o>u){const t=2*Math.sqrt(1+o-n-u);this._w=(r-l)/t,this._x=(i+a)/t,this._y=.25*t,this._z=(s+c)/t}else{const t=2*Math.sqrt(1+u-n-o);this._w=(a-i)/t,this._x=(r+l)/t,this._y=(s+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(q(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(0===n)return this;const i=Math.min(1,e/n);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,i=t._y,r=t._z,a=t._w,o=e._x,s=e._y,l=e._z,c=e._w;return this._x=n*c+a*o+i*l-r*s,this._y=i*c+a*s+r*o-n*l,this._z=r*c+a*l+n*s-i*o,this._w=a*c-n*o-i*s-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const n=this._x,i=this._y,r=this._z,a=this._w;let o=a*t._w+n*t._x+i*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=i,this._z=r,this;const s=1-o*o;if(s<=Number.EPSILON){const t=1-e;return this._w=t*a+e*this._w,this._x=t*n+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(s),c=Math.atan2(l,o),u=Math.sin((1-e)*c)/l,h=Math.sin(e*c)/l;return this._w=a*u+this._w*h,this._x=n*u+this._x*h,this._y=i*u+this._y*h,this._z=r*u+this._z*h,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=Math.random(),e=Math.sqrt(1-t),n=Math.sqrt(t),i=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(i),n*Math.sin(r),n*Math.cos(r),e*Math.sin(i))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Et{constructor(t=0,e=0,n=0){Et.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(At.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(At.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*i,this.y=r[1]*e+r[4]*n+r[7]*i,this.z=r[2]*e+r[5]*n+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=t.elements,a=1/(r[3]*e+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*i+r[12])*a,this.y=(r[1]*e+r[5]*n+r[9]*i+r[13])*a,this.z=(r[2]*e+r[6]*n+r[10]*i+r[14])*a,this}applyQuaternion(t){const e=this.x,n=this.y,i=this.z,r=t.x,a=t.y,o=t.z,s=t.w,l=s*e+a*i-o*n,c=s*n+o*e-r*i,u=s*i+r*n-a*e,h=-r*e-a*n-o*i;return this.x=l*s+h*-r+c*-o-u*-a,this.y=c*s+h*-a+u*-r-l*-o,this.z=u*s+h*-o+l*-a-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*i,this.y=r[1]*e+r[5]*n+r[9]*i,this.z=r[2]*e+r[6]*n+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,i=t.y,r=t.z,a=e.x,o=e.y,s=e.z;return this.x=i*s-r*o,this.y=r*a-n*s,this.z=n*o-i*a,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Tt.copy(this).projectOnVector(t),this.sub(Tt)}reflect(t){return this.sub(Tt.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(q(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,i=this.z-t.z;return e*e+n*n+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const i=Math.sin(e)*t;return this.x=i*Math.sin(n),this.y=Math.cos(e)*t,this.z=i*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=2*(Math.random()-.5),e=Math.random()*Math.PI*2,n=Math.sqrt(1-t**2);return this.x=n*Math.cos(e),this.y=n*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Tt=new Et,At=new St;class Ct{constructor(t=new Et(1/0,1/0,1/0),e=new Et(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,n=1/0,i=1/0,r=-1/0,a=-1/0,o=-1/0;for(let s=0,l=t.length;sr&&(r=l),c>a&&(a=c),u>o&&(o=u)}return this.min.set(e,n,i),this.max.set(r,a,o),this}setFromBufferAttribute(t){let e=1/0,n=1/0,i=1/0,r=-1/0,a=-1/0,o=-1/0;for(let s=0,l=t.count;sr&&(r=l),c>a&&(a=c),u>o&&(o=u)}return this.min.set(e,n,i),this.max.set(r,a,o),this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Pt),Pt.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Ut),Ft.subVectors(this.max,Ut),Dt.subVectors(t.a,Ut),Ot.subVectors(t.b,Ut),It.subVectors(t.c,Ut),kt.subVectors(Ot,Dt),Nt.subVectors(It,Ot),zt.subVectors(Dt,It);let e=[0,-kt.z,kt.y,0,-Nt.z,Nt.y,0,-zt.z,zt.y,kt.z,0,-kt.x,Nt.z,0,-Nt.x,zt.z,0,-zt.x,-kt.y,kt.x,0,-Nt.y,Nt.x,0,-zt.y,zt.x,0];return!!Gt(e,Dt,Ot,It,Ft)&&(e=[1,0,0,0,1,0,0,0,1],!!Gt(e,Dt,Ot,It,Ft)&&(Bt.crossVectors(kt,Nt),e=[Bt.x,Bt.y,Bt.z],Gt(e,Dt,Ot,It,Ft)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return Pt.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return this.getCenter(t.center),t.radius=.5*this.getSize(Pt).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Lt[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Lt[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Lt[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Lt[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Lt[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Lt[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Lt[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Lt[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Lt)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Lt=[new Et,new Et,new Et,new Et,new Et,new Et,new Et,new Et],Pt=new Et,Rt=new Ct,Dt=new Et,Ot=new Et,It=new Et,kt=new Et,Nt=new Et,zt=new Et,Ut=new Et,Ft=new Et,Bt=new Et,jt=new Et;function Gt(t,e,n,i,r){for(let a=0,o=t.length-3;a<=o;a+=3){jt.fromArray(t,a);const o=r.x*Math.abs(jt.x)+r.y*Math.abs(jt.y)+r.z*Math.abs(jt.z),s=e.dot(jt),l=n.dot(jt),c=i.dot(jt);if(Math.max(-Math.max(s,l,c),Math.min(s,l,c))>o)return!1}return!0}const Ht=new Ct,Vt=new Et,Wt=new Et;class qt{constructor(t=new Et,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;void 0!==e?n.copy(e):Ht.setFromPoints(t).getCenter(n);let i=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Vt.subVectors(t,this.center);const e=Vt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),n=.5*(t-this.radius);this.center.addScaledVector(Vt,n/t),this.radius+=n}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Wt.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Vt.copy(t.center).add(Wt)),this.expandByPoint(Vt.copy(t.center).sub(Wt))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Xt=new Et,Yt=new Et,$t=new Et,Zt=new Et,Jt=new Et,Kt=new Et,Qt=new Et;class te{constructor(t=new Et,e=new Et(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Xt)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Xt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Xt.copy(this.direction).multiplyScalar(e).add(this.origin),Xt.distanceToSquared(t))}distanceSqToSegment(t,e,n,i){Yt.copy(t).add(e).multiplyScalar(.5),$t.copy(e).sub(t).normalize(),Zt.copy(this.origin).sub(Yt);const r=.5*t.distanceTo(e),a=-this.direction.dot($t),o=Zt.dot(this.direction),s=-Zt.dot($t),l=Zt.lengthSq(),c=Math.abs(1-a*a);let u,h,d,p;if(c>0)if(u=a*s-o,h=a*o-s,p=r*c,u>=0)if(h>=-p)if(h<=p){const t=1/c;u*=t,h*=t,d=u*(u+a*h+2*o)+h*(a*u+h+2*s)+l}else h=r,u=Math.max(0,-(a*h+o)),d=-u*u+h*(h+2*s)+l;else h=-r,u=Math.max(0,-(a*h+o)),d=-u*u+h*(h+2*s)+l;else h<=-p?(u=Math.max(0,-(-a*r+o)),h=u>0?-r:Math.min(Math.max(-r,-s),r),d=-u*u+h*(h+2*s)+l):h<=p?(u=0,h=Math.min(Math.max(-r,-s),r),d=h*(h+2*s)+l):(u=Math.max(0,-(a*r+o)),h=u>0?r:Math.min(Math.max(-r,-s),r),d=-u*u+h*(h+2*s)+l);else h=a>0?-r:r,u=Math.max(0,-(a*h+o)),d=-u*u+h*(h+2*s)+l;return n&&n.copy(this.direction).multiplyScalar(u).add(this.origin),i&&i.copy($t).multiplyScalar(h).add(Yt),d}intersectSphere(t,e){Xt.subVectors(t.center,this.origin);const n=Xt.dot(this.direction),i=Xt.dot(Xt)-n*n,r=t.radius*t.radius;if(i>r)return null;const a=Math.sqrt(r-i),o=n-a,s=n+a;return o<0&&s<0?null:o<0?this.at(s,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return null===n?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,i,r,a,o,s;const l=1/this.direction.x,c=1/this.direction.y,u=1/this.direction.z,h=this.origin;return l>=0?(n=(t.min.x-h.x)*l,i=(t.max.x-h.x)*l):(n=(t.max.x-h.x)*l,i=(t.min.x-h.x)*l),c>=0?(r=(t.min.y-h.y)*c,a=(t.max.y-h.y)*c):(r=(t.max.y-h.y)*c,a=(t.min.y-h.y)*c),n>a||r>i?null:((r>n||isNaN(n))&&(n=r),(a=0?(o=(t.min.z-h.z)*u,s=(t.max.z-h.z)*u):(o=(t.max.z-h.z)*u,s=(t.min.z-h.z)*u),n>s||o>i?null:((o>n||n!=n)&&(n=o),(s=0?n:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,Xt)}intersectTriangle(t,e,n,i,r){Jt.subVectors(e,t),Kt.subVectors(n,t),Qt.crossVectors(Jt,Kt);let a,o=this.direction.dot(Qt);if(o>0){if(i)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}Zt.subVectors(this.origin,t);const s=a*this.direction.dot(Kt.crossVectors(Zt,Kt));if(s<0)return null;const l=a*this.direction.dot(Jt.cross(Zt));if(l<0)return null;if(s+l>o)return null;const c=-a*Zt.dot(Qt);return c<0?null:this.at(c/o,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ee{constructor(){ee.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}set(t,e,n,i,r,a,o,s,l,c,u,h,d,p,f,m){const g=this.elements;return g[0]=t,g[4]=e,g[8]=n,g[12]=i,g[1]=r,g[5]=a,g[9]=o,g[13]=s,g[2]=l,g[6]=c,g[10]=u,g[14]=h,g[3]=d,g[7]=p,g[11]=f,g[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ee).fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,i=1/ne.setFromMatrixColumn(t,0).length(),r=1/ne.setFromMatrixColumn(t,1).length(),a=1/ne.setFromMatrixColumn(t,2).length();return e[0]=n[0]*i,e[1]=n[1]*i,e[2]=n[2]*i,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,n=t.x,i=t.y,r=t.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(i),l=Math.sin(i),c=Math.cos(r),u=Math.sin(r);if("XYZ"===t.order){const t=a*c,n=a*u,i=o*c,r=o*u;e[0]=s*c,e[4]=-s*u,e[8]=l,e[1]=n+i*l,e[5]=t-r*l,e[9]=-o*s,e[2]=r-t*l,e[6]=i+n*l,e[10]=a*s}else if("YXZ"===t.order){const t=s*c,n=s*u,i=l*c,r=l*u;e[0]=t+r*o,e[4]=i*o-n,e[8]=a*l,e[1]=a*u,e[5]=a*c,e[9]=-o,e[2]=n*o-i,e[6]=r+t*o,e[10]=a*s}else if("ZXY"===t.order){const t=s*c,n=s*u,i=l*c,r=l*u;e[0]=t-r*o,e[4]=-a*u,e[8]=i+n*o,e[1]=n+i*o,e[5]=a*c,e[9]=r-t*o,e[2]=-a*l,e[6]=o,e[10]=a*s}else if("ZYX"===t.order){const t=a*c,n=a*u,i=o*c,r=o*u;e[0]=s*c,e[4]=i*l-n,e[8]=t*l+r,e[1]=s*u,e[5]=r*l+t,e[9]=n*l-i,e[2]=-l,e[6]=o*s,e[10]=a*s}else if("YZX"===t.order){const t=a*s,n=a*l,i=o*s,r=o*l;e[0]=s*c,e[4]=r-t*u,e[8]=i*u+n,e[1]=u,e[5]=a*c,e[9]=-o*c,e[2]=-l*c,e[6]=n*u+i,e[10]=t-r*u}else if("XZY"===t.order){const t=a*s,n=a*l,i=o*s,r=o*l;e[0]=s*c,e[4]=-u,e[8]=l*c,e[1]=t*u+r,e[5]=a*c,e[9]=n*u-i,e[2]=i*u-n,e[6]=o*c,e[10]=r*u+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(re,t,ae)}lookAt(t,e,n){const i=this.elements;return le.subVectors(t,e),0===le.lengthSq()&&(le.z=1),le.normalize(),oe.crossVectors(n,le),0===oe.lengthSq()&&(1===Math.abs(n.z)?le.x+=1e-4:le.z+=1e-4,le.normalize(),oe.crossVectors(n,le)),oe.normalize(),se.crossVectors(le,oe),i[0]=oe.x,i[4]=se.x,i[8]=le.x,i[1]=oe.y,i[5]=se.y,i[9]=le.y,i[2]=oe.z,i[6]=se.z,i[10]=le.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,a=n[0],o=n[4],s=n[8],l=n[12],c=n[1],u=n[5],h=n[9],d=n[13],p=n[2],f=n[6],m=n[10],g=n[14],v=n[3],_=n[7],y=n[11],x=n[15],b=i[0],w=i[4],M=i[8],S=i[12],E=i[1],T=i[5],A=i[9],C=i[13],L=i[2],P=i[6],R=i[10],D=i[14],O=i[3],I=i[7],k=i[11],N=i[15];return r[0]=a*b+o*E+s*L+l*O,r[4]=a*w+o*T+s*P+l*I,r[8]=a*M+o*A+s*R+l*k,r[12]=a*S+o*C+s*D+l*N,r[1]=c*b+u*E+h*L+d*O,r[5]=c*w+u*T+h*P+d*I,r[9]=c*M+u*A+h*R+d*k,r[13]=c*S+u*C+h*D+d*N,r[2]=p*b+f*E+m*L+g*O,r[6]=p*w+f*T+m*P+g*I,r[10]=p*M+f*A+m*R+g*k,r[14]=p*S+f*C+m*D+g*N,r[3]=v*b+_*E+y*L+x*O,r[7]=v*w+_*T+y*P+x*I,r[11]=v*M+_*A+y*R+x*k,r[15]=v*S+_*C+y*D+x*N,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],i=t[8],r=t[12],a=t[1],o=t[5],s=t[9],l=t[13],c=t[2],u=t[6],h=t[10],d=t[14];return t[3]*(+r*s*u-i*l*u-r*o*h+n*l*h+i*o*d-n*s*d)+t[7]*(+e*s*d-e*l*h+r*a*h-i*a*d+i*l*c-r*s*c)+t[11]*(+e*l*u-e*o*d-r*a*u+n*a*d+r*o*c-n*l*c)+t[15]*(-i*o*c-e*s*u+e*o*h+i*a*u-n*a*h+n*s*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=t[9],h=t[10],d=t[11],p=t[12],f=t[13],m=t[14],g=t[15],v=u*m*l-f*h*l+f*s*d-o*m*d-u*s*g+o*h*g,_=p*h*l-c*m*l-p*s*d+a*m*d+c*s*g-a*h*g,y=c*f*l-p*u*l+p*o*d-a*f*d-c*o*g+a*u*g,x=p*u*s-c*f*s-p*o*h+a*f*h+c*o*m-a*u*m,b=e*v+n*_+i*y+r*x;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/b;return t[0]=v*w,t[1]=(f*h*r-u*m*r-f*i*d+n*m*d+u*i*g-n*h*g)*w,t[2]=(o*m*r-f*s*r+f*i*l-n*m*l-o*i*g+n*s*g)*w,t[3]=(u*s*r-o*h*r-u*i*l+n*h*l+o*i*d-n*s*d)*w,t[4]=_*w,t[5]=(c*m*r-p*h*r+p*i*d-e*m*d-c*i*g+e*h*g)*w,t[6]=(p*s*r-a*m*r-p*i*l+e*m*l+a*i*g-e*s*g)*w,t[7]=(a*h*r-c*s*r+c*i*l-e*h*l-a*i*d+e*s*d)*w,t[8]=y*w,t[9]=(p*u*r-c*f*r-p*n*d+e*f*d+c*n*g-e*u*g)*w,t[10]=(a*f*r-p*o*r+p*n*l-e*f*l-a*n*g+e*o*g)*w,t[11]=(c*o*r-a*u*r-c*n*l+e*u*l+a*n*d-e*o*d)*w,t[12]=x*w,t[13]=(c*f*i-p*u*i+p*n*h-e*f*h-c*n*m+e*u*m)*w,t[14]=(p*o*i-a*f*i-p*n*s+e*f*s+a*n*m-e*o*m)*w,t[15]=(a*u*i-c*o*i+c*n*s-e*u*s-a*n*h+e*o*h)*w,this}scale(t){const e=this.elements,n=t.x,i=t.y,r=t.z;return e[0]*=n,e[4]*=i,e[8]*=r,e[1]*=n,e[5]*=i,e[9]*=r,e[2]*=n,e[6]*=i,e[10]*=r,e[3]*=n,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,i))}makeTranslation(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),i=Math.sin(e),r=1-n,a=t.x,o=t.y,s=t.z,l=r*a,c=r*o;return this.set(l*a+n,l*o-i*s,l*s+i*o,0,l*o+i*s,c*o+n,c*s-i*a,0,l*s-i*o,c*s+i*a,r*s*s+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,i,r,a){return this.set(1,n,r,0,t,1,a,0,e,i,1,0,0,0,0,1),this}compose(t,e,n){const i=this.elements,r=e._x,a=e._y,o=e._z,s=e._w,l=r+r,c=a+a,u=o+o,h=r*l,d=r*c,p=r*u,f=a*c,m=a*u,g=o*u,v=s*l,_=s*c,y=s*u,x=n.x,b=n.y,w=n.z;return i[0]=(1-(f+g))*x,i[1]=(d+y)*x,i[2]=(p-_)*x,i[3]=0,i[4]=(d-y)*b,i[5]=(1-(h+g))*b,i[6]=(m+v)*b,i[7]=0,i[8]=(p+_)*w,i[9]=(m-v)*w,i[10]=(1-(h+f))*w,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,n){const i=this.elements;let r=ne.set(i[0],i[1],i[2]).length();const a=ne.set(i[4],i[5],i[6]).length(),o=ne.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],ie.copy(this);const s=1/r,l=1/a,c=1/o;return ie.elements[0]*=s,ie.elements[1]*=s,ie.elements[2]*=s,ie.elements[4]*=l,ie.elements[5]*=l,ie.elements[6]*=l,ie.elements[8]*=c,ie.elements[9]*=c,ie.elements[10]*=c,e.setFromRotationMatrix(ie),n.x=r,n.y=a,n.z=o,this}makePerspective(t,e,n,i,r,a){const o=this.elements,s=2*r/(e-t),l=2*r/(n-i),c=(e+t)/(e-t),u=(n+i)/(n-i),h=-(a+r)/(a-r),d=-2*a*r/(a-r);return o[0]=s,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=l,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=h,o[14]=d,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(t,e,n,i,r,a){const o=this.elements,s=1/(e-t),l=1/(n-i),c=1/(a-r),u=(e+t)*s,h=(n+i)*l,d=(a+r)*c;return o[0]=2*s,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*l,o[9]=0,o[13]=-h,o[2]=0,o[6]=0,o[10]=-2*c,o[14]=-d,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<16;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}const ne=new Et,ie=new ee,re=new Et(0,0,0),ae=new Et(1,1,1),oe=new Et,se=new Et,le=new Et,ce=new ee,ue=new St;class he{constructor(t=0,e=0,n=0,i=he.DefaultOrder){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,i=this._order){return this._x=t,this._y=e,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const i=t.elements,r=i[0],a=i[4],o=i[8],s=i[1],l=i[5],c=i[9],u=i[2],h=i[6],d=i[10];switch(e){case"XYZ":this._y=Math.asin(q(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(h,l),this._z=0);break;case"YXZ":this._x=Math.asin(-q(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(s,l)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(q(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(-u,d),this._z=Math.atan2(-a,l)):(this._y=0,this._z=Math.atan2(s,r));break;case"ZYX":this._y=Math.asin(-q(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(h,d),this._z=Math.atan2(s,r)):(this._x=0,this._z=Math.atan2(-a,l));break;case"YZX":this._z=Math.asin(q(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-q(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(h,l),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===n&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return ce.makeRotationFromQuaternion(t),this.setFromRotationMatrix(ce,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ue.setFromEuler(this),this.setFromQuaternion(ue,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}toVector3(){console.error("THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead")}}he.DefaultOrder="XYZ",he.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class de{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(n=n.concat(r))}return n}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(_e,t,ye),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(_e,xe,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let n=0,i=e.length;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(i.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const n=e.shapes;if(Array.isArray(n))for(let e=0,i=n.length;e0){i.children=[];for(let e=0;e0){i.animations=[];for(let e=0;e0&&(n.geometries=e),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),o.length>0&&(n.images=o),s.length>0&&(n.shapes=s),l.length>0&&(n.skeletons=l),c.length>0&&(n.animations=c),u.length>0&&(n.nodes=u)}return n.object=i,n;function a(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,n,i,r){Ae.subVectors(i,e),Ce.subVectors(n,e),Le.subVectors(t,e);const a=Ae.dot(Ae),o=Ae.dot(Ce),s=Ae.dot(Le),l=Ce.dot(Ce),c=Ce.dot(Le),u=a*l-o*o;if(0===u)return r.set(-2,-1,-1);const h=1/u,d=(l*s-o*c)*h,p=(a*c-o*s)*h;return r.set(1-d-p,p,d)}static containsPoint(t,e,n,i){return this.getBarycoord(t,e,n,i,Pe),Pe.x>=0&&Pe.y>=0&&Pe.x+Pe.y<=1}static getUV(t,e,n,i,r,a,o,s){return this.getBarycoord(t,e,n,i,Pe),s.set(0,0),s.addScaledVector(r,Pe.x),s.addScaledVector(a,Pe.y),s.addScaledVector(o,Pe.z),s}static isFrontFacing(t,e,n,i){return Ae.subVectors(n,e),Ce.subVectors(t,e),Ae.cross(Ce).dot(i)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,i){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[i]),this}setFromAttributeAndIndices(t,e,n,i){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Ae.subVectors(this.c,this.b),Ce.subVectors(this.a,this.b),.5*Ae.cross(Ce).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return ze.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return ze.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,i,r){return ze.getUV(t,this.a,this.b,this.c,e,n,i,r)}containsPoint(t){return ze.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return ze.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,i=this.b,r=this.c;let a,o;Re.subVectors(i,n),De.subVectors(r,n),Ie.subVectors(t,n);const s=Re.dot(Ie),l=De.dot(Ie);if(s<=0&&l<=0)return e.copy(n);ke.subVectors(t,i);const c=Re.dot(ke),u=De.dot(ke);if(c>=0&&u<=c)return e.copy(i);const h=s*u-c*l;if(h<=0&&s>=0&&c<=0)return a=s/(s-c),e.copy(n).addScaledVector(Re,a);Ne.subVectors(t,r);const d=Re.dot(Ne),p=De.dot(Ne);if(p>=0&&d<=p)return e.copy(r);const f=d*l-s*p;if(f<=0&&l>=0&&p<=0)return o=l/(l-p),e.copy(n).addScaledVector(De,o);const m=c*p-d*u;if(m<=0&&u-c>=0&&d-p>=0)return Oe.subVectors(r,i),o=(u-c)/(u-c+(d-p)),e.copy(i).addScaledVector(Oe,o);const g=1/(m+f+h);return a=f*g,o=h*g,e.copy(n).addScaledVector(Re,a).addScaledVector(De,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let Ue=0;class Fe extends j{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:Ue++}),this.uuid=W(),this.name="",this.type="Material",this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=h,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=U,this.stencilZFail=U,this.stencilZPass=U,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const n=t[e];if(void 0===n){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[e]=n:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),void 0!==this.sheen&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.iridescence&&(n.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(n.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(n.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,void 0!==this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(n.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),!1===this.fog&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(n.textures=e),r.length>0&&(n.images=r)}return n}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(null!==e){const t=e.length;n=new Array(t);for(let i=0;i!==t;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class Be extends Fe{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const je=new Et,Ge=new K;class He{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=n,this.usage=35044,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let i=0,r=this.itemSize;i0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const e in n){const i=n[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const n=this.morphAttributes[e],a=[];for(let e=0,i=n.length;e0&&(i[e]=a,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(t.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return null!==o&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;null!==n&&this.setIndex(n.clone(e));const i=t.attributes;for(const t in i){const n=i[t];this.setAttribute(t,n.clone(e))}const r=t.morphAttributes;for(const t in r){const n=[],i=r[t];for(let t=0,r=i.length;t0){const n=t[e[0]];if(void 0!==n){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=n.length;tn.far?null:{distance:c,point:fn.clone(),object:t}}(t,e,n,i,an,on,sn,pn);if(c){r&&(un.fromBufferAttribute(r,o),hn.fromBufferAttribute(r,s),dn.fromBufferAttribute(r,l),c.uv=ze.getUV(pn,an,on,sn,un,hn,dn,new K)),a&&(un.fromBufferAttribute(a,o),hn.fromBufferAttribute(a,s),dn.fromBufferAttribute(a,l),c.uv2=ze.getUV(pn,an,on,sn,un,hn,dn,new K));const t={a:o,b:s,c:l,normal:new Et,materialIndex:0};ze.getNormal(an,on,sn,t.normal),c.face=t}return c}class vn extends tn{constructor(t=1,e=1,n=1,i=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:i,heightSegments:r,depthSegments:a};const o=this;i=Math.floor(i),r=Math.floor(r),a=Math.floor(a);const s=[],l=[],c=[],u=[];let h=0,d=0;function p(t,e,n,i,r,a,p,f,m,g,v){const _=a/m,y=p/g,x=a/2,b=p/2,w=f/2,M=m+1,S=g+1;let E=0,T=0;const A=new Et;for(let a=0;a0?1:-1,c.push(A.x,A.y,A.z),u.push(s/m),u.push(1-a/g),E+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const n={};for(const t in this.extensions)!0===this.extensions[t]&&(n[t]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}class Mn extends Te{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ee,this.projectionMatrix=new ee,this.projectionMatrixInverse=new ee}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}class Sn extends Mn{constructor(t=50,e=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*V*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*H*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*V*Math.atan(Math.tan(.5*H*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,i,r,a){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*H*this.fov)/this.zoom,n=2*e,i=this.aspect*n,r=-.5*i;const a=this.view;if(null!==this.view&&this.view.enabled){const t=a.fullWidth,o=a.fullHeight;r+=a.offsetX*i/t,e-=a.offsetY*n/o,i*=a.width/t,n*=a.height/o}const o=this.filmOffset;0!==o&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const En=-90;class Tn extends Te{constructor(t,e,n){super(),this.type="CubeCamera",this.renderTarget=n;const i=new Sn(En,1,t,e);i.layers=this.layers,i.up.set(0,1,0),i.lookAt(1,0,0),this.add(i);const r=new Sn(En,1,t,e);r.layers=this.layers,r.up.set(0,1,0),r.lookAt(-1,0,0),this.add(r);const a=new Sn(En,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(0,1,0),this.add(a);const o=new Sn(En,1,t,e);o.layers=this.layers,o.up.set(0,0,1),o.lookAt(0,-1,0),this.add(o);const s=new Sn(En,1,t,e);s.layers=this.layers,s.up.set(0,1,0),s.lookAt(0,0,1),this.add(s);const l=new Sn(En,1,t,e);l.layers=this.layers,l.up.set(0,1,0),l.lookAt(0,0,-1),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const n=this.renderTarget,[i,r,a,o,s,l]=this.children,c=t.getRenderTarget(),u=t.toneMapping,h=t.xr.enabled;t.toneMapping=0,t.xr.enabled=!1;const d=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,i),t.setRenderTarget(n,1),t.render(e,r),t.setRenderTarget(n,2),t.render(e,a),t.setRenderTarget(n,3),t.render(e,o),t.setRenderTarget(n,4),t.render(e,s),n.texture.generateMipmaps=d,t.setRenderTarget(n,5),t.render(e,l),t.setRenderTarget(c),t.toneMapping=u,t.xr.enabled=h,n.texture.needsPMREMUpdate=!0}}class An extends yt{constructor(t,e,n,i,r,a,o,s,l,c){super(t=void 0!==t?t:[],e=void 0!==e?e:d,n,i,r,a,o,s,l,c),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Cn extends bt{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const n={width:t,height:t,depth:1},i=[n,n,n,n,n,n];this.texture=new An(i,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:x}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new vn(5,5,5),r=new wn({name:"CubemapFromEquirect",uniforms:_n(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const a=new mn(i,r),o=e.minFilter;e.minFilter===b&&(e.minFilter=x);return new Tn(1,10,this).update(t,a),e.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(t,e,n,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,n,i);t.setRenderTarget(r)}}const Ln=new Et,Pn=new Et,Rn=new Q;class Dn{constructor(t=new Et(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,n,i){return this.normal.set(t,e,n),this.constant=i,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,n){const i=Ln.subVectors(n,e).cross(Pn.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(i,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){const n=t.delta(Ln),i=this.normal.dot(n);if(0===i)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/i;return r<0||r>1?null:e.copy(n).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Rn.getNormalMatrix(t),i=this.coplanarPoint(Ln).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const On=new qt,In=new Et;class kn{constructor(t=new Dn,e=new Dn,n=new Dn,i=new Dn,r=new Dn,a=new Dn){this.planes=[t,e,n,i,r,a]}set(t,e,n,i,r,a){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(a),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t){const e=this.planes,n=t.elements,i=n[0],r=n[1],a=n[2],o=n[3],s=n[4],l=n[5],c=n[6],u=n[7],h=n[8],d=n[9],p=n[10],f=n[11],m=n[12],g=n[13],v=n[14],_=n[15];return e[0].setComponents(o-i,u-s,f-h,_-m).normalize(),e[1].setComponents(o+i,u+s,f+h,_+m).normalize(),e[2].setComponents(o+r,u+l,f+d,_+g).normalize(),e[3].setComponents(o-r,u-l,f-d,_-g).normalize(),e[4].setComponents(o-a,u-c,f-p,_-v).normalize(),e[5].setComponents(o+a,u+c,f+p,_+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),On.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(On)}intersectsSprite(t){return On.center.set(0,0,0),On.radius=.7071067811865476,On.applyMatrix4(t.matrixWorld),this.intersectsSphere(On)}intersectsSphere(t){const e=this.planes,n=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(n)0?t.max.x:t.min.x,In.y=i.normal.y>0?t.max.y:t.min.y,In.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(In)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function Nn(){let t=null,e=!1,n=null,i=null;function r(e,a){n(e,a),i=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==n&&(i=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(i),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function zn(t,e){const n=e.isWebGL2,i=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),i.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const n=i.get(e);n&&(t.deleteBuffer(n.buffer),i.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=i.get(e);return void((!t||t.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",iridescence_fragment:"#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660, 0.0556434,\n\t\t-1.5371385, 1.8760108, -0.2040259,\n\t\t-0.4985314, 0.0415560, 1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\t return vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat R21 = R12;\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos.xyz );\n\t\tvec3 vSigmaY = dFdy( surf_pos.xyz );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"vec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness );\n\t#else\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometry.viewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if defined( USE_SHADOWMAP ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_COORDS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tuniform int boneTextureSize;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tfloat j = i * 4.0;\n\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\ty = dy * ( y + 0.5 );\n\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\treturn bone;\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef texture2DLodEXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Bn={common:{diffuse:{value:new pt(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new Q},uv2Transform:{value:new Q},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new K(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new pt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new pt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Q}},sprite:{diffuse:{value:new pt(16777215)},opacity:{value:1},center:{value:new K(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Q}}},jn={basic:{uniforms:yn([Bn.common,Bn.specularmap,Bn.envmap,Bn.aomap,Bn.lightmap,Bn.fog]),vertexShader:Fn.meshbasic_vert,fragmentShader:Fn.meshbasic_frag},lambert:{uniforms:yn([Bn.common,Bn.specularmap,Bn.envmap,Bn.aomap,Bn.lightmap,Bn.emissivemap,Bn.bumpmap,Bn.normalmap,Bn.displacementmap,Bn.fog,Bn.lights,{emissive:{value:new pt(0)}}]),vertexShader:Fn.meshlambert_vert,fragmentShader:Fn.meshlambert_frag},phong:{uniforms:yn([Bn.common,Bn.specularmap,Bn.envmap,Bn.aomap,Bn.lightmap,Bn.emissivemap,Bn.bumpmap,Bn.normalmap,Bn.displacementmap,Bn.fog,Bn.lights,{emissive:{value:new pt(0)},specular:{value:new pt(1118481)},shininess:{value:30}}]),vertexShader:Fn.meshphong_vert,fragmentShader:Fn.meshphong_frag},standard:{uniforms:yn([Bn.common,Bn.envmap,Bn.aomap,Bn.lightmap,Bn.emissivemap,Bn.bumpmap,Bn.normalmap,Bn.displacementmap,Bn.roughnessmap,Bn.metalnessmap,Bn.fog,Bn.lights,{emissive:{value:new pt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Fn.meshphysical_vert,fragmentShader:Fn.meshphysical_frag},toon:{uniforms:yn([Bn.common,Bn.aomap,Bn.lightmap,Bn.emissivemap,Bn.bumpmap,Bn.normalmap,Bn.displacementmap,Bn.gradientmap,Bn.fog,Bn.lights,{emissive:{value:new pt(0)}}]),vertexShader:Fn.meshtoon_vert,fragmentShader:Fn.meshtoon_frag},matcap:{uniforms:yn([Bn.common,Bn.bumpmap,Bn.normalmap,Bn.displacementmap,Bn.fog,{matcap:{value:null}}]),vertexShader:Fn.meshmatcap_vert,fragmentShader:Fn.meshmatcap_frag},points:{uniforms:yn([Bn.points,Bn.fog]),vertexShader:Fn.points_vert,fragmentShader:Fn.points_frag},dashed:{uniforms:yn([Bn.common,Bn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Fn.linedashed_vert,fragmentShader:Fn.linedashed_frag},depth:{uniforms:yn([Bn.common,Bn.displacementmap]),vertexShader:Fn.depth_vert,fragmentShader:Fn.depth_frag},normal:{uniforms:yn([Bn.common,Bn.bumpmap,Bn.normalmap,Bn.displacementmap,{opacity:{value:1}}]),vertexShader:Fn.meshnormal_vert,fragmentShader:Fn.meshnormal_frag},sprite:{uniforms:yn([Bn.sprite,Bn.fog]),vertexShader:Fn.sprite_vert,fragmentShader:Fn.sprite_frag},background:{uniforms:{uvTransform:{value:new Q},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Fn.background_vert,fragmentShader:Fn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:Fn.backgroundCube_vert,fragmentShader:Fn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Fn.cube_vert,fragmentShader:Fn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Fn.equirect_vert,fragmentShader:Fn.equirect_frag},distanceRGBA:{uniforms:yn([Bn.common,Bn.displacementmap,{referencePosition:{value:new Et},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Fn.distanceRGBA_vert,fragmentShader:Fn.distanceRGBA_frag},shadow:{uniforms:yn([Bn.lights,Bn.fog,{color:{value:new pt(0)},opacity:{value:1}}]),vertexShader:Fn.shadow_vert,fragmentShader:Fn.shadow_frag}};jn.physical={uniforms:yn([jn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new K(1,1)},clearcoatNormalMap:{value:null},iridescence:{value:0},iridescenceMap:{value:null},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},sheen:{value:0},sheenColor:{value:new pt(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new K},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new pt(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new pt(1,1,1)},specularColorMap:{value:null}}]),vertexShader:Fn.meshphysical_vert,fragmentShader:Fn.meshphysical_frag};const Gn={r:0,b:0,g:0};function Hn(t,e,n,i,r,a,o){const s=new pt(0);let l,c,u=!0===a?0:1,h=null,d=0,p=null;function m(e,n){e.getRGB(Gn,xn(t)),i.buffers.color.setClear(Gn.r,Gn.g,Gn.b,n,o)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),u=e,m(s,u)},getClearAlpha:function(){return u},setClearAlpha:function(t){u=t,m(s,u)},render:function(i,a){let o=!1,g=!0===a.isScene?a.background:null;if(g&&g.isTexture){g=(a.backgroundBlurriness>0?n:e).get(g)}const v=t.xr,_=v.getSession&&v.getSession();_&&"additive"===_.environmentBlendMode&&(g=null),null===g?m(s,u):g&&g.isColor&&(m(g,1),o=!0),(t.autoClear||o)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),g&&(g.isCubeTexture||g.mapping===f)?(void 0===c&&(c=new mn(new vn(1,1,1),new wn({name:"BackgroundCubeMaterial",uniforms:_n(jn.backgroundCube.uniforms),vertexShader:jn.backgroundCube.vertexShader,fragmentShader:jn.backgroundCube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),c.geometry.deleteAttribute("uv"),c.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(c.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(c)),c.material.uniforms.envMap.value=g,c.material.uniforms.flipEnvMap.value=g.isCubeTexture&&!1===g.isRenderTargetTexture?-1:1,c.material.uniforms.backgroundBlurriness.value=a.backgroundBlurriness,c.material.uniforms.backgroundIntensity.value=a.backgroundIntensity,c.material.toneMapped=g.encoding!==k,h===g&&d===g.version&&p===t.toneMapping||(c.material.needsUpdate=!0,h=g,d=g.version,p=t.toneMapping),c.layers.enableAll(),i.unshift(c,c.geometry,c.material,0,0,null)):g&&g.isTexture&&(void 0===l&&(l=new mn(new Un(2,2),new wn({name:"BackgroundMaterial",uniforms:_n(jn.background.uniforms),vertexShader:jn.background.vertexShader,fragmentShader:jn.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),Object.defineProperty(l.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(l)),l.material.uniforms.t2D.value=g,l.material.uniforms.backgroundIntensity.value=a.backgroundIntensity,l.material.toneMapped=g.encoding!==k,!0===g.matrixAutoUpdate&&g.updateMatrix(),l.material.uniforms.uvTransform.value.copy(g.matrix),h===g&&d===g.version&&p===t.toneMapping||(l.material.needsUpdate=!0,h=g,d=g.version,p=t.toneMapping),l.layers.enableAll(),i.unshift(l,l.geometry,l.material,0,0,null))}}}function Vn(t,e,n,i){const r=t.getParameter(34921),a=i.isWebGL2?null:e.get("OES_vertex_array_object"),o=i.isWebGL2||null!==a,s={},l=p(null);let c=l,u=!1;function h(e){return i.isWebGL2?t.bindVertexArray(e):a.bindVertexArrayOES(e)}function d(e){return i.isWebGL2?t.deleteVertexArray(e):a.deleteVertexArrayOES(e)}function p(t){const e=[],n=[],i=[];for(let t=0;t=0){const n=r[e];let i=a[e];if(void 0===i&&("instanceMatrix"===e&&t.instanceMatrix&&(i=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(i=t.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;o++}}return c.attributesNum!==o||c.index!==i}(r,y,d,x),b&&function(t,e,n,i){const r={},a=e.attributes;let o=0;const s=n.getAttributes();for(const e in s){if(s[e].location>=0){let n=a[e];void 0===n&&("instanceMatrix"===e&&t.instanceMatrix&&(n=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(n=t.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[e]=i,o++}}c.attributes=r,c.attributesNum=o,c.index=i}(r,y,d,x)}else{const t=!0===l.wireframe;c.geometry===y.id&&c.program===d.id&&c.wireframe===t||(c.geometry=y.id,c.program=d.id,c.wireframe=t,b=!0)}null!==x&&n.update(x,34963),(b||u)&&(u=!1,function(r,a,o,s){if(!1===i.isWebGL2&&(r.isInstancedMesh||s.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;f();const l=s.attributes,c=o.getAttributes(),u=a.defaultAttributeValues;for(const e in c){const i=c[e];if(i.location>=0){let a=l[e];if(void 0===a&&("instanceMatrix"===e&&r.instanceMatrix&&(a=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(a=r.instanceColor)),void 0!==a){const e=a.normalized,o=a.itemSize,l=n.get(a);if(void 0===l)continue;const c=l.buffer,u=l.type,h=l.bytesPerElement;if(a.isInterleavedBufferAttribute){const n=a.data,l=n.stride,d=a.offset;if(n.isInstancedInterleavedBuffer){for(let t=0;t0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const a="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let o=void 0!==n.precision?n.precision:"highp";const s=r(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=a||e.has("WEBGL_draw_buffers"),c=!0===n.logarithmicDepthBuffer,u=t.getParameter(34930),h=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),f=t.getParameter(34921),m=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),_=h>0,y=a||e.has("OES_texture_float");return{isWebGL2:a,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===e.has("EXT_texture_filter_anisotropic")){const n=e.get("EXT_texture_filter_anisotropic");i=t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:r,precision:o,logarithmicDepthBuffer:c,maxTextures:u,maxVertexTextures:h,maxTextureSize:d,maxCubemapSize:p,maxAttributes:f,maxVertexUniforms:m,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:_,floatFragmentTextures:y,floatVertexTextures:_&&y,maxSamples:a?t.getParameter(36183):0}}function Xn(t){const e=this;let n=null,i=0,r=!1,a=!1;const o=new Dn,s=new Q,l={value:null,needsUpdate:!1};function c(){l.value!==n&&(l.value=n,l.needsUpdate=i>0),e.numPlanes=i,e.numIntersection=0}function u(t,n,i,r){const a=null!==t?t.length:0;let c=null;if(0!==a){if(c=l.value,!0!==r||null===c){const e=i+4*a,r=n.matrixWorldInverse;s.getNormalMatrix(r),(null===c||c.length0){const o=new Cn(a.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}class $n extends Mn{constructor(t=-1,e=1,n=1,i=-1,r=.1,a=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=n,this.bottom=i,this.near=r,this.far=a,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,n,i,r,a){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let r=n-t,a=n+t,o=i+e,s=i-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,a=r+t*this.view.width,o-=e*this.view.offsetY,s=o-e*this.view.height}this.projectionMatrix.makeOrthographic(r,a,o,s,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}const Zn=[.125,.215,.35,.446,.526,.582],Jn=20,Kn=new $n,Qn=new pt;let ti=null;const ei=(1+Math.sqrt(5))/2,ni=1/ei,ii=[new Et(1,1,1),new Et(-1,1,1),new Et(1,1,-1),new Et(-1,1,-1),new Et(0,ei,ni),new Et(0,ei,-ni),new Et(ni,0,ei),new Et(-ni,0,ei),new Et(ei,ni,0),new Et(-ei,ni,0)];class ri{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,i=100){ti=this._renderer.getRenderTarget(),this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,i,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=li(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=si(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let t=0;tt-4?s=Zn[o-t+4-1]:0===o&&(s=0),i.push(s);const l=1/(a-2),c=-l,u=1+l,h=[c,c,u,c,u,u,c,c,u,u,c,u],d=6,p=6,f=3,m=2,g=1,v=new Float32Array(f*p*d),_=new Float32Array(m*p*d),y=new Float32Array(g*p*d);for(let t=0;t2?0:-1,i=[e,n,0,e+2/3,n,0,e+2/3,n+1,0,e,n,0,e+2/3,n+1,0,e,n+1,0];v.set(i,f*p*t),_.set(h,m*p*t);const r=[t,t,t,t,t,t];y.set(r,g*p*t)}const x=new tn;x.setAttribute("position",new He(v,f)),x.setAttribute("uv",new He(_,m)),x.setAttribute("faceIndex",new He(y,g)),e.push(x),r>4&&r--}return{lodPlanes:e,sizeLods:n,sigmas:i}}(i)),this._blurMaterial=function(t,e,n){const i=new Float32Array(Jn),r=new Et(0,1,0),a=new wn({name:"SphericalGaussianBlur",defines:{n:Jn,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r}},vertexShader:ci(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1});return a}(i,t,e)}return i}_compileMaterial(t){const e=new mn(this._lodPlanes[0],t);this._renderer.compile(e,Kn)}_sceneToCubeUV(t,e,n,i){const r=new Sn(90,1,e,n),a=[1,-1,1,1,1,1],o=[1,1,1,-1,-1,-1],s=this._renderer,l=s.autoClear,c=s.toneMapping;s.getClearColor(Qn),s.toneMapping=0,s.autoClear=!1;const u=new Be({name:"PMREM.Background",side:1,depthWrite:!1,depthTest:!1}),h=new mn(new vn,u);let d=!1;const p=t.background;p?p.isColor&&(u.color.copy(p),t.background=null,d=!0):(u.color.copy(Qn),d=!0);for(let e=0;e<6;e++){const n=e%3;0===n?(r.up.set(0,a[e],0),r.lookAt(o[e],0,0)):1===n?(r.up.set(0,0,a[e]),r.lookAt(0,o[e],0)):(r.up.set(0,a[e],0),r.lookAt(0,0,o[e]));const l=this._cubeSize;oi(i,n*l,e>2?l:0,l,l),s.setRenderTarget(i),d&&s.render(h,r),s.render(t,r)}h.geometry.dispose(),h.material.dispose(),s.toneMapping=c,s.autoClear=l,t.background=p}_textureToCubeUV(t,e){const n=this._renderer,i=t.mapping===d||t.mapping===p;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=li()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===t.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=si());const r=i?this._cubemapMaterial:this._equirectMaterial,a=new mn(this._lodPlanes[0],r);r.uniforms.envMap.value=t;const o=this._cubeSize;oi(e,0,0,3*o,2*o),n.setRenderTarget(e),n.render(a,Kn)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let e=1;eJn&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const m=[];let g=0;for(let t=0;tv-4?i-v+4:0),4*(this._cubeSize-_),3*_,2*_),s.setRenderTarget(e),s.render(c,Kn)}}function ai(t,e,n){const i=new bt(t,e,n);return i.texture.mapping=f,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function oi(t,e,n,i,r){t.viewport.set(e,n,i,r),t.scissor.set(e,n,i,r)}function si(){return new wn({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ci(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function li(){return new wn({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ci(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function ci(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ui(t){let e=new WeakMap,n=null;function i(t){const n=t.target;n.removeEventListener("dispose",i);const r=e.get(n);void 0!==r&&(e.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping,o=303===a||304===a,s=a===d||a===p;if(o||s){if(r.isRenderTargetTexture&&!0===r.needsPMREMUpdate){r.needsPMREMUpdate=!1;let i=e.get(r);return null===n&&(n=new ri(t)),i=o?n.fromEquirectangular(r,i):n.fromCubemap(r,i),e.set(r,i),i.texture}if(e.has(r))return e.get(r).texture;{const a=r.image;if(o&&a&&a.height>0||s&&a&&function(t){let e=0;const n=6;for(let i=0;ie.maxTextureSize&&(A=Math.ceil(T/e.maxTextureSize),T=e.maxTextureSize);const C=new Float32Array(T*A*4*f),L=new wt(C,T,A,f);L.type=S,L.needsUpdate=!0;const P=4*E;for(let D=0;D0)return t;const r=e*n;let a=Mi[r];if(void 0===a&&(a=new Float32Array(r),Mi[r]=a),0!==e){i.toArray(a,0);for(let i=1,r=0;i!==e;++i)r+=n,t[i].toArray(a,r)}return a}function Li(t,e){if(t.length!==e.length)return!1;for(let n=0,i=t.length;n":" "} ${r}: ${n[t]}`)}return i.join("\n")}(t.getShaderSource(e),i)}return r}function Tr(t,e){const n=function(t){switch(t){case I:return["Linear","( value )"];case k:return["sRGB","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+n[0]+n[1]+"; }"}function Ar(t,e){let n;switch(e){case 1:n="Linear";break;case 2:n="Reinhard";break;case 3:n="OptimizedCineon";break;case 4:n="ACESFilmic";break;case 5:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),n="Linear"}return"vec3 "+t+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}function Cr(t){return""!==t}function Lr(t,e){const n=e.numSpotLightShadows+e.numSpotLightMaps-e.numSpotLightShadowsWithMaps;return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,e.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,e.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function Pr(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const Rr=/^[ \t]*#include +<([\w\d./]+)>/gm;function Dr(t){return t.replace(Rr,Or)}function Or(t,e){const n=Fn[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return Dr(n)}const Ir=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function kr(t){return t.replace(Ir,Nr)}function Nr(t,e,n,i){let r="";for(let t=parseInt(e);t0&&(y+="\n"),x=[g,v].filter(Cr).join("\n"),x.length>0&&(x+="\n")):(y=[zr(n),"#define SHADER_NAME "+n.shaderName,v,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors&&n.isWebGL2?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Cr).join("\n"),x=[g,zr(n),"#define SHADER_NAME "+n.shaderName,v,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+u:"",n.envMap?"#define "+h:"",m?"#define CUBEUV_TEXEL_WIDTH "+m.texelWidth:"",m?"#define CUBEUV_TEXEL_HEIGHT "+m.texelHeight:"",m?"#define CUBEUV_MAX_MIP "+m.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?Fn.tonemapping_pars_fragment:"",0!==n.toneMapping?Ar("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Fn.encodings_pars_fragment,Tr("linearToOutputTexel",n.outputEncoding),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Cr).join("\n")),o=Dr(o),o=Lr(o,n),o=Pr(o,n),s=Dr(s),s=Lr(s,n),s=Pr(s,n),o=kr(o),s=kr(s),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(b="#version 300 es\n",y=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+y,x=["#define varying in",n.glslVersion===F?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===F?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+x);const w=b+x+s,M=Mr(r,35633,b+y+o),S=Mr(r,35632,w);if(r.attachShader(_,M),r.attachShader(_,S),void 0!==n.index0AttributeName?r.bindAttribLocation(_,0,n.index0AttributeName):!0===n.morphTargets&&r.bindAttribLocation(_,0,"position"),r.linkProgram(_),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(_).trim(),e=r.getShaderInfoLog(M).trim(),n=r.getShaderInfoLog(S).trim();let i=!0,a=!0;if(!1===r.getProgramParameter(_,35714)){i=!1;const e=Er(r,M,"vertex"),n=Er(r,S,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(_,35715)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+n)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==n||(a=!1);a&&(this.diagnostics={runnable:i,programLog:t,vertexShader:{log:e,prefix:y},fragmentShader:{log:n,prefix:x}})}let E,T;return r.deleteShader(M),r.deleteShader(S),this.getUniforms=function(){return void 0===E&&(E=new wr(r,_)),E},this.getAttributes=function(){return void 0===T&&(T=function(t,e){const n={},i=t.getProgramParameter(e,35721);for(let r=0;r0,O=a.clearcoat>0,N=a.iridescence>0;return{isWebGL2:u,shaderID:M,shaderName:a.type,vertexShader:T,fragmentShader:A,defines:a.defines,customVertexShaderID:C,customFragmentShaderID:L,isRawShaderMaterial:!0===a.isRawShaderMaterial,glslVersion:a.glslVersion,precision:p,instancing:!0===v.isInstancedMesh,instancingColor:!0===v.isInstancedMesh&&null!==v.instanceColor,supportsVertexTextures:d,outputEncoding:null===R?t.outputEncoding:!0===R.isXRRenderTarget?R.texture.encoding:I,map:!!a.map,matcap:!!a.matcap,envMap:!!b,envMapMode:b&&b.mapping,envMapCubeUVHeight:w,lightMap:!!a.lightMap,aoMap:!!a.aoMap,emissiveMap:!!a.emissiveMap,bumpMap:!!a.bumpMap,normalMap:!!a.normalMap,objectSpaceNormalMap:1===a.normalMapType,tangentSpaceNormalMap:0===a.normalMapType,decodeVideoTexture:!!a.map&&!0===a.map.isVideoTexture&&a.map.encoding===k,clearcoat:O,clearcoatMap:O&&!!a.clearcoatMap,clearcoatRoughnessMap:O&&!!a.clearcoatRoughnessMap,clearcoatNormalMap:O&&!!a.clearcoatNormalMap,iridescence:N,iridescenceMap:N&&!!a.iridescenceMap,iridescenceThicknessMap:N&&!!a.iridescenceThicknessMap,displacementMap:!!a.displacementMap,roughnessMap:!!a.roughnessMap,metalnessMap:!!a.metalnessMap,specularMap:!!a.specularMap,specularIntensityMap:!!a.specularIntensityMap,specularColorMap:!!a.specularColorMap,opaque:!1===a.transparent&&1===a.blending,alphaMap:!!a.alphaMap,alphaTest:D,gradientMap:!!a.gradientMap,sheen:a.sheen>0,sheenColorMap:!!a.sheenColorMap,sheenRoughnessMap:!!a.sheenRoughnessMap,transmission:a.transmission>0,transmissionMap:!!a.transmissionMap,thicknessMap:!!a.thicknessMap,combine:a.combine,vertexTangents:!!a.normalMap&&!!y.attributes.tangent,vertexColors:a.vertexColors,vertexAlphas:!0===a.vertexColors&&!!y.attributes.color&&4===y.attributes.color.itemSize,vertexUvs:!!(a.map||a.bumpMap||a.normalMap||a.specularMap||a.alphaMap||a.emissiveMap||a.roughnessMap||a.metalnessMap||a.clearcoatMap||a.clearcoatRoughnessMap||a.clearcoatNormalMap||a.iridescenceMap||a.iridescenceThicknessMap||a.displacementMap||a.transmissionMap||a.thicknessMap||a.specularIntensityMap||a.specularColorMap||a.sheenColorMap||a.sheenRoughnessMap),uvsVertexOnly:!(a.map||a.bumpMap||a.normalMap||a.specularMap||a.alphaMap||a.emissiveMap||a.roughnessMap||a.metalnessMap||a.clearcoatNormalMap||a.iridescenceMap||a.iridescenceThicknessMap||a.transmission>0||a.transmissionMap||a.thicknessMap||a.specularIntensityMap||a.specularColorMap||a.sheen>0||a.sheenColorMap||a.sheenRoughnessMap||!a.displacementMap),fog:!!_,useFog:!0===a.fog,fogExp2:_&&_.isFogExp2,flatShading:!!a.flatShading,sizeAttenuation:a.sizeAttenuation,logarithmicDepthBuffer:h,skinning:!0===v.isSkinnedMesh,morphTargets:void 0!==y.morphAttributes.position,morphNormals:void 0!==y.morphAttributes.normal,morphColors:void 0!==y.morphAttributes.color,morphTargetsCount:E,morphTextureStride:P,numDirLights:s.directional.length,numPointLights:s.point.length,numSpotLights:s.spot.length,numSpotLightMaps:s.spotLightMap.length,numRectAreaLights:s.rectArea.length,numHemiLights:s.hemi.length,numDirLightShadows:s.directionalShadowMap.length,numPointLightShadows:s.pointShadowMap.length,numSpotLightShadows:s.spotShadowMap.length,numSpotLightShadowsWithMaps:s.numSpotLightShadowsWithMaps,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:a.dithering,shadowMapEnabled:t.shadowMap.enabled&&c.length>0,shadowMapType:t.shadowMap.type,toneMapping:a.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:a.premultipliedAlpha,doubleSided:2===a.side,flipSided:1===a.side,useDepthPacking:!!a.depthPacking,depthPacking:a.depthPacking||0,index0AttributeName:a.index0AttributeName,extensionDerivatives:a.extensions&&a.extensions.derivatives,extensionFragDepth:a.extensions&&a.extensions.fragDepth,extensionDrawBuffers:a.extensions&&a.extensions.drawBuffers,extensionShaderTextureLOD:a.extensions&&a.extensions.shaderTextureLOD,rendererExtensionFragDepth:u||i.has("EXT_frag_depth"),rendererExtensionDrawBuffers:u||i.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:u||i.has("EXT_shader_texture_lod"),customProgramCacheKey:a.customProgramCacheKey()}},getProgramCacheKey:function(e){const n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.customVertexShaderID),n.push(e.customFragmentShaderID)),void 0!==e.defines)for(const t in e.defines)n.push(t),n.push(e.defines[t]);return!1===e.isRawShaderMaterial&&(!function(t,e){t.push(e.precision),t.push(e.outputEncoding),t.push(e.envMapMode),t.push(e.envMapCubeUVHeight),t.push(e.combine),t.push(e.vertexUvs),t.push(e.fogExp2),t.push(e.sizeAttenuation),t.push(e.morphTargetsCount),t.push(e.morphAttributeCount),t.push(e.numDirLights),t.push(e.numPointLights),t.push(e.numSpotLights),t.push(e.numSpotLightMaps),t.push(e.numHemiLights),t.push(e.numRectAreaLights),t.push(e.numDirLightShadows),t.push(e.numPointLightShadows),t.push(e.numSpotLightShadows),t.push(e.numSpotLightShadowsWithMaps),t.push(e.shadowMapType),t.push(e.toneMapping),t.push(e.numClippingPlanes),t.push(e.numClipIntersection),t.push(e.depthPacking)}(n,e),function(t,e){s.disableAll(),e.isWebGL2&&s.enable(0);e.supportsVertexTextures&&s.enable(1);e.instancing&&s.enable(2);e.instancingColor&&s.enable(3);e.map&&s.enable(4);e.matcap&&s.enable(5);e.envMap&&s.enable(6);e.lightMap&&s.enable(7);e.aoMap&&s.enable(8);e.emissiveMap&&s.enable(9);e.bumpMap&&s.enable(10);e.normalMap&&s.enable(11);e.objectSpaceNormalMap&&s.enable(12);e.tangentSpaceNormalMap&&s.enable(13);e.clearcoat&&s.enable(14);e.clearcoatMap&&s.enable(15);e.clearcoatRoughnessMap&&s.enable(16);e.clearcoatNormalMap&&s.enable(17);e.iridescence&&s.enable(18);e.iridescenceMap&&s.enable(19);e.iridescenceThicknessMap&&s.enable(20);e.displacementMap&&s.enable(21);e.specularMap&&s.enable(22);e.roughnessMap&&s.enable(23);e.metalnessMap&&s.enable(24);e.gradientMap&&s.enable(25);e.alphaMap&&s.enable(26);e.alphaTest&&s.enable(27);e.vertexColors&&s.enable(28);e.vertexAlphas&&s.enable(29);e.vertexUvs&&s.enable(30);e.vertexTangents&&s.enable(31);e.uvsVertexOnly&&s.enable(32);t.push(s.mask),s.disableAll(),e.fog&&s.enable(0);e.useFog&&s.enable(1);e.flatShading&&s.enable(2);e.logarithmicDepthBuffer&&s.enable(3);e.skinning&&s.enable(4);e.morphTargets&&s.enable(5);e.morphNormals&&s.enable(6);e.morphColors&&s.enable(7);e.premultipliedAlpha&&s.enable(8);e.shadowMapEnabled&&s.enable(9);e.physicallyCorrectLights&&s.enable(10);e.doubleSided&&s.enable(11);e.flipSided&&s.enable(12);e.useDepthPacking&&s.enable(13);e.dithering&&s.enable(14);e.specularIntensityMap&&s.enable(15);e.specularColorMap&&s.enable(16);e.transmission&&s.enable(17);e.transmissionMap&&s.enable(18);e.thicknessMap&&s.enable(19);e.sheen&&s.enable(20);e.sheenColorMap&&s.enable(21);e.sheenRoughnessMap&&s.enable(22);e.decodeVideoTexture&&s.enable(23);e.opaque&&s.enable(24);t.push(s.mask)}(n,e),n.push(t.outputEncoding)),n.push(e.customProgramCacheKey),n.join()},getUniforms:function(t){const e=m[t.type];let n;if(e){const t=jn[e];n=bn.clone(t.uniforms)}else n=t.uniforms;return n},acquireProgram:function(e,n){let i;for(let t=0,e=c.length;t0?i.push(u):!0===o.transparent?r.push(u):n.push(u)},unshift:function(t,e,o,s,l,c){const u=a(t,e,o,s,l,c);o.transmission>0?i.unshift(u):!0===o.transparent?r.unshift(u):n.unshift(u)},finish:function(){for(let n=e,i=t.length;n1&&n.sort(t||Vr),i.length>1&&i.sort(e||Wr),r.length>1&&r.sort(e||Wr)}}}function Xr(){let t=new WeakMap;return{get:function(e,n){const i=t.get(e);let r;return void 0===i?(r=new qr,t.set(e,[r])):n>=i.length?(r=new qr,i.push(r)):r=i[n],r},dispose:function(){t=new WeakMap}}}function Yr(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new Et,color:new pt};break;case"SpotLight":n={position:new Et,direction:new Et,color:new pt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Et,color:new pt,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Et,skyColor:new pt,groundColor:new pt};break;case"RectAreaLight":n={color:new pt,position:new Et,halfWidth:new Et,halfHeight:new Et}}return t[e.id]=n,n}}}let $r=0;function Zr(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function Jr(t,e){const n=new Yr,i=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new K};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new K,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=n,n}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0};for(let t=0;t<9;t++)r.probe.push(new Et);const a=new Et,o=new ee,s=new ee;return{setup:function(a,o){let s=0,l=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let u=0,h=0,d=0,p=0,f=0,m=0,g=0,v=0,_=0,y=0;a.sort(Zr);const x=!0!==o?Math.PI:1;for(let t=0,e=a.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Bn.LTC_FLOAT_1,r.rectAreaLTC2=Bn.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Bn.LTC_HALF_1,r.rectAreaLTC2=Bn.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=s,r.ambient[1]=l,r.ambient[2]=c;const b=r.hash;b.directionalLength===u&&b.pointLength===h&&b.spotLength===d&&b.rectAreaLength===p&&b.hemiLength===f&&b.numDirectionalShadows===m&&b.numPointShadows===g&&b.numSpotShadows===v&&b.numSpotMaps===_||(r.directional.length=u,r.spot.length=d,r.rectArea.length=p,r.point.length=h,r.hemi.length=f,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=g,r.spotLightMatrix.length=v+_-y,r.spotLightMap.length=_,r.numSpotLightShadowsWithMaps=y,b.directionalLength=u,b.pointLength=h,b.spotLength=d,b.rectAreaLength=p,b.hemiLength=f,b.numDirectionalShadows=m,b.numPointShadows=g,b.numSpotShadows=v,b.numSpotMaps=_,r.version=$r++)},setupView:function(t,e){let n=0,i=0,l=0,c=0,u=0;const h=e.matrixWorldInverse;for(let e=0,d=t.length;e=a.length?(o=new Kr(t,e),a.push(o)):o=a[r],o},dispose:function(){n=new WeakMap}}}class ta extends Fe{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class ea extends Fe{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.referencePosition=new Et,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}function na(t,e,n){let i=new kn;const r=new K,a=new K,o=new xt,s=new ta({depthPacking:3201}),l=new ea,c={},u=n.maxTextureSize,h={0:1,1:0,2:2},d=new wn({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new K},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const f=new tn;f.setAttribute("position",new He(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new mn(f,d),g=this;function v(n,i){const a=e.update(m);d.defines.VSM_SAMPLES!==n.blurSamples&&(d.defines.VSM_SAMPLES=n.blurSamples,p.defines.VSM_SAMPLES=n.blurSamples,d.needsUpdate=!0,p.needsUpdate=!0),null===n.mapPass&&(n.mapPass=new bt(r.x,r.y)),d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(i,null,a,d,m,null),p.uniforms.shadow_pass.value=n.mapPass.texture,p.uniforms.resolution.value=n.mapSize,p.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(i,null,a,p,m,null)}function y(e,n,i,r,a,o){let u=null;const d=!0===i.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(void 0!==d)u=d;else if(u=!0===i.isPointLight?l:s,t.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0){const t=u.uuid,e=n.uuid;let i=c[t];void 0===i&&(i={},c[t]=i);let r=i[e];void 0===r&&(r=u.clone(),i[e]=r),u=r}return u.visible=n.visible,u.wireframe=n.wireframe,u.side=3===o?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],u.alphaMap=n.alphaMap,u.alphaTest=n.alphaTest,u.map=n.map,u.clipShadows=n.clipShadows,u.clippingPlanes=n.clippingPlanes,u.clipIntersection=n.clipIntersection,u.displacementMap=n.displacementMap,u.displacementScale=n.displacementScale,u.displacementBias=n.displacementBias,u.wireframeLinewidth=n.wireframeLinewidth,u.linewidth=n.linewidth,!0===i.isPointLight&&!0===u.isMeshDistanceMaterial&&(u.referencePosition.setFromMatrixPosition(i.matrixWorld),u.nearDistance=r,u.farDistance=a),u}function x(n,r,a,o,s){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===s)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);const i=e.update(n),r=n.material;if(Array.isArray(r)){const e=i.groups;for(let l=0,c=e.length;lu||r.y>u)&&(r.x>u&&(a.x=Math.floor(u/p.x),r.x=a.x*p.x,h.mapSize.x=a.x),r.y>u&&(a.y=Math.floor(u/p.y),r.y=a.y*p.y,h.mapSize.y=a.y)),null===h.map){const t=3!==this.type?{minFilter:_,magFilter:_}:{};h.map=new bt(r.x,r.y,t),h.map.texture.name=c.name+".shadowMap",h.camera.updateProjectionMatrix()}t.setRenderTarget(h.map),t.clear();const f=h.getViewportCount();for(let t=0;t=1):-1!==D.indexOf("OpenGL ES")&&(R=parseFloat(/^OpenGL ES (\d)/.exec(D)[1]),P=R>=2);let O=null,I={};const k=t.getParameter(3088),N=t.getParameter(2978),z=(new xt).fromArray(k),U=(new xt).fromArray(N);function F(e,n,i){const r=new Uint8Array(4),a=t.createTexture();t.bindTexture(e,a),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;ei||t.height>i)&&(r=i/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const i=e?$:Math.floor,a=i(r*t.width),o=i(r*t.height);void 0===P&&(P=O(a,o));const s=n?O(a,o):P;s.width=a,s.height=o;return s.getContext("2d").drawImage(t,0,0,a,o),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+a+"x"+o+")."),s}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function z(t){return Y(t.width)&&Y(t.height)}function U(t,e){return t.generateMipmaps&&e&&t.minFilter!==_&&t.minFilter!==x}function F(e){t.generateMipmap(e)}function j(n,i,r,a,o=!1){if(!1===s)return i;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let l=i;return 6403===i&&(5126===r&&(l=33326),5131===r&&(l=33325),5121===r&&(l=33321)),33319===i&&(5126===r&&(l=33328),5131===r&&(l=33327),5121===r&&(l=33323)),6408===i&&(5126===r&&(l=34836),5131===r&&(l=34842),5121===r&&(l=a===k&&!1===o?35907:32856),32819===r&&(l=32854),32820===r&&(l=32855)),33325!==l&&33326!==l&&33327!==l&&33328!==l&&34842!==l&&34836!==l||e.get("EXT_color_buffer_float"),l}function G(t,e,n){return!0===U(t,n)||t.isFramebufferTexture&&t.minFilter!==_&&t.minFilter!==x?Math.log2(Math.max(e.width,e.height))+1:void 0!==t.mipmaps&&t.mipmaps.length>0?t.mipmaps.length:t.isCompressedTexture&&Array.isArray(t.image)?e.mipmaps.length:1}function H(t){return t===_||1004===t||t===y?9728:9729}function V(t){const e=t.target;e.removeEventListener("dispose",V),function(t){const e=i.get(t);if(void 0===e.__webglInit)return;const n=t.source,r=R.get(n);if(r){const i=r[e.__cacheKey];i.usedTimes--,0===i.usedTimes&&q(t),0===Object.keys(r).length&&R.delete(n)}i.remove(t)}(e),e.isVideoTexture&&f.delete(e)}function W(e){const n=e.target;n.removeEventListener("dispose",W),function(e){const n=e.texture,r=i.get(e),a=i.get(n);void 0!==a.__webglTexture&&(t.deleteTexture(a.__webglTexture),o.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else{if(t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer)for(let e=0;e0&&r.__version!==t.version){const n=t.image;if(null===n)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==n.complete)return void et(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.bindTexture(3553,r.__webglTexture,33984+e)}const J={[m]:10497,[g]:33071,[v]:33648},K={[_]:9728,1004:9984,[y]:9986,[x]:9729,1007:9985,[b]:9987};function Q(n,a,o){if(o?(t.texParameteri(n,10242,J[a.wrapS]),t.texParameteri(n,10243,J[a.wrapT]),32879!==n&&35866!==n||t.texParameteri(n,32882,J[a.wrapR]),t.texParameteri(n,10240,K[a.magFilter]),t.texParameteri(n,10241,K[a.minFilter])):(t.texParameteri(n,10242,33071),t.texParameteri(n,10243,33071),32879!==n&&35866!==n||t.texParameteri(n,32882,33071),a.wrapS===g&&a.wrapT===g||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(n,10240,H(a.magFilter)),t.texParameteri(n,10241,H(a.minFilter)),a.minFilter!==_&&a.minFilter!==x&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===e.has("EXT_texture_filter_anisotropic")){const o=e.get("EXT_texture_filter_anisotropic");if(a.magFilter===_)return;if(a.minFilter!==y&&a.minFilter!==b)return;if(a.type===S&&!1===e.has("OES_texture_float_linear"))return;if(!1===s&&a.type===E&&!1===e.has("OES_texture_half_float_linear"))return;(a.anisotropy>1||i.get(a).__currentAnisotropy)&&(t.texParameterf(n,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,r.getMaxAnisotropy())),i.get(a).__currentAnisotropy=a.anisotropy)}}function tt(e,n){let i=!1;void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",V));const r=n.source;let a=R.get(r);void 0===a&&(a={},R.set(r,a));const s=function(t){const e=[];return e.push(t.wrapS),e.push(t.wrapT),e.push(t.wrapR||0),e.push(t.magFilter),e.push(t.minFilter),e.push(t.anisotropy),e.push(t.internalFormat),e.push(t.format),e.push(t.type),e.push(t.generateMipmaps),e.push(t.premultiplyAlpha),e.push(t.flipY),e.push(t.unpackAlignment),e.push(t.encoding),e.join()}(n);if(s!==e.__cacheKey){void 0===a[s]&&(a[s]={texture:t.createTexture(),usedTimes:0},o.memory.textures++,i=!0),a[s].usedTimes++;const r=a[e.__cacheKey];void 0!==r&&(a[e.__cacheKey].usedTimes--,0===r.usedTimes&&q(n)),e.__cacheKey=s,e.__webglTexture=a[s].texture}return i}function et(e,r,o){let l=3553;(r.isDataArrayTexture||r.isCompressedArrayTexture)&&(l=35866),r.isData3DTexture&&(l=32879);const c=tt(e,r),h=r.source;n.bindTexture(l,e.__webglTexture,33984+o);const d=i.get(h);if(h.version!==d.__version||!0===c){n.activeTexture(33984+o),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=function(t){return!s&&(t.wrapS!==g||t.wrapT!==g||t.minFilter!==_&&t.minFilter!==x)}(r)&&!1===z(r.image);let i=N(r.image,e,!1,u);i=lt(r,i);const p=z(i)||s,f=a.convert(r.format,r.encoding);let m,v=a.convert(r.type),y=j(r.internalFormat,f,v,r.encoding,r.isVideoTexture);Q(l,r,p);const b=r.mipmaps,w=s&&!0!==r.isVideoTexture,E=void 0===d.__version||!0===c,P=G(r,i,p);if(r.isDepthTexture)y=6402,s?y=r.type===S?36012:r.type===M?33190:r.type===T?35056:33189:r.type===S&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===C&&6402===y&&1012!==r.type&&r.type!==M&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=M,v=a.convert(r.type)),r.format===L&&6402===y&&(y=34041,r.type!==T&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=T,v=a.convert(r.type))),E&&(w?n.texStorage2D(3553,1,y,i.width,i.height):n.texImage2D(3553,0,y,i.width,i.height,0,f,v,null));else if(r.isDataTexture)if(b.length>0&&p){w&&E&&n.texStorage2D(3553,P,y,b[0].width,b[0].height);for(let t=0,e=b.length;t>=1,e>>=1}}else if(b.length>0&&p){w&&E&&n.texStorage2D(3553,P,y,b[0].width,b[0].height);for(let t=0,e=b.length;t=34069&&l<=34074)&&t.framebufferTexture2D(36160,s,l,i.get(o).__webglTexture,0),n.bindFramebuffer(36160,null)}function rt(e,n,i){if(t.bindRenderbuffer(36161,e),n.depthBuffer&&!n.stencilBuffer){let r=33189;if(i||st(n)){const e=n.depthTexture;e&&e.isDepthTexture&&(e.type===S?r=36012:e.type===M&&(r=33190));const i=ot(n);st(n)?d.renderbufferStorageMultisampleEXT(36161,i,r,n.width,n.height):t.renderbufferStorageMultisample(36161,i,r,n.width,n.height)}else t.renderbufferStorage(36161,r,n.width,n.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(n.depthBuffer&&n.stencilBuffer){const r=ot(n);i&&!1===st(n)?t.renderbufferStorageMultisample(36161,r,35056,n.width,n.height):st(n)?d.renderbufferStorageMultisampleEXT(36161,r,35056,n.width,n.height):t.renderbufferStorage(36161,34041,n.width,n.height),t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=!0===n.isWebGLMultipleRenderTargets?n.texture:[n.texture];for(let r=0;r0&&!0===e.has("WEBGL_multisampled_render_to_texture")&&!1!==n.__useRenderToTexture}function lt(t,n){const i=t.encoding,r=t.format,a=t.type;return!0===t.isCompressedTexture||!0===t.isVideoTexture||t.format===B||i!==I&&(i===k?!1===s?!0===e.has("EXT_sRGB")&&r===A?(t.format=B,t.minFilter=x,t.generateMipmaps=!1):n=mt.sRGBToLinear(n):r===A&&a===w||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",i)),n}this.allocateTextureUnit=function(){const t=X;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),X+=1,t},this.resetTextureUnits=function(){X=0},this.setTexture2D=Z,this.setTexture2DArray=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?et(r,t,e):n.bindTexture(35866,r.__webglTexture,33984+e)},this.setTexture3D=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?et(r,t,e):n.bindTexture(32879,r.__webglTexture,33984+e)},this.setTextureCube=function(e,r){const o=i.get(e);e.version>0&&o.__version!==e.version?function(e,r,o){if(6!==r.image.length)return;const l=tt(e,r),u=r.source;n.bindTexture(34067,e.__webglTexture,33984+o);const h=i.get(u);if(u.version!==h.__version||!0===l){n.activeTexture(33984+o),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=r.isCompressedTexture||r.image[0].isCompressedTexture,i=r.image[0]&&r.image[0].isDataTexture,d=[];for(let t=0;t<6;t++)d[t]=e||i?i?r.image[t].image:r.image[t]:N(r.image[t],!1,!0,c),d[t]=lt(r,d[t]);const p=d[0],f=z(p)||s,m=a.convert(r.format,r.encoding),g=a.convert(r.type),v=j(r.internalFormat,m,g,r.encoding),_=s&&!0!==r.isVideoTexture,y=void 0===h.__version||!0===l;let x,b=G(r,p,f);if(Q(34067,r,f),e){_&&y&&n.texStorage2D(34067,b,v,p.width,p.height);for(let t=0;t<6;t++){x=d[t].mipmaps;for(let e=0;e0&&b++,n.texStorage2D(34067,b,v,d[0].width,d[0].height));for(let t=0;t<6;t++)if(i){_?n.texSubImage2D(34069+t,0,0,0,d[t].width,d[t].height,m,g,d[t].data):n.texImage2D(34069+t,0,v,d[t].width,d[t].height,0,m,g,d[t].data);for(let e=0;e0&&!1===st(e)){const i=d?l:[l];c.__webglMultisampledFramebuffer=t.createFramebuffer(),c.__webglColorRenderbuffer=[],n.bindFramebuffer(36160,c.__webglMultisampledFramebuffer);for(let n=0;n0&&!1===st(e)){const r=e.isWebGLMultipleRenderTargets?e.texture:[e.texture],a=e.width,o=e.height;let s=16384;const l=[],c=e.stencilBuffer?33306:36096,u=i.get(e),h=!0===e.isWebGLMultipleRenderTargets;if(h)for(let e=0;es+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&o<=s-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==s&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),null!==r&&(s.matrix.fromArray(r.transform.matrix),s.matrix.decompose(s.position,s.rotation,s.scale),r.linearVelocity?(s.hasLinearVelocity=!0,s.linearVelocity.copy(r.linearVelocity)):s.hasLinearVelocity=!1,r.angularVelocity?(s.hasAngularVelocity=!0,s.angularVelocity.copy(r.angularVelocity)):s.hasAngularVelocity=!1));null!==o&&(i=e.getPose(t.targetRaySpace,n),null===i&&null!==r&&(i=r),null!==i&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(la)))}return null!==o&&(o.visible=null!==i),null!==s&&(s.visible=null!==r),null!==l&&(l.visible=null!==a),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const n=new sa;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}}class ua extends yt{constructor(t,e,n,i,r,a,o,s,l,c){if((c=void 0!==c?c:C)!==C&&c!==L)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&c===C&&(n=M),void 0===n&&c===L&&(n=T),super(null,i,r,a,o,s,c,n,l),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==o?o:_,this.minFilter=void 0!==s?s:_,this.flipY=!1,this.generateMipmaps=!1}}class ha extends j{constructor(t,e){super();const n=this;let i=null,r=1,a=null,o="local-floor",s=null,l=null,c=null,u=null,h=null,d=null;const p=e.getContextAttributes();let f=null,m=null;const g=[],v=[],_=new Set,y=new Map,x=new Sn;x.layers.enable(1),x.viewport=new xt;const b=new Sn;b.layers.enable(2),b.viewport=new xt;const S=[x,b],E=new oa;E.layers.enable(1),E.layers.enable(2);let P=null,R=null;function D(t){const e=v.indexOf(t.inputSource);if(-1===e)return;const n=g[e];void 0!==n&&n.dispatchEvent({type:t.type,data:t.inputSource})}function O(){i.removeEventListener("select",D),i.removeEventListener("selectstart",D),i.removeEventListener("selectend",D),i.removeEventListener("squeeze",D),i.removeEventListener("squeezestart",D),i.removeEventListener("squeezeend",D),i.removeEventListener("end",O),i.removeEventListener("inputsourceschange",I);for(let t=0;t=0&&(v[i]=null,g[i].disconnect(n))}for(let e=0;e=v.length){v.push(n),i=t;break}if(null===v[t]){v[t]=n,i=t;break}}if(-1===i)break}const r=g[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=g[t];return void 0===e&&(e=new ca,g[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=g[t];return void 0===e&&(e=new ca,g[t]=e),e.getGripSpace()},this.getHand=function(t){let e=g[t];return void 0===e&&(e=new ca,g[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){r=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){o=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return s||a},this.setReferenceSpace=function(t){s=t},this.getBaseLayer=function(){return null!==u?u:h},this.getBinding=function(){return c},this.getFrame=function(){return d},this.getSession=function(){return i},this.setSession=async function(l){if(i=l,null!==i){if(f=t.getRenderTarget(),i.addEventListener("select",D),i.addEventListener("selectstart",D),i.addEventListener("selectend",D),i.addEventListener("squeeze",D),i.addEventListener("squeezestart",D),i.addEventListener("squeezeend",D),i.addEventListener("end",O),i.addEventListener("inputsourceschange",I),!0!==p.xrCompatible&&await e.makeXRCompatible(),void 0===i.renderState.layers||!1===t.capabilities.isWebGL2){const n={antialias:void 0!==i.renderState.layers||p.antialias,alpha:p.alpha,depth:p.depth,stencil:p.stencil,framebufferScaleFactor:r};h=new XRWebGLLayer(i,e,n),i.updateRenderState({baseLayer:h}),m=new bt(h.framebufferWidth,h.framebufferHeight,{format:A,type:w,encoding:t.outputEncoding,stencilBuffer:p.stencil})}else{let n=null,a=null,o=null;p.depth&&(o=p.stencil?35056:33190,n=p.stencil?L:C,a=p.stencil?T:M);const s={colorFormat:32856,depthFormat:o,scaleFactor:r};c=new XRWebGLBinding(i,e),u=c.createProjectionLayer(s),i.updateRenderState({layers:[u]}),m=new bt(u.textureWidth,u.textureHeight,{format:A,type:w,depthTexture:new ua(u.textureWidth,u.textureHeight,a,void 0,void 0,void 0,void 0,void 0,void 0,n),stencilBuffer:p.stencil,encoding:t.outputEncoding,samples:p.antialias?4:0});t.properties.get(m).__ignoreDepthValues=u.ignoreDepthValues}m.isXRRenderTarget=!0,this.setFoveation(1),s=null,a=await i.requestReferenceSpace(o),F.setContext(i),F.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}};const k=new Et,N=new Et;function z(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.updateCamera=function(t){if(null===i)return;E.near=b.near=x.near=t.near,E.far=b.far=x.far=t.far,P===E.near&&R===E.far||(i.updateRenderState({depthNear:E.near,depthFar:E.far}),P=E.near,R=E.far);const e=t.parent,n=E.cameras;z(E,e);for(let t=0;te&&(y.set(t,t.lastChangedTime),n.dispatchEvent({type:"planechanged",data:t}))}else _.add(t),y.set(t,i.lastChangedTime),n.dispatchEvent({type:"planeadded",data:t})}d=null})),this.setAnimationLoop=function(t){U=t},this.dispose=function(){}}}function da(t,e){function n(n,i){n.opacity.value=i.opacity,i.color&&n.diffuse.value.copy(i.color),i.emissive&&n.emissive.value.copy(i.emissive).multiplyScalar(i.emissiveIntensity),i.map&&(n.map.value=i.map),i.alphaMap&&(n.alphaMap.value=i.alphaMap),i.bumpMap&&(n.bumpMap.value=i.bumpMap,n.bumpScale.value=i.bumpScale,1===i.side&&(n.bumpScale.value*=-1)),i.displacementMap&&(n.displacementMap.value=i.displacementMap,n.displacementScale.value=i.displacementScale,n.displacementBias.value=i.displacementBias),i.emissiveMap&&(n.emissiveMap.value=i.emissiveMap),i.normalMap&&(n.normalMap.value=i.normalMap,n.normalScale.value.copy(i.normalScale),1===i.side&&n.normalScale.value.negate()),i.specularMap&&(n.specularMap.value=i.specularMap),i.alphaTest>0&&(n.alphaTest.value=i.alphaTest);const r=e.get(i).envMap;if(r&&(n.envMap.value=r,n.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,n.reflectivity.value=i.reflectivity,n.ior.value=i.ior,n.refractionRatio.value=i.refractionRatio),i.lightMap){n.lightMap.value=i.lightMap;const e=!0!==t.physicallyCorrectLights?Math.PI:1;n.lightMapIntensity.value=i.lightMapIntensity*e}let a,o;i.aoMap&&(n.aoMap.value=i.aoMap,n.aoMapIntensity.value=i.aoMapIntensity),i.map?a=i.map:i.specularMap?a=i.specularMap:i.displacementMap?a=i.displacementMap:i.normalMap?a=i.normalMap:i.bumpMap?a=i.bumpMap:i.roughnessMap?a=i.roughnessMap:i.metalnessMap?a=i.metalnessMap:i.alphaMap?a=i.alphaMap:i.emissiveMap?a=i.emissiveMap:i.clearcoatMap?a=i.clearcoatMap:i.clearcoatNormalMap?a=i.clearcoatNormalMap:i.clearcoatRoughnessMap?a=i.clearcoatRoughnessMap:i.iridescenceMap?a=i.iridescenceMap:i.iridescenceThicknessMap?a=i.iridescenceThicknessMap:i.specularIntensityMap?a=i.specularIntensityMap:i.specularColorMap?a=i.specularColorMap:i.transmissionMap?a=i.transmissionMap:i.thicknessMap?a=i.thicknessMap:i.sheenColorMap?a=i.sheenColorMap:i.sheenRoughnessMap&&(a=i.sheenRoughnessMap),void 0!==a&&(a.isWebGLRenderTarget&&(a=a.texture),!0===a.matrixAutoUpdate&&a.updateMatrix(),n.uvTransform.value.copy(a.matrix)),i.aoMap?o=i.aoMap:i.lightMap&&(o=i.lightMap),void 0!==o&&(o.isWebGLRenderTarget&&(o=o.texture),!0===o.matrixAutoUpdate&&o.updateMatrix(),n.uv2Transform.value.copy(o.matrix))}return{refreshFogUniforms:function(e,n){n.color.getRGB(e.fogColor.value,xn(t)),n.isFog?(e.fogNear.value=n.near,e.fogFar.value=n.far):n.isFogExp2&&(e.fogDensity.value=n.density)},refreshMaterialUniforms:function(t,i,r,a,o){i.isMeshBasicMaterial||i.isMeshLambertMaterial?n(t,i):i.isMeshToonMaterial?(n(t,i),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap)}(t,i)):i.isMeshPhongMaterial?(n(t,i),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4)}(t,i)):i.isMeshStandardMaterial?(n(t,i),function(t,n){t.roughness.value=n.roughness,t.metalness.value=n.metalness,n.roughnessMap&&(t.roughnessMap.value=n.roughnessMap);n.metalnessMap&&(t.metalnessMap.value=n.metalnessMap);const i=e.get(n).envMap;i&&(t.envMapIntensity.value=n.envMapIntensity)}(t,i),i.isMeshPhysicalMaterial&&function(t,e,n){t.ior.value=e.ior,e.sheen>0&&(t.sheenColor.value.copy(e.sheenColor).multiplyScalar(e.sheen),t.sheenRoughness.value=e.sheenRoughness,e.sheenColorMap&&(t.sheenColorMap.value=e.sheenColorMap),e.sheenRoughnessMap&&(t.sheenRoughnessMap.value=e.sheenRoughnessMap));e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate()));e.iridescence>0&&(t.iridescence.value=e.iridescence,t.iridescenceIOR.value=e.iridescenceIOR,t.iridescenceThicknessMinimum.value=e.iridescenceThicknessRange[0],t.iridescenceThicknessMaximum.value=e.iridescenceThicknessRange[1],e.iridescenceMap&&(t.iridescenceMap.value=e.iridescenceMap),e.iridescenceThicknessMap&&(t.iridescenceThicknessMap.value=e.iridescenceThicknessMap));e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=n.texture,t.transmissionSamplerSize.value.set(n.width,n.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor));t.specularIntensity.value=e.specularIntensity,t.specularColor.value.copy(e.specularColor),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap);e.specularColorMap&&(t.specularColorMap.value=e.specularColorMap)}(t,i,o)):i.isMeshMatcapMaterial?(n(t,i),function(t,e){e.matcap&&(t.matcap.value=e.matcap)}(t,i)):i.isMeshDepthMaterial?n(t,i):i.isMeshDistanceMaterial?(n(t,i),function(t,e){t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,i)):i.isMeshNormalMaterial?n(t,i):i.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,i),i.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,i)):i.isPointsMaterial?function(t,e,n,i){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*n,t.scale.value=.5*i,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,i,r,a):i.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let n;e.map?n=e.map:e.alphaMap&&(n=e.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),t.uvTransform.value.copy(n.matrix))}(t,i):i.isShadowMaterial?(t.color.value.copy(i.color),t.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function pa(t,e,n,i){let r={},a={},o=[];const s=n.isWebGL2?t.getParameter(35375):0;function l(t,e,n){const i=t.value;if(void 0===n[e]){if("number"==typeof i)n[e]=i;else{const t=Array.isArray(i)?i:[i],r=[];for(let e=0;e0){r=n%i;0!==r&&i-r-o.boundary<0&&(n+=i-r,a.__offset=n)}n+=o.storage}r=n%i,r>0&&(n+=i-r);t.__size=n,t.__cache={}}(n),d=function(e){const n=function(){for(let t=0;t0&&function(t,e,n){const i=J.isWebGL2;null===H&&(H=new bt(1,1,{generateMipmaps:!0,type:Z.has("EXT_color_buffer_half_float")?E:w,minFilter:b,samples:i&&!0===o?4:0}));g.getDrawingBufferSize(W),i?H.setSize(W.x,W.y):H.setSize($(W.x),$(W.y));const r=g.getRenderTarget();g.setRenderTarget(H),g.clear();const a=g.toneMapping;g.toneMapping=0,Ft(t,e,n),g.toneMapping=a,it.updateMultisampleRenderTarget(H),it.updateRenderTargetMipmap(H),g.setRenderTarget(r)}(r,e,n),i&&Q.viewport(C.copy(i)),r.length>0&&Ft(r,e,n),a.length>0&&Ft(a,e,n),s.length>0&&Ft(s,e,n),Q.buffers.depth.setTest(!0),Q.buffers.depth.setMask(!0),Q.buffers.color.setMask(!0),Q.setPolygonOffset(!1)}function Ft(t,e,n){const i=!0===e.isScene?e.overrideMaterial:null;for(let r=0,a=t.length;r0?m[m.length-1]:null,f.pop(),d=f.length>0?f[f.length-1]:null},this.getActiveCubeFace=function(){return _},this.getActiveMipmapLevel=function(){return y},this.getRenderTarget=function(){return x},this.setRenderTargetTextures=function(t,e,n){et.get(t.texture).__webglTexture=e,et.get(t.depthTexture).__webglTexture=n;const i=et.get(t);i.__hasExternalTextures=!0,i.__hasExternalTextures&&(i.__autoAllocateDepthBuffer=void 0===n,i.__autoAllocateDepthBuffer||!0===Z.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),i.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(t,e){const n=et.get(t);n.__webglFramebuffer=e,n.__useDefaultFramebuffer=void 0===e},this.setRenderTarget=function(t,e=0,n=0){x=t,_=e,y=n;let i=!0,r=null,a=!1,o=!1;if(t){const n=et.get(t);void 0!==n.__useDefaultFramebuffer?(Q.bindFramebuffer(36160,null),i=!1):void 0===n.__webglFramebuffer?it.setupRenderTarget(t):n.__hasExternalTextures&&it.rebindTextures(t,et.get(t.texture).__webglTexture,et.get(t.depthTexture).__webglTexture);const s=t.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(o=!0);const l=et.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=l[e],a=!0):r=J.isWebGL2&&t.samples>0&&!1===it.useMultisampledRTT(t)?et.get(t).__webglMultisampledFramebuffer:l,C.copy(t.viewport),L.copy(t.scissor),P=t.scissorTest}else C.copy(z).multiplyScalar(O).floor(),L.copy(U).multiplyScalar(O).floor(),P=F;if(Q.bindFramebuffer(36160,r)&&J.drawBuffers&&i&&Q.drawBuffers(t,r),Q.viewport(C),Q.scissor(L),Q.setScissorTest(P),a){const i=et.get(t.texture);St.framebufferTexture2D(36160,36064,34069+e,i.__webglTexture,n)}else if(o){const i=et.get(t.texture),r=e||0;St.framebufferTextureLayer(36160,36064,i.__webglTexture,n||0,r)}M=-1},this.readRenderTargetPixels=function(t,e,n,i,r,a,o){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=et.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){Q.bindFramebuffer(36160,s);try{const o=t.texture,s=o.format,l=o.type;if(s!==A&&yt.convert(s)!==St.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===E&&(Z.has("EXT_color_buffer_half_float")||J.isWebGL2&&Z.has("EXT_color_buffer_float"));if(!(l===w||yt.convert(l)===St.getParameter(35738)||l===S&&(J.isWebGL2||Z.has("OES_texture_float")||Z.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");e>=0&&e<=t.width-i&&n>=0&&n<=t.height-r&&St.readPixels(e,n,i,r,yt.convert(s),yt.convert(l),a)}finally{const t=null!==x?et.get(x).__webglFramebuffer:null;Q.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i);it.setTexture2D(e,0),St.copyTexSubImage2D(3553,n,0,0,t.x,t.y,r,a),Q.unbindTexture()},this.copyTextureToTexture=function(t,e,n,i=0){const r=e.image.width,a=e.image.height,o=yt.convert(n.format),s=yt.convert(n.type);it.setTexture2D(n,0),St.pixelStorei(37440,n.flipY),St.pixelStorei(37441,n.premultiplyAlpha),St.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?St.texSubImage2D(3553,i,t.x,t.y,r,a,o,s,e.image.data):e.isCompressedTexture?St.compressedTexSubImage2D(3553,i,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,o,e.mipmaps[0].data):St.texSubImage2D(3553,i,t.x,t.y,o,s,e.image),0===i&&n.generateMipmaps&&St.generateMipmap(3553),Q.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,i,r=0){if(g.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const a=t.max.x-t.min.x+1,o=t.max.y-t.min.y+1,s=t.max.z-t.min.z+1,l=yt.convert(i.format),c=yt.convert(i.type);let u;if(i.isData3DTexture)it.setTexture3D(i,0),u=32879;else{if(!i.isDataArrayTexture)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");it.setTexture2DArray(i,0),u=35866}St.pixelStorei(37440,i.flipY),St.pixelStorei(37441,i.premultiplyAlpha),St.pixelStorei(3317,i.unpackAlignment);const h=St.getParameter(3314),d=St.getParameter(32878),p=St.getParameter(3316),f=St.getParameter(3315),m=St.getParameter(32877),v=n.isCompressedTexture?n.mipmaps[0]:n.image;St.pixelStorei(3314,v.width),St.pixelStorei(32878,v.height),St.pixelStorei(3316,t.min.x),St.pixelStorei(3315,t.min.y),St.pixelStorei(32877,t.min.z),n.isDataTexture||n.isData3DTexture?St.texSubImage3D(u,r,e.x,e.y,e.z,a,o,s,l,c,v.data):n.isCompressedArrayTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),St.compressedTexSubImage3D(u,r,e.x,e.y,e.z,a,o,s,l,v.data)):St.texSubImage3D(u,r,e.x,e.y,e.z,a,o,s,l,c,v),St.pixelStorei(3314,h),St.pixelStorei(32878,d),St.pixelStorei(3316,p),St.pixelStorei(3315,f),St.pixelStorei(32877,m),0===r&&i.generateMipmaps&&St.generateMipmap(u),Q.unbindTexture()},this.initTexture=function(t){t.isCubeTexture?it.setTextureCube(t,0):t.isData3DTexture?it.setTexture3D(t,0):t.isDataArrayTexture||t.isCompressedArrayTexture?it.setTexture2DArray(t,0):it.setTexture2D(t,0),Q.unbindTexture()},this.resetState=function(){_=0,y=0,x=null,Q.reset(),wt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}(class extends fa{}).prototype.isWebGL1Renderer=!0;class ma extends Fe{constructor(t){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new pt(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}}const ga=new Et,va=new Et,_a=new ee,ya=new te,xa=new qt;class ba{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const n=this.getUtoTmapping(t);return this.getPoint(n,e)}getPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPoint(n/t));return e}getSpacedPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPointAt(n/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let n,i=this.getPoint(0),r=0;e.push(0);for(let a=1;a<=t;a++)n=this.getPoint(a/t),r+=n.distanceTo(i),e.push(r),i=n;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const n=this.getLengths();let i=0;const r=n.length;let a;a=e||t*n[r-1];let o,s=0,l=r-1;for(;s<=l;)if(i=Math.floor(s+(l-s)/2),o=n[i]-a,o<0)s=i+1;else{if(!(o>0)){l=i;break}l=i-1}if(i=l,n[i]===a)return i/(r-1);const c=n[i];return(i+(a-c)/(n[i+1]-c))/(r-1)}getTangent(t,e){const n=1e-4;let i=t-n,r=t+n;i<0&&(i=0),r>1&&(r=1);const a=this.getPoint(i),o=this.getPoint(r),s=e||(a.isVector2?new K:new Et);return s.copy(o).sub(a).normalize(),s}getTangentAt(t,e){const n=this.getUtoTmapping(t);return this.getTangent(n,e)}computeFrenetFrames(t,e){const n=new Et,i=[],r=[],a=[],o=new Et,s=new ee;for(let e=0;e<=t;e++){const n=e/t;i[e]=this.getTangentAt(n,new Et)}r[0]=new Et,a[0]=new Et;let l=Number.MAX_VALUE;const c=Math.abs(i[0].x),u=Math.abs(i[0].y),h=Math.abs(i[0].z);c<=l&&(l=c,n.set(1,0,0)),u<=l&&(l=u,n.set(0,1,0)),h<=l&&n.set(0,0,1),o.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],o),a[0].crossVectors(i[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),a[e]=a[e-1].clone(),o.crossVectors(i[e-1],i[e]),o.length()>Number.EPSILON){o.normalize();const t=Math.acos(q(i[e-1].dot(i[e]),-1,1));r[e].applyMatrix4(s.makeRotationAxis(o,t))}a[e].crossVectors(i[e],r[e])}if(!0===e){let e=Math.acos(q(r[0].dot(r[t]),-1,1));e/=t,i[0].dot(o.crossVectors(r[0],r[t]))>0&&(e=-e);for(let n=1;n<=t;n++)r[n].applyMatrix4(s.makeRotationAxis(i[n],e*n)),a[n].crossVectors(i[n],r[n])}return{tangents:i,normals:r,binormals:a}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class wa extends ba{constructor(t=0,e=0,n=1,i=1,r=0,a=2*Math.PI,o=!1,s=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=a,this.aClockwise=o,this.aRotation=s}getPoint(t,e){const n=e||new K,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const a=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?o=i[(l-1)%r]:(Sa.subVectors(i[0],i[1]).add(i[0]),o=Sa);const u=i[l%r],h=i[(l+1)%r];if(this.closed||l+2i.length-2?i.length-1:a+1],u=i[a>i.length-3?i.length-1:a+2];return n.set(Ca(o,s.x,l.x,c.x,u.x),Ca(o,s.y,l.y,c.y,u.y)),n}copy(t){super.copy(t),this.points=[];for(let e=0,n=t.points.length;e0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new qe(u,3)),this.setAttribute("normal",new qe(h,3)),this.setAttribute("uv",new qe(d,2))}static fromJSON(t){return new Ia(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class ka extends Ia{constructor(t=1,e=1,n=32,i=1,r=!1,a=0,o=2*Math.PI){super(0,t,e,n,i,r,a,o),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:a,thetaLength:o}}static fromJSON(t){return new ka(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Na extends tn{constructor(t=1,e=32,n=16,i=0,r=2*Math.PI,a=0,o=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:n,phiStart:i,phiLength:r,thetaStart:a,thetaLength:o},e=Math.max(3,Math.floor(e)),n=Math.max(2,Math.floor(n));const s=Math.min(a+o,Math.PI);let l=0;const c=[],u=new Et,h=new Et,d=[],p=[],f=[],m=[];for(let d=0;d<=n;d++){const g=[],v=d/n;let _=0;0==d&&0==a?_=.5/e:d==n&&s==Math.PI&&(_=-.5/e);for(let n=0;n<=e;n++){const s=n/e;u.x=-t*Math.cos(i+s*r)*Math.sin(a+v*o),u.y=t*Math.cos(a+v*o),u.z=t*Math.sin(i+s*r)*Math.sin(a+v*o),p.push(u.x,u.y,u.z),h.copy(u).normalize(),f.push(h.x,h.y,h.z),m.push(s+_,1-v),g.push(l++)}c.push(g)}for(let t=0;t0)&&d.push(e,r,l),(t!==n-1||s0){const t=a[0].object;eo.setFromNormalAndCoplanarPoint(e.getWorldDirection(eo.normal),oo.setFromMatrixPosition(t.matrixWorld)),r!==t&&null!==r&&(o.dispatchEvent({type:"hoveroff",object:r}),n.style.cursor="auto",r=null),r!==t&&(o.dispatchEvent({type:"hoveron",object:t}),n.style.cursor="pointer",r=t)}else null!==r&&(o.dispatchEvent({type:"hoveroff",object:r}),n.style.cursor="auto",r=null)}}function u(r){!1!==o.enabled&&(d(r),a.length=0,no.setFromCamera(io,e),no.intersectObjects(t,!0,a),a.length>0&&(i=!0===o.transformGroup?t[0]:a[0].object,eo.setFromNormalAndCoplanarPoint(e.getWorldDirection(eo.normal),oo.setFromMatrixPosition(i.matrixWorld)),no.ray.intersectPlane(eo,ao)&&(so.copy(i.parent.matrixWorld).invert(),ro.copy(ao).sub(oo.setFromMatrixPosition(i.matrixWorld))),n.style.cursor="move",o.dispatchEvent({type:"dragstart",object:i})))}function h(){!1!==o.enabled&&(i&&(o.dispatchEvent({type:"dragend",object:i}),i=null),n.style.cursor=r?"pointer":"auto")}function d(t){const e=n.getBoundingClientRect();io.x=(t.clientX-e.left)/e.width*2-1,io.y=-(t.clientY-e.top)/e.height*2+1}s(),this.enabled=!0,this.transformGroup=!1,this.activate=s,this.deactivate=l,this.dispose=function(){l()},this.getObjects=function(){return t},this.getRaycaster=function(){return no}}}function co(t,e,n){var i,r=1;function a(){var a,o,s=i.length,l=0,c=0,u=0;for(a=0;a=(r=(h+d)/2))?h=r:d=r,i=c,!(c=c[s=+o]))return i[s]=u,t;if(e===(a=+t._x.call(null,c.data)))return u.next=c,i?i[s]=u:t._root=u,t;do{i=i?i[s]=new Array(2):t._root=new Array(2),(o=e>=(r=(h+d)/2))?h=r:d=r}while((s=+o)==(l=+(a>=r)));return i[l]=c,i[s]=u,t}function ho(t,e,n){this.node=t,this.x0=e,this.x1=n}function po(t){return t[0]}function fo(t,e){var n=new mo(null==e?po:e,NaN,NaN);return null==t?n:n.addAll(t)}function mo(t,e,n){this._x=t,this._x0=e,this._x1=n,this._root=void 0}function go(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var vo=fo.prototype=mo.prototype;function _o(t,e,n,i){if(isNaN(e)||isNaN(n))return t;var r,a,o,s,l,c,u,h,d,p=t._root,f={data:i},m=t._x0,g=t._y0,v=t._x1,_=t._y1;if(!p)return t._root=f,t;for(;p.length;)if((c=e>=(a=(m+v)/2))?m=a:v=a,(u=n>=(o=(g+_)/2))?g=o:_=o,r=p,!(p=p[h=u<<1|c]))return r[h]=f,t;if(s=+t._x.call(null,p.data),l=+t._y.call(null,p.data),e===s&&n===l)return f.next=p,r?r[h]=f:t._root=f,t;do{r=r?r[h]=new Array(4):t._root=new Array(4),(c=e>=(a=(m+v)/2))?m=a:v=a,(u=n>=(o=(g+_)/2))?g=o:_=o}while((h=u<<1|c)==(d=(l>=o)<<1|s>=a));return r[d]=p,r[h]=f,t}function yo(t,e,n,i,r){this.node=t,this.x0=e,this.y0=n,this.x1=i,this.y1=r}function xo(t){return t[0]}function bo(t){return t[1]}function wo(t,e,n){var i=new Mo(null==e?xo:e,null==n?bo:n,NaN,NaN,NaN,NaN);return null==t?i:i.addAll(t)}function Mo(t,e,n,i,r,a){this._x=t,this._y=e,this._x0=n,this._y0=i,this._x1=r,this._y1=a,this._root=void 0}function So(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}vo.copy=function(){var t,e,n=new mo(this._x,this._x0,this._x1),i=this._root;if(!i)return n;if(!i.length)return n._root=go(i),n;for(t=[{source:i,target:n._root=new Array(2)}];i=t.pop();)for(var r=0;r<2;++r)(e=i.source[r])&&(e.length?t.push({source:e,target:i.target[r]=new Array(2)}):i.target[r]=go(e));return n},vo.add=function(t){var e=+this._x.call(null,t);return uo(this.cover(e),e,t)},vo.addAll=function(t){var e,n,i=t.length,r=new Array(i),a=1/0,o=-1/0;for(e=0;eo&&(o=n));if(a>o)return this;for(this.cover(a).cover(o),e=0;et||t>=n;)switch(r=+(tl||(r=a.x1)=h))&&(a=c[c.length-1],c[c.length-1]=c[c.length-1-o],c[c.length-1-o]=a)}else{var d=Math.abs(t-+this._x.call(null,u.data));d=(o=(h+d)/2))?h=o:d=o,e=u,!(u=u[l=+s]))return this;if(!u.length)break;e[l+1&1]&&(n=e,c=l)}for(;u.data!==t;)if(i=u,!(u=u.next))return this;return(r=u.next)&&delete u.next,i?(r?i.next=r:delete i.next,this):e?(r?e[l]=r:delete e[l],(u=e[0]||e[1])&&u===(e[1]||e[0])&&!u.length&&(n?n[c]=u:this._root=u),this):(this._root=r,this)},vo.removeAll=function(t){for(var e=0,n=t.length;e=(o=(y+w)/2))?y=o:w=o,(p=n>=(s=(x+M)/2))?x=s:M=s,(f=i>=(l=(b+S)/2))?b=l:S=l,a=v,!(v=v[m=f<<2|p<<1|d]))return a[m]=_,t;if(c=+t._x.call(null,v.data),u=+t._y.call(null,v.data),h=+t._z.call(null,v.data),e===c&&n===u&&i===h)return _.next=v,a?a[m]=_:t._root=_,t;do{a=a?a[m]=new Array(8):t._root=new Array(8),(d=e>=(o=(y+w)/2))?y=o:w=o,(p=n>=(s=(x+M)/2))?x=s:M=s,(f=i>=(l=(b+S)/2))?b=l:S=l}while((m=f<<2|p<<1|d)==(g=(h>=l)<<2|(u>=s)<<1|c>=o));return a[g]=v,a[m]=_,t}function Ao(t,e,n,i,r,a,o){this.node=t,this.x0=e,this.y0=n,this.z0=i,this.x1=r,this.y1=a,this.z1=o}function Co(t){return t[0]}function Lo(t){return t[1]}function Po(t){return t[2]}function Ro(t,e,n,i){var r=new Do(null==e?Co:e,null==n?Lo:n,null==i?Po:i,NaN,NaN,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Do(t,e,n,i,r,a,o,s,l){this._x=t,this._y=e,this._z=n,this._x0=i,this._y0=r,this._z0=a,this._x1=o,this._y1=s,this._z1=l,this._root=void 0}function Oo(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}Eo.copy=function(){var t,e,n=new Mo(this._x,this._y,this._x0,this._y0,this._x1,this._y1),i=this._root;if(!i)return n;if(!i.length)return n._root=So(i),n;for(t=[{source:i,target:n._root=new Array(4)}];i=t.pop();)for(var r=0;r<4;++r)(e=i.source[r])&&(e.length?t.push({source:e,target:i.target[r]=new Array(4)}):i.target[r]=So(e));return n},Eo.add=function(t){const e=+this._x.call(null,t),n=+this._y.call(null,t);return _o(this.cover(e,n),e,n,t)},Eo.addAll=function(t){var e,n,i,r,a=t.length,o=new Array(a),s=new Array(a),l=1/0,c=1/0,u=-1/0,h=-1/0;for(n=0;nu&&(u=i),rh&&(h=r));if(l>u||c>h)return this;for(this.cover(l,c).cover(u,h),n=0;nt||t>=r||i>e||e>=a;)switch(s=(ed||(a=l.y0)>p||(o=l.x1)=v)<<1|t>=g)&&(l=f[f.length-1],f[f.length-1]=f[f.length-1-c],f[f.length-1-c]=l)}else{var _=t-+this._x.call(null,m.data),y=e-+this._y.call(null,m.data),x=_*_+y*y;if(x=(s=(f+g)/2))?f=s:g=s,(u=o>=(l=(m+v)/2))?m=l:v=l,e=p,!(p=p[h=u<<1|c]))return this;if(!p.length)break;(e[h+1&3]||e[h+2&3]||e[h+3&3])&&(n=e,d=h)}for(;p.data!==t;)if(i=p,!(p=p.next))return this;return(r=p.next)&&delete p.next,i?(r?i.next=r:delete i.next,this):e?(r?e[h]=r:delete e[h],(p=e[0]||e[1]||e[2]||e[3])&&p===(e[3]||e[2]||e[1]||e[0])&&!p.length&&(n?n[d]=p:this._root=p),this):(this._root=r,this)},Eo.removeAll=function(t){for(var e=0,n=t.length;e1&&(v=d.y+d.vy-u.y-u.vy||No(s)),r>2&&(_=d.z+d.vz-u.z-u.vz||No(s)),g*=p=((p=Math.sqrt(g*g+v*v+_*_))-n[m])/p*i*e[m],v*=p,_*=p,d.vx-=g*(f=o[m]),r>1&&(d.vy-=v*f),r>2&&(d.vz-=_*f),u.vx+=g*(f=1-f),r>1&&(u.vy+=v*f),r>2&&(u.vz+=_*f)}function p(){if(i){var r,s,c=i.length,u=t.length,h=new Map(i.map(((t,e)=>[l(t,e,i),t])));for(r=0,a=new Array(c);r"function"==typeof t))||Math.random,r=e.find((t=>[1,2,3].includes(t)))||2,p()},d.links=function(e){return arguments.length?(t=e,p(),d):t},d.id=function(t){return arguments.length?(l=t,d):l},d.iterations=function(t){return arguments.length?(h=+t,d):h},d.strength=function(t){return arguments.length?(c="function"==typeof t?t:ko(+t),f(),d):c},d.distance=function(t){return arguments.length?(u="function"==typeof t?t:ko(+t),m(),d):u},d}Io.copy=function(){var t,e,n=new Do(this._x,this._y,this._z,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1),i=this._root;if(!i)return n;if(!i.length)return n._root=Oo(i),n;for(t=[{source:i,target:n._root=new Array(8)}];i=t.pop();)for(var r=0;r<8;++r)(e=i.source[r])&&(e.length?t.push({source:e,target:i.target[r]=new Array(8)}):i.target[r]=Oo(e));return n},Io.add=function(t){var e=+this._x.call(null,t),n=+this._y.call(null,t),i=+this._z.call(null,t);return To(this.cover(e,n,i),e,n,i,t)},Io.addAll=function(t){var e,n,i,r,a,o=t.length,s=new Array(o),l=new Array(o),c=new Array(o),u=1/0,h=1/0,d=1/0,p=-1/0,f=-1/0,m=-1/0;for(n=0;np&&(p=i),rf&&(f=r),am&&(m=a));if(u>p||h>f||d>m)return this;for(this.cover(u,h,d).cover(p,f,m),n=0;nt||t>=o||r>e||e>=s||a>n||n>=l;)switch(u=(ng||(o=h.y0)>v||(s=h.z0)>_||(l=h.x1)=M)<<2|(e>=w)<<1|t>=b)&&(h=y[y.length-1],y[y.length-1]=y[y.length-1-d],y[y.length-1-d]=h)}else{var S=t-+this._x.call(null,x.data),E=e-+this._y.call(null,x.data),T=n-+this._z.call(null,x.data),A=S*S+E*E+T*T;if(A=(l=(v+x)/2))?v=l:x=l,(d=o>=(c=(_+b)/2))?_=c:b=c,(p=s>=(u=(y+w)/2))?y=u:w=u,e=g,!(g=g[f=p<<2|d<<1|h]))return this;if(!g.length)break;(e[f+1&7]||e[f+2&7]||e[f+3&7]||e[f+4&7]||e[f+5&7]||e[f+6&7]||e[f+7&7])&&(n=e,m=f)}for(;g.data!==t;)if(i=g,!(g=g.next))return this;return(r=g.next)&&delete g.next,i?(r?i.next=r:delete i.next,this):e?(r?e[f]=r:delete e[f],(g=e[0]||e[1]||e[2]||e[3]||e[4]||e[5]||e[6]||e[7])&&g===(e[7]||e[6]||e[5]||e[4]||e[3]||e[2]||e[1]||e[0])&&!g.length&&(n?n[m]=g:this._root=g),this):(this._root=r,this)},Io.removeAll=function(t){for(var e=0,n=t.length;e{}};function jo(){for(var t,e=0,n=arguments.length,i={};e=0&&(n=t.slice(i+1),t=t.slice(0,i)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function Vo(t,e){for(var n,i=0,r=t.length;i0)for(var n,i,r=new Array(n),a=0;a=0&&e._call.call(void 0,t),e=e._next;--Yo}()}finally{Yo=0,function(){var t,e,n=qo,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:qo=e);Xo=t,ls(i)}(),Ko=0}}function ss(){var t=ts.now(),e=t-Jo;e>1e3&&(Qo-=e,Jo=t)}function ls(t){Yo||($o&&($o=clearTimeout($o)),t-Ko>24?(t<1/0&&($o=setTimeout(os,t-ts.now()-Qo)),Zo&&(Zo=clearInterval(Zo))):(Zo||(Jo=ts.now(),Zo=setInterval(ss,1e3)),Yo=1,es(os)))}rs.prototype=as.prototype={constructor:rs,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?ns():+n)+(null==e?0:+e),this._next||Xo===this||(Xo?Xo._next=this:qo=this,Xo=this),this._call=t,this._time=n,ls()},stop:function(){this._call&&(this._call=null,this._time=1/0,ls())}};const cs=4294967296;function us(t){return t.x}function hs(t){return t.y}function ds(t){return t.z}var ps=Math.PI*(3-Math.sqrt(5)),fs=20*Math.PI/(9+Math.sqrt(221));function ms(t,e){e=e||2;var n,i=Math.min(3,Math.max(1,Math.round(e))),r=1,a=.001,o=1-Math.pow(a,1/300),s=0,l=.6,c=new Map,u=as(p),h=jo("tick","end"),d=function(){let t=1;return()=>(t=(1664525*t+1013904223)%cs)/cs}();function p(){f(),h.call("tick",n),r1&&(null==u.fy?u.y+=u.vy*=l:(u.y=u.fy,u.vy=0)),i>2&&(null==u.fz?u.z+=u.vz*=l:(u.z=u.fz,u.vz=0));return n}function m(){for(var e,n=0,r=t.length;n1&&isNaN(e.y)||i>2&&isNaN(e.z)){var a=10*(i>2?Math.cbrt(.5+n):i>1?Math.sqrt(.5+n):n),o=n*ps,s=n*fs;1===i?e.x=a:2===i?(e.x=a*Math.cos(o),e.y=a*Math.sin(o)):(e.x=a*Math.sin(o)*Math.cos(s),e.y=a*Math.cos(o),e.z=a*Math.sin(o)*Math.sin(s))}(isNaN(e.vx)||i>1&&isNaN(e.vy)||i>2&&isNaN(e.vz))&&(e.vx=0,i>1&&(e.vy=0),i>2&&(e.vz=0))}}function g(e){return e.initialize&&e.initialize(t,d,i),e}return null==t&&(t=[]),m(),n={tick:f,restart:function(){return u.restart(p),n},stop:function(){return u.stop(),n},numDimensions:function(t){return arguments.length?(i=Math.min(3,Math.max(1,Math.round(t))),c.forEach(g),n):i},nodes:function(e){return arguments.length?(t=e,m(),c.forEach(g),n):t},alpha:function(t){return arguments.length?(r=+t,n):r},alphaMin:function(t){return arguments.length?(a=+t,n):a},alphaDecay:function(t){return arguments.length?(o=+t,n):+o},alphaTarget:function(t){return arguments.length?(s=+t,n):s},velocityDecay:function(t){return arguments.length?(l=1-t,n):1-l},randomSource:function(t){return arguments.length?(d=t,c.forEach(g),n):d},force:function(t,e){return arguments.length>1?(null==e?c.delete(t):c.set(t,g(e)),n):c.get(t)},find:function(){var e,n,r,a,o,s,l=Array.prototype.slice.call(arguments),c=l.shift()||0,u=(i>1?l.shift():null)||0,h=(i>2?l.shift():null)||0,d=l.shift()||1/0,p=0,f=t.length;for(d*=d,p=0;p1?(h.on(t,e),n):h.on(t)}}}function gs(){var t,e,n,i,r,a,o=ko(-30),s=1,l=1/0,c=.81;function u(i){var a,o=t.length,s=(1===e?fo(t,us):2===e?wo(t,us,hs):3===e?Ro(t,us,hs,ds):null).visitAfter(d);for(r=i,a=0;a1&&(t.y=o/u),e>2&&(t.z=s/u)}else{(n=t).x=n.data.x,e>1&&(n.y=n.data.y),e>2&&(n.z=n.data.z);do{c+=a[n.data.index]}while(n=n.next)}t.value=c}function p(t,o,u,h,d){if(!t.value)return!0;var p=[u,h,d][e-1],f=t.x-n.x,m=e>1?t.y-n.y:0,g=e>2?t.z-n.z:0,v=p-o,_=f*f+m*m+g*g;if(v*v/c<_)return _1&&0===m&&(_+=(m=No(i))*m),e>2&&0===g&&(_+=(g=No(i))*g),_1&&(n.vy+=m*t.value*r/_),e>2&&(n.vz+=g*t.value*r/_)),!0;if(!(t.length||_>=l)){(t.data!==n||t.next)&&(0===f&&(_+=(f=No(i))*f),e>1&&0===m&&(_+=(m=No(i))*m),e>2&&0===g&&(_+=(g=No(i))*g),_1&&(n.vy+=m*v),e>2&&(n.vz+=g*v))}while(t=t.next)}}return u.initialize=function(n,...r){t=n,i=r.find((t=>"function"==typeof t))||Math.random,e=r.find((t=>[1,2,3].includes(t)))||2,h()},u.strength=function(t){return arguments.length?(o="function"==typeof t?t:ko(+t),h(),u):o},u.distanceMin=function(t){return arguments.length?(s=t*t,u):Math.sqrt(s)},u.distanceMax=function(t){return arguments.length?(l=t*t,u):Math.sqrt(l)},u.theta=function(t){return arguments.length?(c=t*t,u):Math.sqrt(c)},u}var vs=function(t){!function(t){if(!t)throw new Error("Eventify cannot use falsy object as events subject");for(var e=["on","fire","off"],n=0;n1&&(i=Array.prototype.splice.call(arguments,1));for(var a=0;a0&&(h.fire("changed",o),o.length=0)}function S(t){if("function"!=typeof t)throw new Error("Function is expected to iterate over graph nodes. You passed "+t);for(var n=e.values(),i=n.next();!i.done;){if(t(i.value))return!0;i=n.next()}}},ys=vs;function xs(t,e){this.id=t,this.links=null,this.data=e}function bs(t,e){t.links?t.links.add(e):t.links=new Set([e])}function ws(t,e,n,i){this.fromId=t,this.toId=e,this.data=n,this.id=i}function Ms(t,e){return t.toString()+"👉 "+e.toString()}var Ss={},Es={get exports(){return Ss},set exports(t){Ss=t}},Ts={},As=function(t){return 0===t?"x":1===t?"y":2===t?"z":"c"+(t+1)};const Cs=As;var Ls=function(t){return function(e,n){let i=n&&n.indent||0,r=n&&void 0!==n.join?n.join:"\n",a=Array(i+1).join(" "),o=[];for(let n=0;n {var}max) {var}max = pos.{var};",{indent:6})}\n }\n\n // Makes the bounds square.\n var maxSideLength = -Infinity;\n ${e("if ({var}max - {var}min > maxSideLength) maxSideLength = {var}max - {var}min ;",{indent:4})}\n\n currentInCache = 0;\n root = newNode();\n ${e("root.min_{var} = {var}min;",{indent:4})}\n ${e("root.max_{var} = {var}min + maxSideLength;",{indent:4})}\n\n i = bodies.length - 1;\n if (i >= 0) {\n root.body = bodies[i];\n }\n while (i--) {\n insert(bodies[i], root);\n }\n }\n\n function insert(newBody) {\n insertStack.reset();\n insertStack.push(root, newBody);\n\n while (!insertStack.isEmpty()) {\n var stackItem = insertStack.pop();\n var node = stackItem.node;\n var body = stackItem.body;\n\n if (!node.body) {\n // This is internal node. Update the total mass of the node and center-of-mass.\n ${e("var {var} = body.pos.{var};",{indent:8})}\n node.mass += body.mass;\n ${e("node.mass_{var} += body.mass * {var};",{indent:8})}\n\n // Recursively insert the body in the appropriate quadrant.\n // But first find the appropriate quadrant.\n var quadIdx = 0; // Assume we are in the 0's quad.\n ${e("var min_{var} = node.min_{var};",{indent:8})}\n ${e("var max_{var} = (min_{var} + node.max_{var}) / 2;",{indent:8})}\n\n${function(e){let n=[],i=Array(e+1).join(" ");for(let e=0;e max_${Ns(e)}) {`),n.push(i+` quadIdx = quadIdx + ${Math.pow(2,e)};`),n.push(i+` min_${Ns(e)} = max_${Ns(e)};`),n.push(i+` max_${Ns(e)} = node.max_${Ns(e)};`),n.push(i+"}");return n.join("\n")}(8)}\n\n var child = getChild(node, quadIdx);\n\n if (!child) {\n // The node is internal but this quadrant is not taken. Add\n // subnode to it.\n child = newNode();\n ${e("child.min_{var} = min_{var};",{indent:10})}\n ${e("child.max_{var} = max_{var};",{indent:10})}\n child.body = body;\n\n setChild(node, quadIdx, child);\n } else {\n // continue searching in this quadrant.\n insertStack.push(child, body);\n }\n } else {\n // We are trying to add to the leaf node.\n // We have to convert current leaf into internal node\n // and continue adding two nodes.\n var oldBody = node.body;\n node.body = null; // internal nodes do not cary bodies\n\n if (isSamePosition(oldBody.pos, body.pos)) {\n // Prevent infinite subdivision by bumping one node\n // anywhere in this quadrant\n var retriesCount = 3;\n do {\n var offset = random.nextDouble();\n ${e("var d{var} = (node.max_{var} - node.min_{var}) * offset;",{indent:12})}\n\n ${e("oldBody.pos.{var} = node.min_{var} + d{var};",{indent:12})}\n retriesCount -= 1;\n // Make sure we don't bump it out of the box. If we do, next iteration should fix it\n } while (retriesCount > 0 && isSamePosition(oldBody.pos, body.pos));\n\n if (retriesCount === 0 && isSamePosition(oldBody.pos, body.pos)) {\n // This is very bad, we ran out of precision.\n // if we do not return from the method we'll get into\n // infinite loop here. So we sacrifice correctness of layout, and keep the app running\n // Next layout iteration should get larger bounding box in the first step and fix this\n return;\n }\n }\n // Next iteration should subdivide node further.\n insertStack.push(node, oldBody);\n insertStack.push(node, body);\n }\n }\n }\n}\nreturn createQuadTree;\n\n`}function Us(t){let e=ks(t);return`\n function isSamePosition(point1, point2) {\n ${e("var d{var} = Math.abs(point1.{var} - point2.{var});",{indent:2})}\n \n return ${e("d{var} < 1e-8",{join:" && "})};\n } \n`}function Fs(t){var e=Math.pow(2,t);return`\nfunction setChild(node, idx, child) {\n ${function(){let t=[];for(let n=0;n 0) {\n return this.stack[--this.popIdx];\n }\n },\n reset: function () {\n this.popIdx = 0;\n }\n};\n\nfunction InsertStackElement(node, body) {\n this.node = node; // QuadTree node\n this.body = body; // physical body which needs to be inserted to node\n}\n"}({get exports(){return Is},set exports(t){Is=t}}).exports=function(t){let e=zs(t);return new Function(e)()},Is.generateQuadTreeFunctionBody=zs,Is.getInsertStackCode=Gs,Is.getQuadNodeCode=js,Is.isSamePosition=Us,Is.getChildBodyCode=Bs,Is.setChildBodyCode=Fs;var Hs={};({get exports(){return Hs},set exports(t){Hs=t}}).exports=function(t){let e=Ws(t);return new Function("bodies","settings","random",e)},Hs.generateFunctionBody=Ws;const Vs=Ls;function Ws(t){let e=Vs(t);return`\n var boundingBox = {\n ${e("min_{var}: 0, max_{var}: 0,",{indent:4})}\n };\n\n return {\n box: boundingBox,\n\n update: updateBoundingBox,\n\n reset: resetBoundingBox,\n\n getBestNewPosition: function (neighbors) {\n var ${e("base_{var} = 0",{join:", "})};\n\n if (neighbors.length) {\n for (var i = 0; i < neighbors.length; ++i) {\n let neighborPos = neighbors[i].pos;\n ${e("base_{var} += neighborPos.{var};",{indent:10})}\n }\n\n ${e("base_{var} /= neighbors.length;",{indent:8})}\n } else {\n ${e("base_{var} = (boundingBox.min_{var} + boundingBox.max_{var}) / 2;",{indent:8})}\n }\n\n var springLength = settings.springLength;\n return {\n ${e("{var}: base_{var} + (random.nextDouble() - 0.5) * springLength,",{indent:8})}\n };\n }\n };\n\n function updateBoundingBox() {\n var i = bodies.length;\n if (i === 0) return; // No bodies - no borders.\n\n ${e("var max_{var} = -Infinity;",{indent:4})}\n ${e("var min_{var} = Infinity;",{indent:4})}\n\n while(i--) {\n // this is O(n), it could be done faster with quadtree, if we check the root node bounds\n var bodyPos = bodies[i].pos;\n ${e("if (bodyPos.{var} < min_{var}) min_{var} = bodyPos.{var};",{indent:6})}\n ${e("if (bodyPos.{var} > max_{var}) max_{var} = bodyPos.{var};",{indent:6})}\n }\n\n ${e("boundingBox.min_{var} = min_{var};",{indent:4})}\n ${e("boundingBox.max_{var} = max_{var};",{indent:4})}\n }\n\n function resetBoundingBox() {\n ${e("boundingBox.min_{var} = boundingBox.max_{var} = 0;",{indent:4})}\n }\n`}var qs={};const Xs=Ls;function Ys(t){return`\n if (!Number.isFinite(options.dragCoefficient)) throw new Error('dragCoefficient is not a finite number');\n\n return {\n update: function(body) {\n ${Xs(t)("body.force.{var} -= options.dragCoefficient * body.velocity.{var};",{indent:6})}\n }\n };\n`}({get exports(){return qs},set exports(t){qs=t}}).exports=function(t){let e=Ys(t);return new Function("options",e)},qs.generateCreateDragForceFunctionBody=Ys;var $s={};const Zs=Ls;function Js(t){let e=Zs(t);return`\n if (!Number.isFinite(options.springCoefficient)) throw new Error('Spring coefficient is not a number');\n if (!Number.isFinite(options.springLength)) throw new Error('Spring length is not a number');\n\n return {\n /**\n * Updates forces acting on a spring\n */\n update: function (spring) {\n var body1 = spring.from;\n var body2 = spring.to;\n var length = spring.length < 0 ? options.springLength : spring.length;\n ${e("var d{var} = body2.pos.{var} - body1.pos.{var};",{indent:6})}\n var r = Math.sqrt(${e("d{var} * d{var}",{join:" + "})});\n\n if (r === 0) {\n ${e("d{var} = (random.nextDouble() - 0.5) / 50;",{indent:8})}\n r = Math.sqrt(${e("d{var} * d{var}",{join:" + "})});\n }\n\n var d = r - length;\n var coefficient = ((spring.coefficient > 0) ? spring.coefficient : options.springCoefficient) * d / r;\n\n ${e("body1.force.{var} += coefficient * d{var}",{indent:6})};\n body1.springCount += 1;\n body1.springLength += r;\n\n ${e("body2.force.{var} -= coefficient * d{var}",{indent:6})};\n body2.springCount += 1;\n body2.springLength += r;\n }\n };\n`}({get exports(){return $s},set exports(t){$s=t}}).exports=function(t){let e=Js(t);return new Function("options","random",e)},$s.generateCreateSpringForceFunctionBody=Js;var Ks={};const Qs=Ls;function tl(t){let e=Qs(t);return`\n var length = bodies.length;\n if (length === 0) return 0;\n\n ${e("var d{var} = 0, t{var} = 0;",{indent:2})}\n\n for (var i = 0; i < length; ++i) {\n var body = bodies[i];\n if (body.isPinned) continue;\n\n if (adaptiveTimeStepWeight && body.springCount) {\n timeStep = (adaptiveTimeStepWeight * body.springLength/body.springCount);\n }\n\n var coeff = timeStep / body.mass;\n\n ${e("body.velocity.{var} += coeff * body.force.{var};",{indent:4})}\n ${e("var v{var} = body.velocity.{var};",{indent:4})}\n var v = Math.sqrt(${e("v{var} * v{var}",{join:" + "})});\n\n if (v > 1) {\n // We normalize it so that we move within timeStep range. \n // for the case when v <= 1 - we let velocity to fade out.\n ${e("body.velocity.{var} = v{var} / v;",{indent:6})}\n }\n\n ${e("d{var} = timeStep * body.velocity.{var};",{indent:4})}\n\n ${e("body.pos.{var} += d{var};",{indent:4})}\n\n ${e("t{var} += Math.abs(d{var});",{indent:4})}\n }\n\n return (${e("t{var} * t{var}",{join:" + "})})/length;\n`}var el,nl,il,rl;({get exports(){return Ks},set exports(t){Ks=t}}).exports=function(t){let e=tl(t);return new Function("bodies","timeStep","adaptiveTimeStepWeight",e)},Ks.generateIntegratorFunctionBody=tl;var al,ol={},sl={get exports(){return ol},set exports(t){ol=t}};var ll=function(t){var e=nl?el:(nl=1,el=function(t,e,n,i){this.from=t,this.to=e,this.length=n,this.coefficient=i}),n=(rl||(rl=1,il=function t(e,n){var i;if(e||(e={}),n)for(i in n)if(n.hasOwnProperty(i)){var r=e.hasOwnProperty(i),a=typeof n[i];r&&typeof e[i]===a?"object"===a&&(e[i]=t(e[i],n[i])):e[i]=n[i]}return e}),il),i=vs;if(t){if(void 0!==t.springCoeff)throw new Error("springCoeff was renamed to springCoefficient");if(void 0!==t.dragCoeff)throw new Error("dragCoeff was renamed to dragCoefficient")}t=n(t,{springLength:10,springCoefficient:.8,gravity:-12,theta:.8,dragCoefficient:.9,timeStep:.5,adaptiveTimeStepWeight:0,dimensions:2,debug:!1});var r=ml[t.dimensions];if(!r){var a=t.dimensions;r={Body:cl(a,t.debug),createQuadTree:ul(a),createBounds:hl(a),createDragForce:dl(a),createSpringForce:pl(a),integrate:fl(a)},ml[a]=r}var o=r.Body,s=r.createQuadTree,l=r.createBounds,c=r.createDragForce,u=r.createSpringForce,h=r.integrate,d=function(){if(al)return ol;function t(t){return new e("number"==typeof t?t:+new Date)}function e(t){this.seed=t}function n(t){return Math.sqrt(2*Math.PI/t)*Math.pow(1/Math.E*(t+1/(12*t-1/(10*t))),t)}function i(){var t=this.seed;return t=4294967295&(3042594569^(t=4251993797+(t=4294967295&(3550635116+(t=374761393+(t=4294967295&(3345072700^(t=t+2127912214+(t<<12)&4294967295)^t>>>19))+(t<<5)&4294967295)^t<<9))+(t<<3)&4294967295)^t>>>16),this.seed=t,(268435455&t)/268435456}return al=1,sl.exports=t,ol.random=t,ol.randomIterator=function(e,n){var i=n||t();if("function"!=typeof i.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(t){var n,r,a;for(n=e.length-1;n>0;--n)r=i.next(n+1),a=e[r],e[r]=e[n],e[n]=a,t(a);e.length&&t(e[0])},shuffle:function(){var t,n,r;for(t=e.length-1;t>0;--t)n=i.next(t+1),r=e[n],e[n]=e[t],e[t]=r;return e}}},e.prototype.next=function(t){return Math.floor(this.nextDouble()*t)},e.prototype.nextDouble=i,e.prototype.uniform=i,e.prototype.gaussian=function(){var t,e,n;do{t=(e=2*this.nextDouble()-1)*e+(n=2*this.nextDouble()-1)*n}while(t>=1||0===t);return e*Math.sqrt(-2*Math.log(t)/t)},e.prototype.levy=function(){var t=1.5,e=Math.pow(n(2.5)*Math.sin(Math.PI*t/2)/(n(1.25)*t*Math.pow(2,.25)),1/t);return this.gaussian()*e/Math.pow(Math.abs(this.gaussian()),1/t)},ol}().random(42),p=[],f=[],m=s(t,d),g=l(p,t,d),v=u(t,d),_=c(t),y=[],x=new Map,b=0;S("nbody",(function(){if(0===p.length)return;m.insertBodies(p);var t=p.length;for(;t--;){var e=p[t];e.isPinned||(e.reset(),m.updateBodyForce(e),_.update(e))}})),S("spring",(function(){var t=f.length;for(;t--;)v.update(f[t])}));var w={bodies:p,quadTree:m,springs:f,settings:t,addForce:S,removeForce:function(t){var e=y.indexOf(x.get(t));if(e<0)return;y.splice(e,1),x.delete(t)},getForces:function(){return x},step:function(){for(var e=0;enew o(t))(t);return p.push(e),e},removeBody:function(t){if(t){var e=p.indexOf(t);if(!(e<0))return p.splice(e,1),0===p.length&&g.reset(),!0}},addSpring:function(t,n,i,r){if(!t||!n)throw new Error("Cannot add null spring to force simulator");"number"!=typeof i&&(i=-1);var a=new e(t,n,i,r>=0?r:-1);return f.push(a),a},getTotalMovement:function(){return 0},removeSpring:function(t){if(t){var e=f.indexOf(t);return e>-1?(f.splice(e,1),!0):void 0}},getBestNewBodyPosition:function(t){return g.getBestNewPosition(t)},getBBox:M,getBoundingBox:M,invalidateBBox:function(){console.warn("invalidateBBox() is deprecated, bounds always recomputed on `getBBox()` call")},gravity:function(e){return void 0!==e?(t.gravity=e,m.options({gravity:e}),this):t.gravity},theta:function(e){return void 0!==e?(t.theta=e,m.options({theta:e}),this):t.theta},random:d};return function(t,e){for(var n in t)gl(t,e,n)}(t,w),i(w),w;function M(){return g.update(),g.box}function S(t,e){if(x.has(t))throw new Error("Force "+t+" is already added");x.set(t,e),y.push(e)}},cl=Ts,ul=Is,hl=Hs,dl=qs,pl=$s,fl=Ks,ml={};function gl(t,e,n){if(t.hasOwnProperty(n)&&"function"!=typeof e[n]){var i=Number.isFinite(t[n]);e[n]=i?function(i){if(void 0!==i){if(!Number.isFinite(i))throw new Error("Value of "+n+" should be a valid number.");return t[n]=i,e}return t[n]}:function(i){return void 0!==i?(t[n]=i,e):t[n]}}}Es.exports=function(t,e){if(!t)throw new Error("Graph structure cannot be undefined");var n=(e&&e.createSimulator||ll)(e);if(Array.isArray(e))throw new Error("Physics settings is expected to be an object");var i=t.version>19?function(e){var n=t.getLinks(e);return n?1+n.size/3:1}:function(e){var n=t.getLinks(e);return n?1+n.length/3:1};e&&"function"==typeof e.nodeMass&&(i=e.nodeMass);var r=new Map,a={},o=0,s=n.settings.springTransform||_l;o=0,t.forEachNode((function(t){p(t.id),o+=1})),t.forEachLink(m),t.on("changed",d);var l=!1,c={step:function(){if(0===o)return u(!0),!0;var t=n.step();c.lastMove=t,c.fire("step");var e=t/o<=.01;return u(e),e},getNodePosition:function(t){return _(t).pos},setNodePosition:function(t){var e=_(t);e.setPosition.apply(e,Array.prototype.slice.call(arguments,1))},getLinkPosition:function(t){var e=a[t];if(e)return{from:e.from.pos,to:e.to.pos}},getGraphRect:function(){return n.getBBox()},forEachBody:h,pinNode:function(t,e){_(t.id).isPinned=!!e},isNodePinned:function(t){return _(t.id).isPinned},dispose:function(){t.off("changed",d),c.fire("disposed")},getBody:function(t){return r.get(t)},getSpring:function(e,n){var i;if(void 0===n)i="object"!=typeof e?e:e.id;else{var r=t.hasLink(e,n);if(!r)return;i=r.id}return a[i]},getForceVectorLength:function(){var t=0,e=0;return h((function(n){t+=Math.abs(n.force.x),e+=Math.abs(n.force.y)})),Math.sqrt(t*t+e*e)},simulator:n,graph:t,lastMove:0};return vl(c),c;function u(t){var e;l!==t&&(l=t,e=t,c.fire("stable",e))}function h(t){r.forEach(t)}function d(e){for(var n=0;n=0?i=setTimeout(l,e-c):(i=null,n||(s=t.apply(a,r),a=r=null))}null==e&&(e=100);var c=function(){a=this,r=arguments,o=Date.now();var c=n&&!i;return i||(i=setTimeout(l,e)),c&&(s=t.apply(a,r),a=r=null),s};return c.clear=function(){i&&(clearTimeout(i),i=null)},c.flush=function(){i&&(s=t.apply(a,r),a=r=null,clearTimeout(i),i=null)},c}yl.debounce=yl;var xl=yl;function bl(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n0&&void 0!==arguments[0]?arguments[0]:{},e=Object.assign({},n instanceof Function?n(t):n,{initialised:!1}),i={};function r(e){return a(e,t),s(),r}var a=function(t,n){u.call(r,t,e,n),e.initialised=!0},s=xl((function(){e.initialised&&(d.call(r,e,i),i={})}),1);return p.forEach((function(t){r[t.name]=function(t){var n=t.name,a=t.triggerUpdate,o=void 0!==a&&a,l=t.onChange,c=void 0===l?function(t,e){}:l,u=t.defaultVal,h=void 0===u?null:u;return function(t){var a=e[n];if(!arguments.length)return a;var l=void 0===t?h:t;return e[n]=l,c.call(r,l,e,a),!i.hasOwnProperty(n)&&(i[n]=a),o&&s(),r}}(t)})),Object.keys(o).forEach((function(t){r[t]=function(){for(var n,i=arguments.length,a=new Array(i),s=0;s=e)&&(n=e);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n=r)&&(n=r)}return n}function Dl(t,e){let n;if(void 0===e)for(const e of t)null!=e&&(n>e||void 0===n&&e>=e)&&(n=e);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n>r||void 0===n&&r>=r)&&(n=r)}return n}function Ol(t,e){if(null==t)return{};var n,i,r=function(t,e){if(null==t)return{};var n,i,r={},a=Object.keys(t);for(i=0;i=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}function Il(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null==n)return;var i,r,a=[],o=!0,s=!1;try{for(n=n.call(t);!(o=(i=n.next()).done)&&(a.push(i.value),!e||a.length!==e);o=!0);}catch(t){s=!0,r=t}finally{try{o||null==n.return||n.return()}finally{if(s)throw r}}return a}(t,e)||Nl(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function kl(t){return function(t){if(Array.isArray(t))return zl(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Nl(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Nl(t,e){if(t){if("string"==typeof t)return zl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zl(t,e):void 0}}function zl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=(e instanceof Array?e.length?e:[void 0]:[e]).map((function(t){return{keyAccessor:t,isProp:!(t instanceof Function)}})),a=t.reduce((function(t,e){var i=t,a=e;return r.forEach((function(t,e){var o,s=t.keyAccessor;if(t.isProp){var l=a,c=l[s],u=Ol(l,[s].map(Ul));o=c,a=u}else o=s(a,e);e+11&&void 0!==arguments[1]?arguments[1]:1;i===r.length?Object.keys(e).forEach((function(t){return e[t]=n(e[t])})):Object.values(e).forEach((function(e){return t(e,i+1)}))}(a);var o=a;return i&&(o=[],function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];n.length===r.length?o.push({keys:n,vals:e}):Object.entries(e).forEach((function(e){var i=Il(e,2),r=i[0],a=i[1];return t(a,[].concat(kl(n),[r]))}))}(a),e instanceof Array&&0===e.length&&1===o.length&&(o[0].keys=[])),o};function Bl(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function jl(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function Gl(t,e){if(null==t)return{};var n,i,r=function(t,e){if(null==t)return{};var n,i,r={},a=Object.keys(t);for(i=0;i=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}function Hl(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null==n)return;var i,r,a=[],o=!0,s=!1;try{for(n=n.call(t);!(o=(i=n.next()).done)&&(a.push(i.value),!e||a.length!==e);o=!0);}catch(t){s=!0,r=t}finally{try{o||null==n.return||n.return()}finally{if(s)throw r}}return a}(t,e)||Wl(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vl(t){return function(t){if(Array.isArray(t))return ql(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Wl(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Wl(t,e){if(t){if("string"==typeof t)return ql(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ql(t,e):void 0}}function ql(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}if(t=P(t,360),e=P(e,100),n=P(n,100),0===e)i=r=a=n;else{var s=n<.5?n*(1+e):n+e-n*e,l=2*n-s;i=o(l,s,t+1/3),r=o(l,s,t),a=o(l,s,t-1/3)}return{r:255*i,g:255*r,b:255*a}}(t.h,l,u),h=!0,d="hsl"),t.hasOwnProperty("a")&&(a=t.a));var p,f,m;return a=L(a),{ok:h,format:t.format||d,r:o(255,s(r.r,0)),g:o(255,s(r.g,0)),b:o(255,s(r.b,0)),a:a}}(t);this._originalInput=t,this._r=u.r,this._g=u.g,this._b=u.b,this._a=u.a,this._roundA=a(100*this._a)/100,this._format=l.format||u.format,this._gradientType=l.gradientType,this._r<1&&(this._r=a(this._r)),this._g<1&&(this._g=a(this._g)),this._b<1&&(this._b=a(this._b)),this._ok=u.ok,this._tc_id=r++}function u(t,e,n){t=P(t,255),e=P(e,255),n=P(n,255);var i,r,a=s(t,e,n),l=o(t,e,n),c=(a+l)/2;if(a==l)i=r=0;else{var u=a-l;switch(r=c>.5?u/(2-a-l):u/(a+l),a){case t:i=(e-n)/u+(e>1)+720)%360;--e;)i.h=(i.h+r)%360,a.push(c(i));return a}function T(t,e){e=e||6;for(var n=c(t).toHsv(),i=n.h,r=n.s,a=n.v,o=[],s=1/e;e--;)o.push(c({h:i,s:r,v:a})),a=(a+s)%1;return o}c.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,n,i,r=this.toRgb();return t=r.r/255,n=r.g/255,i=r.b/255,.2126*(t<=.03928?t/12.92:e.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:e.pow((n+.055)/1.055,2.4))+.0722*(i<=.03928?i/12.92:e.pow((i+.055)/1.055,2.4))},setAlpha:function(t){return this._a=L(t),this._roundA=a(100*this._a)/100,this},toHsv:function(){var t=h(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=h(this._r,this._g,this._b),e=a(360*t.h),n=a(100*t.s),i=a(100*t.v);return 1==this._a?"hsv("+e+", "+n+"%, "+i+"%)":"hsva("+e+", "+n+"%, "+i+"%, "+this._roundA+")"},toHsl:function(){var t=u(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=u(this._r,this._g,this._b),e=a(360*t.h),n=a(100*t.s),i=a(100*t.l);return 1==this._a?"hsl("+e+", "+n+"%, "+i+"%)":"hsla("+e+", "+n+"%, "+i+"%, "+this._roundA+")"},toHex:function(t){return d(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return function(t,e,n,i,r){var o=[O(a(t).toString(16)),O(a(e).toString(16)),O(a(n).toString(16)),O(k(i))];if(r&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1))return o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0);return o.join("")}(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:a(this._r),g:a(this._g),b:a(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+a(this._r)+", "+a(this._g)+", "+a(this._b)+")":"rgba("+a(this._r)+", "+a(this._g)+", "+a(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:a(100*P(this._r,255))+"%",g:a(100*P(this._g,255))+"%",b:a(100*P(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+a(100*P(this._r,255))+"%, "+a(100*P(this._g,255))+"%, "+a(100*P(this._b,255))+"%)":"rgba("+a(100*P(this._r,255))+"%, "+a(100*P(this._g,255))+"%, "+a(100*P(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(C[d(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e="#"+p(this._r,this._g,this._b,this._a),n=e,i=this._gradientType?"GradientType = 1, ":"";if(t){var r=c(t);n="#"+p(r._r,r._g,r._b,r._a)}return"progid:DXImageTransform.Microsoft.gradient("+i+"startColorstr="+e+",endColorstr="+n+")"},toString:function(t){var e=!!t;t=t||this._format;var n=!1,i=this._a<1&&this._a>=0;return e||!i||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(n=this.toRgbString()),"prgb"===t&&(n=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(n=this.toHexString()),"hex3"===t&&(n=this.toHexString(!0)),"hex4"===t&&(n=this.toHex8String(!0)),"hex8"===t&&(n=this.toHex8String()),"name"===t&&(n=this.toName()),"hsl"===t&&(n=this.toHslString()),"hsv"===t&&(n=this.toHsvString()),n||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return c(this.toString())},_applyModification:function(t,e){var n=t.apply(null,[this].concat([].slice.call(e)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(v,arguments)},brighten:function(){return this._applyModification(_,arguments)},darken:function(){return this._applyModification(y,arguments)},desaturate:function(){return this._applyModification(f,arguments)},saturate:function(){return this._applyModification(m,arguments)},greyscale:function(){return this._applyModification(g,arguments)},spin:function(){return this._applyModification(x,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(E,arguments)},complement:function(){return this._applyCombination(b,arguments)},monochromatic:function(){return this._applyCombination(T,arguments)},splitcomplement:function(){return this._applyCombination(S,arguments)},triad:function(){return this._applyCombination(w,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},c.fromRatio=function(t,e){if("object"==typeof t){var n={};for(var i in t)t.hasOwnProperty(i)&&(n[i]="a"===i?t[i]:I(t[i]));t=n}return c(t,e)},c.equals=function(t,e){return!(!t||!e)&&c(t).toRgbString()==c(e).toRgbString()},c.random=function(){return c.fromRatio({r:l(),g:l(),b:l()})},c.mix=function(t,e,n){n=0===n?0:n||50;var i=c(t).toRgb(),r=c(e).toRgb(),a=n/100;return c({r:(r.r-i.r)*a+i.r,g:(r.g-i.g)*a+i.g,b:(r.b-i.b)*a+i.b,a:(r.a-i.a)*a+i.a})}, +// =4.5;break;case"AAlarge":r=a>=3;break;case"AAAsmall":r=a>=7}return r},c.mostReadable=function(t,e,n){var i,r,a,o,s=null,l=0;r=(n=n||{}).includeFallbackColors,a=n.level,o=n.size;for(var u=0;ul&&(l=i,s=c(e[u]));return c.isReadable(t,s,{level:a,size:o})||!r?s:(n.includeFallbackColors=!1,c.mostReadable(t,["#fff","#000"],n))};var A=c.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},C=c.hexNames=function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=n);return e}(A);function L(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function P(t,n){(function(t){return"string"==typeof t&&-1!=t.indexOf(".")&&1===parseFloat(t)})(t)&&(t="100%");var i=function(t){return"string"==typeof t&&-1!=t.indexOf("%")}(t);return t=o(n,s(0,parseFloat(t))),i&&(t=parseInt(t*n,10)/100),e.abs(t-n)<1e-6?1:t%n/parseFloat(n)}function R(t){return o(1,s(0,t))}function D(t){return parseInt(t,16)}function O(t){return 1==t.length?"0"+t:""+t}function I(t){return t<=1&&(t=100*t+"%"),t}function k(t){return e.round(255*parseFloat(t)).toString(16)}function N(t){return D(t)/255}var z,U,F,B=(U="[\\s|\\(]+("+(z="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+z+")[,|\\s]+("+z+")\\s*\\)?",F="[\\s|\\(]+("+z+")[,|\\s]+("+z+")[,|\\s]+("+z+")[,|\\s]+("+z+")\\s*\\)?",{CSS_UNIT:new RegExp(z),rgb:new RegExp("rgb"+U),rgba:new RegExp("rgba"+F),hsl:new RegExp("hsl"+U),hsla:new RegExp("hsla"+F),hsv:new RegExp("hsv"+U),hsva:new RegExp("hsva"+F),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function j(t){return!!B.CSS_UNIT.exec(t)}t.exports?t.exports=c:window.tinycolor=c}(Math)}({get exports(){return Ql},set exports(t){Ql=t}});var tc=Ql;function ec(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function nc(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}function fc(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function mc(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return fc(t)}function gc(t){var e=hc();return function(){var n,i=cc(t);if(e){var r=cc(this).constructor;n=Reflect.construct(i,arguments,r)}else n=i.apply(this,arguments);return mc(this,n)}}function vc(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,r,a,o,s=[],l=!0,c=!1;try{if(a=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=a.call(n)).done)&&(s.push(i.value),s.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(t,e)||yc(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _c(t){return function(t){if(Array.isArray(t))return xc(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||yc(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function yc(t,e){if(t){if("string"==typeof t)return xc(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?xc(t,e):void 0}}function xc(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{},i=n.objFilter,r=void 0===i?function(){return!0}:i,a=pc(n,Ec);return $l(t,e.children.filter(r),(function(t){return e.add(t)}),(function(t){e.remove(t),Sc(t)}),nc({objBindAttr:"__threeObj"},a))}var Ac=function(t){return isNaN(t)?parseInt(tc(t).toHex(),16):t},Cc=function(t){return isNaN(t)?tc(t).getAlpha():1},Lc=function t(){var e=new Cl,n=[],i=[],r=Jl;function a(t){let a=e.get(t);if(void 0===a){if(r!==Jl)return r;e.set(t,a=n.push(t)-1)}return i[a%i.length]}return a.domain=function(t){if(!arguments.length)return n.slice();n=[],e=new Cl;for(const i of t)e.has(i)||e.set(i,n.push(i)-1);return a},a.range=function(t){return arguments.length?(i=Array.from(t),a):i.slice()},a.unknown=function(t){return arguments.length?(r=t,a):r},a.copy=function(){return t(n,i).unknown(r)},Zl.apply(a,arguments),a}(Kl);function Pc(t,e,n){e&&"string"==typeof n&&t.filter((function(t){return!t[n]})).forEach((function(t){t[n]=Lc(e(t))}))}var Rc=window.THREE?window.THREE:{Group:sa,Mesh:mn,MeshLambertMaterial:class extends Fe{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new pt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new K(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}},Color:pt,BufferGeometry:tn,BufferAttribute:He,Matrix4:ee,Vector3:Et,SphereGeometry:Na,CylinderGeometry:Ia,TubeGeometry:za,ConeGeometry:ka,Line:class extends Te{constructor(t=new tn,e=new ma){super(),this.isLine=!0,this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,n=[0];for(let t=1,i=e.count;ts)continue;h.applyMatrix4(this.matrixWorld);const a=t.ray.origin.distanceTo(h);at.far||e.push({distance:a,point:u.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}else{for(let n=Math.max(0,a.start),i=Math.min(f.count,a.start+a.count)-1;ns)continue;h.applyMatrix4(this.matrixWorld);const i=t.ray.origin.distanceTo(h);it.far||e.push({distance:i,point:u.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const n=t[e[0]];if(void 0!==n){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=n.length;t2?-60:-30),t<3&&i(e.graphData.nodes,"z"),t<2&&i(e.graphData.nodes,"y")}},dagMode:{onChange:function(t,e){!t&&"d3"===e.forceEngine&&(e.graphData.nodes||[]).forEach((function(t){return t.fx=t.fy=t.fz=void 0}))}},dagLevelDistance:{},dagNodeFilter:{default:function(t){return!0}},onDagError:{triggerUpdate:!1},nodeRelSize:{default:4},nodeId:{default:"id"},nodeVal:{default:"val"},nodeResolution:{default:8},nodeColor:{default:"color"},nodeAutoColorBy:{},nodeOpacity:{default:.75},nodeVisibility:{default:!0},nodeThreeObject:{},nodeThreeObjectExtend:{default:!1},linkSource:{default:"source"},linkTarget:{default:"target"},linkVisibility:{default:!0},linkColor:{default:"color"},linkAutoColorBy:{},linkOpacity:{default:.2},linkWidth:{},linkResolution:{default:6},linkCurvature:{default:0,triggerUpdate:!1},linkCurveRotation:{default:0,triggerUpdate:!1},linkMaterial:{},linkThreeObject:{},linkThreeObjectExtend:{default:!1},linkPositionUpdate:{triggerUpdate:!1},linkDirectionalArrowLength:{default:0},linkDirectionalArrowColor:{},linkDirectionalArrowRelPos:{default:.5,triggerUpdate:!1},linkDirectionalArrowResolution:{default:8},linkDirectionalParticles:{default:0},linkDirectionalParticleSpeed:{default:.01,triggerUpdate:!1},linkDirectionalParticleWidth:{default:.5},linkDirectionalParticleColor:{},linkDirectionalParticleResolution:{default:4},forceEngine:{default:"d3"},d3AlphaMin:{default:0},d3AlphaDecay:{default:.0228,triggerUpdate:!1,onChange:function(t,e){e.d3ForceLayout.alphaDecay(t)}},d3AlphaTarget:{default:0,triggerUpdate:!1,onChange:function(t,e){e.d3ForceLayout.alphaTarget(t)}},d3VelocityDecay:{default:.4,triggerUpdate:!1,onChange:function(t,e){e.d3ForceLayout.velocityDecay(t)}},ngraphPhysics:{default:{timeStep:20,gravity:-1.2,theta:.8,springLength:30,springCoefficient:8e-4,dragCoefficient:.02}},warmupTicks:{default:0,triggerUpdate:!1},cooldownTicks:{default:1/0,triggerUpdate:!1},cooldownTime:{default:15e3,triggerUpdate:!1},onLoading:{default:function(){},triggerUpdate:!1},onFinishLoading:{default:function(){},triggerUpdate:!1},onUpdate:{default:function(){},triggerUpdate:!1},onFinishUpdate:{default:function(){},triggerUpdate:!1},onEngineTick:{default:function(){},triggerUpdate:!1},onEngineStop:{default:function(){},triggerUpdate:!1}},methods:{refresh:function(t){return t._flushObjects=!0,t._rerender(),this},d3Force:function(t,e,n){return void 0===n?t.d3ForceLayout.force(e):(t.d3ForceLayout.force(e,n),this)},d3ReheatSimulation:function(t){return t.d3ForceLayout.alpha(1),this.resetCountdown(),this},resetCountdown:function(t){return t.cntTicks=0,t.startTickTime=new Date,t.engineRunning=!0,this},tickFrame:function(t){var e,n,i,r,a="ngraph"!==t.forceEngine;return t.engineRunning&&function(){++t.cntTicks>t.cooldownTicks||new Date-t.startTickTime>t.cooldownTime||a&&t.d3AlphaMin>0&&t.d3ForceLayout.alpha()0){var f=s.x-o.x,m=s.y-o.y||0,g=(new Rc.Vector3).subVectors(h,u),v=g.clone().multiplyScalar(l).cross(0!==f||0!==m?new Rc.Vector3(0,0,1):new Rc.Vector3(0,1,0)).applyAxisAngle(g.normalize(),p).add((new Rc.Vector3).addVectors(u,h).divideScalar(2));c=new Rc.QuadraticBezierCurve3(u,v,h)}else{var _=70*l,y=-p,x=y+Math.PI/2;c=new Rc.CubicBezierCurve3(u,new Rc.Vector3(_*Math.cos(x),_*Math.sin(x),0).add(u),new Rc.Vector3(_*Math.cos(y),_*Math.sin(y),0).add(u),h)}e.__curve=c}else e.__curve=null}}t.graphData.links.forEach((function(n){var i=n.__lineObj;if(i){var s=a?n:t.layout.getLinkPosition(t.layout.graph.getLink(n.source,n.target).id),l=s[a?"source":"from"],c=s[a?"target":"to"];if(l&&c&&l.hasOwnProperty("x")&&c.hasOwnProperty("x")){o(n);var u=r(n);if(!t.linkPositionUpdate||!t.linkPositionUpdate(u?i.children[1]:i,{start:{x:l.x,y:l.y,z:l.z},end:{x:c.x,y:c.y,z:c.z}},n)||u){var h=30,d=n.__curve,p=i.children.length?i.children[0]:i;if("Line"===p.type){if(d)p.geometry.setFromPoints(d.getPoints(h));else{var f=p.geometry.getAttribute("position");f&&f.array&&6===f.array.length||p.geometry[Oc]("position",f=new Rc.BufferAttribute(new Float32Array(6),3)),f.array[0]=l.x,f.array[1]=l.y||0,f.array[2]=l.z||0,f.array[3]=c.x,f.array[4]=c.y||0,f.array[5]=c.z||0,f.needsUpdate=!0}p.geometry.computeBoundingSphere()}else if("Mesh"===p.type)if(d){p.geometry.type.match(/^Tube(Buffer)?Geometry$/)||(p.position.set(0,0,0),p.rotation.set(0,0,0),p.scale.set(1,1,1));var m=Math.ceil(10*e(n))/10/2,g=new Rc.TubeGeometry(d,h,m,t.linkResolution,!1);p.geometry.dispose(),p.geometry=g}else{if(!p.geometry.type.match(/^Cylinder(Buffer)?Geometry$/)){var v=Math.ceil(10*e(n))/10/2,_=new Rc.CylinderGeometry(v,v,1,t.linkResolution,1,!1);_[Ic]((new Rc.Matrix4).makeTranslation(0,.5,0)),_[Ic]((new Rc.Matrix4).makeRotationX(Math.PI/2)),p.geometry.dispose(),p.geometry=_}var y=new Rc.Vector3(l.x,l.y||0,l.z||0),x=new Rc.Vector3(c.x,c.y||0,c.z||0),b=y.distanceTo(x);p.position.x=y.x,p.position.y=y.y,p.position.z=y.z,p.scale.z=b,p.parent.localToWorld(x),p.lookAt(x)}}}}}))}(),e=Al(t.linkDirectionalArrowRelPos),n=Al(t.linkDirectionalArrowLength),i=Al(t.nodeVal),t.graphData.links.forEach((function(r){var o=r.__arrowObj;if(o){var s=a?r:t.layout.getLinkPosition(t.layout.graph.getLink(r.source,r.target).id),l=s[a?"source":"from"],c=s[a?"target":"to"];if(l&&c&&l.hasOwnProperty("x")&&c.hasOwnProperty("x")){var u=Math.cbrt(Math.max(0,i(l)||1))*t.nodeRelSize,h=Math.cbrt(Math.max(0,i(c)||1))*t.nodeRelSize,d=n(r),p=e(r),f=r.__curve?function(t){return r.__curve.getPoint(t)}:function(t){var e=function(t,e,n,i){return e[t]+(n[t]-e[t])*i||0};return{x:e("x",l,c,t),y:e("y",l,c,t),z:e("z",l,c,t)}},m=r.__curve?r.__curve.getLength():Math.sqrt(["x","y","z"].map((function(t){return Math.pow((c[t]||0)-(l[t]||0),2)})).reduce((function(t,e){return t+e}),0)),g=u+d+(m-u-h-d)*p,v=f(g/m),_=f((g-d)/m);["x","y","z"].forEach((function(t){return o.position[t]=_[t]}));var y=dc(Rc.Vector3,_c(["x","y","z"].map((function(t){return v[t]}))));o.parent.localToWorld(y),o.lookAt(y)}}})),r=Al(t.linkDirectionalParticleSpeed),t.graphData.links.forEach((function(e){var n=e.__photonsObj&&e.__photonsObj.children,i=e.__singleHopPhotonsObj&&e.__singleHopPhotonsObj.children;if(i&&i.length||n&&n.length){var o=a?e:t.layout.getLinkPosition(t.layout.graph.getLink(e.source,e.target).id),s=o[a?"source":"from"],l=o[a?"target":"to"];if(s&&l&&s.hasOwnProperty("x")&&l.hasOwnProperty("x")){var c=r(e),u=e.__curve?function(t){return e.__curve.getPoint(t)}:function(t){var e=function(t,e,n,i){return e[t]+(n[t]-e[t])*i||0};return{x:e("x",s,l,t),y:e("y",s,l,t),z:e("z",s,l,t)}};[].concat(_c(n||[]),_c(i||[])).forEach((function(t,e){var i="singleHopPhotons"===t.parent.__linkThreeObjType;if(t.hasOwnProperty("__progressRatio")||(t.__progressRatio=i?0:e/n.length),t.__progressRatio+=c,t.__progressRatio>=1){if(i)return t.parent.remove(t),void Sc(t);t.__progressRatio=t.__progressRatio%1}var r=t.__progressRatio,a=u(r);["x","y","z"].forEach((function(e){return t.position[e]=a[e]}))}))}}})),this},emitParticle:function(t,e){if(e&&t.graphData.links.includes(e)){if(!e.__singleHopPhotonsObj){var n=new Rc.Group;n.__linkThreeObjType="singleHopPhotons",e.__singleHopPhotonsObj=n,t.graphScene.add(n)}var i=Al(t.linkDirectionalParticleWidth),r=Math.ceil(10*i(e))/10/2,a=t.linkDirectionalParticleResolution,o=new Rc.SphereGeometry(r,a,a),s=Al(t.linkColor),l=Al(t.linkDirectionalParticleColor)(e)||s(e)||"#f0f0f0",c=new Rc.Color(Ac(l)),u=3*t.linkOpacity,h=new Rc.MeshLambertMaterial({color:c,transparent:!0,opacity:u});e.__singleHopPhotonsObj.add(new Rc.Mesh(o,h))}return this},getGraphBbox:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){return!0};if(!t.initialised)return null;var n=function t(n){var i=[];if(n.geometry){n.geometry.computeBoundingBox();var r=new Rc.Box3;r.copy(n.geometry.boundingBox).applyMatrix4(n.matrixWorld),i.push(r)}return i.concat.apply(i,_c((n.children||[]).filter((function(t){return!t.hasOwnProperty("__graphObjType")||"node"===t.__graphObjType&&e(t.__data)})).map(t)))}(t.graphScene);return n.length?Object.assign.apply(Object,_c(["x","y","z"].map((function(t){return sc({},t,[Dl(n,(function(e){return e.min[t]})),Rl(n,(function(e){return e.max[t]}))])})))):null}},stateInit:function(){return{d3ForceLayout:ms().force("link",Fo()).force("charge",gs()).force("center",co()).force("dagRadial",null).stop(),engineRunning:!1}},init:function(t,e){e.graphScene=t},update:function(t,e){var n=function(t){return t.some((function(t){return e.hasOwnProperty(t)}))};if(t.engineRunning=!1,t.onUpdate(),null!==t.nodeAutoColorBy&&n(["nodeAutoColorBy","graphData","nodeColor"])&&Pc(t.graphData.nodes,Al(t.nodeAutoColorBy),t.nodeColor),null!==t.linkAutoColorBy&&n(["linkAutoColorBy","graphData","linkColor"])&&Pc(t.graphData.links,Al(t.linkAutoColorBy),t.linkColor),t._flushObjects||n(["graphData","nodeThreeObject","nodeThreeObjectExtend","nodeVal","nodeColor","nodeVisibility","nodeRelSize","nodeResolution","nodeOpacity"])){var i=Al(t.nodeThreeObject),r=Al(t.nodeThreeObjectExtend),a=Al(t.nodeVal),o=Al(t.nodeColor),s=Al(t.nodeVisibility),l={},c={};Tc(t.graphData.nodes.filter(s),t.graphScene,{purge:t._flushObjects||n(["nodeThreeObject","nodeThreeObjectExtend"]),objFilter:function(t){return"node"===t.__graphObjType},createObj:function(e){var n,a=i(e),o=r(e);return a&&t.nodeThreeObject===a&&(a=a.clone()),a&&!o?n=a:((n=new Rc.Mesh).__graphDefaultObj=!0,a&&o&&n.add(a)),n.__graphObjType="node",n},updateObj:function(e,n){if(e.__graphDefaultObj){var i=a(n)||1,r=Math.cbrt(i)*t.nodeRelSize,s=t.nodeResolution;e.geometry.type.match(/^Sphere(Buffer)?Geometry$/)&&e.geometry.parameters.radius===r&&e.geometry.parameters.widthSegments===s||(l.hasOwnProperty(i)||(l[i]=new Rc.SphereGeometry(r,s,s)),e.geometry.dispose(),e.geometry=l[i]);var u=o(n),h=new Rc.Color(Ac(u||"#ffffaa")),d=t.nodeOpacity*Cc(u);"MeshLambertMaterial"===e.material.type&&e.material.color.equals(h)&&e.material.opacity===d||(c.hasOwnProperty(u)||(c[u]=new Rc.MeshLambertMaterial({color:h,transparent:!0,opacity:d})),e.material.dispose(),e.material=c[u])}}})}if(t._flushObjects||n(["graphData","linkThreeObject","linkThreeObjectExtend","linkMaterial","linkColor","linkWidth","linkVisibility","linkResolution","linkOpacity","linkDirectionalArrowLength","linkDirectionalArrowColor","linkDirectionalArrowResolution","linkDirectionalParticles","linkDirectionalParticleWidth","linkDirectionalParticleColor","linkDirectionalParticleResolution"])){var u=Al(t.linkThreeObject),h=Al(t.linkThreeObjectExtend),d=Al(t.linkMaterial),p=Al(t.linkVisibility),f=Al(t.linkColor),m=Al(t.linkWidth),g={},v={},_={},y=t.graphData.links.filter(p);if(Tc(y,t.graphScene,{objBindAttr:"__lineObj",purge:t._flushObjects||n(["linkThreeObject","linkThreeObjectExtend","linkWidth"]),objFilter:function(t){return"link"===t.__graphObjType},exitObj:function(t){var e=t.__data&&t.__data.__singleHopPhotonsObj;e&&(e.parent.remove(e),Sc(e),delete t.__data.__singleHopPhotonsObj)},createObj:function(e){var n,i,r=u(e),a=h(e);if(r&&t.linkThreeObject===r&&(r=r.clone()),!r||a)if(!!m(e))n=new Rc.Mesh;else{var o=new Rc.BufferGeometry;o[Oc]("position",new Rc.BufferAttribute(new Float32Array(6),3)),n=new Rc.Line(o)}return r?a?((i=new Rc.Group).__graphDefaultObj=!0,i.add(n),i.add(r)):i=r:(i=n).__graphDefaultObj=!0,i.renderOrder=10,i.__graphObjType="link",i},updateObj:function(e,n){if(e.__graphDefaultObj){var i=e.children.length?e.children[0]:e,r=Math.ceil(10*m(n))/10,a=!!r;if(a){var o=r/2,s=t.linkResolution;if(!i.geometry.type.match(/^Cylinder(Buffer)?Geometry$/)||i.geometry.parameters.radiusTop!==o||i.geometry.parameters.radialSegments!==s){if(!g.hasOwnProperty(r)){var l=new Rc.CylinderGeometry(o,o,1,s,1,!1);l[Ic]((new Rc.Matrix4).makeTranslation(0,.5,0)),l[Ic]((new Rc.Matrix4).makeRotationX(Math.PI/2)),g[r]=l}i.geometry.dispose(),i.geometry=g[r]}}var c=d(n);if(c)i.material=c;else{var u=f(n),h=new Rc.Color(Ac(u||"#f0f0f0")),p=t.linkOpacity*Cc(u),y=a?"MeshLambertMaterial":"LineBasicMaterial";if(i.material.type!==y||!i.material.color.equals(h)||i.material.opacity!==p){var x=a?v:_;x.hasOwnProperty(u)||(x[u]=new Rc[y]({color:h,transparent:p<1,opacity:p,depthWrite:p>=1})),i.material.dispose(),i.material=x[u]}}}}}),t.linkDirectionalArrowLength||e.hasOwnProperty("linkDirectionalArrowLength")){var x=Al(t.linkDirectionalArrowLength),b=Al(t.linkDirectionalArrowColor);Tc(y.filter(x),t.graphScene,{objBindAttr:"__arrowObj",objFilter:function(t){return"arrow"===t.__linkThreeObjType},createObj:function(){var t=new Rc.Mesh(void 0,new Rc.MeshLambertMaterial({transparent:!0}));return t.__linkThreeObjType="arrow",t},updateObj:function(e,n){var i=x(n),r=t.linkDirectionalArrowResolution;if(!e.geometry.type.match(/^Cone(Buffer)?Geometry$/)||e.geometry.parameters.height!==i||e.geometry.parameters.radialSegments!==r){var a=new Rc.ConeGeometry(.25*i,i,r);a.translate(0,i/2,0),a.rotateX(Math.PI/2),e.geometry.dispose(),e.geometry=a}e.material.color=new Rc.Color(b(n)||f(n)||"#f0f0f0"),e.material.opacity=3*t.linkOpacity}})}if(t.linkDirectionalParticles||e.hasOwnProperty("linkDirectionalParticles")){var w=Al(t.linkDirectionalParticles),M=Al(t.linkDirectionalParticleWidth),S=Al(t.linkDirectionalParticleColor),E={},T={};Tc(y.filter(w),t.graphScene,{objBindAttr:"__photonsObj",objFilter:function(t){return"photons"===t.__linkThreeObjType},createObj:function(){var t=new Rc.Group;return t.__linkThreeObjType="photons",t},updateObj:function(e,n){var i,r=Math.round(Math.abs(w(n))),a=!!e.children.length&&e.children[0],o=Math.ceil(10*M(n))/10/2,s=t.linkDirectionalParticleResolution;a&&a.geometry.parameters.radius===o&&a.geometry.parameters.widthSegments===s?i=a.geometry:(T.hasOwnProperty(o)||(T[o]=new Rc.SphereGeometry(o,s,s)),i=T[o],a&&a.geometry.dispose());var l,c=S(n)||f(n)||"#f0f0f0",u=new Rc.Color(Ac(c)),h=3*t.linkOpacity;a&&a.material.color.equals(u)&&a.material.opacity===h?l=a.material:(E.hasOwnProperty(c)||(E[c]=new Rc.MeshLambertMaterial({color:u,transparent:!0,opacity:h})),l=E[c],a&&a.material.dispose()),Tc(_c(new Array(r)).map((function(t,e){return{idx:e}})),e,{idAccessor:function(t){return t.idx},createObj:function(){return new Rc.Mesh(i,l)},updateObj:function(t){t.geometry=i,t.material=l}})}})}}if(t._flushObjects=!1,n(["graphData","nodeId","linkSource","linkTarget","numDimensions","forceEngine","dagMode","dagNodeFilter","dagLevelDistance"])){t.engineRunning=!1,t.graphData.links.forEach((function(e){e.source=e[t.linkSource],e.target=e[t.linkTarget]}));var A,C="ngraph"!==t.forceEngine;if(C){(A=t.d3ForceLayout).stop().alpha(1).numDimensions(t.numDimensions).nodes(t.graphData.nodes);var L=t.d3ForceLayout.force("link");L&&L.id((function(e){return e[t.nodeId]})).links(t.graphData.links);var P=t.dagMode&&function(t,e){var n=t.nodes,i=t.links,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.nodeFilter,o=void 0===a?function(){return!0}:a,s=r.onLoopError,l=void 0===s?function(t){throw"Invalid DAG structure! Found cycle in node path: ".concat(t.join(" -> "),".")}:s,c={};n.forEach((function(t){return c[e(t)]={data:t,out:[],depth:-1,skip:!o(t)}})),i.forEach((function(t){var n=t.source,i=t.target,r=l(n),a=l(i);if(!c.hasOwnProperty(r))throw"Missing source node with id: ".concat(r);if(!c.hasOwnProperty(a))throw"Missing target node with id: ".concat(a);var o=c[r],s=c[a];function l(t){return"object"===ic(t)?e(t):t}o.out.push(s)}));var u=[];d(Object.values(c));var h=Object.assign.apply(Object,[{}].concat(_c(Object.entries(c).filter((function(t){return!vc(t,2)[1].skip})).map((function(t){var e=vc(t,2);return sc({},e[0],e[1].depth)})))));return h;function d(t){for(var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=function(){var r=t[a];if(-1!==n.indexOf(r)){var o=[].concat(_c(n.slice(n.indexOf(r))),[r]).map((function(t){return e(t.data)}));return u.some((function(t){return t.length===o.length&&t.every((function(t,e){return t===o[e]}))}))||(u.push(o),l(o)),"continue"}i>r.depth&&(r.depth=i,d(r.out,[].concat(_c(n),[r]),i+(r.skip?0:1)))},a=0,o=t.length;a1&&(u.vy+=d*m),a>2&&(u.vz+=p*m)}}function u(){if(r){var e,n=r.length;for(o=new Array(n),s=new Array(n),e=0;e[1,2,3].includes(t)))||2,u()},c.strength=function(t){return arguments.length?(l="function"==typeof t?t:ko(+t),u(),c):l},c.radius=function(e){return arguments.length?(t="function"==typeof e?e:ko(+e),u(),c):t},c.x=function(t){return arguments.length?(e=+t,c):e},c.y=function(t){return arguments.length?(n=+t,c):n},c.z=function(t){return arguments.length?(i=+t,c):i},c}((function(e){var n=P[e[t.nodeId]]||-1;return("radialin"===t.dagMode?R-n:n)*D})).strength((function(e){return t.dagNodeFilter(e)?1:0})):null)}else{var z=Dc.graph();t.graphData.nodes.forEach((function(e){z.addNode(e[t.nodeId])})),t.graphData.links.forEach((function(t){z.addLink(t.source,t.target)})),(A=Dc.forcelayout(z,nc({dimensions:t.numDimensions},t.ngraphPhysics))).graph=z}for(var U=0;U0&&t.d3ForceLayout.alpha()1&&void 0!==arguments[1]?arguments[1]:Object,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=function(e){lc(r,e);var i=gc(r);function r(){var e;rc(this,r);for(var a=arguments.length,o=new Array(a),s=0;s0&&(n.object.isPerspectiveCamera?_.multiplyScalar(t):n.object.isOrthographicCamera?(n.object.zoom/=t,n.object.updateProjectionMatrix()):console.warn("THREE.TrackballControls: Unsupported camera type")),n.staticMoving?w.copy(M):w.y+=(M.y-w.y)*this.dynamicDampingFactor)},this.panCamera=function(){const t=new K,e=new Et,i=new Et;return function(){if(t.copy(E).sub(S),t.lengthSq()){if(n.object.isOrthographicCamera){const e=(n.object.right-n.object.left)/n.object.zoom/n.domElement.clientWidth,i=(n.object.top-n.object.bottom)/n.object.zoom/n.domElement.clientWidth;t.x*=e,t.y*=i}t.multiplyScalar(_.length()*n.panSpeed),i.copy(_).cross(n.object.up).setLength(t.x),i.add(e.copy(n.object.up).setLength(t.y)),n.object.position.add(i),n.target.add(i),n.staticMoving?S.copy(E):S.add(t.subVectors(E,S).multiplyScalar(n.dynamicDampingFactor))}}}(),this.checkDistances=function(){n.noZoom&&n.noPan||(_.lengthSq()>n.maxDistance*n.maxDistance&&(n.object.position.addVectors(n.target,_.setLength(n.maxDistance)),w.copy(M)),_.lengthSq()u&&(n.dispatchEvent(zc),h.copy(n.object.position))):n.object.isOrthographicCamera?(n.object.lookAt(n.target),(h.distanceToSquared(n.object.position)>u||d!==n.object.zoom)&&(n.dispatchEvent(zc),h.copy(n.object.position),d=n.object.zoom)):console.warn("THREE.TrackballControls: Unsupported camera type")},this.reset=function(){p=i,f=i,n.target.copy(n.target0),n.object.position.copy(n.position0),n.object.up.copy(n.up0),n.object.zoom=n.zoom0,n.object.updateProjectionMatrix(),_.subVectors(n.object.position,n.target),n.object.lookAt(n.target),n.dispatchEvent(zc),h.copy(n.object.position),d=n.object.zoom},this.dispose=function(){n.domElement.removeEventListener("contextmenu",z),n.domElement.removeEventListener("pointerdown",P),n.domElement.removeEventListener("pointercancel",O),n.domElement.removeEventListener("wheel",N),n.domElement.removeEventListener("pointermove",R),n.domElement.removeEventListener("pointerup",D),window.removeEventListener("keydown",I),window.removeEventListener("keyup",k)},this.domElement.addEventListener("contextmenu",z),this.domElement.addEventListener("pointerdown",P),this.domElement.addEventListener("pointercancel",O),this.domElement.addEventListener("wheel",N,{passive:!1}),window.addEventListener("keydown",I),window.addEventListener("keyup",k),this.handleResize(),this.update()}}const jc={type:"change"},Gc={type:"start"},Hc={type:"end"};class Vc extends j{constructor(t,e){super(),this.object=t,this.domElement=e,this.domElement.style.touchAction="none",this.enabled=!0,this.target=new Et,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:o.ROTATE,MIDDLE:o.DOLLY,RIGHT:o.PAN},this.touches={ONE:s,TWO:c},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this.getPolarAngle=function(){return h.phi},this.getAzimuthalAngle=function(){return h.theta},this.getDistance=function(){return this.object.position.distanceTo(this.target)},this.listenToKeyEvents=function(t){t.addEventListener("keydown",Y),this._domElementKeyEvents=t},this.saveState=function(){n.target0.copy(n.target),n.position0.copy(n.object.position),n.zoom0=n.object.zoom},this.reset=function(){n.target.copy(n.target0),n.object.position.copy(n.position0),n.object.zoom=n.zoom0,n.object.updateProjectionMatrix(),n.dispatchEvent(jc),n.update(),r=i.NONE},this.update=function(){const e=new Et,o=(new St).setFromUnitVectors(t.up,new Et(0,1,0)),s=o.clone().invert(),l=new Et,c=new St,u=2*Math.PI;return function(){const t=n.object.position;e.copy(t).sub(n.target),e.applyQuaternion(o),h.setFromVector3(e),n.autoRotate&&r===i.NONE&&C(2*Math.PI/60/60*n.autoRotateSpeed),n.enableDamping?(h.theta+=d.theta*n.dampingFactor,h.phi+=d.phi*n.dampingFactor):(h.theta+=d.theta,h.phi+=d.phi);let g=n.minAzimuthAngle,v=n.maxAzimuthAngle;return isFinite(g)&&isFinite(v)&&(g<-Math.PI?g+=u:g>Math.PI&&(g-=u),v<-Math.PI?v+=u:v>Math.PI&&(v-=u),h.theta=g<=v?Math.max(g,Math.min(v,h.theta)):h.theta>(g+v)/2?Math.max(g,h.theta):Math.min(v,h.theta)),h.phi=Math.max(n.minPolarAngle,Math.min(n.maxPolarAngle,h.phi)),h.makeSafe(),h.radius*=p,h.radius=Math.max(n.minDistance,Math.min(n.maxDistance,h.radius)),!0===n.enableDamping?n.target.addScaledVector(f,n.dampingFactor):n.target.add(f),e.setFromSpherical(h),e.applyQuaternion(s),t.copy(n.target).add(e),n.object.lookAt(n.target),!0===n.enableDamping?(d.theta*=1-n.dampingFactor,d.phi*=1-n.dampingFactor,f.multiplyScalar(1-n.dampingFactor)):(d.set(0,0,0),f.set(0,0,0)),p=1,!!(m||l.distanceToSquared(n.object.position)>a||8*(1-c.dot(n.object.quaternion))>a)&&(n.dispatchEvent(jc),l.copy(n.object.position),c.copy(n.object.quaternion),m=!1,!0)}}(),this.dispose=function(){n.domElement.removeEventListener("contextmenu",$),n.domElement.removeEventListener("pointerdown",H),n.domElement.removeEventListener("pointercancel",q),n.domElement.removeEventListener("wheel",X),n.domElement.removeEventListener("pointermove",V),n.domElement.removeEventListener("pointerup",W),null!==n._domElementKeyEvents&&n._domElementKeyEvents.removeEventListener("keydown",Y)};const n=this,i={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6};let r=i.NONE;const a=1e-6,h=new to,d=new to;let p=1;const f=new Et;let m=!1;const g=new K,v=new K,_=new K,y=new K,x=new K,b=new K,w=new K,M=new K,S=new K,E=[],T={};function A(){return Math.pow(.95,n.zoomSpeed)}function C(t){d.theta-=t}function L(t){d.phi-=t}const P=function(){const t=new Et;return function(e,n){t.setFromMatrixColumn(n,0),t.multiplyScalar(-e),f.add(t)}}(),R=function(){const t=new Et;return function(e,i){!0===n.screenSpacePanning?t.setFromMatrixColumn(i,1):(t.setFromMatrixColumn(i,0),t.crossVectors(n.object.up,t)),t.multiplyScalar(e),f.add(t)}}(),D=function(){const t=new Et;return function(e,i){const r=n.domElement;if(n.object.isPerspectiveCamera){const a=n.object.position;t.copy(a).sub(n.target);let o=t.length();o*=Math.tan(n.object.fov/2*Math.PI/180),P(2*e*o/r.clientHeight,n.object.matrix),R(2*i*o/r.clientHeight,n.object.matrix)}else n.object.isOrthographicCamera?(P(e*(n.object.right-n.object.left)/n.object.zoom/r.clientWidth,n.object.matrix),R(i*(n.object.top-n.object.bottom)/n.object.zoom/r.clientHeight,n.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),n.enablePan=!1)}}();function O(t){n.object.isPerspectiveCamera?p/=t:n.object.isOrthographicCamera?(n.object.zoom=Math.max(n.minZoom,Math.min(n.maxZoom,n.object.zoom*t)),n.object.updateProjectionMatrix(),m=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),n.enableZoom=!1)}function I(t){n.object.isPerspectiveCamera?p*=t:n.object.isOrthographicCamera?(n.object.zoom=Math.max(n.minZoom,Math.min(n.maxZoom,n.object.zoom/t)),n.object.updateProjectionMatrix(),m=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),n.enableZoom=!1)}function k(t){g.set(t.clientX,t.clientY)}function N(t){y.set(t.clientX,t.clientY)}function z(){if(1===E.length)g.set(E[0].pageX,E[0].pageY);else{const t=.5*(E[0].pageX+E[1].pageX),e=.5*(E[0].pageY+E[1].pageY);g.set(t,e)}}function U(){if(1===E.length)y.set(E[0].pageX,E[0].pageY);else{const t=.5*(E[0].pageX+E[1].pageX),e=.5*(E[0].pageY+E[1].pageY);y.set(t,e)}}function F(){const t=E[0].pageX-E[1].pageX,e=E[0].pageY-E[1].pageY,n=Math.sqrt(t*t+e*e);w.set(0,n)}function B(t){if(1==E.length)v.set(t.pageX,t.pageY);else{const e=Q(t),n=.5*(t.pageX+e.x),i=.5*(t.pageY+e.y);v.set(n,i)}_.subVectors(v,g).multiplyScalar(n.rotateSpeed);const e=n.domElement;C(2*Math.PI*_.x/e.clientHeight),L(2*Math.PI*_.y/e.clientHeight),g.copy(v)}function j(t){if(1===E.length)x.set(t.pageX,t.pageY);else{const e=Q(t),n=.5*(t.pageX+e.x),i=.5*(t.pageY+e.y);x.set(n,i)}b.subVectors(x,y).multiplyScalar(n.panSpeed),D(b.x,b.y),y.copy(x)}function G(t){const e=Q(t),i=t.pageX-e.x,r=t.pageY-e.y,a=Math.sqrt(i*i+r*r);M.set(0,a),S.set(0,Math.pow(M.y/w.y,n.zoomSpeed)),O(S.y),w.copy(M)}function H(t){!1!==n.enabled&&(0===E.length&&(n.domElement.setPointerCapture(t.pointerId),n.domElement.addEventListener("pointermove",V),n.domElement.addEventListener("pointerup",W)),function(t){E.push(t)}(t),"touch"===t.pointerType?function(t){switch(J(t),E.length){case 1:switch(n.touches.ONE){case s:if(!1===n.enableRotate)return;z(),r=i.TOUCH_ROTATE;break;case l:if(!1===n.enablePan)return;U(),r=i.TOUCH_PAN;break;default:r=i.NONE}break;case 2:switch(n.touches.TWO){case c:if(!1===n.enableZoom&&!1===n.enablePan)return;n.enableZoom&&F(),n.enablePan&&U(),r=i.TOUCH_DOLLY_PAN;break;case u:if(!1===n.enableZoom&&!1===n.enableRotate)return;n.enableZoom&&F(),n.enableRotate&&z(),r=i.TOUCH_DOLLY_ROTATE;break;default:r=i.NONE}break;default:r=i.NONE}r!==i.NONE&&n.dispatchEvent(Gc)}(t):function(t){let e;switch(t.button){case 0:e=n.mouseButtons.LEFT;break;case 1:e=n.mouseButtons.MIDDLE;break;case 2:e=n.mouseButtons.RIGHT;break;default:e=-1}switch(e){case o.DOLLY:if(!1===n.enableZoom)return;!function(t){w.set(t.clientX,t.clientY)}(t),r=i.DOLLY;break;case o.ROTATE:if(t.ctrlKey||t.metaKey||t.shiftKey){if(!1===n.enablePan)return;N(t),r=i.PAN}else{if(!1===n.enableRotate)return;k(t),r=i.ROTATE}break;case o.PAN:if(t.ctrlKey||t.metaKey||t.shiftKey){if(!1===n.enableRotate)return;k(t),r=i.ROTATE}else{if(!1===n.enablePan)return;N(t),r=i.PAN}break;default:r=i.NONE}r!==i.NONE&&n.dispatchEvent(Gc)}(t))}function V(t){!1!==n.enabled&&("touch"===t.pointerType?function(t){switch(J(t),r){case i.TOUCH_ROTATE:if(!1===n.enableRotate)return;B(t),n.update();break;case i.TOUCH_PAN:if(!1===n.enablePan)return;j(t),n.update();break;case i.TOUCH_DOLLY_PAN:if(!1===n.enableZoom&&!1===n.enablePan)return;!function(t){n.enableZoom&&G(t),n.enablePan&&j(t)}(t),n.update();break;case i.TOUCH_DOLLY_ROTATE:if(!1===n.enableZoom&&!1===n.enableRotate)return;!function(t){n.enableZoom&&G(t),n.enableRotate&&B(t)}(t),n.update();break;default:r=i.NONE}}(t):function(t){switch(r){case i.ROTATE:if(!1===n.enableRotate)return;!function(t){v.set(t.clientX,t.clientY),_.subVectors(v,g).multiplyScalar(n.rotateSpeed);const e=n.domElement;C(2*Math.PI*_.x/e.clientHeight),L(2*Math.PI*_.y/e.clientHeight),g.copy(v),n.update()}(t);break;case i.DOLLY:if(!1===n.enableZoom)return;!function(t){M.set(t.clientX,t.clientY),S.subVectors(M,w),S.y>0?O(A()):S.y<0&&I(A()),w.copy(M),n.update()}(t);break;case i.PAN:if(!1===n.enablePan)return;!function(t){x.set(t.clientX,t.clientY),b.subVectors(x,y).multiplyScalar(n.panSpeed),D(b.x,b.y),y.copy(x),n.update()}(t)}}(t))}function W(t){Z(t),0===E.length&&(n.domElement.releasePointerCapture(t.pointerId),n.domElement.removeEventListener("pointermove",V),n.domElement.removeEventListener("pointerup",W)),n.dispatchEvent(Hc),r=i.NONE}function q(t){Z(t)}function X(t){!1!==n.enabled&&!1!==n.enableZoom&&r===i.NONE&&(t.preventDefault(),n.dispatchEvent(Gc),function(t){t.deltaY<0?I(A()):t.deltaY>0&&O(A()),n.update()}(t),n.dispatchEvent(Hc))}function Y(t){!1!==n.enabled&&!1!==n.enablePan&&function(t){let e=!1;switch(t.code){case n.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?L(2*Math.PI*n.rotateSpeed/n.domElement.clientHeight):D(0,n.keyPanSpeed),e=!0;break;case n.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?L(-2*Math.PI*n.rotateSpeed/n.domElement.clientHeight):D(0,-n.keyPanSpeed),e=!0;break;case n.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?C(2*Math.PI*n.rotateSpeed/n.domElement.clientHeight):D(n.keyPanSpeed,0),e=!0;break;case n.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?C(-2*Math.PI*n.rotateSpeed/n.domElement.clientHeight):D(-n.keyPanSpeed,0),e=!0}e&&(t.preventDefault(),n.update())}(t)}function $(t){!1!==n.enabled&&t.preventDefault()}function Z(t){delete T[t.pointerId];for(let e=0;e0){const e=this.getContainerDimensions(),n=e.size[0]/2,i=e.size[1]/2;this.moveState.yawLeft=-(t.pageX-e.offset[0]-n)/n,this.moveState.pitchDown=(t.pageY-e.offset[1]-i)/i,this.updateRotationVector()}},this.pointerup=function(t){if(this.dragToLook)this.status--,this.moveState.yawLeft=this.moveState.pitchDown=0;else{switch(t.button){case 0:this.moveState.forward=0;break;case 2:this.moveState.back=0}this.updateMovementVector()}this.updateRotationVector()},this.update=function(t){const e=t*n.movementSpeed,o=t*n.rollSpeed;n.object.translateX(n.moveVector.x*e),n.object.translateY(n.moveVector.y*e),n.object.translateZ(n.moveVector.z*e),n.tmpQuaternion.set(n.rotationVector.x*o,n.rotationVector.y*o,n.rotationVector.z*o,1).normalize(),n.object.quaternion.multiply(n.tmpQuaternion),(a.distanceToSquared(n.object.position)>i||8*(1-r.dot(n.object.quaternion))>i)&&(n.dispatchEvent(Wc),r.copy(n.object.quaternion),a.copy(n.object.position))},this.updateMovementVector=function(){const t=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right,this.moveVector.y=-this.moveState.down+this.moveState.up,this.moveVector.z=-t+this.moveState.back},this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp,this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft,this.rotationVector.z=-this.moveState.rollRight+this.moveState.rollLeft},this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}},this.dispose=function(){this.domElement.removeEventListener("contextmenu",Xc),this.domElement.removeEventListener("pointerdown",s),this.domElement.removeEventListener("pointermove",o),this.domElement.removeEventListener("pointerup",l),window.removeEventListener("keydown",c),window.removeEventListener("keyup",u)};const o=this.pointermove.bind(this),s=this.pointerdown.bind(this),l=this.pointerup.bind(this),c=this.keydown.bind(this),u=this.keyup.bind(this);this.domElement.addEventListener("contextmenu",Xc),this.domElement.addEventListener("pointerdown",s),this.domElement.addEventListener("pointermove",o),this.domElement.addEventListener("pointerup",l),window.addEventListener("keydown",c),window.addEventListener("keyup",u),this.updateMovementVector(),this.updateRotationVector()}}function Xc(t){t.preventDefault()}const Yc={uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:"\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}",fragmentShader:"\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.a *= opacity;\n\n\n\t\t}"};class $c{constructor(){this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const Zc=new $n(-1,1,1,-1,0,1),Jc=new tn;Jc.setAttribute("position",new qe([-1,3,0,-1,-1,0,3,-1,0],3)),Jc.setAttribute("uv",new qe([0,2,0,0,2,0],2));class Kc{constructor(t){this._mesh=new mn(Jc,t)}dispose(){this._mesh.geometry.dispose()}render(t){t.render(this._mesh,Zc)}get material(){return this._mesh.material}set material(t){this._mesh.material=t}}class Qc extends $c{constructor(t,e){super(),this.textureID=void 0!==e?e:"tDiffuse",t instanceof wn?(this.uniforms=t.uniforms,this.material=t):t&&(this.uniforms=bn.clone(t.uniforms),this.material=new wn({defines:Object.assign({},t.defines),uniforms:this.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader})),this.fsQuad=new Kc(this.material)}render(t,e,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this.fsQuad.material=this.material,this.renderToScreen?(t.setRenderTarget(null),this.fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),this.fsQuad.render(t))}dispose(){this.material.dispose(),this.fsQuad.dispose()}}class tu extends $c{constructor(t,e){super(),this.scene=t,this.camera=e,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(t,e,n){const i=t.getContext(),r=t.state;let a,o;r.buffers.color.setMask(!1),r.buffers.depth.setMask(!1),r.buffers.color.setLocked(!0),r.buffers.depth.setLocked(!0),this.inverse?(a=0,o=1):(a=1,o=0),r.buffers.stencil.setTest(!0),r.buffers.stencil.setOp(i.REPLACE,i.REPLACE,i.REPLACE),r.buffers.stencil.setFunc(i.ALWAYS,a,4294967295),r.buffers.stencil.setClear(o),r.buffers.stencil.setLocked(!0),t.setRenderTarget(n),this.clear&&t.clear(),t.render(this.scene,this.camera),t.setRenderTarget(e),this.clear&&t.clear(),t.render(this.scene,this.camera),r.buffers.color.setLocked(!1),r.buffers.depth.setLocked(!1),r.buffers.stencil.setLocked(!1),r.buffers.stencil.setFunc(i.EQUAL,1,4294967295),r.buffers.stencil.setOp(i.KEEP,i.KEEP,i.KEEP),r.buffers.stencil.setLocked(!0)}}class eu extends $c{constructor(){super(),this.needsSwap=!1}render(t){t.state.buffers.stencil.setLocked(!1),t.state.buffers.stencil.setTest(!1)}}class nu{constructor(t,e){if(this.renderer=t,void 0===e){const n=t.getSize(new K);this._pixelRatio=t.getPixelRatio(),this._width=n.width,this._height=n.height,(e=new bt(this._width*this._pixelRatio,this._height*this._pixelRatio)).texture.name="EffectComposer.rt1"}else this._pixelRatio=1,this._width=e.width,this._height=e.height;this.renderTarget1=e,this.renderTarget2=e.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new Qc(Yc),this.clock=new $a}swapBuffers(){const t=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=t}addPass(t){this.passes.push(t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(t,e){this.passes.splice(e,0,t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(t){const e=this.passes.indexOf(t);-1!==e&&this.passes.splice(e,1)}isLastEnabledPass(t){for(let e=t+1;e1?i-1:0),a=1;a=0&&r<1?(s=a,l=o):r>=1&&r<2?(s=o,l=a):r>=2&&r<3?(l=a,c=o):r>=3&&r<4?(l=o,c=a):r>=4&&r<5?(s=o,c=a):r>=5&&r<6&&(s=a,c=o);var u=n-a/2;return i(s+u,l+u,c+u)}var vu={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"639",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"};var _u=/^#[a-fA-F0-9]{6}$/,yu=/^#[a-fA-F0-9]{8}$/,xu=/^#[a-fA-F0-9]{3}$/,bu=/^#[a-fA-F0-9]{4}$/,wu=/^rgb\(\s*(\d{1,3})\s*(?:,)?\s*(\d{1,3})\s*(?:,)?\s*(\d{1,3})\s*\)$/i,Mu=/^rgb(?:a)?\(\s*(\d{1,3})\s*(?:,)?\s*(\d{1,3})\s*(?:,)?\s*(\d{1,3})\s*(?:,|\/)\s*([-+]?\d*[.]?\d+[%]?)\s*\)$/i,Su=/^hsl\(\s*(\d{0,3}[.]?[0-9]+(?:deg)?)\s*(?:,)?\s*(\d{1,3}[.]?[0-9]?)%\s*(?:,)?\s*(\d{1,3}[.]?[0-9]?)%\s*\)$/i,Eu=/^hsl(?:a)?\(\s*(\d{0,3}[.]?[0-9]+(?:deg)?)\s*(?:,)?\s*(\d{1,3}[.]?[0-9]?)%\s*(?:,)?\s*(\d{1,3}[.]?[0-9]?)%\s*(?:,|\/)\s*([-+]?\d*[.]?\d+[%]?)\s*\)$/i;function Tu(t){if("string"!=typeof t)throw new pu(3);var e=function(t){if("string"!=typeof t)return t;var e=t.toLowerCase();return vu[e]?"#"+vu[e]:t}(t);if(e.match(_u))return{red:parseInt(""+e[1]+e[2],16),green:parseInt(""+e[3]+e[4],16),blue:parseInt(""+e[5]+e[6],16)};if(e.match(yu)){var n=parseFloat((parseInt(""+e[7]+e[8],16)/255).toFixed(2));return{red:parseInt(""+e[1]+e[2],16),green:parseInt(""+e[3]+e[4],16),blue:parseInt(""+e[5]+e[6],16),alpha:n}}if(e.match(xu))return{red:parseInt(""+e[1]+e[1],16),green:parseInt(""+e[2]+e[2],16),blue:parseInt(""+e[3]+e[3],16)};if(e.match(bu)){var i=parseFloat((parseInt(""+e[4]+e[4],16)/255).toFixed(2));return{red:parseInt(""+e[1]+e[1],16),green:parseInt(""+e[2]+e[2],16),blue:parseInt(""+e[3]+e[3],16),alpha:i}}var r=wu.exec(e);if(r)return{red:parseInt(""+r[1],10),green:parseInt(""+r[2],10),blue:parseInt(""+r[3],10)};var a=Mu.exec(e.substring(0,50));if(a)return{red:parseInt(""+a[1],10),green:parseInt(""+a[2],10),blue:parseInt(""+a[3],10),alpha:parseFloat(""+a[4])>1?parseFloat(""+a[4])/100:parseFloat(""+a[4])};var o=Su.exec(e);if(o){var s="rgb("+gu(parseInt(""+o[1],10),parseInt(""+o[2],10)/100,parseInt(""+o[3],10)/100)+")",l=wu.exec(s);if(!l)throw new pu(4,e,s);return{red:parseInt(""+l[1],10),green:parseInt(""+l[2],10),blue:parseInt(""+l[3],10)}}var c=Eu.exec(e.substring(0,50));if(c){var u="rgb("+gu(parseInt(""+c[1],10),parseInt(""+c[2],10)/100,parseInt(""+c[3],10)/100)+")",h=wu.exec(u);if(!h)throw new pu(4,e,u);return{red:parseInt(""+h[1],10),green:parseInt(""+h[2],10),blue:parseInt(""+h[3],10),alpha:parseFloat(""+c[4])>1?parseFloat(""+c[4])/100:parseFloat(""+c[4])}}throw new pu(5)}var Au=function(t){return 7===t.length&&t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?"#"+t[1]+t[3]+t[5]:t};function Cu(t){var e=t.toString(16);return 1===e.length?"0"+e:e}function Lu(t,e,n){if("number"==typeof t&&"number"==typeof e&&"number"==typeof n)return Au("#"+Cu(t)+Cu(e)+Cu(n));if("object"==typeof t&&void 0===e&&void 0===n)return Au("#"+Cu(t.red)+Cu(t.green)+Cu(t.blue));throw new pu(6)}function Pu(t,e,n){return function(){var i=n.concat(Array.prototype.slice.call(arguments));return i.length>=e?t.apply(this,i):Pu(t,e,i)}}function Ru(t){return Pu(t,t.length,[])}function Du(t,e){if("transparent"===e)return e;var n,i,r,a=Tu(e),o="number"==typeof a.alpha?a.alpha:1;return function(t,e,n,i){if("string"==typeof t&&"number"==typeof e){var r=Tu(t);return"rgba("+r.red+","+r.green+","+r.blue+","+e+")"}if("number"==typeof t&&"number"==typeof e&&"number"==typeof n&&"number"==typeof i)return i>=1?Lu(t,e,n):"rgba("+t+","+e+","+n+","+i+")";if("object"==typeof t&&void 0===e&&void 0===n&&void 0===i)return t.alpha>=1?Lu(t.red,t.green,t.blue):"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")";throw new pu(7)}(ru({},a,{alpha:(n=0,i=1,r=(100*o+100*parseFloat(t))/100,Math.max(n,Math.min(i,r)))}))}var Ou=Ru(Du),Iu={Linear:{None:function(t){return t}},Quadratic:{In:function(t){return t*t},Out:function(t){return t*(2-t)},InOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},Cubic:{In:function(t){return t*t*t},Out:function(t){return--t*t*t+1},InOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},Quartic:{In:function(t){return t*t*t*t},Out:function(t){return 1- --t*t*t*t},InOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},Quintic:{In:function(t){return t*t*t*t*t},Out:function(t){return--t*t*t*t*t+1},InOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},Sinusoidal:{In:function(t){return 1-Math.cos(t*Math.PI/2)},Out:function(t){return Math.sin(t*Math.PI/2)},InOut:function(t){return.5*(1-Math.cos(Math.PI*t))}},Exponential:{In:function(t){return 0===t?0:Math.pow(1024,t-1)},Out:function(t){return 1===t?1:1-Math.pow(2,-10*t)},InOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))}},Circular:{In:function(t){return 1-Math.sqrt(1-t*t)},Out:function(t){return Math.sqrt(1- --t*t)},InOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},Elastic:{In:function(t){return 0===t?0:1===t?1:-Math.pow(2,10*(t-1))*Math.sin(5*(t-1.1)*Math.PI)},Out:function(t){return 0===t?0:1===t?1:Math.pow(2,-10*t)*Math.sin(5*(t-.1)*Math.PI)+1},InOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?-.5*Math.pow(2,10*(t-1))*Math.sin(5*(t-1.1)*Math.PI):.5*Math.pow(2,-10*(t-1))*Math.sin(5*(t-1.1)*Math.PI)+1}},Back:{In:function(t){var e=1.70158;return t*t*((e+1)*t-e)},Out:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},InOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)}},Bounce:{In:function(t){return 1-Iu.Bounce.Out(1-t)},Out:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},InOut:function(t){return t<.5?.5*Iu.Bounce.In(2*t):.5*Iu.Bounce.Out(2*t-1)+.5}}},ku="undefined"==typeof self&&"undefined"!=typeof process&&process.hrtime?function(){var t=process.hrtime();return 1e3*t[0]+t[1]/1e6}:"undefined"!=typeof self&&void 0!==self.performance&&void 0!==self.performance.now?self.performance.now.bind(self.performance):void 0!==Date.now?Date.now:function(){return(new Date).getTime()},Nu=function(){function t(){this._tweens={},this._tweensAddedDuringUpdate={}}return t.prototype.getAll=function(){var t=this;return Object.keys(this._tweens).map((function(e){return t._tweens[e]}))},t.prototype.removeAll=function(){this._tweens={}},t.prototype.add=function(t){this._tweens[t.getId()]=t,this._tweensAddedDuringUpdate[t.getId()]=t},t.prototype.remove=function(t){delete this._tweens[t.getId()],delete this._tweensAddedDuringUpdate[t.getId()]},t.prototype.update=function(t,e){void 0===t&&(t=ku()),void 0===e&&(e=!1);var n=Object.keys(this._tweens);if(0===n.length)return!1;for(;n.length>0;){this._tweensAddedDuringUpdate={};for(var i=0;i1?a(t[n],t[n-1],n-i):a(t[r],t[r+1>n?n:r+1],i-r)},Bezier:function(t,e){for(var n=0,i=t.length-1,r=Math.pow,a=zu.Utils.Bernstein,o=0;o<=i;o++)n+=r(1-e,i-o)*r(e,o)*t[o]*a(i,o);return n},CatmullRom:function(t,e){var n=t.length-1,i=n*e,r=Math.floor(i),a=zu.Utils.CatmullRom;return t[0]===t[n]?(e<0&&(r=Math.floor(i=n*(1+e))),a(t[(r-1+n)%n],t[r],t[(r+1)%n],t[(r+2)%n],i-r)):e<0?t[0]-(a(t[0],t[0],t[1],t[1],-i)-t[0]):e>1?t[n]-(a(t[n],t[n],t[n-1],t[n-1],i-n)-t[n]):a(t[r?r-1:0],t[r],t[n1;i--)n*=i;return t[e]=n,n}}(),CatmullRom:function(t,e,n,i,r){var a=.5*(n-t),o=.5*(i-e),s=r*r;return(2*e-2*n+a+o)*(r*s)+(-3*e+3*n-2*a-o)*s+a*r+e}}},Uu=function(){function t(){}return t.nextId=function(){return t._nextId++},t._nextId=0,t}(),Fu=new Nu,Bu=function(){function t(t,e){void 0===e&&(e=Fu),this._object=t,this._group=e,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Iu.Linear.None,this._interpolationFunction=zu.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._id=Uu.nextId(),this._isChainStopped=!1,this._goToEnd=!1}return t.prototype.getId=function(){return this._id},t.prototype.isPlaying=function(){return this._isPlaying},t.prototype.isPaused=function(){return this._isPaused},t.prototype.to=function(t,e){return this._valuesEnd=Object.create(t),void 0!==e&&(this._duration=e),this},t.prototype.duration=function(t){return this._duration=t,this},t.prototype.start=function(t){if(this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed)for(var e in this._reversed=!1,this._valuesStartRepeat)this._swapEndStartRepeatValues(e),this._valuesStart[e]=this._valuesStartRepeat[e];return this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=void 0!==t?"string"==typeof t?ku()+parseFloat(t):t:ku(),this._startTime+=this._delayTime,this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat),this},t.prototype._setupProperties=function(t,e,n,i){for(var r in n){var a=t[r],o=Array.isArray(a),s=o?"array":typeof a,l=!o&&Array.isArray(n[r]);if("undefined"!==s&&"function"!==s){if(l){var c=n[r];if(0===c.length)continue;c=c.map(this._handleRelativeValue.bind(this,a)),n[r]=[a].concat(c)}if("object"!==s&&!o||!a||l)void 0===e[r]&&(e[r]=a),o||(e[r]*=1),i[r]=l?n[r].slice().reverse():e[r]||0;else{for(var u in e[r]=o?[]:{},a)e[r][u]=a[u];i[r]=o?[]:{},this._setupProperties(a,e[r],n[r],i[r])}}}},t.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},t.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},t.prototype.pause=function(t){return void 0===t&&(t=ku()),this._isPaused||!this._isPlaying||(this._isPaused=!0,this._pauseStart=t,this._group&&this._group.remove(this)),this},t.prototype.resume=function(t){return void 0===t&&(t=ku()),this._isPaused&&this._isPlaying?(this._isPaused=!1,this._startTime+=t-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this):this},t.prototype.stopChainedTweens=function(){for(var t=0,e=this._chainedTweens.length;tr)return!1;e&&this.start(t)}if(this._goToEnd=!1,t1?1:i;var a=this._easingFunction(i);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,a),this._onUpdateCallback&&this._onUpdateCallback(this._object,i),1===i){if(this._repeat>0){for(n in isFinite(this._repeat)&&this._repeat--,this._valuesStartRepeat)this._yoyo||"string"!=typeof this._valuesEnd[n]||(this._valuesStartRepeat[n]=this._valuesStartRepeat[n]+parseFloat(this._valuesEnd[n])),this._yoyo&&this._swapEndStartRepeatValues(n),this._valuesStart[n]=this._valuesStartRepeat[n];return this._yoyo&&(this._reversed=!this._reversed),void 0!==this._repeatDelayTime?this._startTime=t+this._repeatDelayTime:this._startTime=t+this._delayTime,this._onRepeatCallback&&this._onRepeatCallback(this._object),!0}this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var o=0,s=this._chainedTweens.length;ot.length)&&(e=t.length);for(var n=0,i=new Array(e);n0&&(e.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.backgroundIntensity=this.backgroundIntensity),e}get autoUpdate(){return console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate}set autoUpdate(t){console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate=t}},PerspectiveCamera:Sn,Raycaster:Ja,TextureLoader:class extends ja{constructor(t){super(t)}load(t,e,n,i){const r=new yt,a=new Ga(this.manager);return a.setCrossOrigin(this.crossOrigin),a.setPath(this.path),a.load(t,(function(t){r.image=t,r.needsUpdate=!0,void 0!==e&&e(r)}),n,i),r}},Vector2:K,Vector3:Et,Box3:Ct,Color:pt,Mesh:mn,SphereGeometry:Na,MeshBasicMaterial:Be,BackSide:1,EventDispatcher:j,MOUSE:o,Quaternion:St,Spherical:to,Clock:$a},eh=Tl({props:{width:{default:window.innerWidth,onChange:function(t,e,n){isNaN(t)&&(e.width=n)}},height:{default:window.innerHeight,onChange:function(t,e,n){isNaN(t)&&(e.height=n)}},backgroundColor:{default:"#000011"},backgroundImageUrl:{},onBackgroundImageLoaded:{},showNavInfo:{default:!0},skyRadius:{default:5e4},objects:{default:[]},enablePointerInteraction:{default:!0,onChange:function(t,e){e.hoverObj=null,e.toolTipElem&&(e.toolTipElem.innerHTML="")},triggerUpdate:!1},lineHoverPrecision:{default:1,triggerUpdate:!1},hoverOrderComparator:{default:function(){return-1},triggerUpdate:!1},hoverFilter:{default:function(){return!0},triggerUpdate:!1},tooltipContent:{triggerUpdate:!1},hoverDuringDrag:{default:!1,triggerUpdate:!1},clickAfterDrag:{default:!1,triggerUpdate:!1},onHover:{default:function(){},triggerUpdate:!1},onClick:{default:function(){},triggerUpdate:!1},onRightClick:{triggerUpdate:!1}},methods:{tick:function(t){if(t.initialised){if(t.controls.update&&t.controls.update(t.clock.getDelta()),t.postProcessingComposer?t.postProcessingComposer.render():t.renderer.render(t.scene,t.camera),t.extraRenderers.forEach((function(e){return e.render(t.scene,t.camera)})),t.enablePointerInteraction){var e=null;if(t.hoverDuringDrag||!t.isPointerDragging){var n=this.intersectingObjects(t.pointerPos.x,t.pointerPos.y).filter((function(e){return t.hoverFilter(e.object)})).sort((function(e,n){return t.hoverOrderComparator(e.object,n.object)})),i=n.length?n[0]:null;e=i?i.object:null,t.intersectionPoint=i?i.point:null}e!==t.hoverObj&&(t.onHover(e,t.hoverObj),t.toolTipElem.innerHTML=e&&Al(t.tooltipContent)(e)||"",t.hoverObj=e)}Yu.update()}return this},getPointerPos:function(t){var e=t.pointerPos;return{x:e.x,y:e.y}},cameraPosition:function(t,e,n,i){var r=t.camera;if(e&&t.initialised){var a=e,o=n||{x:0,y:0,z:0};if(i){var s=Object.assign({},r.position),l=h();new Yu.Tween(s).to(a,i).easing(Yu.Easing.Quadratic.Out).onUpdate(c).start(),new Yu.Tween(l).to(o,i/3).easing(Yu.Easing.Quadratic.Out).onUpdate(u).start()}else c(a),u(o);return this}return Object.assign({},r.position,{lookAt:h()});function c(t){var e=t.x,n=t.y,i=t.z;void 0!==e&&(r.position.x=e),void 0!==n&&(r.position.y=n),void 0!==i&&(r.position.z=i)}function u(e){var n=new th.Vector3(e.x,e.y,e.z);t.controls.target?t.controls.target=n:r.lookAt(n)}function h(){return Object.assign(new th.Vector3(0,0,-1e3).applyQuaternion(r.quaternion).add(r.position))}},zoomToFit:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,i=arguments.length,r=new Array(i>3?i-3:0),a=3;a2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:10,r=t.camera;if(e){var a=new th.Vector3(0,0,0),o=2*Math.max.apply(Math,Ju(Object.entries(e).map((function(t){var e=Zu(t,2),n=e[0],i=e[1];return Math.max.apply(Math,Ju(i.map((function(t){return Math.abs(a[n]-t)}))))})))),s=(1-2*i/t.height)*r.fov,l=o/Math.atan(s*Math.PI/180),c=l/r.aspect,u=Math.max(l,c);if(u>0){var h=a.clone().sub(r.position).normalize().multiplyScalar(-u);this.cameraPosition(h,a,n)}}return this},getBbox:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){return!0},n=new th.Box3(new th.Vector3(0,0,0),new th.Vector3(0,0,0)),i=t.objects.filter(e);return i.length?(i.forEach((function(t){return n.expandByObject(t)})),Object.assign.apply(Object,Ju(["x","y","z"].map((function(t){return $u({},t,[n.min[t],n.max[t]])}))))):null},getScreenCoords:function(t,e,n,i){var r=new th.Vector3(e,n,i);return r.project(this.camera()),{x:(r.x+1)*t.width/2,y:-(r.y-1)*t.height/2}},getSceneCoords:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,r=new th.Vector2(e/t.width*2-1,-n/t.height*2+1),a=new th.Raycaster;return a.setFromCamera(r,t.camera),Object.assign({},a.ray.at(i,new th.Vector3))},intersectingObjects:function(t,e,n){var i=new th.Vector2(e/t.width*2-1,-n/t.height*2+1),r=new th.Raycaster;return r.params.Line.threshold=t.lineHoverPrecision,r.setFromCamera(i,t.camera),r.intersectObjects(t.objects,!0)},renderer:function(t){return t.renderer},scene:function(t){return t.scene},camera:function(t){return t.camera},postProcessingComposer:function(t){return t.postProcessingComposer},controls:function(t){return t.controls},tbControls:function(t){return t.controls}},stateInit:function(){return{scene:new th.Scene,camera:new th.PerspectiveCamera,clock:new th.Clock}},init:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=n.controlType,r=void 0===i?"trackball":i,a=n.rendererConfig,o=void 0===a?{}:a,s=n.extraRenderers,l=void 0===s?[]:s,c=n.waitForLoadComplete,u=void 0===c||c;t.innerHTML="",t.appendChild(e.container=document.createElement("div")),e.container.className="scene-container",e.container.style.position="relative",e.container.appendChild(e.navInfo=document.createElement("div")),e.navInfo.className="scene-nav-info",e.navInfo.textContent={orbit:"Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan",trackball:"Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan",fly:"WASD: move, R|F: up | down, Q|E: roll, up|down: pitch, left|right: yaw"}[r]||"",e.navInfo.style.display=e.showNavInfo?null:"none",e.toolTipElem=document.createElement("div"),e.toolTipElem.classList.add("scene-tooltip"),e.container.appendChild(e.toolTipElem),e.pointerPos=new th.Vector2,e.pointerPos.x=-2,e.pointerPos.y=-2,["pointermove","pointerdown"].forEach((function(t){return e.container.addEventListener(t,(function(n){if("pointerdown"===t&&(e.isPointerPressed=!0),!e.isPointerDragging&&"pointermove"===n.type&&(n.pressure>0||e.isPointerPressed)&&("touch"!==n.pointerType||void 0===n.movementX||[n.movementX,n.movementY].some((function(t){return Math.abs(t)>1})))&&(e.isPointerDragging=!0),e.enablePointerInteraction){var i=(r=e.container,a=r.getBoundingClientRect(),o=window.pageXOffset||document.documentElement.scrollLeft,s=window.pageYOffset||document.documentElement.scrollTop,{top:a.top+s,left:a.left+o});e.pointerPos.x=n.pageX-i.left,e.pointerPos.y=n.pageY-i.top,e.toolTipElem.style.top="".concat(e.pointerPos.y,"px"),e.toolTipElem.style.left="".concat(e.pointerPos.x,"px"),e.toolTipElem.style.transform="translate(-".concat(e.pointerPos.x/e.width*100,"%, ").concat(e.height-e.pointerPos.y<100?"calc(-100% - 8px)":"21px",")")}var r,a,o,s}),{passive:!0})})),e.container.addEventListener("pointerup",(function(t){e.isPointerPressed=!1,e.isPointerDragging&&(e.isPointerDragging=!1,!e.clickAfterDrag)||requestAnimationFrame((function(){0===t.button&&e.onClick(e.hoverObj||null,t,e.intersectionPoint),2===t.button&&e.onRightClick&&e.onRightClick(e.hoverObj||null,t,e.intersectionPoint)}))}),{passive:!0,capture:!0}),e.container.addEventListener("contextmenu",(function(t){e.onRightClick&&t.preventDefault()})),e.renderer=new th.WebGLRenderer(Object.assign({antialias:!0,alpha:!0},o)),e.renderer.setPixelRatio(Math.min(2,window.devicePixelRatio)),e.container.appendChild(e.renderer.domElement),e.extraRenderers=l,e.extraRenderers.forEach((function(t){t.domElement.style.position="absolute",t.domElement.style.top="0px",t.domElement.style.pointerEvents="none",e.container.appendChild(t.domElement)})),e.postProcessingComposer=new nu(e.renderer),e.postProcessingComposer.addPass(new iu(e.scene,e.camera)),e.controls=new{trackball:Bc,orbit:Vc,fly:qc}[r](e.camera,e.renderer.domElement),"fly"===r&&(e.controls.movementSpeed=300,e.controls.rollSpeed=Math.PI/6,e.controls.dragToLook=!0),"trackball"!==r&&"orbit"!==r||(e.controls.minDistance=.1,e.controls.maxDistance=e.skyRadius,e.controls.addEventListener("start",(function(){e.controlsEngaged=!0})),e.controls.addEventListener("change",(function(){e.controlsEngaged&&(e.controlsDragging=!0)})),e.controls.addEventListener("end",(function(){e.controlsEngaged=!1,e.controlsDragging=!1}))),[e.renderer,e.postProcessingComposer].concat(Ju(e.extraRenderers)).forEach((function(t){return t.setSize(e.width,e.height)})),e.camera.aspect=e.width/e.height,e.camera.updateProjectionMatrix(),e.camera.position.z=1e3,e.scene.add(e.skysphere=new th.Mesh),e.skysphere.visible=!1,e.loadComplete=e.scene.visible=!u,window.scene=e.scene},update:function(t,e){if(t.width&&t.height&&(e.hasOwnProperty("width")||e.hasOwnProperty("height"))&&(t.container.style.width="".concat(t.width,"px"),t.container.style.height="".concat(t.height,"px"),[t.renderer,t.postProcessingComposer].concat(Ju(t.extraRenderers)).forEach((function(e){return e.setSize(t.width,t.height)})),t.camera.aspect=t.width/t.height,t.camera.updateProjectionMatrix()),e.hasOwnProperty("skyRadius")&&t.skyRadius&&(t.controls.hasOwnProperty("maxDistance")&&e.skyRadius&&(t.controls.maxDistance=Math.min(t.controls.maxDistance,t.skyRadius)),t.camera.far=2.5*t.skyRadius,t.camera.updateProjectionMatrix(),t.skysphere.geometry=new th.SphereGeometry(t.skyRadius)),e.hasOwnProperty("backgroundColor")){var n=Tu(t.backgroundColor).alpha;void 0===n&&(n=1),t.renderer.setClearColor(new th.Color(Ou(1,t.backgroundColor)),n)}function i(){t.loadComplete=t.scene.visible=!0}e.hasOwnProperty("backgroundImageUrl")&&(t.backgroundImageUrl?(new th.TextureLoader).load(t.backgroundImageUrl,(function(e){t.skysphere.material=new th.MeshBasicMaterial({map:e,side:th.BackSide}),t.skysphere.visible=!0,t.onBackgroundImageLoaded&&setTimeout(t.onBackgroundImageLoaded),!t.loadComplete&&i()})):(t.skysphere.visible=!1,t.skysphere.material.map=null,!t.loadComplete&&i())),e.hasOwnProperty("showNavInfo")&&(t.navInfo.style.display=t.showNavInfo?null:"none"),e.hasOwnProperty("objects")&&((e.objects||[]).forEach((function(e){return t.scene.remove(e)})),t.objects.forEach((function(e){return t.scene.add(e)})))}});function nh(t,e){var n=new e;return{linkProp:function(e){return{default:n[e](),onChange:function(n,i){i[t][e](n)},triggerUpdate:!1}},linkMethod:function(e){return function(n){for(var i=n[t],r=arguments.length,a=new Array(r>1?r-1:0),o=1;o3?r-3:0),o=3;o1&&(z=s.y+s.vy),u>2&&(p=s.z+s.vz),o.visit(m);function m(n,t,e,r,i,o,a){var c=[t,e,r,i,o,a],l=c[0],h=c[1],y=c[2],g=c[u],q=c[u+1],N=c[u+2],m=n.data,A=n.r,b=M+A;if(!m)return l>x+b||g1&&(h>z+b||q2&&(y>p+b||Ns.index){var k=x-m.x-m.vx,E=u>1?z-m.y-m.vy:0,j=u>2?p-m.z-m.vz:0,D=k*k+E*E+j*j;D1&&0===E&&(D+=(E=f(v))*E),u>2&&0===j&&(D+=(j=f(v))*j),D=(b-(D=Math.sqrt(D)))/D*d,s.vx+=(k*=D)*(b=(A*=A)/(w+A)),u>1&&(s.vy+=(E*=D)*b),u>2&&(s.vz+=(j*=D)*b),m.vx-=k*(b=1-b),u>1&&(m.vy-=E*b),u>2&&(m.vz-=j*b))}}}function g(n){if(n.data)return n.r=h[n.data.index];for(var t=n.r=0;tn.r&&(n.r=n[t].r)}function x(){if(i){var t,e,r=i.length;for(h=new Array(r),t=0;t"function"==typeof n))||Math.random,u=t.find((n=>[1,2,3].includes(n)))||2,x()},s.iterations=function(n){return arguments.length?(y=+n,s):y},s.strength=function(n){return arguments.length?(d=+n,s):d},s.radius=function(t){return arguments.length?(n="function"==typeof t?t:o(+t),x(),s):n},s},n.forceLink=function(n){var t,e,r,i,u,a,c,l=h,d=function(n){return 1/Math.min(u[n.source.index],u[n.target.index])},y=o(30),s=1;function g(r){for(var u=0,o=n.length;u1&&(z=v.y+v.vy-h.y-h.vy||f(c)),i>2&&(p=v.z+v.vz-h.z-h.vz||f(c)),x*=d=((d=Math.sqrt(x*x+z*z+p*p))-e[g])/d*r*t[g],z*=d,p*=d,v.vx-=x*(y=a[g]),i>1&&(v.vy-=z*y),i>2&&(v.vz-=p*y),h.vx+=x*(y=1-y),i>1&&(h.vy+=z*y),i>2&&(h.vz+=p*y)}function x(){if(r){var i,o,f=r.length,c=n.length,h=new Map(r.map(((n,t)=>[l(n,t,r),n])));for(i=0,u=new Array(f);i"function"==typeof n))||Math.random,i=t.find((n=>[1,2,3].includes(n)))||2,x()},g.links=function(t){return arguments.length?(n=t,x(),g):n},g.id=function(n){return arguments.length?(l=n,g):l},g.iterations=function(n){return arguments.length?(s=+n,g):s},g.strength=function(n){return arguments.length?(d="function"==typeof n?n:o(+n),z(),g):d},g.distance=function(n){return arguments.length?(y="function"==typeof n?n:o(+n),p(),g):y},g},n.forceManyBody=function(){var n,i,u,a,c,l,h=o(-30),v=1,d=1/0,x=.81;function z(o){var f,a=n.length,l=(1===i?t.binarytree(n,y):2===i?e.quadtree(n,y,s):3===i?r.octree(n,y,s,g):null).visitAfter(M);for(c=o,f=0;f1&&(n.y=u/c),i>2&&(n.z=o/c)}else{(t=n).x=t.data.x,i>1&&(t.y=t.data.y),i>2&&(t.z=t.data.z);do{a+=l[t.data.index]}while(t=t.next)}n.value=a}function w(n,t,e,r,o){if(!n.value)return!0;var h=[e,r,o][i-1],y=n.x-u.x,s=i>1?n.y-u.y:0,g=i>2?n.z-u.z:0,z=h-t,p=y*y+s*s+g*g;if(z*z/x1&&0===s&&(p+=(s=f(a))*s),i>2&&0===g&&(p+=(g=f(a))*g),p1&&(u.vy+=s*n.value*c/p),i>2&&(u.vz+=g*n.value*c/p)),!0;if(!(n.length||p>=d)){(n.data!==u||n.next)&&(0===y&&(p+=(y=f(a))*y),i>1&&0===s&&(p+=(s=f(a))*s),i>2&&0===g&&(p+=(g=f(a))*g),p1&&(u.vy+=s*z),i>2&&(u.vz+=g*z))}while(n=n.next)}}return z.initialize=function(t,...e){n=t,a=e.find((n=>"function"==typeof n))||Math.random,i=e.find((n=>[1,2,3].includes(n)))||2,p()},z.strength=function(n){return arguments.length?(h="function"==typeof n?n:o(+n),p(),z):h},z.distanceMin=function(n){return arguments.length?(v=n*n,z):Math.sqrt(v)},z.distanceMax=function(n){return arguments.length?(d=n*n,z):Math.sqrt(d)},z.theta=function(n){return arguments.length?(x=n*n,z):Math.sqrt(x)},z},n.forceRadial=function(n,t,e,r){var i,u,f,a,c=o(.1);function l(n){for(var o=0,c=i.length;o1&&(l.vy+=v*s),u>2&&(l.vz+=d*s)}}function h(){if(i){var t,e=i.length;for(f=new Array(e),a=new Array(e),t=0;t[1,2,3].includes(n)))||2,h()},l.strength=function(n){return arguments.length?(c="function"==typeof n?n:o(+n),h(),l):c},l.radius=function(t){return arguments.length?(n="function"==typeof t?t:o(+t),h(),l):n},l.x=function(n){return arguments.length?(t=+n,l):t},l.y=function(n){return arguments.length?(e=+n,l):e},l.z=function(n){return arguments.length?(r=+n,l):r},l},n.forceSimulation=function(n,t){t=t||2;var e,r=Math.min(3,Math.max(1,Math.round(t))),o=1,f=.001,a=1-Math.pow(f,1/300),c=0,l=.6,h=new Map,v=u.timer(g),y=i.dispatch("tick","end"),s=function(){let n=1;return()=>(n=(1664525*n+1013904223)%d)/d}();function g(){p(),y.call("tick",e),o1&&(null==u.fy?u.y+=u.vy*=l:(u.y=u.fy,u.vy=0)),r>2&&(null==u.fz?u.z+=u.vz*=l:(u.z=u.fz,u.vz=0));return e}function M(){for(var t,e=0,i=n.length;e1&&isNaN(t.y)||r>2&&isNaN(t.z)){var u=10*(r>2?Math.cbrt(.5+e):r>1?Math.sqrt(.5+e):e),o=e*x,f=e*z;1===r?t.x=u:2===r?(t.x=u*Math.cos(o),t.y=u*Math.sin(o)):(t.x=u*Math.sin(o)*Math.cos(f),t.y=u*Math.cos(o),t.z=u*Math.sin(o)*Math.sin(f))}(isNaN(t.vx)||r>1&&isNaN(t.vy)||r>2&&isNaN(t.vz))&&(t.vx=0,r>1&&(t.vy=0),r>2&&(t.vz=0))}}function w(t){return t.initialize&&t.initialize(n,s,r),t}return null==n&&(n=[]),M(),e={tick:p,restart:function(){return v.restart(g),e},stop:function(){return v.stop(),e},numDimensions:function(n){return arguments.length?(r=Math.min(3,Math.max(1,Math.round(n))),h.forEach(w),e):r},nodes:function(t){return arguments.length?(n=t,M(),h.forEach(w),e):n},alpha:function(n){return arguments.length?(o=+n,e):o},alphaMin:function(n){return arguments.length?(f=+n,e):f},alphaDecay:function(n){return arguments.length?(a=+n,e):+a},alphaTarget:function(n){return arguments.length?(c=+n,e):c},velocityDecay:function(n){return arguments.length?(l=1-n,e):1-l},randomSource:function(n){return arguments.length?(s=n,h.forEach(w),e):s},force:function(n,t){return arguments.length>1?(null==t?h.delete(n):h.set(n,w(t)),e):h.get(n)},find:function(){var t,e,i,u,o,f,a=Array.prototype.slice.call(arguments),c=a.shift()||0,l=(r>1?a.shift():null)||0,h=(r>2?a.shift():null)||0,v=a.shift()||1/0,d=0,y=n.length;for(v*=v,d=0;d1?(y.on(n,t),e):y.on(n)}}},n.forceX=function(n){var t,e,r,i=o(.1);function u(n){for(var i,u=0,o=t.length;ut.length)&&(e=t.length);for(var r=0,i=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"rgba(255, 255, 255, 1)";return e(this,l),(t=c.call(this,new f.SpriteMaterial))._text="".concat(r),t._textHeight=i,t._color=n,t._backgroundColor=!1,t._padding=0,t._borderWidth=0,t._borderRadius=0,t._borderColor="white",t._strokeWidth=0,t._strokeColor="white",t._fontFace="Arial",t._fontSize=90,t._fontWeight="normal",t._canvas=document.createElement("canvas"),t._genCanvas(),t}return i=l,(o=[{key:"text",get:function(){return this._text},set:function(t){this._text=t,this._genCanvas()}},{key:"textHeight",get:function(){return this._textHeight},set:function(t){this._textHeight=t,this._genCanvas()}},{key:"color",get:function(){return this._color},set:function(t){this._color=t,this._genCanvas()}},{key:"backgroundColor",get:function(){return this._backgroundColor},set:function(t){this._backgroundColor=t,this._genCanvas()}},{key:"padding",get:function(){return this._padding},set:function(t){this._padding=t,this._genCanvas()}},{key:"borderWidth",get:function(){return this._borderWidth},set:function(t){this._borderWidth=t,this._genCanvas()}},{key:"borderRadius",get:function(){return this._borderRadius},set:function(t){this._borderRadius=t,this._genCanvas()}},{key:"borderColor",get:function(){return this._borderColor},set:function(t){this._borderColor=t,this._genCanvas()}},{key:"fontFace",get:function(){return this._fontFace},set:function(t){this._fontFace=t,this._genCanvas()}},{key:"fontSize",get:function(){return this._fontSize},set:function(t){this._fontSize=t,this._genCanvas()}},{key:"fontWeight",get:function(){return this._fontWeight},set:function(t){this._fontWeight=t,this._genCanvas()}},{key:"strokeWidth",get:function(){return this._strokeWidth},set:function(t){this._strokeWidth=t,this._genCanvas()}},{key:"strokeColor",get:function(){return this._strokeColor},set:function(t){this._strokeColor=t,this._genCanvas()}},{key:"_genCanvas",value:function(){var t=this,e=this._canvas,r=e.getContext("2d"),i=Array.isArray(this.borderWidth)?this.borderWidth:[this.borderWidth,this.borderWidth],n=i.map((function(e){return e*t.fontSize*.1})),o=(Array.isArray(this.borderRadius)?this.borderRadius:[this.borderRadius,this.borderRadius,this.borderRadius,this.borderRadius]).map((function(e){return e*t.fontSize*.1})),a=Array.isArray(this.padding)?this.padding:[this.padding,this.padding],u=a.map((function(e){return e*t.fontSize*.1})),c=this.text.split("\n"),l="".concat(this.fontWeight," ").concat(this.fontSize,"px ").concat(this.fontFace);r.font=l;var d=Math.max.apply(Math,s(c.map((function(t){return r.measureText(t).width})))),g=this.fontSize*c.length;if(e.width=d+2*n[0]+2*u[0],e.height=g+2*n[1]+2*u[1],this.borderWidth){if(r.strokeStyle=this.borderColor,n[0]){var p=n[0]/2;r.lineWidth=n[0],r.beginPath(),r.moveTo(p,o[0]),r.lineTo(p,e.height-o[3]),r.moveTo(e.width-p,o[1]),r.lineTo(e.width-p,e.height-o[2]),r.stroke()}if(n[1]){var y=n[1]/2;r.lineWidth=n[1],r.beginPath(),r.moveTo(Math.max(n[0],o[0]),y),r.lineTo(e.width-Math.max(n[0],o[1]),y),r.moveTo(Math.max(n[0],o[3]),e.height-y),r.lineTo(e.width-Math.max(n[0],o[2]),e.height-y),r.stroke()}if(this.borderRadius){var b=Math.max.apply(Math,s(n)),v=b/2;r.lineWidth=b,r.beginPath(),[!!o[0]&&[o[0],v,v,o[0]],!!o[1]&&[e.width-o[1],e.width-v,v,o[1]],!!o[2]&&[e.width-o[2],e.width-v,e.height-v,e.height-o[2]],!!o[3]&&[o[3],v,e.height-v,e.height-o[3]]].filter((function(t){return t})).forEach((function(t){var e=h(t,4),i=e[0],n=e[1],o=e[2],a=e[3];r.moveTo(i,o),r.quadraticCurveTo(n,o,n,a)})),r.stroke()}}this.backgroundColor&&(r.fillStyle=this.backgroundColor,this.borderRadius?(r.beginPath(),r.moveTo(n[0],o[0]),[[n[0],o[0],e.width-o[1],n[1],n[1],n[1]],[e.width-n[0],e.width-n[0],e.width-n[0],n[1],o[1],e.height-o[2]],[e.width-n[0],e.width-o[2],o[3],e.height-n[1],e.height-n[1],e.height-n[1]],[n[0],n[0],n[0],e.height-n[1],e.height-o[3],o[0]]].forEach((function(t){var e=h(t,6),i=e[0],n=e[1],o=e[2],a=e[3],s=e[4],u=e[5];r.quadraticCurveTo(i,a,n,s),r.lineTo(o,u)})),r.closePath(),r.fill()):r.fillRect(n[0],n[1],e.width-2*n[0],e.height-2*n[1])),r.translate.apply(r,s(n)),r.translate.apply(r,s(u)),r.font=l,r.fillStyle=this.color,r.textBaseline="bottom";var _=this.strokeWidth>0;_&&(r.lineWidth=this.strokeWidth*this.fontSize/10,r.strokeStyle=this.strokeColor),c.forEach((function(e,i){var n=(d-r.measureText(e).width)/2,o=(i+1)*t.fontSize;_&&r.strokeText(e,n,o),r.fillText(e,n,o)})),this.material.map&&this.material.map.dispose();var m=this.material.map=new f.Texture(e);m.minFilter=f.LinearFilter,m.needsUpdate=!0;var w=this.textHeight*c.length+2*i[1]+2*a[1];this.scale.set(w*e.width/e.height,w,0)}},{key:"clone",value:function(){return new this.constructor(this.text,this.textHeight,this.color).copy(this)}},{key:"copy",value:function(t){return f.Sprite.prototype.copy.call(this,t),this.color=t.color,this.backgroundColor=t.backgroundColor,this.padding=t.padding,this.borderWidth=t.borderWidth,this.borderColor=t.borderColor,this.fontFace=t.fontFace,this.fontSize=t.fontSize,this.fontWeight=t.fontWeight,this.strokeWidth=t.strokeWidth,this.strokeColor=t.strokeColor,this}}])&&r(i.prototype,o),u&&r(i,u),Object.defineProperty(i,"prototype",{writable:!1}),l}(f.Sprite);return l})); diff --git a/galaxy/static/galaxy/js/three.min.js b/galaxy/static/galaxy/js/three.min.js new file mode 100644 index 00000000..c3724c3a --- /dev/null +++ b/galaxy/static/galaxy/js/three.min.js @@ -0,0 +1,6 @@ +/** + * @license + * Copyright 2010-2022 Three.js Authors + * SPDX-License-Identifier: MIT + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="148",i=100,n=300,r=301,s=302,a=303,o=304,l=306,c=1e3,h=1001,u=1002,d=1003,p=1004,m=1005,f=1006,g=1007,v=1008,x=1009,_=1012,y=1014,M=1015,b=1016,S=1020,w=1023,T=1026,A=1027,E=33776,C=33777,L=33778,R=33779,P=35840,I=35841,D=35842,N=35843,O=37492,z=37496,U=37808,B=37809,F=37810,k=37811,G=37812,V=37813,H=37814,W=37815,j=37816,q=37817,X=37818,Y=37819,Z=37820,J=37821,K=36492,$=2300,Q=2301,tt=2302,et=2400,it=2401,nt=2402,rt=2500,st=2501,at=3e3,ot=3001,lt="srgb",ct="srgb-linear",ht=7680,ut=35044,dt="300 es",pt=1035;class mt{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const i=this._listeners[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const i=e.slice(0);for(let e=0,n=i.length;e>8&255]+ft[t>>16&255]+ft[t>>24&255]+"-"+ft[255&e]+ft[e>>8&255]+"-"+ft[e>>16&15|64]+ft[e>>24&255]+"-"+ft[63&i|128]+ft[i>>8&255]+"-"+ft[i>>16&255]+ft[i>>24&255]+ft[255&n]+ft[n>>8&255]+ft[n>>16&255]+ft[n>>24&255]).toLowerCase()}function yt(t,e,i){return Math.max(e,Math.min(i,t))}function Mt(t,e){return(t%e+e)%e}function bt(t,e,i){return(1-i)*t+i*e}function St(t){return 0==(t&t-1)&&0!==t}function wt(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function Tt(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function At(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Et(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}var Ct=Object.freeze({__proto__:null,DEG2RAD:vt,RAD2DEG:xt,generateUUID:_t,clamp:yt,euclideanModulo:Mt,mapLinear:function(t,e,i,n,r){return n+(t-e)*(r-n)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:bt,damp:function(t,e,i,n){return bt(t,e,1-Math.exp(-i*n))},pingpong:function(t,e=1){return e-Math.abs(Mt(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(gt=t);let e=gt+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*vt},radToDeg:function(t){return t*xt},isPowerOfTwo:St,ceilPowerOfTwo:wt,floorPowerOfTwo:Tt,setQuaternionFromProperEuler:function(t,e,i,n,r){const s=Math.cos,a=Math.sin,o=s(i/2),l=a(i/2),c=s((e+n)/2),h=a((e+n)/2),u=s((e-n)/2),d=a((e-n)/2),p=s((n-e)/2),m=a((n-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Et,denormalize:At});class Lt{constructor(t=0,e=0){Lt.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Rt{constructor(){Rt.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1]}set(t,e,i,n,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=n,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],c=i[4],h=i[7],u=i[2],d=i[5],p=i[8],m=n[0],f=n[3],g=n[6],v=n[1],x=n[4],_=n[7],y=n[2],M=n[5],b=n[8];return r[0]=s*m+a*v+o*y,r[3]=s*f+a*x+o*M,r[6]=s*g+a*_+o*b,r[1]=l*m+c*v+h*y,r[4]=l*f+c*x+h*M,r[7]=l*g+c*_+h*b,r[2]=u*m+d*v+p*y,r[5]=u*f+d*x+p*M,r[8]=u*g+d*_+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-i*r*c+i*a*o+n*r*l-n*s*o}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=h*m,t[1]=(n*l-c*i)*m,t[2]=(a*i-n*s)*m,t[3]=u*m,t[4]=(c*e-n*o)*m,t[5]=(n*r-a*e)*m,t[6]=d*m,t[7]=(i*o-l*e)*m,t[8]=(s*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,n,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(i*o,i*l,-i*(o*s+l*a)+s+t,-n*l,n*o,-n*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(Pt.makeScale(t,e)),this}rotate(t){return this.premultiply(Pt.makeRotation(-t)),this}translate(t,e){return this.premultiply(Pt.makeTranslation(t,e)),this}makeTranslation(t,e){return this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const Pt=new Rt;function It(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Dt={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Nt(t,e){return new Dt[t](e)}function Ot(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function zt(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ut(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}const Bt={[lt]:{[ct]:zt},[ct]:{[lt]:Ut}},Ft={legacyMode:!0,get workingColorSpace(){return ct},set workingColorSpace(t){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(t,e,i){if(this.legacyMode||e===i||!e||!i)return t;if(Bt[e]&&void 0!==Bt[e][i]){const n=Bt[e][i];return t.r=n(t.r),t.g=n(t.g),t.b=n(t.b),t}throw new Error("Unsupported color space conversion.")},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)}},kt={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Gt={r:0,g:0,b:0},Vt={h:0,s:0,l:0},Ht={h:0,s:0,l:0};function Wt(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}function jt(t,e){return e.r=t.r,e.g=t.g,e.b=t.b,e}class qt{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=lt){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,Ft.toWorkingColorSpace(this,e),this}setRGB(t,e,i,n=Ft.workingColorSpace){return this.r=t,this.g=e,this.b=i,Ft.toWorkingColorSpace(this,n),this}setHSL(t,e,i,n=Ft.workingColorSpace){if(t=Mt(t,1),e=yt(e,0,1),i=yt(i,0,1),0===e)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=Wt(r,n,t+1/3),this.g=Wt(r,n,t),this.b=Wt(r,n,t-1/3)}return Ft.toWorkingColorSpace(this,n),this}setStyle(t,e=lt){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const r=n[1],s=n[2];switch(r){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(s))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,Ft.toWorkingColorSpace(this,e),i(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(s))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,Ft.toWorkingColorSpace(this,e),i(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(s)){const n=parseFloat(t[1])/360,r=parseFloat(t[2])/100,s=parseFloat(t[3])/100;return i(t[4]),this.setHSL(n,r,s,e)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=n[1],i=t.length;if(3===i)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,Ft.toWorkingColorSpace(this,e),this;if(6===i)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,Ft.toWorkingColorSpace(this,e),this}return t&&t.length>0?this.setColorName(t,e):this}setColorName(t,e=lt){const i=kt[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=zt(t.r),this.g=zt(t.g),this.b=zt(t.b),this}copyLinearToSRGB(t){return this.r=Ut(t.r),this.g=Ut(t.g),this.b=Ut(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=lt){return Ft.fromWorkingColorSpace(jt(this,Gt),t),yt(255*Gt.r,0,255)<<16^yt(255*Gt.g,0,255)<<8^yt(255*Gt.b,0,255)<<0}getHexString(t=lt){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=Ft.workingColorSpace){Ft.fromWorkingColorSpace(jt(this,Gt),e);const i=Gt.r,n=Gt.g,r=Gt.b,s=Math.max(i,n,r),a=Math.min(i,n,r);let o,l;const c=(a+s)/2;if(a===s)o=0,l=0;else{const t=s-a;switch(l=c<=.5?t/(s+a):t/(2-s-a),s){case i:o=(n-r)/t+(n2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Ot("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const n=i.getImageData(0,0,t.width,t.height),r=n.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==n)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case c:t.x=t.x-Math.floor(t.x);break;case h:t.x=t.x<0?0:1;break;case u:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case c:t.y=t.y-Math.floor(t.y);break;case h:t.y=t.y<0?0:1;break;case u:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}}$t.DEFAULT_IMAGE=null,$t.DEFAULT_MAPPING=n,$t.DEFAULT_ANISOTROPY=1;class Qt{constructor(t=0,e=0,i=0,n=1){Qt.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=n}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,n,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?o=0?1:-1,n=1-e*e;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,e*i);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,i,n,r,s){const a=i[n],o=i[n+1],l=i[n+2],c=i[n+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){const i=t._x,n=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(i/2),c=a(n/2),h=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],n=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=i+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-n)*t}else if(i>a&&i>h){const t=2*Math.sqrt(1+i-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(n+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-i-h);this._w=(r-l)/t,this._x=(n+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-i-a);this._w=(s-n)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(yt(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const n=Math.min(1,e/i);return this.slerp(t,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,n=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=i*c+s*a+n*l-r*o,this._y=n*c+s*o+r*a-i*l,this._z=r*c+s*l+i*o-n*a,this._w=s*c-i*a-n*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*t._w+i*t._x+n*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*i+e*this._x,this._y=t*n+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=i*h+this._x*u,this._y=n*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=Math.random(),e=Math.sqrt(1-t),i=Math.sqrt(t),n=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(n),i*Math.sin(r),i*Math.cos(r),e*Math.sin(n))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class re{constructor(t=0,e=0,i=0){re.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(ae.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ae.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*n-a*i,c=o*i+a*e-r*n,h=o*n+r*i-s*e,u=-r*e-s*i-a*n;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,n=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return se.copy(this).projectOnVector(t),this.sub(se)}reflect(t){return this.sub(se.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(yt(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=2*(Math.random()-.5),e=Math.random()*Math.PI*2,i=Math.sqrt(1-t**2);return this.x=i*Math.cos(e),this.y=i*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const se=new re,ae=new ne;class oe{constructor(t=new re(1/0,1/0,1/0),e=new re(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,i,n),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,ce),ce.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ve),xe.subVectors(this.max,ve),ue.subVectors(t.a,ve),de.subVectors(t.b,ve),pe.subVectors(t.c,ve),me.subVectors(de,ue),fe.subVectors(pe,de),ge.subVectors(ue,pe);let e=[0,-me.z,me.y,0,-fe.z,fe.y,0,-ge.z,ge.y,me.z,0,-me.x,fe.z,0,-fe.x,ge.z,0,-ge.x,-me.y,me.x,0,-fe.y,fe.x,0,-ge.y,ge.x,0];return!!Me(e,ue,de,pe,xe)&&(e=[1,0,0,0,1,0,0,0,1],!!Me(e,ue,de,pe,xe)&&(_e.crossVectors(me,fe),e=[_e.x,_e.y,_e.z],Me(e,ue,de,pe,xe)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return ce.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return this.getCenter(t.center),t.radius=.5*this.getSize(ce).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(le[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),le[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),le[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),le[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),le[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),le[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),le[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),le[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(le)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const le=[new re,new re,new re,new re,new re,new re,new re,new re],ce=new re,he=new oe,ue=new re,de=new re,pe=new re,me=new re,fe=new re,ge=new re,ve=new re,xe=new re,_e=new re,ye=new re;function Me(t,e,i,n,r){for(let s=0,a=t.length-3;s<=a;s+=3){ye.fromArray(t,s);const a=r.x*Math.abs(ye.x)+r.y*Math.abs(ye.y)+r.z*Math.abs(ye.z),o=e.dot(ye),l=i.dot(ye),c=n.dot(ye);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const be=new oe,Se=new re,we=new re;class Te{constructor(t=new re,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):be.setFromPoints(t).getCenter(i);let n=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Se.subVectors(t,this.center);const e=Se.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Se,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(we.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Se.copy(t.center).add(we)),this.expandByPoint(Se.copy(t.center).sub(we))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Ae=new re,Ee=new re,Ce=new re,Le=new re,Re=new re,Pe=new re,Ie=new re;class De{constructor(t=new re,e=new re(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Ae)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Ae.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Ae.copy(this.direction).multiplyScalar(e).add(this.origin),Ae.distanceToSquared(t))}distanceSqToSegment(t,e,i,n){Ee.copy(t).add(e).multiplyScalar(.5),Ce.copy(e).sub(t).normalize(),Le.copy(this.origin).sub(Ee);const r=.5*t.distanceTo(e),s=-this.direction.dot(Ce),a=Le.dot(this.direction),o=-Le.dot(Ce),l=Le.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return i&&i.copy(this.direction).multiplyScalar(h).add(this.origin),n&&n.copy(Ce).multiplyScalar(u).add(Ee),d}intersectSphere(t,e){Ae.subVectors(t.center,this.origin);const i=Ae.dot(this.direction),n=Ae.dot(Ae)-i*i,r=t.radius*t.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,n,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(i=(t.min.x-u.x)*l,n=(t.max.x-u.x)*l):(i=(t.max.x-u.x)*l,n=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),i>s||r>n?null:((r>i||isNaN(i))&&(i=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o=0?i:n,e)))}intersectsBox(t){return null!==this.intersectBox(t,Ae)}intersectTriangle(t,e,i,n,r){Re.subVectors(e,t),Pe.subVectors(i,t),Ie.crossVectors(Re,Pe);let s,a=this.direction.dot(Ie);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Le.subVectors(this.origin,t);const o=s*this.direction.dot(Pe.crossVectors(Le,Pe));if(o<0)return null;const l=s*this.direction.dot(Re.cross(Le));if(l<0)return null;if(o+l>a)return null;const c=-s*Le.dot(Ie);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Ne{constructor(){Ne.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}set(t,e,i,n,r,s,a,o,l,c,h,u,d,p,m,f){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Ne).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,n=1/Oe.setFromMatrixColumn(t,0).length(),r=1/Oe.setFromMatrixColumn(t,1).length(),s=1/Oe.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),l=Math.sin(n),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=i+n*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=n+i*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t+r*a,e[4]=n*a-i,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=i*a-n,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,i=o*h,n=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=n+i*a,e[1]=i+n*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,i=s*h,n=a*c,r=a*h;e[0]=o*c,e[4]=n*l-i,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=i*l-n,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=n*h+i,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=i*h+n,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,i=s*l,n=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=i*h-n,e[2]=n*h-i,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ue,t,Be)}lookAt(t,e,i){const n=this.elements;return Ge.subVectors(t,e),0===Ge.lengthSq()&&(Ge.z=1),Ge.normalize(),Fe.crossVectors(i,Ge),0===Fe.lengthSq()&&(1===Math.abs(i.z)?Ge.x+=1e-4:Ge.z+=1e-4,Ge.normalize(),Fe.crossVectors(i,Ge)),Fe.normalize(),ke.crossVectors(Ge,Fe),n[0]=Fe.x,n[4]=ke.x,n[8]=Ge.x,n[1]=Fe.y,n[5]=ke.y,n[9]=Ge.y,n[2]=Fe.z,n[6]=ke.z,n[10]=Ge.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],a=i[4],o=i[8],l=i[12],c=i[1],h=i[5],u=i[9],d=i[13],p=i[2],m=i[6],f=i[10],g=i[14],v=i[3],x=i[7],_=i[11],y=i[15],M=n[0],b=n[4],S=n[8],w=n[12],T=n[1],A=n[5],E=n[9],C=n[13],L=n[2],R=n[6],P=n[10],I=n[14],D=n[3],N=n[7],O=n[11],z=n[15];return r[0]=s*M+a*T+o*L+l*D,r[4]=s*b+a*A+o*R+l*N,r[8]=s*S+a*E+o*P+l*O,r[12]=s*w+a*C+o*I+l*z,r[1]=c*M+h*T+u*L+d*D,r[5]=c*b+h*A+u*R+d*N,r[9]=c*S+h*E+u*P+d*O,r[13]=c*w+h*C+u*I+d*z,r[2]=p*M+m*T+f*L+g*D,r[6]=p*b+m*A+f*R+g*N,r[10]=p*S+m*E+f*P+g*O,r[14]=p*w+m*C+f*I+g*z,r[3]=v*M+x*T+_*L+y*D,r[7]=v*b+x*A+_*R+y*N,r[11]=v*S+x*E+_*P+y*O,r[15]=v*w+x*C+_*I+y*z,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-n*l*h-r*a*u+i*l*u+n*a*d-i*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-n*s*d+n*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+i*s*d+r*a*c-i*l*c)+t[15]*(-n*a*c-e*o*h+e*a*u+n*s*h-i*s*u+i*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,x=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,_=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,y=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,M=e*v+i*x+n*_+r*y;if(0===M)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/M;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*n*d+i*f*d+h*n*g-i*u*g)*b,t[2]=(a*f*r-m*o*r+m*n*l-i*f*l-a*n*g+i*o*g)*b,t[3]=(h*o*r-a*u*r-h*n*l+i*u*l+a*n*d-i*o*d)*b,t[4]=x*b,t[5]=(c*f*r-p*u*r+p*n*d-e*f*d-c*n*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*n*l+e*f*l+s*n*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*n*l-e*u*l-s*n*d+e*o*d)*b,t[8]=_*b,t[9]=(p*h*r-c*m*r-p*i*d+e*m*d+c*i*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*i*l-e*m*l-s*i*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*i*l+e*h*l+s*i*d-e*a*d)*b,t[12]=y*b,t[13]=(c*m*n-p*h*n+p*i*u-e*m*u-c*i*f+e*h*f)*b,t[14]=(p*a*n-s*m*n-p*i*o+e*m*o+s*i*f-e*a*f)*b,t[15]=(s*h*n-c*a*n+c*i*o-e*h*o-s*i*u+e*a*u)*b,this}scale(t){const e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))}makeTranslation(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+i,l*a-n*o,l*o+n*a,0,l*a+n*o,c*a+i,c*o-n*s,0,l*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,n,r,s){return this.set(1,i,r,0,t,1,s,0,e,n,1,0,0,0,0,1),this}compose(t,e,i){const n=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,x=o*c,_=o*h,y=i.x,M=i.y,b=i.z;return n[0]=(1-(m+g))*y,n[1]=(d+_)*y,n[2]=(p-x)*y,n[3]=0,n[4]=(d-_)*M,n[5]=(1-(u+g))*M,n[6]=(f+v)*M,n[7]=0,n[8]=(p+x)*b,n[9]=(f-v)*b,n[10]=(1-(u+m))*b,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this}decompose(t,e,i){const n=this.elements;let r=Oe.set(n[0],n[1],n[2]).length();const s=Oe.set(n[4],n[5],n[6]).length(),a=Oe.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],ze.copy(this);const o=1/r,l=1/s,c=1/a;return ze.elements[0]*=o,ze.elements[1]*=o,ze.elements[2]*=o,ze.elements[4]*=l,ze.elements[5]*=l,ze.elements[6]*=l,ze.elements[8]*=c,ze.elements[9]*=c,ze.elements[10]*=c,e.setFromRotationMatrix(ze),i.x=r,i.y=s,i.z=a,this}makePerspective(t,e,i,n,r,s){const a=this.elements,o=2*r/(e-t),l=2*r/(i-n),c=(e+t)/(e-t),h=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,n,r,s){const a=this.elements,o=1/(e-t),l=1/(i-n),c=1/(s-r),h=(e+t)*o,u=(i+n)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Oe=new re,ze=new Ne,Ue=new re(0,0,0),Be=new re(1,1,1),Fe=new re,ke=new re,Ge=new re,Ve=new Ne,He=new ne;class We{constructor(t=0,e=0,i=0,n=We.DefaultOrder){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=n}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,n=this._order){return this._x=t,this._y=e,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const n=t.elements,r=n[0],s=n[4],a=n[8],o=n[1],l=n[5],c=n[9],h=n[2],u=n[6],d=n[10];switch(e){case"XYZ":this._y=Math.asin(yt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-yt(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(yt(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-yt(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(yt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-yt(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Ve.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Ve,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return He.setFromEuler(this),this.setFromQuaternion(He,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}toVector3(){console.error("THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead")}}We.DefaultOrder="XYZ",We.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class je{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(i=i.concat(r))}return i}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(Ke,t,$e),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(Ke,Qe,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let i=0,n=e.length;i0&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(n.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?n.background=this.background.toJSON():this.background.isTexture&&(n.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(n.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){n.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,n=i.length;e0){n.children=[];for(let e=0;e0){n.animations=[];for(let e=0;e0&&(i.geometries=e),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),l.length>0&&(i.skeletons=l),c.length>0&&(i.animations=c),h.length>0&&(i.nodes=h)}return i.object=n,i;function s(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(t,e,i,n,r){ai.subVectors(n,e),oi.subVectors(i,e),li.subVectors(t,e);const s=ai.dot(ai),a=ai.dot(oi),o=ai.dot(li),l=oi.dot(oi),c=oi.dot(li),h=s*l-a*a;if(0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,n){return this.getBarycoord(t,e,i,n,ci),ci.x>=0&&ci.y>=0&&ci.x+ci.y<=1}static getUV(t,e,i,n,r,s,a,o){return this.getBarycoord(t,e,i,n,ci),o.set(0,0),o.addScaledVector(r,ci.x),o.addScaledVector(s,ci.y),o.addScaledVector(a,ci.z),o}static isFrontFacing(t,e,i,n){return ai.subVectors(i,e),oi.subVectors(t,e),ai.cross(oi).dot(n)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this}setFromAttributeAndIndices(t,e,i,n){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,n),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return ai.subVectors(this.c,this.b),oi.subVectors(this.a,this.b),.5*ai.cross(oi).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return gi.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return gi.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,i,n,r){return gi.getUV(t,this.a,this.b,this.c,e,i,n,r)}containsPoint(t){return gi.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return gi.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,n=this.b,r=this.c;let s,a;hi.subVectors(n,i),ui.subVectors(r,i),pi.subVectors(t,i);const o=hi.dot(pi),l=ui.dot(pi);if(o<=0&&l<=0)return e.copy(i);mi.subVectors(t,n);const c=hi.dot(mi),h=ui.dot(mi);if(c>=0&&h<=c)return e.copy(n);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(i).addScaledVector(hi,s);fi.subVectors(t,r);const d=hi.dot(fi),p=ui.dot(fi);if(p>=0&&d<=p)return e.copy(r);const m=d*l-o*p;if(m<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(i).addScaledVector(ui,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return di.subVectors(r,n),a=(h-c)/(h-c+(d-p)),e.copy(n).addScaledVector(di,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(i).addScaledVector(hi,s).addScaledVector(ui,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let vi=0;class xi extends mt{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:vi++}),this.uuid=_t(),this.name="",this.type="Material",this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=i,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=ht,this.stencilZFail=ht,this.stencilZPass=ht,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}const n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=n(t.textures),r=n(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let n=0;n!==t;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class _i extends xi{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new qt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const yi=new re,Mi=new Lt;class bi{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=ut,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let n=0,r=this.itemSize;n0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const n=i[e];t.data.attributes[e]=n.toJSON(t.data)}const n={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],s=[];for(let e=0,n=i.length;e0&&(n[e]=s,r=!0)}r&&(t.data.morphAttributes=n,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const n=t.attributes;for(const t in n){const i=n[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],n=r[t];for(let t=0,r=n.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ti.far?null:{distance:c,point:qi.clone(),object:t}}(t,e,i,n,Ui,Bi,Fi,ji);if(c){r&&(Vi.fromBufferAttribute(r,a),Hi.fromBufferAttribute(r,o),Wi.fromBufferAttribute(r,l),c.uv=gi.getUV(ji,Ui,Bi,Fi,Vi,Hi,Wi,new Lt)),s&&(Vi.fromBufferAttribute(s,a),Hi.fromBufferAttribute(s,o),Wi.fromBufferAttribute(s,l),c.uv2=gi.getUV(ji,Ui,Bi,Fi,Vi,Hi,Wi,new Lt));const t={a:a,b:o,c:l,normal:new re,materialIndex:0};gi.getNormal(Ui,Bi,Fi,t.normal),c.face=t}return c}class Zi extends Di{constructor(t=1,e=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,i,n,r,s,p,m,f,g,v){const x=s/f,_=p/g,y=s/2,M=p/2,b=m/2,S=f+1,w=g+1;let T=0,A=0;const E=new re;for(let s=0;s0?1:-1,c.push(E.x,E.y,E.z),h.push(o/f),h.push(1-s/g),T+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class en extends si{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new Ne,this.projectionMatrix=new Ne,this.projectionMatrixInverse=new Ne}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}class nn extends en{constructor(t=50,e=1,i=.1,n=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*xt*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*vt*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*xt*Math.atan(Math.tan(.5*vt*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*vt*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/t,e-=s.offsetY*i/a,n*=s.width/t,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const rn=-90;class sn extends si{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i;const n=new nn(rn,1,t,e);n.layers=this.layers,n.up.set(0,1,0),n.lookAt(1,0,0),this.add(n);const r=new nn(rn,1,t,e);r.layers=this.layers,r.up.set(0,1,0),r.lookAt(-1,0,0),this.add(r);const s=new nn(rn,1,t,e);s.layers=this.layers,s.up.set(0,0,-1),s.lookAt(0,1,0),this.add(s);const a=new nn(rn,1,t,e);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(0,-1,0),this.add(a);const o=new nn(rn,1,t,e);o.layers=this.layers,o.up.set(0,1,0),o.lookAt(0,0,1),this.add(o);const l=new nn(rn,1,t,e);l.layers=this.layers,l.up.set(0,1,0),l.lookAt(0,0,-1),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,l]=this.children,c=t.getRenderTarget(),h=t.toneMapping,u=t.xr.enabled;t.toneMapping=0,t.xr.enabled=!1;const d=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0),t.render(e,n),t.setRenderTarget(i,1),t.render(e,r),t.setRenderTarget(i,2),t.render(e,s),t.setRenderTarget(i,3),t.render(e,a),t.setRenderTarget(i,4),t.render(e,o),i.texture.generateMipmaps=d,t.setRenderTarget(i,5),t.render(e,l),t.setRenderTarget(c),t.toneMapping=h,t.xr.enabled=u,i.texture.needsPMREMUpdate=!0}}class an extends $t{constructor(t,e,i,n,s,a,o,l,c,h){super(t=void 0!==t?t:[],e=void 0!==e?e:r,i,n,s,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class on extends te{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},n=[i,i,i,i,i,i];this.texture=new an(n,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:f}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},n=new Zi(5,5,5),r=new tn({name:"CubemapFromEquirect",uniforms:Ji(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new Xi(n,r),a=e.minFilter;e.minFilter===v&&(e.minFilter=f);return new sn(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,i,n){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,n);t.setRenderTarget(r)}}const ln=new re,cn=new re,hn=new Rt;class un{constructor(t=new re(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,i){const n=ln.subVectors(i,e).cross(cn.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){const i=t.delta(ln),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:e.copy(i).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||hn.getNormalMatrix(t),n=this.coplanarPoint(ln).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const dn=new Te,pn=new re;class mn{constructor(t=new un,e=new un,i=new un,n=new un,r=new un,s=new un){this.planes=[t,e,i,n,r,s]}set(t,e,i,n,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t){const e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],l=i[5],c=i[6],h=i[7],u=i[8],d=i[9],p=i[10],m=i[11],f=i[12],g=i[13],v=i[14],x=i[15];return e[0].setComponents(a-n,h-o,m-u,x-f).normalize(),e[1].setComponents(a+n,h+o,m+u,x+f).normalize(),e[2].setComponents(a+r,h+l,m+d,x+g).normalize(),e[3].setComponents(a-r,h-l,m-d,x-g).normalize(),e[4].setComponents(a-s,h-c,m-p,x-v).normalize(),e[5].setComponents(a+s,h+c,m+p,x+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),dn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(dn)}intersectsSprite(t){return dn.center.set(0,0,0),dn.radius=.7071067811865476,dn.applyMatrix4(t.matrixWorld),this.intersectsSphere(dn)}intersectsSphere(t){const e=this.planes,i=t.center,n=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,pn.y=n.normal.y>0?t.max.y:t.min.y,pn.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(pn)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function fn(){let t=null,e=!1,i=null,n=null;function r(e,s){i(e,s),n=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==i&&(n=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function gn(t,e){const i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=n.get(e);return void((!t||t.version 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",iridescence_fragment:"#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660,\t0.0556434,\n\t\t-1.5371385,\t1.8760108, -0.2040259,\n\t\t-0.4985314,\t0.0415560,\t1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\t return vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat R21 = R12;\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos.xyz );\n\t\tvec3 vSigmaY = dFdy( surf_pos.xyz );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_v0 0.339\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_v1 0.276\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_v4 0.046\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_v5 0.016\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_v6 0.0038\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"vec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness );\n\t#else\n\t\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometry.viewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if defined( USE_SHADOWMAP ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_COORDS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tuniform int boneTextureSize;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tfloat j = i * 4.0;\n\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\ty = dy * ( y + 0.5 );\n\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\treturn bone;\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef texture2DLodEXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},_n={common:{diffuse:{value:new qt(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new Rt},uv2Transform:{value:new Rt},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new Lt(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new qt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new qt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Rt}},sprite:{diffuse:{value:new qt(16777215)},opacity:{value:1},center:{value:new Lt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Rt}}},yn={basic:{uniforms:Ki([_n.common,_n.specularmap,_n.envmap,_n.aomap,_n.lightmap,_n.fog]),vertexShader:xn.meshbasic_vert,fragmentShader:xn.meshbasic_frag},lambert:{uniforms:Ki([_n.common,_n.specularmap,_n.envmap,_n.aomap,_n.lightmap,_n.emissivemap,_n.bumpmap,_n.normalmap,_n.displacementmap,_n.fog,_n.lights,{emissive:{value:new qt(0)}}]),vertexShader:xn.meshlambert_vert,fragmentShader:xn.meshlambert_frag},phong:{uniforms:Ki([_n.common,_n.specularmap,_n.envmap,_n.aomap,_n.lightmap,_n.emissivemap,_n.bumpmap,_n.normalmap,_n.displacementmap,_n.fog,_n.lights,{emissive:{value:new qt(0)},specular:{value:new qt(1118481)},shininess:{value:30}}]),vertexShader:xn.meshphong_vert,fragmentShader:xn.meshphong_frag},standard:{uniforms:Ki([_n.common,_n.envmap,_n.aomap,_n.lightmap,_n.emissivemap,_n.bumpmap,_n.normalmap,_n.displacementmap,_n.roughnessmap,_n.metalnessmap,_n.fog,_n.lights,{emissive:{value:new qt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:xn.meshphysical_vert,fragmentShader:xn.meshphysical_frag},toon:{uniforms:Ki([_n.common,_n.aomap,_n.lightmap,_n.emissivemap,_n.bumpmap,_n.normalmap,_n.displacementmap,_n.gradientmap,_n.fog,_n.lights,{emissive:{value:new qt(0)}}]),vertexShader:xn.meshtoon_vert,fragmentShader:xn.meshtoon_frag},matcap:{uniforms:Ki([_n.common,_n.bumpmap,_n.normalmap,_n.displacementmap,_n.fog,{matcap:{value:null}}]),vertexShader:xn.meshmatcap_vert,fragmentShader:xn.meshmatcap_frag},points:{uniforms:Ki([_n.points,_n.fog]),vertexShader:xn.points_vert,fragmentShader:xn.points_frag},dashed:{uniforms:Ki([_n.common,_n.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:xn.linedashed_vert,fragmentShader:xn.linedashed_frag},depth:{uniforms:Ki([_n.common,_n.displacementmap]),vertexShader:xn.depth_vert,fragmentShader:xn.depth_frag},normal:{uniforms:Ki([_n.common,_n.bumpmap,_n.normalmap,_n.displacementmap,{opacity:{value:1}}]),vertexShader:xn.meshnormal_vert,fragmentShader:xn.meshnormal_frag},sprite:{uniforms:Ki([_n.sprite,_n.fog]),vertexShader:xn.sprite_vert,fragmentShader:xn.sprite_frag},background:{uniforms:{uvTransform:{value:new Rt},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:xn.background_vert,fragmentShader:xn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:xn.backgroundCube_vert,fragmentShader:xn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:xn.cube_vert,fragmentShader:xn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:xn.equirect_vert,fragmentShader:xn.equirect_frag},distanceRGBA:{uniforms:Ki([_n.common,_n.displacementmap,{referencePosition:{value:new re},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:xn.distanceRGBA_vert,fragmentShader:xn.distanceRGBA_frag},shadow:{uniforms:Ki([_n.lights,_n.fog,{color:{value:new qt(0)},opacity:{value:1}}]),vertexShader:xn.shadow_vert,fragmentShader:xn.shadow_frag}};yn.physical={uniforms:Ki([yn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new Lt(1,1)},clearcoatNormalMap:{value:null},iridescence:{value:0},iridescenceMap:{value:null},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},sheen:{value:0},sheenColor:{value:new qt(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new Lt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new qt(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new qt(1,1,1)},specularColorMap:{value:null}}]),vertexShader:xn.meshphysical_vert,fragmentShader:xn.meshphysical_frag};const Mn={r:0,b:0,g:0};function bn(t,e,i,n,r,s,a){const o=new qt(0);let c,h,u=!0===s?0:1,d=null,p=0,m=null;function f(e,i){e.getRGB(Mn,$i(t)),n.buffers.color.setClear(Mn.r,Mn.g,Mn.b,i,a)}return{getClearColor:function(){return o},setClearColor:function(t,e=1){o.set(t),u=e,f(o,u)},getClearAlpha:function(){return u},setClearAlpha:function(t){u=t,f(o,u)},render:function(n,s){let a=!1,g=!0===s.isScene?s.background:null;if(g&&g.isTexture){g=(s.backgroundBlurriness>0?i:e).get(g)}const v=t.xr,x=v.getSession&&v.getSession();x&&"additive"===x.environmentBlendMode&&(g=null),null===g?f(o,u):g&&g.isColor&&(f(g,1),a=!0),(t.autoClear||a)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),g&&(g.isCubeTexture||g.mapping===l)?(void 0===h&&(h=new Xi(new Zi(1,1,1),new tn({name:"BackgroundCubeMaterial",uniforms:Ji(yn.backgroundCube.uniforms),vertexShader:yn.backgroundCube.vertexShader,fragmentShader:yn.backgroundCube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(h)),h.material.uniforms.envMap.value=g,h.material.uniforms.flipEnvMap.value=g.isCubeTexture&&!1===g.isRenderTargetTexture?-1:1,h.material.uniforms.backgroundBlurriness.value=s.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=s.backgroundIntensity,h.material.toneMapped=g.encoding!==ot,d===g&&p===g.version&&m===t.toneMapping||(h.material.needsUpdate=!0,d=g,p=g.version,m=t.toneMapping),h.layers.enableAll(),n.unshift(h,h.geometry,h.material,0,0,null)):g&&g.isTexture&&(void 0===c&&(c=new Xi(new vn(2,2),new tn({name:"BackgroundMaterial",uniforms:Ji(yn.background.uniforms),vertexShader:yn.background.vertexShader,fragmentShader:yn.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(c)),c.material.uniforms.t2D.value=g,c.material.uniforms.backgroundIntensity.value=s.backgroundIntensity,c.material.toneMapped=g.encoding!==ot,!0===g.matrixAutoUpdate&&g.updateMatrix(),c.material.uniforms.uvTransform.value.copy(g.matrix),d===g&&p===g.version&&m===t.toneMapping||(c.material.needsUpdate=!0,d=g,p=g.version,m=t.toneMapping),c.layers.enableAll(),n.unshift(c,c.geometry,c.material,0,0,null))}}}function Sn(t,e,i,n){const r=t.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},l=p(null);let c=l,h=!1;function u(e){return n.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function d(e){return n.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function p(t){const e=[],i=[],n=[];for(let t=0;t=0){const i=r[e];let n=s[e];if(void 0===n&&("instanceMatrix"===e&&t.instanceMatrix&&(n=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(n=t.instanceColor)),void 0===i)return!0;if(i.attribute!==n)return!0;if(n&&i.data!==n.data)return!0;a++}}return c.attributesNum!==a||c.index!==n}(r,_,d,y),M&&function(t,e,i,n){const r={},s=e.attributes;let a=0;const o=i.getAttributes();for(const e in o){if(o[e].location>=0){let i=s[e];void 0===i&&("instanceMatrix"===e&&t.instanceMatrix&&(i=t.instanceMatrix),"instanceColor"===e&&t.instanceColor&&(i=t.instanceColor));const n={};n.attribute=i,i&&i.data&&(n.data=i.data),r[e]=n,a++}}c.attributes=r,c.attributesNum=a,c.index=n}(r,_,d,y)}else{const t=!0===l.wireframe;c.geometry===_.id&&c.program===d.id&&c.wireframe===t||(c.geometry=_.id,c.program=d.id,c.wireframe=t,M=!0)}null!==y&&i.update(y,34963),(M||h)&&(h=!1,function(r,s,a,o){if(!1===n.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;m();const l=o.attributes,c=a.getAttributes(),h=s.defaultAttributeValues;for(const e in c){const n=c[e];if(n.location>=0){let s=l[e];if(void 0===s&&("instanceMatrix"===e&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const e=s.normalized,a=s.itemSize,l=i.get(s);if(void 0===l)continue;const c=l.buffer,h=l.type,u=l.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,l=i.stride,d=s.offset;if(i.isInstancedInterleavedBuffer){for(let t=0;t0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),f=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),x=u>0,_=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===e.has("EXT_texture_filter_anisotropic")){const i=e.get("EXT_texture_filter_anisotropic");n=t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:x,floatFragmentTextures:_,floatVertexTextures:x&&_,maxSamples:s?t.getParameter(36183):0}}function An(t){const e=this;let i=null,n=0,r=!1,s=!1;const a=new un,o=new Rt,l={value:null,needsUpdate:!1};function c(){l.value!==i&&(l.value=i,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(t,i,n,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0){const a=new on(s.height/2);return a.fromEquirectangularTexture(t,r),e.set(r,a),r.addEventListener("dispose",n),i(a.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}class Cn extends en{constructor(t=-1,e=1,i=1,n=-1,r=.1,s=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-t,s=i+t,a=n+e,o=n-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}const Ln=[.125,.215,.35,.446,.526,.582],Rn=20,Pn=new Cn,In=new qt;let Dn=null;const Nn=(1+Math.sqrt(5))/2,On=1/Nn,zn=[new re(1,1,1),new re(-1,1,1),new re(1,1,-1),new re(-1,1,-1),new re(0,Nn,On),new re(0,Nn,-On),new re(On,0,Nn),new re(-On,0,Nn),new re(Nn,On,0),new re(-Nn,On,0)];class Un{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,i=.1,n=100){Dn=this._renderer.getRenderTarget(),this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,i,n,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Gn(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=kn(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let t=0;tt-4?o=Ln[a-t+4-1]:0===a&&(o=0),n.push(o);const l=1/(s-2),c=-l,h=1+l,u=[c,c,h,c,h,h,c,c,h,h,c,h],d=6,p=6,m=3,f=2,g=1,v=new Float32Array(m*p*d),x=new Float32Array(f*p*d),_=new Float32Array(g*p*d);for(let t=0;t2?0:-1,n=[e,i,0,e+2/3,i,0,e+2/3,i+1,0,e,i,0,e+2/3,i+1,0,e,i+1,0];v.set(n,m*p*t),x.set(u,f*p*t);const r=[t,t,t,t,t,t];_.set(r,g*p*t)}const y=new Di;y.setAttribute("position",new bi(v,m)),y.setAttribute("uv",new bi(x,f)),y.setAttribute("faceIndex",new bi(_,g)),e.push(y),r>4&&r--}return{lodPlanes:e,sizeLods:i,sigmas:n}}(n)),this._blurMaterial=function(t,e,i){const n=new Float32Array(Rn),r=new re(0,1,0),s=new tn({name:"SphericalGaussianBlur",defines:{n:Rn,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r}},vertexShader:Vn(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1});return s}(n,t,e)}return n}_compileMaterial(t){const e=new Xi(this._lodPlanes[0],t);this._renderer.compile(e,Pn)}_sceneToCubeUV(t,e,i,n){const r=new nn(90,1,e,i),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,l=o.autoClear,c=o.toneMapping;o.getClearColor(In),o.toneMapping=0,o.autoClear=!1;const h=new _i({name:"PMREM.Background",side:1,depthWrite:!1,depthTest:!1}),u=new Xi(new Zi,h);let d=!1;const p=t.background;p?p.isColor&&(h.color.copy(p),t.background=null,d=!0):(h.color.copy(In),d=!0);for(let e=0;e<6;e++){const i=e%3;0===i?(r.up.set(0,s[e],0),r.lookAt(a[e],0,0)):1===i?(r.up.set(0,0,s[e]),r.lookAt(0,a[e],0)):(r.up.set(0,s[e],0),r.lookAt(0,0,a[e]));const l=this._cubeSize;Fn(n,i*l,e>2?l:0,l,l),o.setRenderTarget(n),d&&o.render(u,r),o.render(t,r)}u.geometry.dispose(),u.material.dispose(),o.toneMapping=c,o.autoClear=l,t.background=p}_textureToCubeUV(t,e){const i=this._renderer,n=t.mapping===r||t.mapping===s;n?(null===this._cubemapMaterial&&(this._cubemapMaterial=Gn()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===t.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=kn());const a=n?this._cubemapMaterial:this._equirectMaterial,o=new Xi(this._lodPlanes[0],a);a.uniforms.envMap.value=t;const l=this._cubeSize;Fn(e,0,0,3*l,2*l),i.setRenderTarget(e),i.render(o,Pn)}_applyPMREM(t){const e=this._renderer,i=e.autoClear;e.autoClear=!1;for(let e=1;eRn&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const f=[];let g=0;for(let t=0;tv-4?n-v+4:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(e),o.render(c,Pn)}}function Bn(t,e,i){const n=new te(t,e,i);return n.texture.mapping=l,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Fn(t,e,i,n,r){t.viewport.set(e,i,n,r),t.scissor.set(e,i,n,r)}function kn(){return new tn({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Vn(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function Gn(){return new tn({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Vn(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function Vn(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function Hn(t){let e=new WeakMap,i=null;function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(l){if(l&&l.isTexture){const c=l.mapping,h=c===a||c===o,u=c===r||c===s;if(h||u){if(l.isRenderTargetTexture&&!0===l.needsPMREMUpdate){l.needsPMREMUpdate=!1;let n=e.get(l);return null===i&&(i=new Un(t)),n=h?i.fromEquirectangular(l,n):i.fromCubemap(l,n),e.set(l,n),n.texture}if(e.has(l))return e.get(l).texture;{const r=l.image;if(h&&r&&r.height>0||u&&r&&function(t){let e=0;const i=6;for(let n=0;ne.maxTextureSize&&(E=Math.ceil(A/e.maxTextureSize),A=e.maxTextureSize);const C=new Float32Array(A*E*4*m),L=new ee(C,A,E,m);L.type=M,L.needsUpdate=!0;const R=4*T;for(let I=0;I0)return t;const r=e*i;let s=ir[r];if(void 0===s&&(s=new Float32Array(r),ir[r]=s),0!==e){n.toArray(s,0);for(let n=1,r=0;n!==e;++n)r+=i,t[n].toArray(s,r)}return s}function lr(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i":" "} ${r}: ${i[t]}`)}return n.join("\n")}(t.getShaderSource(e),n)}return r}function ss(t,e){const i=function(t){switch(t){case at:return["Linear","( value )"];case ot:return["sRGB","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+i[0]+i[1]+"; }"}function as(t,e){let i;switch(e){case 1:i="Linear";break;case 2:i="Reinhard";break;case 3:i="OptimizedCineon";break;case 4:i="ACESFilmic";break;case 5:i="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),i="Linear"}return"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function os(t){return""!==t}function ls(t,e){const i=e.numSpotLightShadows+e.numSpotLightMaps-e.numSpotLightShadowsWithMaps;return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,e.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,i).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,e.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function cs(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const hs=/^[ \t]*#include +<([\w\d./]+)>/gm;function us(t){return t.replace(hs,ds)}function ds(t,e){const i=xn[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return us(i)}const ps=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function ms(t){return t.replace(ps,fs)}function fs(t,e,i,n){let r="";for(let t=parseInt(e);t0&&(_+="\n"),y=[g,v].filter(os).join("\n"),y.length>0&&(y+="\n")):(_=[gs(i),"#define SHADER_NAME "+i.shaderName,v,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"",i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+p:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.morphColors&&i.isWebGL2?"#define USE_MORPHCOLORS":"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+i.morphTextureStride:"",i.morphTargetsCount>0&&i.isWebGL2?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(os).join("\n"),y=[g,gs(i),"#define SHADER_NAME "+i.shaderName,v,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+d:"",i.envMap?"#define "+p:"",i.envMap?"#define "+m:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.iridescence?"#define USE_IRIDESCENCE":"",i.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",i.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+u:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?xn.tonemapping_pars_fragment:"",0!==i.toneMapping?as("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.opaque?"#define OPAQUE":"",xn.encodings_pars_fragment,ss("linearToOutputTexel",i.outputEncoding),i.useDepthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(os).join("\n")),c=us(c),c=ls(c,i),c=cs(c,i),h=us(h),h=ls(h,i),h=cs(h,i),c=ms(c),h=ms(h),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(M="#version 300 es\n",_=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,y=["#define varying in",i.glslVersion===dt?"":"layout(location = 0) out highp vec4 pc_fragColor;",i.glslVersion===dt?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+y);const b=M+y+h,S=is(a,35633,M+_+c),w=is(a,35632,b);if(a.attachShader(x,S),a.attachShader(x,w),void 0!==i.index0AttributeName?a.bindAttribLocation(x,0,i.index0AttributeName):!0===i.morphTargets&&a.bindAttribLocation(x,0,"position"),a.linkProgram(x),t.debug.checkShaderErrors){const t=a.getProgramInfoLog(x).trim(),e=a.getShaderInfoLog(S).trim(),i=a.getShaderInfoLog(w).trim();let n=!0,r=!0;if(!1===a.getProgramParameter(x,35714)){n=!1;const e=rs(a,S,"vertex"),i=rs(a,w,"fragment");console.error("THREE.WebGLProgram: Shader Error "+a.getError()+" - VALIDATE_STATUS "+a.getProgramParameter(x,35715)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+i)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==i||(r=!1);r&&(this.diagnostics={runnable:n,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:i,prefix:y}})}let T,A;return a.deleteShader(S),a.deleteShader(w),this.getUniforms=function(){return void 0===T&&(T=new es(a,x)),T},this.getAttributes=function(){return void 0===A&&(A=function(t,e){const i={},n=t.getProgramParameter(e,35721);for(let r=0;r0,D=s.clearcoat>0,N=s.iridescence>0;return{isWebGL2:u,shaderID:S,shaderName:s.type,vertexShader:A,fragmentShader:E,defines:s.defines,customVertexShaderID:C,customFragmentShaderID:L,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:m,instancing:!0===v.isInstancedMesh,instancingColor:!0===v.isInstancedMesh&&null!==v.instanceColor,supportsVertexTextures:p,outputEncoding:null===P?t.outputEncoding:!0===P.isXRRenderTarget?P.texture.encoding:at,map:!!s.map,matcap:!!s.matcap,envMap:!!M,envMapMode:M&&M.mapping,envMapCubeUVHeight:b,lightMap:!!s.lightMap,aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:1===s.normalMapType,tangentSpaceNormalMap:0===s.normalMapType,decodeVideoTexture:!!s.map&&!0===s.map.isVideoTexture&&s.map.encoding===ot,clearcoat:D,clearcoatMap:D&&!!s.clearcoatMap,clearcoatRoughnessMap:D&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:D&&!!s.clearcoatNormalMap,iridescence:N,iridescenceMap:N&&!!s.iridescenceMap,iridescenceThicknessMap:N&&!!s.iridescenceThicknessMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularColorMap:!!s.specularColorMap,opaque:!1===s.transparent&&1===s.blending,alphaMap:!!s.alphaMap,alphaTest:I,gradientMap:!!s.gradientMap,sheen:s.sheen>0,sheenColorMap:!!s.sheenColorMap,sheenRoughnessMap:!!s.sheenRoughnessMap,transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!_.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!_.attributes.color&&4===_.attributes.color.itemSize,vertexUvs:!!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatMap||s.clearcoatRoughnessMap||s.clearcoatNormalMap||s.iridescenceMap||s.iridescenceThicknessMap||s.displacementMap||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheenColorMap||s.sheenRoughnessMap),uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.iridescenceMap||s.iridescenceThicknessMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheen>0||s.sheenColorMap||s.sheenRoughnessMap||!s.displacementMap),fog:!!x,useFog:!0===s.fog,fogExp2:x&&x.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:d,skinning:!0===v.isSkinnedMesh,morphTargets:void 0!==_.morphAttributes.position,morphNormals:void 0!==_.morphAttributes.normal,morphColors:void 0!==_.morphAttributes.color,morphTargetsCount:T,morphTextureStride:R,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numSpotLightMaps:o.spotLightMap.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numSpotLightShadowsWithMaps:o.numSpotLightShadowsWithMaps,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:s.dithering,shadowMapEnabled:t.shadowMap.enabled&&h.length>0,shadowMapType:t.shadowMap.type,toneMapping:s.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:2===s.side,flipSided:1===s.side,useDepthPacking:!!s.depthPacking,depthPacking:s.depthPacking||0,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:u||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:u||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:u||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(e){const i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.customVertexShaderID),i.push(e.customFragmentShaderID)),void 0!==e.defines)for(const t in e.defines)i.push(t),i.push(e.defines[t]);return!1===e.isRawShaderMaterial&&(!function(t,e){t.push(e.precision),t.push(e.outputEncoding),t.push(e.envMapMode),t.push(e.envMapCubeUVHeight),t.push(e.combine),t.push(e.vertexUvs),t.push(e.fogExp2),t.push(e.sizeAttenuation),t.push(e.morphTargetsCount),t.push(e.morphAttributeCount),t.push(e.numDirLights),t.push(e.numPointLights),t.push(e.numSpotLights),t.push(e.numSpotLightMaps),t.push(e.numHemiLights),t.push(e.numRectAreaLights),t.push(e.numDirLightShadows),t.push(e.numPointLightShadows),t.push(e.numSpotLightShadows),t.push(e.numSpotLightShadowsWithMaps),t.push(e.shadowMapType),t.push(e.toneMapping),t.push(e.numClippingPlanes),t.push(e.numClipIntersection),t.push(e.depthPacking)}(i,e),function(t,e){o.disableAll(),e.isWebGL2&&o.enable(0);e.supportsVertexTextures&&o.enable(1);e.instancing&&o.enable(2);e.instancingColor&&o.enable(3);e.map&&o.enable(4);e.matcap&&o.enable(5);e.envMap&&o.enable(6);e.lightMap&&o.enable(7);e.aoMap&&o.enable(8);e.emissiveMap&&o.enable(9);e.bumpMap&&o.enable(10);e.normalMap&&o.enable(11);e.objectSpaceNormalMap&&o.enable(12);e.tangentSpaceNormalMap&&o.enable(13);e.clearcoat&&o.enable(14);e.clearcoatMap&&o.enable(15);e.clearcoatRoughnessMap&&o.enable(16);e.clearcoatNormalMap&&o.enable(17);e.iridescence&&o.enable(18);e.iridescenceMap&&o.enable(19);e.iridescenceThicknessMap&&o.enable(20);e.displacementMap&&o.enable(21);e.specularMap&&o.enable(22);e.roughnessMap&&o.enable(23);e.metalnessMap&&o.enable(24);e.gradientMap&&o.enable(25);e.alphaMap&&o.enable(26);e.alphaTest&&o.enable(27);e.vertexColors&&o.enable(28);e.vertexAlphas&&o.enable(29);e.vertexUvs&&o.enable(30);e.vertexTangents&&o.enable(31);e.uvsVertexOnly&&o.enable(32);t.push(o.mask),o.disableAll(),e.fog&&o.enable(0);e.useFog&&o.enable(1);e.flatShading&&o.enable(2);e.logarithmicDepthBuffer&&o.enable(3);e.skinning&&o.enable(4);e.morphTargets&&o.enable(5);e.morphNormals&&o.enable(6);e.morphColors&&o.enable(7);e.premultipliedAlpha&&o.enable(8);e.shadowMapEnabled&&o.enable(9);e.physicallyCorrectLights&&o.enable(10);e.doubleSided&&o.enable(11);e.flipSided&&o.enable(12);e.useDepthPacking&&o.enable(13);e.dithering&&o.enable(14);e.specularIntensityMap&&o.enable(15);e.specularColorMap&&o.enable(16);e.transmission&&o.enable(17);e.transmissionMap&&o.enable(18);e.thicknessMap&&o.enable(19);e.sheen&&o.enable(20);e.sheenColorMap&&o.enable(21);e.sheenRoughnessMap&&o.enable(22);e.decodeVideoTexture&&o.enable(23);e.opaque&&o.enable(24);t.push(o.mask)}(i,e),i.push(t.outputEncoding)),i.push(e.customProgramCacheKey),i.join()},getUniforms:function(t){const e=f[t.type];let i;if(e){const t=yn[e];i=Qi.clone(t.uniforms)}else i=t.uniforms;return i},acquireProgram:function(e,i){let n;for(let t=0,e=h.length;t0?n.push(h):!0===a.transparent?r.push(h):i.push(h)},unshift:function(t,e,a,o,l,c){const h=s(t,e,a,o,l,c);a.transmission>0?n.unshift(h):!0===a.transparent?r.unshift(h):i.unshift(h)},finish:function(){for(let i=e,n=t.length;i1&&i.sort(t||Ss),n.length>1&&n.sort(e||ws),r.length>1&&r.sort(e||ws)}}}function As(){let t=new WeakMap;return{get:function(e,i){const n=t.get(e);let r;return void 0===n?(r=new Ts,t.set(e,[r])):i>=n.length?(r=new Ts,n.push(r)):r=n[i],r},dispose:function(){t=new WeakMap}}}function Es(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new re,color:new qt};break;case"SpotLight":i={position:new re,direction:new re,color:new qt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new re,color:new qt,distance:0,decay:0};break;case"HemisphereLight":i={direction:new re,skyColor:new qt,groundColor:new qt};break;case"RectAreaLight":i={color:new qt,position:new re,halfWidth:new re,halfHeight:new re}}return t[e.id]=i,i}}}let Cs=0;function Ls(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function Rs(t,e){const i=new Es,n=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0};for(let t=0;t<9;t++)r.probe.push(new re);const s=new re,a=new Ne,o=new Ne;return{setup:function(s,a){let o=0,l=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let h=0,u=0,d=0,p=0,m=0,f=0,g=0,v=0,x=0,_=0;s.sort(Ls);const y=!0!==a?Math.PI:1;for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=_n.LTC_FLOAT_1,r.rectAreaLTC2=_n.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=_n.LTC_HALF_1,r.rectAreaLTC2=_n.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=c;const M=r.hash;M.directionalLength===h&&M.pointLength===u&&M.spotLength===d&&M.rectAreaLength===p&&M.hemiLength===m&&M.numDirectionalShadows===f&&M.numPointShadows===g&&M.numSpotShadows===v&&M.numSpotMaps===x||(r.directional.length=h,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=m,r.directionalShadow.length=f,r.directionalShadowMap.length=f,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=f,r.pointShadowMatrix.length=g,r.spotLightMatrix.length=v+x-_,r.spotLightMap.length=x,r.numSpotLightShadowsWithMaps=_,M.directionalLength=h,M.pointLength=u,M.spotLength=d,M.rectAreaLength=p,M.hemiLength=m,M.numDirectionalShadows=f,M.numPointShadows=g,M.numSpotShadows=v,M.numSpotMaps=x,r.version=Cs++)},setupView:function(t,e){let i=0,n=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=s.length?(a=new Ps(t,e),s.push(a)):a=s[r],a},dispose:function(){i=new WeakMap}}}class Ds extends xi{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class Ns extends xi{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.referencePosition=new re,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}function Os(t,e,i){let n=new mn;const r=new Lt,s=new Lt,a=new Qt,o=new Ds({depthPacking:3201}),l=new Ns,c={},h=i.maxTextureSize,u={0:1,1:0,2:2},p=new tn({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Lt},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),m=p.clone();m.defines.HORIZONTAL_PASS=1;const f=new Di;f.setAttribute("position",new bi(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const g=new Xi(f,p),v=this;function x(i,n){const s=e.update(g);p.defines.VSM_SAMPLES!==i.blurSamples&&(p.defines.VSM_SAMPLES=i.blurSamples,m.defines.VSM_SAMPLES=i.blurSamples,p.needsUpdate=!0,m.needsUpdate=!0),null===i.mapPass&&(i.mapPass=new te(r.x,r.y)),p.uniforms.shadow_pass.value=i.map.texture,p.uniforms.resolution.value=i.mapSize,p.uniforms.radius.value=i.radius,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,s,p,g,null),m.uniforms.shadow_pass.value=i.mapPass.texture,m.uniforms.resolution.value=i.mapSize,m.uniforms.radius.value=i.radius,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,s,m,g,null)}function _(e,i,n,r,s,a){let h=null;const d=!0===n.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(void 0!==d)h=d;else if(h=!0===n.isPointLight?l:o,t.localClippingEnabled&&!0===i.clipShadows&&Array.isArray(i.clippingPlanes)&&0!==i.clippingPlanes.length||i.displacementMap&&0!==i.displacementScale||i.alphaMap&&i.alphaTest>0||i.map&&i.alphaTest>0){const t=h.uuid,e=i.uuid;let n=c[t];void 0===n&&(n={},c[t]=n);let r=n[e];void 0===r&&(r=h.clone(),n[e]=r),h=r}return h.visible=i.visible,h.wireframe=i.wireframe,h.side=3===a?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:u[i.side],h.alphaMap=i.alphaMap,h.alphaTest=i.alphaTest,h.map=i.map,h.clipShadows=i.clipShadows,h.clippingPlanes=i.clippingPlanes,h.clipIntersection=i.clipIntersection,h.displacementMap=i.displacementMap,h.displacementScale=i.displacementScale,h.displacementBias=i.displacementBias,h.wireframeLinewidth=i.wireframeLinewidth,h.linewidth=i.linewidth,!0===n.isPointLight&&!0===h.isMeshDistanceMaterial&&(h.referencePosition.setFromMatrixPosition(n.matrixWorld),h.nearDistance=r,h.farDistance=s),h}function y(i,r,s,a,o){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=e.update(i),r=i.material;if(Array.isArray(r)){const e=n.groups;for(let l=0,c=e.length;lh||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/m.x),r.x=s.x*m.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/m.y),r.y=s.y*m.y,u.mapSize.y=s.y)),null===u.map){const t=3!==this.type?{minFilter:d,magFilter:d}:{};u.map=new te(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t=1):-1!==I.indexOf("OpenGL ES")&&(P=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),R=P>=2);let D=null,N={};const O=t.getParameter(3088),z=t.getParameter(2978),U=(new Qt).fromArray(O),B=(new Qt).fromArray(z);function F(e,i,n){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;en||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const n=e?Tt:Math.floor,s=n(r*t.width),a=n(r*t.height);void 0===D&&(D=z(s,a));const o=i?z(s,a):D;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function B(t){return St(t.width)&&St(t.height)}function F(t,e){return t.generateMipmaps&&e&&t.minFilter!==d&&t.minFilter!==f}function k(e){t.generateMipmap(e)}function G(i,n,r,s,a=!1){if(!1===o)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let l=n;return 6403===n&&(5126===r&&(l=33326),5131===r&&(l=33325),5121===r&&(l=33321)),33319===n&&(5126===r&&(l=33328),5131===r&&(l=33327),5121===r&&(l=33323)),6408===n&&(5126===r&&(l=34836),5131===r&&(l=34842),5121===r&&(l=s===ot&&!1===a?35907:32856),32819===r&&(l=32854),32820===r&&(l=32855)),33325!==l&&33326!==l&&33327!==l&&33328!==l&&34842!==l&&34836!==l||e.get("EXT_color_buffer_float"),l}function V(t,e,i){return!0===F(t,i)||t.isFramebufferTexture&&t.minFilter!==d&&t.minFilter!==f?Math.log2(Math.max(e.width,e.height))+1:void 0!==t.mipmaps&&t.mipmaps.length>0?t.mipmaps.length:t.isCompressedTexture&&Array.isArray(t.image)?e.mipmaps.length:1}function H(t){return t===d||t===p||t===m?9728:9729}function W(t){const e=t.target;e.removeEventListener("dispose",W),function(t){const e=n.get(t);if(void 0===e.__webglInit)return;const i=t.source,r=N.get(i);if(r){const n=r[e.__cacheKey];n.usedTimes--,0===n.usedTimes&&q(t),0===Object.keys(r).length&&N.delete(i)}n.remove(t)}(e),e.isVideoTexture&&I.delete(e)}function j(e){const i=e.target;i.removeEventListener("dispose",j),function(e){const i=e.texture,r=n.get(e),s=n.get(i);void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else{if(t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer)for(let e=0;e0&&r.__version!==t.version){const i=t.image;if(null===i)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==i.complete)return void Q(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.bindTexture(3553,r.__webglTexture,33984+e)}const Z={[c]:10497,[h]:33071,[u]:33648},J={[d]:9728,[p]:9984,[m]:9986,[f]:9729,[g]:9985,[v]:9987};function K(i,s,a){if(a?(t.texParameteri(i,10242,Z[s.wrapS]),t.texParameteri(i,10243,Z[s.wrapT]),32879!==i&&35866!==i||t.texParameteri(i,32882,Z[s.wrapR]),t.texParameteri(i,10240,J[s.magFilter]),t.texParameteri(i,10241,J[s.minFilter])):(t.texParameteri(i,10242,33071),t.texParameteri(i,10243,33071),32879!==i&&35866!==i||t.texParameteri(i,32882,33071),s.wrapS===h&&s.wrapT===h||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(i,10240,H(s.magFilter)),t.texParameteri(i,10241,H(s.minFilter)),s.minFilter!==d&&s.minFilter!==f&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===e.has("EXT_texture_filter_anisotropic")){const a=e.get("EXT_texture_filter_anisotropic");if(s.magFilter===d)return;if(s.minFilter!==m&&s.minFilter!==v)return;if(s.type===M&&!1===e.has("OES_texture_float_linear"))return;if(!1===o&&s.type===b&&!1===e.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function $(e,i){let n=!1;void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",W));const r=i.source;let s=N.get(r);void 0===s&&(s={},N.set(r,s));const o=function(t){const e=[];return e.push(t.wrapS),e.push(t.wrapT),e.push(t.wrapR||0),e.push(t.magFilter),e.push(t.minFilter),e.push(t.anisotropy),e.push(t.internalFormat),e.push(t.format),e.push(t.type),e.push(t.generateMipmaps),e.push(t.premultiplyAlpha),e.push(t.flipY),e.push(t.unpackAlignment),e.push(t.encoding),e.join()}(i);if(o!==e.__cacheKey){void 0===s[o]&&(s[o]={texture:t.createTexture(),usedTimes:0},a.memory.textures++,n=!0),s[o].usedTimes++;const r=s[e.__cacheKey];void 0!==r&&(s[e.__cacheKey].usedTimes--,0===r.usedTimes&&q(i)),e.__cacheKey=o,e.__webglTexture=s[o].texture}return n}function Q(e,r,a){let l=3553;(r.isDataArrayTexture||r.isCompressedArrayTexture)&&(l=35866),r.isData3DTexture&&(l=32879);const c=$(e,r),u=r.source;i.bindTexture(l,e.__webglTexture,33984+a);const p=n.get(u);if(u.version!==p.__version||!0===c){i.activeTexture(33984+a),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=function(t){return!o&&(t.wrapS!==h||t.wrapT!==h||t.minFilter!==d&&t.minFilter!==f)}(r)&&!1===B(r.image);let n=U(r.image,e,!1,C);n=st(r,n);const m=B(n)||o,g=s.convert(r.format,r.encoding);let v,x=s.convert(r.type),b=G(r.internalFormat,g,x,r.encoding,r.isVideoTexture);K(l,r,m);const E=r.mipmaps,L=o&&!0!==r.isVideoTexture,R=void 0===p.__version||!0===c,P=V(r,n,m);if(r.isDepthTexture)b=6402,o?b=r.type===M?36012:r.type===y?33190:r.type===S?35056:33189:r.type===M&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===T&&6402===b&&r.type!==_&&r.type!==y&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=y,x=s.convert(r.type)),r.format===A&&6402===b&&(b=34041,r.type!==S&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=S,x=s.convert(r.type))),R&&(L?i.texStorage2D(3553,1,b,n.width,n.height):i.texImage2D(3553,0,b,n.width,n.height,0,g,x,null));else if(r.isDataTexture)if(E.length>0&&m){L&&R&&i.texStorage2D(3553,P,b,E[0].width,E[0].height);for(let t=0,e=E.length;t>=1,e>>=1}}else if(E.length>0&&m){L&&R&&i.texStorage2D(3553,P,b,E[0].width,E[0].height);for(let t=0,e=E.length;t=34069&&l<=34074)&&t.framebufferTexture2D(36160,o,l,n.get(a).__webglTexture,0),i.bindFramebuffer(36160,null)}function et(e,i,n){if(t.bindRenderbuffer(36161,e),i.depthBuffer&&!i.stencilBuffer){let r=33189;if(n||rt(i)){const e=i.depthTexture;e&&e.isDepthTexture&&(e.type===M?r=36012:e.type===y&&(r=33190));const n=nt(i);rt(i)?R.renderbufferStorageMultisampleEXT(36161,n,r,i.width,i.height):t.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else t.renderbufferStorage(36161,r,i.width,i.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(i.depthBuffer&&i.stencilBuffer){const r=nt(i);n&&!1===rt(i)?t.renderbufferStorageMultisample(36161,r,35056,i.width,i.height):rt(i)?R.renderbufferStorageMultisampleEXT(36161,r,35056,i.width,i.height):t.renderbufferStorage(36161,34041,i.width,i.height),t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=!0===i.isWebGLMultipleRenderTargets?i.texture:[i.texture];for(let r=0;r0&&!0===e.has("WEBGL_multisampled_render_to_texture")&&!1!==i.__useRenderToTexture}function st(t,i){const n=t.encoding,r=t.format,s=t.type;return!0===t.isCompressedTexture||!0===t.isVideoTexture||t.format===pt||n!==at&&(n===ot?!1===o?!0===e.has("EXT_sRGB")&&r===w?(t.format=pt,t.minFilter=f,t.generateMipmaps=!1):i=Yt.sRGBToLinear(i):r===w&&s===x||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",n)),i}this.allocateTextureUnit=function(){const t=X;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),X+=1,t},this.resetTextureUnits=function(){X=0},this.setTexture2D=Y,this.setTexture2DArray=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?Q(r,t,e):i.bindTexture(35866,r.__webglTexture,33984+e)},this.setTexture3D=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?Q(r,t,e):i.bindTexture(32879,r.__webglTexture,33984+e)},this.setTextureCube=function(e,r){const a=n.get(e);e.version>0&&a.__version!==e.version?function(e,r,a){if(6!==r.image.length)return;const l=$(e,r),c=r.source;i.bindTexture(34067,e.__webglTexture,33984+a);const h=n.get(c);if(c.version!==h.__version||!0===l){i.activeTexture(33984+a),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);const e=r.isCompressedTexture||r.image[0].isCompressedTexture,n=r.image[0]&&r.image[0].isDataTexture,u=[];for(let t=0;t<6;t++)u[t]=e||n?n?r.image[t].image:r.image[t]:U(r.image[t],!1,!0,E),u[t]=st(r,u[t]);const d=u[0],p=B(d)||o,m=s.convert(r.format,r.encoding),f=s.convert(r.type),g=G(r.internalFormat,m,f,r.encoding),v=o&&!0!==r.isVideoTexture,x=void 0===h.__version||!0===l;let _,y=V(r,d,p);if(K(34067,r,p),e){v&&x&&i.texStorage2D(34067,y,g,d.width,d.height);for(let t=0;t<6;t++){_=u[t].mipmaps;for(let e=0;e<_.length;e++){const n=_[e];r.format!==w?null!==m?v?i.compressedTexSubImage2D(34069+t,e,0,0,n.width,n.height,m,n.data):i.compressedTexImage2D(34069+t,e,g,n.width,n.height,0,n.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):v?i.texSubImage2D(34069+t,e,0,0,n.width,n.height,m,f,n.data):i.texImage2D(34069+t,e,g,n.width,n.height,0,m,f,n.data)}}}else{_=r.mipmaps,v&&x&&(_.length>0&&y++,i.texStorage2D(34067,y,g,u[0].width,u[0].height));for(let t=0;t<6;t++)if(n){v?i.texSubImage2D(34069+t,0,0,0,u[t].width,u[t].height,m,f,u[t].data):i.texImage2D(34069+t,0,g,u[t].width,u[t].height,0,m,f,u[t].data);for(let e=0;e<_.length;e++){const n=_[e].image[t].image;v?i.texSubImage2D(34069+t,e+1,0,0,n.width,n.height,m,f,n.data):i.texImage2D(34069+t,e+1,g,n.width,n.height,0,m,f,n.data)}}else{v?i.texSubImage2D(34069+t,0,0,0,m,f,u[t]):i.texImage2D(34069+t,0,g,m,f,u[t]);for(let e=0;e<_.length;e++){const n=_[e];v?i.texSubImage2D(34069+t,e+1,0,0,m,f,n.image[t]):i.texImage2D(34069+t,e+1,g,m,f,n.image[t])}}}F(r,p)&&k(34067),h.__version=c.version,r.onUpdate&&r.onUpdate(r)}e.__version=r.version}(a,e,r):i.bindTexture(34067,a.__webglTexture,33984+r)},this.rebindTextures=function(t,e,i){const r=n.get(t);void 0!==e&&tt(r.__webglFramebuffer,t,t.texture,36064,3553),void 0!==i&&it(t)},this.setupRenderTarget=function(e){const l=e.texture,c=n.get(e),h=n.get(l);e.addEventListener("dispose",j),!0!==e.isWebGLMultipleRenderTargets&&(void 0===h.__webglTexture&&(h.__webglTexture=t.createTexture()),h.__version=l.version,a.memory.textures++);const u=!0===e.isWebGLCubeRenderTarget,d=!0===e.isWebGLMultipleRenderTargets,p=B(e)||o;if(u){c.__webglFramebuffer=[];for(let e=0;e<6;e++)c.__webglFramebuffer[e]=t.createFramebuffer()}else{if(c.__webglFramebuffer=t.createFramebuffer(),d)if(r.drawBuffers){const i=e.texture;for(let e=0,r=i.length;e0&&!1===rt(e)){const n=d?l:[l];c.__webglMultisampledFramebuffer=t.createFramebuffer(),c.__webglColorRenderbuffer=[],i.bindFramebuffer(36160,c.__webglMultisampledFramebuffer);for(let i=0;i0&&!1===rt(e)){const r=e.isWebGLMultipleRenderTargets?e.texture:[e.texture],s=e.width,a=e.height;let o=16384;const l=[],c=e.stencilBuffer?33306:36096,h=n.get(e),u=!0===e.isWebGLMultipleRenderTargets;if(u)for(let e=0;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(n=e.getPose(t.targetRaySpace,i),null===n&&null!==r&&(n=r),null!==n&&(a.matrix.fromArray(n.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),n.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(n.linearVelocity)):a.hasLinearVelocity=!1,n.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(n.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(Gs)))}return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new ks;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class Hs extends $t{constructor(t,e,i,n,r,s,a,o,l,c){if((c=void 0!==c?c:T)!==T&&c!==A)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===T&&(i=y),void 0===i&&c===A&&(i=S),super(null,n,r,s,a,o,c,i,l),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==a?a:d,this.minFilter=void 0!==o?o:d,this.flipY=!1,this.generateMipmaps=!1}}class Ws extends mt{constructor(t,e){super();const i=this;let n=null,r=1,s=null,a="local-floor",o=null,l=null,c=null,h=null,u=null,d=null;const p=e.getContextAttributes();let m=null,f=null;const g=[],v=[],_=new Set,M=new Map,b=new nn;b.layers.enable(1),b.viewport=new Qt;const E=new nn;E.layers.enable(2),E.viewport=new Qt;const C=[b,E],L=new Fs;L.layers.enable(1),L.layers.enable(2);let R=null,P=null;function I(t){const e=v.indexOf(t.inputSource);if(-1===e)return;const i=g[e];void 0!==i&&i.dispatchEvent({type:t.type,data:t.inputSource})}function D(){n.removeEventListener("select",I),n.removeEventListener("selectstart",I),n.removeEventListener("selectend",I),n.removeEventListener("squeeze",I),n.removeEventListener("squeezestart",I),n.removeEventListener("squeezeend",I),n.removeEventListener("end",D),n.removeEventListener("inputsourceschange",N);for(let t=0;t=0&&(v[n]=null,g[n].disconnect(i))}for(let e=0;e=v.length){v.push(i),n=t;break}if(null===v[t]){v[t]=i,n=t;break}}if(-1===n)break}const r=g[n];r&&r.connect(i)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=g[t];return void 0===e&&(e=new Vs,g[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=g[t];return void 0===e&&(e=new Vs,g[t]=e),e.getGripSpace()},this.getHand=function(t){let e=g[t];return void 0===e&&(e=new Vs,g[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){r=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){a=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return o||s},this.setReferenceSpace=function(t){o=t},this.getBaseLayer=function(){return null!==h?h:u},this.getBinding=function(){return c},this.getFrame=function(){return d},this.getSession=function(){return n},this.setSession=async function(l){if(n=l,null!==n){if(m=t.getRenderTarget(),n.addEventListener("select",I),n.addEventListener("selectstart",I),n.addEventListener("selectend",I),n.addEventListener("squeeze",I),n.addEventListener("squeezestart",I),n.addEventListener("squeezeend",I),n.addEventListener("end",D),n.addEventListener("inputsourceschange",N),!0!==p.xrCompatible&&await e.makeXRCompatible(),void 0===n.renderState.layers||!1===t.capabilities.isWebGL2){const i={antialias:void 0!==n.renderState.layers||p.antialias,alpha:p.alpha,depth:p.depth,stencil:p.stencil,framebufferScaleFactor:r};u=new XRWebGLLayer(n,e,i),n.updateRenderState({baseLayer:u}),f=new te(u.framebufferWidth,u.framebufferHeight,{format:w,type:x,encoding:t.outputEncoding,stencilBuffer:p.stencil})}else{let i=null,s=null,a=null;p.depth&&(a=p.stencil?35056:33190,i=p.stencil?A:T,s=p.stencil?S:y);const o={colorFormat:32856,depthFormat:a,scaleFactor:r};c=new XRWebGLBinding(n,e),h=c.createProjectionLayer(o),n.updateRenderState({layers:[h]}),f=new te(h.textureWidth,h.textureHeight,{format:w,type:x,depthTexture:new Hs(h.textureWidth,h.textureHeight,s,void 0,void 0,void 0,void 0,void 0,void 0,i),stencilBuffer:p.stencil,encoding:t.outputEncoding,samples:p.antialias?4:0});t.properties.get(f).__ignoreDepthValues=h.ignoreDepthValues}f.isXRRenderTarget=!0,this.setFoveation(1),o=null,s=await n.requestReferenceSpace(a),F.setContext(n),F.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}};const O=new re,z=new re;function U(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.updateCamera=function(t){if(null===n)return;L.near=E.near=b.near=t.near,L.far=E.far=b.far=t.far,R===L.near&&P===L.far||(n.updateRenderState({depthNear:L.near,depthFar:L.far}),R=L.near,P=L.far);const e=t.parent,i=L.cameras;U(L,e);for(let t=0;te&&(M.set(t,t.lastChangedTime),i.dispatchEvent({type:"planechanged",data:t}))}else _.add(t),M.set(t,n.lastChangedTime),i.dispatchEvent({type:"planeadded",data:t})}d=null})),this.setAnimationLoop=function(t){B=t},this.dispose=function(){}}}function js(t,e){function i(i,n){i.opacity.value=n.opacity,n.color&&i.diffuse.value.copy(n.color),n.emissive&&i.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity),n.map&&(i.map.value=n.map),n.alphaMap&&(i.alphaMap.value=n.alphaMap),n.bumpMap&&(i.bumpMap.value=n.bumpMap,i.bumpScale.value=n.bumpScale,1===n.side&&(i.bumpScale.value*=-1)),n.displacementMap&&(i.displacementMap.value=n.displacementMap,i.displacementScale.value=n.displacementScale,i.displacementBias.value=n.displacementBias),n.emissiveMap&&(i.emissiveMap.value=n.emissiveMap),n.normalMap&&(i.normalMap.value=n.normalMap,i.normalScale.value.copy(n.normalScale),1===n.side&&i.normalScale.value.negate()),n.specularMap&&(i.specularMap.value=n.specularMap),n.alphaTest>0&&(i.alphaTest.value=n.alphaTest);const r=e.get(n).envMap;if(r&&(i.envMap.value=r,i.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,i.reflectivity.value=n.reflectivity,i.ior.value=n.ior,i.refractionRatio.value=n.refractionRatio),n.lightMap){i.lightMap.value=n.lightMap;const e=!0!==t.physicallyCorrectLights?Math.PI:1;i.lightMapIntensity.value=n.lightMapIntensity*e}let s,a;n.aoMap&&(i.aoMap.value=n.aoMap,i.aoMapIntensity.value=n.aoMapIntensity),n.map?s=n.map:n.specularMap?s=n.specularMap:n.displacementMap?s=n.displacementMap:n.normalMap?s=n.normalMap:n.bumpMap?s=n.bumpMap:n.roughnessMap?s=n.roughnessMap:n.metalnessMap?s=n.metalnessMap:n.alphaMap?s=n.alphaMap:n.emissiveMap?s=n.emissiveMap:n.clearcoatMap?s=n.clearcoatMap:n.clearcoatNormalMap?s=n.clearcoatNormalMap:n.clearcoatRoughnessMap?s=n.clearcoatRoughnessMap:n.iridescenceMap?s=n.iridescenceMap:n.iridescenceThicknessMap?s=n.iridescenceThicknessMap:n.specularIntensityMap?s=n.specularIntensityMap:n.specularColorMap?s=n.specularColorMap:n.transmissionMap?s=n.transmissionMap:n.thicknessMap?s=n.thicknessMap:n.sheenColorMap?s=n.sheenColorMap:n.sheenRoughnessMap&&(s=n.sheenRoughnessMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),i.uvTransform.value.copy(s.matrix)),n.aoMap?a=n.aoMap:n.lightMap&&(a=n.lightMap),void 0!==a&&(a.isWebGLRenderTarget&&(a=a.texture),!0===a.matrixAutoUpdate&&a.updateMatrix(),i.uv2Transform.value.copy(a.matrix))}return{refreshFogUniforms:function(e,i){i.color.getRGB(e.fogColor.value,$i(t)),i.isFog?(e.fogNear.value=i.near,e.fogFar.value=i.far):i.isFogExp2&&(e.fogDensity.value=i.density)},refreshMaterialUniforms:function(t,n,r,s,a){n.isMeshBasicMaterial||n.isMeshLambertMaterial?i(t,n):n.isMeshToonMaterial?(i(t,n),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap)}(t,n)):n.isMeshPhongMaterial?(i(t,n),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4)}(t,n)):n.isMeshStandardMaterial?(i(t,n),function(t,i){t.roughness.value=i.roughness,t.metalness.value=i.metalness,i.roughnessMap&&(t.roughnessMap.value=i.roughnessMap);i.metalnessMap&&(t.metalnessMap.value=i.metalnessMap);const n=e.get(i).envMap;n&&(t.envMapIntensity.value=i.envMapIntensity)}(t,n),n.isMeshPhysicalMaterial&&function(t,e,i){t.ior.value=e.ior,e.sheen>0&&(t.sheenColor.value.copy(e.sheenColor).multiplyScalar(e.sheen),t.sheenRoughness.value=e.sheenRoughness,e.sheenColorMap&&(t.sheenColorMap.value=e.sheenColorMap),e.sheenRoughnessMap&&(t.sheenRoughnessMap.value=e.sheenRoughnessMap));e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate()));e.iridescence>0&&(t.iridescence.value=e.iridescence,t.iridescenceIOR.value=e.iridescenceIOR,t.iridescenceThicknessMinimum.value=e.iridescenceThicknessRange[0],t.iridescenceThicknessMaximum.value=e.iridescenceThicknessRange[1],e.iridescenceMap&&(t.iridescenceMap.value=e.iridescenceMap),e.iridescenceThicknessMap&&(t.iridescenceThicknessMap.value=e.iridescenceThicknessMap));e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=i.texture,t.transmissionSamplerSize.value.set(i.width,i.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor));t.specularIntensity.value=e.specularIntensity,t.specularColor.value.copy(e.specularColor),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap);e.specularColorMap&&(t.specularColorMap.value=e.specularColorMap)}(t,n,a)):n.isMeshMatcapMaterial?(i(t,n),function(t,e){e.matcap&&(t.matcap.value=e.matcap)}(t,n)):n.isMeshDepthMaterial?i(t,n):n.isMeshDistanceMaterial?(i(t,n),function(t,e){t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,n)):n.isMeshNormalMaterial?i(t,n):n.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,n),n.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,n)):n.isPointsMaterial?function(t,e,i,n){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*i,t.scale.value=.5*n,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,n,r,s):n.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let i;e.map?i=e.map:e.alphaMap&&(i=e.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(t,n):n.isShadowMaterial?(t.color.value.copy(n.color),t.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function qs(t,e,i,n){let r={},s={},a=[];const o=i.isWebGL2?t.getParameter(35375):0;function l(t,e,i){const n=t.value;if(void 0===i[e]){if("number"==typeof n)i[e]=n;else{const t=Array.isArray(n)?n:[n],r=[];for(let e=0;e0){r=i%n;0!==r&&n-r-a.boundary<0&&(i+=n-r,s.__offset=i)}i+=a.storage}r=i%n,r>0&&(i+=n-r);t.__size=i,t.__cache={}}(i),d=function(e){const i=function(){for(let t=0;t0&&function(t,e,i){const n=Z.isWebGL2;null===V&&(V=new te(1,1,{generateMipmaps:!0,type:Y.has("EXT_color_buffer_half_float")?b:x,minFilter:v,samples:n&&!0===a?4:0}));g.getDrawingBufferSize(W),n?V.setSize(W.x,W.y):V.setSize(Tt(W.x),Tt(W.y));const r=g.getRenderTarget();g.setRenderTarget(V),g.clear();const s=g.toneMapping;g.toneMapping=0,zt(t,e,i),g.toneMapping=s,Q.updateMultisampleRenderTarget(V),Q.updateRenderTargetMipmap(V),g.setRenderTarget(r)}(r,e,i),n&&J.viewport(C.copy(n)),r.length>0&&zt(r,e,i),s.length>0&&zt(s,e,i),o.length>0&&zt(o,e,i),J.buffers.depth.setTest(!0),J.buffers.depth.setMask(!0),J.buffers.color.setMask(!0),J.setPolygonOffset(!1)}function zt(t,e,i){const n=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r0?f[f.length-1]:null,m.pop(),d=m.length>0?m[m.length-1]:null},this.getActiveCubeFace=function(){return y},this.getActiveMipmapLevel=function(){return S},this.getRenderTarget=function(){return T},this.setRenderTargetTextures=function(t,e,i){$.get(t.texture).__webglTexture=e,$.get(t.depthTexture).__webglTexture=i;const n=$.get(t);n.__hasExternalTextures=!0,n.__hasExternalTextures&&(n.__autoAllocateDepthBuffer=void 0===i,n.__autoAllocateDepthBuffer||!0===Y.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),n.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(t,e){const i=$.get(t);i.__webglFramebuffer=e,i.__useDefaultFramebuffer=void 0===e},this.setRenderTarget=function(t,e=0,i=0){T=t,y=e,S=i;let n=!0,r=null,s=!1,a=!1;if(t){const i=$.get(t);void 0!==i.__useDefaultFramebuffer?(J.bindFramebuffer(36160,null),n=!1):void 0===i.__webglFramebuffer?Q.setupRenderTarget(t):i.__hasExternalTextures&&Q.rebindTextures(t,$.get(t.texture).__webglTexture,$.get(t.depthTexture).__webglTexture);const o=t.texture;(o.isData3DTexture||o.isDataArrayTexture||o.isCompressedArrayTexture)&&(a=!0);const l=$.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=l[e],s=!0):r=Z.isWebGL2&&t.samples>0&&!1===Q.useMultisampledRTT(t)?$.get(t).__webglMultisampledFramebuffer:l,C.copy(t.viewport),L.copy(t.scissor),R=t.scissorTest}else C.copy(z).multiplyScalar(D).floor(),L.copy(U).multiplyScalar(D).floor(),R=B;if(J.bindFramebuffer(36160,r)&&Z.drawBuffers&&n&&J.drawBuffers(t,r),J.viewport(C),J.scissor(L),J.setScissorTest(R),s){const n=$.get(t.texture);_t.framebufferTexture2D(36160,36064,34069+e,n.__webglTexture,i)}else if(a){const n=$.get(t.texture),r=e||0;_t.framebufferTextureLayer(36160,36064,n.__webglTexture,i||0,r)}A=-1},this.readRenderTargetPixels=function(t,e,i,n,r,s,a){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=$.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){J.bindFramebuffer(36160,o);try{const a=t.texture,o=a.format,l=a.type;if(o!==w&>.convert(o)!==_t.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===b&&(Y.has("EXT_color_buffer_half_float")||Z.isWebGL2&&Y.has("EXT_color_buffer_float"));if(!(l===x||gt.convert(l)===_t.getParameter(35738)||l===M&&(Z.isWebGL2||Y.has("OES_texture_float")||Y.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");e>=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&_t.readPixels(e,i,n,r,gt.convert(o),gt.convert(l),s)}finally{const t=null!==T?$.get(T).__webglFramebuffer:null;J.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,i=0){const n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n);Q.setTexture2D(e,0),_t.copyTexSubImage2D(3553,i,0,0,t.x,t.y,r,s),J.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n=0){const r=e.image.width,s=e.image.height,a=gt.convert(i.format),o=gt.convert(i.type);Q.setTexture2D(i,0),_t.pixelStorei(37440,i.flipY),_t.pixelStorei(37441,i.premultiplyAlpha),_t.pixelStorei(3317,i.unpackAlignment),e.isDataTexture?_t.texSubImage2D(3553,n,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?_t.compressedTexSubImage2D(3553,n,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):_t.texSubImage2D(3553,n,t.x,t.y,a,o,e.image),0===n&&i.generateMipmaps&&_t.generateMipmap(3553),J.unbindTexture()},this.copyTextureToTexture3D=function(t,e,i,n,r=0){if(g.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=t.max.x-t.min.x+1,a=t.max.y-t.min.y+1,o=t.max.z-t.min.z+1,l=gt.convert(n.format),c=gt.convert(n.type);let h;if(n.isData3DTexture)Q.setTexture3D(n,0),h=32879;else{if(!n.isDataArrayTexture)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");Q.setTexture2DArray(n,0),h=35866}_t.pixelStorei(37440,n.flipY),_t.pixelStorei(37441,n.premultiplyAlpha),_t.pixelStorei(3317,n.unpackAlignment);const u=_t.getParameter(3314),d=_t.getParameter(32878),p=_t.getParameter(3316),m=_t.getParameter(3315),f=_t.getParameter(32877),v=i.isCompressedTexture?i.mipmaps[0]:i.image;_t.pixelStorei(3314,v.width),_t.pixelStorei(32878,v.height),_t.pixelStorei(3316,t.min.x),_t.pixelStorei(3315,t.min.y),_t.pixelStorei(32877,t.min.z),i.isDataTexture||i.isData3DTexture?_t.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,v.data):i.isCompressedArrayTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),_t.compressedTexSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,v.data)):_t.texSubImage3D(h,r,e.x,e.y,e.z,s,a,o,l,c,v),_t.pixelStorei(3314,u),_t.pixelStorei(32878,d),_t.pixelStorei(3316,p),_t.pixelStorei(3315,m),_t.pixelStorei(32877,f),0===r&&n.generateMipmaps&&_t.generateMipmap(h),J.unbindTexture()},this.initTexture=function(t){t.isCubeTexture?Q.setTextureCube(t,0):t.isData3DTexture?Q.setTexture3D(t,0):t.isDataArrayTexture||t.isCompressedArrayTexture?Q.setTexture2DArray(t,0):Q.setTexture2D(t,0),J.unbindTexture()},this.resetState=function(){y=0,S=0,T=null,J.reset(),vt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}class Ys extends Xs{}Ys.prototype.isWebGL1Renderer=!0;class Zs{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new qt(t),this.density=e}clone(){return new Zs(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}class Js{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new qt(t),this.near=e,this.far=i}clone(){return new Js(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}class Ks extends si{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.backgroundIntensity=this.backgroundIntensity),e}get autoUpdate(){return console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate}set autoUpdate(t){console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate=t}}class $s{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=ut,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=_t()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let n=0,r=this.stride;nt.far||e.push({distance:o,point:na.clone(),uv:gi.getUV(na,ca,ha,ua,da,pa,ma,new Lt),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function ga(t,e,i,n,r,s){aa.subVectors(t,i).addScalar(.5).multiply(n),void 0!==r?(oa.x=s*aa.x-r*aa.y,oa.y=r*aa.x+s*aa.y):oa.copy(aa),t.copy(e),t.x+=oa.x,t.y+=oa.y,t.applyMatrix4(la)}const va=new re,xa=new re;class _a extends si{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,n;for(i=1,n=e.length;i0){va.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(va);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){va.setFromMatrixPosition(t.matrixWorld),xa.setFromMatrixPosition(this.matrixWorld);const i=va.distanceTo(xa)/t.zoom;let n,r;for(e[0].object.visible=!0,n=1,r=e.length;n=t))break;e[n-1].object.visible=!1,e[n].object.visible=!0}for(this._currentLevel=n-1;no)continue;u.applyMatrix4(this.matrixWorld);const s=t.ray.origin.distanceTo(u);st.far||e.push({distance:s,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else{for(let i=Math.max(0,s.start),n=Math.min(m.count,s.start+s.count)-1;io)continue;u.applyMatrix4(this.matrixWorld);const n=t.ray.origin.distanceTo(u);nt.far||e.push({distance:n,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,object:a})}}class io extends $t{constructor(t,e,i,n,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,n,r,h,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class no{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,n=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)i=this.getPoint(s/t),r+=i.distanceTo(n),e.push(r),n=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const i=this.getLengths();let n=0;const r=i.length;let s;s=e||t*i[r-1];let a,o=0,l=r-1;for(;o<=l;)if(n=Math.floor(o+(l-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){l=n;break}l=n-1}if(n=l,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(t,e){const i=1e-4;let n=t-i,r=t+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=e||(s.isVector2?new Lt:new re);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e){const i=new re,n=[],r=[],s=[],a=new re,o=new Ne;for(let e=0;e<=t;e++){const i=e/t;n[e]=this.getTangentAt(i,new re)}r[0]=new re,s[0]=new re;let l=Number.MAX_VALUE;const c=Math.abs(n[0].x),h=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=l&&(l=c,i.set(1,0,0)),h<=l&&(l=h,i.set(0,1,0)),u<=l&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(n[e-1],n[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(yt(n[e-1].dot(n[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(n[e],r[e])}if(!0===e){let e=Math.acos(yt(r[0].dot(r[t]),-1,1));e/=t,n[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],e*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class ro extends no{constructor(t=0,e=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const i=e||new Lt,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)n;)r-=n;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=n[(l-1)%r]:(oo.subVectors(n[0],n[1]).add(n[0]),a=oo);const h=n[l%r],u=n[(l+1)%r];if(this.closed||l+2n.length-2?n.length-1:s+1],h=n[s>n.length-3?n.length-1:s+2];return i.set(po(a,o.x,l.x,c.x,h.x),po(a,o.y,l.y,c.y,h.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=n[r]-i,s=this.curves[r],a=s.getLength(),o=0===a?0:1-t/a;return s.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,n=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Ao extends Di{constructor(t=[new Lt(0,-.5),new Lt(.5,0),new Lt(0,.5)],e=12,i=0,n=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:n},e=Math.floor(e),n=yt(n,0,2*Math.PI);const r=[],s=[],a=[],o=[],l=[],c=1/e,h=new re,u=new Lt,d=new re,p=new re,m=new re;let f=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:f=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-f,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:f=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-f,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*c*n,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){h.x=t[i].x*p,h.y=t[i].y,h.z=t[i].x*m,s.push(h.x,h.y,h.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const n=o[3*i+0]*p,c=o[3*i+1],d=o[3*i+0]*m;l.push(n,c,d)}}for(let i=0;i0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new Ti(h,3)),this.setAttribute("normal",new Ti(u,3)),this.setAttribute("uv",new Ti(d,2))}static fromJSON(t){return new Lo(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ro extends Lo{constructor(t=1,e=1,i=32,n=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,i,n,r,s,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:n,openEnded:r,thetaStart:s,thetaLength:a}}static fromJSON(t){return new Ro(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Po extends Di{constructor(t=[],e=[],i=1,n=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:n};const r=[],s=[];function a(t,e,i,n){const r=n+1,s=[];for(let n=0;n<=r;n++){s[n]=[];const a=t.clone().lerp(i,n/r),o=e.clone().lerp(i,n/r),l=r-n;for(let t=0;t<=l;t++)s[n][t]=0===t&&n===r?a:a.clone().lerp(o,t/l)}for(let t=0;t.9&&a<.1&&(e<.2&&(s[t+0]+=1),i<.2&&(s[t+2]+=1),n<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new Ti(r,3)),this.setAttribute("normal",new Ti(r.slice(),3)),this.setAttribute("uv",new Ti(s,2)),0===n?this.computeVertexNormals():this.normalizeNormals()}static fromJSON(t){return new Po(t.vertices,t.indices,t.radius,t.details)}}class Io extends Po{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,n=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-i,0,-n,i,0,n,-i,0,n,i,-n,-i,0,-n,i,0,n,-i,0,n,i,0,-i,0,-n,i,0,-n,-i,0,n,i,0,n],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new Io(t.radius,t.detail)}}const Do=new re,No=new re,Oo=new re,zo=new gi;class Uo extends Di{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,n=Math.pow(10,i),r=Math.cos(vt*e),s=t.getIndex(),a=t.getAttribute("position"),o=s?s.count:a.count,l=[0,0,0],c=["a","b","c"],h=new Array(3),u={},d=[];for(let t=0;t80*i){o=c=t[0],l=h=t[1];for(let e=i;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?32767/p:0}return Vo(s,a,i,o,l,p,0),a};function ko(t,e,i,n,r){let s,a;if(r===function(t,e,i,n){let r=0;for(let s=e,a=i-n;s0)for(s=e;s=e;s-=n)a=ol(s,t[s],t[s+1],a);return a&&el(a,a.next)&&(ll(a),a=a.next),a}function Go(t,e){if(!t)return t;e||(e=t);let i,n=t;do{if(i=!1,n.steiner||!el(n,n.next)&&0!==tl(n.prev,n,n.next))n=n.next;else{if(ll(n),n=e=n.prev,n===n.next)break;i=!0}}while(i||n!==e);return e}function Vo(t,e,i,n,r,s,a){if(!t)return;!a&&s&&function(t,e,i,n){let r=t;do{0===r.z&&(r.z=Jo(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,n,r,s,a,o,l,c=1;do{for(i=t,t=null,s=null,a=0;i;){for(a++,n=i,o=0,e=0;e0||l>0&&n;)0!==o&&(0===l||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(t,n,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?Wo(t,n,r,s):Ho(t))e.push(o.i/i|0),e.push(t.i/i|0),e.push(l.i/i|0),ll(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?Vo(t=jo(Go(t),e,i),e,i,n,r,s,2):2===a&&qo(t,e,i,n,r,s):Vo(Go(t),e,i,n,r,s,1);break}}function Ho(t){const e=t.prev,i=t,n=t.next;if(tl(e,i,n)>=0)return!1;const r=e.x,s=i.x,a=n.x,o=e.y,l=i.y,c=n.y,h=rs?r>a?r:a:s>a?s:a,p=o>l?o>c?o:c:l>c?l:c;let m=n.next;for(;m!==e;){if(m.x>=h&&m.x<=d&&m.y>=u&&m.y<=p&&$o(r,o,s,l,a,c,m.x,m.y)&&tl(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Wo(t,e,i,n){const r=t.prev,s=t,a=t.next;if(tl(r,s,a)>=0)return!1;const o=r.x,l=s.x,c=a.x,h=r.y,u=s.y,d=a.y,p=ol?o>c?o:c:l>c?l:c,g=h>u?h>d?h:d:u>d?u:d,v=Jo(p,m,e,i,n),x=Jo(f,g,e,i,n);let _=t.prevZ,y=t.nextZ;for(;_&&_.z>=v&&y&&y.z<=x;){if(_.x>=p&&_.x<=f&&_.y>=m&&_.y<=g&&_!==r&&_!==a&&$o(o,h,l,u,c,d,_.x,_.y)&&tl(_.prev,_,_.next)>=0)return!1;if(_=_.prevZ,y.x>=p&&y.x<=f&&y.y>=m&&y.y<=g&&y!==r&&y!==a&&$o(o,h,l,u,c,d,y.x,y.y)&&tl(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;_&&_.z>=v;){if(_.x>=p&&_.x<=f&&_.y>=m&&_.y<=g&&_!==r&&_!==a&&$o(o,h,l,u,c,d,_.x,_.y)&&tl(_.prev,_,_.next)>=0)return!1;_=_.prevZ}for(;y&&y.z<=x;){if(y.x>=p&&y.x<=f&&y.y>=m&&y.y<=g&&y!==r&&y!==a&&$o(o,h,l,u,c,d,y.x,y.y)&&tl(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function jo(t,e,i){let n=t;do{const r=n.prev,s=n.next.next;!el(r,s)&&il(r,n,n.next,s)&&sl(r,s)&&sl(s,r)&&(e.push(r.i/i|0),e.push(n.i/i|0),e.push(s.i/i|0),ll(n),ll(n.next),n=t=s),n=n.next}while(n!==t);return Go(n)}function qo(t,e,i,n,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Qo(a,t)){let o=al(a,t);return a=Go(a,a.next),o=Go(o,o.next),Vo(a,e,i,n,r,s,0),void Vo(o,e,i,n,r,s,0)}t=t.next}a=a.next}while(a!==t)}function Xo(t,e){return t.x-e.x}function Yo(t,e){const i=function(t,e){let i,n=e,r=-1/0;const s=t.x,a=t.y;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){const t=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(t<=s&&t>r&&(r=t,i=n.x=n.x&&n.x>=l&&s!==n.x&&$o(ai.x||n.x===i.x&&Zo(i,n)))&&(i=n,u=h)),n=n.next}while(n!==o);return i}(t,e);if(!i)return e;const n=al(i,t);return Go(n,n.next),Go(i,i.next)}function Zo(t,e){return tl(t.prev,t,e.prev)<0&&tl(e.next,t,t.next)<0}function Jo(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Ko(t){let e=t,i=t;do{(e.x=(t-a)*(s-o)&&(t-a)*(n-o)>=(i-a)*(e-o)&&(i-a)*(s-o)>=(r-a)*(n-o)}function Qo(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&il(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(sl(t,e)&&sl(e,t)&&function(t,e){let i=t,n=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(tl(t.prev,t,e.prev)||tl(t,e.prev,e))||el(t,e)&&tl(t.prev,t,t.next)>0&&tl(e.prev,e,e.next)>0)}function tl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function el(t,e){return t.x===e.x&&t.y===e.y}function il(t,e,i,n){const r=rl(tl(t,e,i)),s=rl(tl(t,e,n)),a=rl(tl(i,n,t)),o=rl(tl(i,n,e));return r!==s&&a!==o||(!(0!==r||!nl(t,i,e))||(!(0!==s||!nl(t,n,e))||(!(0!==a||!nl(i,t,n))||!(0!==o||!nl(i,e,n)))))}function nl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function rl(t){return t>0?1:t<0?-1:0}function sl(t,e){return tl(t.prev,t,t.next)<0?tl(t,e,t.next)>=0&&tl(t,t.prev,e)>=0:tl(t,e,t.prev)<0||tl(t,t.next,e)<0}function al(t,e){const i=new cl(t.i,t.x,t.y),n=new cl(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function ol(t,e,i,n){const r=new cl(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function ll(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function cl(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class hl{static area(t){const e=t.length;let i=0;for(let n=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function dl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((i.x-c/d-p)*c-(i.y+l/d-m)*l)/(a*c-o*l);n=p+a*f-t.x,r=m+o*f-t.y;const g=n*n+r*r;if(g<=2)return new Lt(n,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(n=-o,r=a,s=Math.sqrt(h)):(n=a,r=o,s=Math.sqrt(h/2))}return new Lt(n/s,r/s)}const P=[];for(let t=0,e=A.length,i=e-1,n=t+1;t=0;t--){const e=t/p,i=h*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=A.length;t=0;){const n=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,l),(t!==i-1||o0!=t>0&&this.version++,this._sheen=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class Pl extends xi{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new qt(16777215),this.specular=new qt(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new qt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Lt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Il extends xi{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new qt(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new qt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Lt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Dl extends xi{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Lt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class Nl extends xi{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new qt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new qt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Lt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Ol extends xi{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new qt(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Lt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class zl extends Ba{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Ul(t,e,i){return Fl(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)}function Bl(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function Fl(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function kl(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function Gl(t,e,i){const n=t.length,r=new t.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*e;for(let i=0;i!==e;++i)r[a++]=t[n+i]}return r}function Vl(t,e,i,n){let r=1,s=t[0];for(;void 0!==s&&void 0===s[n];)s=t[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(e.push(s.time),i.push.apply(i,a)),s=t[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(e.push(s.time),a.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(e.push(s.time),i.push(a)),s=t[r++]}while(void 0!==s)}var Hl=Object.freeze({__proto__:null,arraySlice:Ul,convertArray:Bl,isTypedArray:Fl,getKeyframeOrder:kl,sortedArray:Gl,flattenJSON:Vl,subclip:function(t,e,i,n,r=30){const s=t.clone();s.name=e;const a=[];for(let t=0;t=n)){l.push(e.times[t]);for(let i=0;is.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=n.times[u]){const t=u*l+o,e=t+l-o;d=Ul(n.values,t,e)}else{const t=n.createInterpolant(),e=o,i=l-o;t.evaluate(s),d=Ul(t.resultBuffer,e,i)}if("quaternion"===r){(new ne).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=i,i=0}}for(;i>>1;te;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Ul(i,r,s),this.values=Ul(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const n=i[e];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,n),t=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,n,s),t=!1;break}s=n}if(void 0!==n&&Fl(n))for(let e=0,i=n.length;e!==i;++e){const i=n[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=Ul(this.times),e=Ul(this.values),i=this.getValueSize(),n=this.getInterpolation()===tt,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*i,n=s*i,a=0;a!==i;++a)e[n+a]=e[t+a];++s}return s!==t.length?(this.times=Ul(t,0,s),this.values=Ul(e,0,s*i)):(this.times=t,this.values=e),this}clone(){const t=Ul(this.times,0),e=Ul(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}Yl.prototype.TimeBufferType=Float32Array,Yl.prototype.ValueBufferType=Float32Array,Yl.prototype.DefaultInterpolation=Q;class Zl extends Yl{}Zl.prototype.ValueTypeName="bool",Zl.prototype.ValueBufferType=Array,Zl.prototype.DefaultInterpolation=$,Zl.prototype.InterpolantFactoryMethodLinear=void 0,Zl.prototype.InterpolantFactoryMethodSmooth=void 0;class Jl extends Yl{}Jl.prototype.ValueTypeName="color";class Kl extends Yl{}Kl.prototype.ValueTypeName="number";class $l extends Wl{constructor(t,e,i,n){super(t,e,i,n)}interpolate_(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-e)/(n-e);let l=t*a;for(let t=l+a;l!==t;l+=4)ne.slerpFlat(r,0,s,l-a,s,l,o);return r}}class Ql extends Yl{InterpolantFactoryMethodLinear(t){return new $l(this.times,this.values,this.getValueSize(),t)}}Ql.prototype.ValueTypeName="quaternion",Ql.prototype.DefaultInterpolation=Q,Ql.prototype.InterpolantFactoryMethodSmooth=void 0;class tc extends Yl{}tc.prototype.ValueTypeName="string",tc.prototype.ValueBufferType=Array,tc.prototype.DefaultInterpolation=$,tc.prototype.InterpolantFactoryMethodLinear=void 0,tc.prototype.InterpolantFactoryMethodSmooth=void 0;class ec extends Yl{}ec.prototype.ValueTypeName="vector";class ic{constructor(t,e=-1,i,n=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=n,this.uuid=_t(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,n=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(nc(i[t]).scale(n));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,n=i.length;t!==n;++t)e.push(Yl.toJSON(i[t]));return n}static CreateFromMorphTargetSequence(t,e,i,n){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=n[t];e||(n[t]=e=[]),e.push(i)}}const s=[];for(const t in n)s.push(this.CreateFromMorphTargetSequence(t,n[t],e,i));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,n,r){if(0!==i.length){const s=[],a=[];Vl(i,s,a,n),0!==s.length&&r.push(new t(e,s,a))}},n=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==lc[t])return void lc[t].push({onLoad:e,onProgress:i,onError:n});lc[t]=[],lc[t].push({onLoad:e,onProgress:i,onError:n});const s=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(s).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=lc[t],n=e.body.getReader(),r=e.headers.get("Content-Length")||e.headers.get("X-File-Size"),s=r?parseInt(r):0,a=0!==s;let o=0;const l=new ReadableStream({start(t){!function e(){n.read().then((({done:n,value:r})=>{if(n)t.close();else{o+=r.byteLength;const n=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:s});for(let t=0,e=i.length;t{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(void 0===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,n=new TextDecoder(i);return t.arrayBuffer().then((t=>n.decode(t)))}}})).then((e=>{rc.add(t,e);const i=lc[t];delete lc[t];for(let t=0,n=i.length;t{const i=lc[t];if(void 0===i)throw this.manager.itemError(t),e;delete lc[t];for(let t=0,n=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class uc extends oc{constructor(t){super(t)}load(t,e,i,n){void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=rc.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const a=Ot("img");function o(){c(),rc.add(t,this),e&&e(this),r.manager.itemEnd(t)}function l(e){c(),n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}function c(){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1)}return a.addEventListener("load",o,!1),a.addEventListener("error",l,!1),"data:"!==t.slice(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),r.manager.itemStart(t),a.src=t,a}}class dc extends si{constructor(t,e=1){super(),this.isLight=!0,this.type="Light",this.color=new qt(t),this.intensity=e}dispose(){}copy(t,e){return super.copy(t,e),this.color.copy(t.color),this.intensity=t.intensity,this}toJSON(t){const e=super.toJSON(t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}class pc extends dc{constructor(t,e,i){super(t,i),this.isHemisphereLight=!0,this.type="HemisphereLight",this.position.copy(si.DefaultUp),this.updateMatrix(),this.groundColor=new qt(e)}copy(t,e){return super.copy(t,e),this.groundColor.copy(t.groundColor),this}}const mc=new Ne,fc=new re,gc=new re;class vc{constructor(t){this.camera=t,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new Lt(512,512),this.map=null,this.mapPass=null,this.matrix=new Ne,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new mn,this._frameExtents=new Lt(1,1),this._viewportCount=1,this._viewports=[new Qt(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(t){const e=this.camera,i=this.matrix;fc.setFromMatrixPosition(t.matrixWorld),e.position.copy(fc),gc.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(gc),e.updateMatrixWorld(),mc.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(mc),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(mc)}getViewport(t){return this._viewports[t]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const t={};return 0!==this.bias&&(t.bias=this.bias),0!==this.normalBias&&(t.normalBias=this.normalBias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}class xc extends vc{constructor(){super(new nn(50,1,.5,500)),this.isSpotLightShadow=!0,this.focus=1}updateMatrices(t){const e=this.camera,i=2*xt*t.angle*this.focus,n=this.mapSize.width/this.mapSize.height,r=t.distance||e.far;i===e.fov&&n===e.aspect&&r===e.far||(e.fov=i,e.aspect=n,e.far=r,e.updateProjectionMatrix()),super.updateMatrices(t)}copy(t){return super.copy(t),this.focus=t.focus,this}}class _c extends dc{constructor(t,e,i=0,n=Math.PI/3,r=0,s=2){super(t,e),this.isSpotLight=!0,this.type="SpotLight",this.position.copy(si.DefaultUp),this.updateMatrix(),this.target=new si,this.distance=i,this.angle=n,this.penumbra=r,this.decay=s,this.map=null,this.shadow=new xc}get power(){return this.intensity*Math.PI}set power(t){this.intensity=t/Math.PI}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}const yc=new Ne,Mc=new re,bc=new re;class Sc extends vc{constructor(){super(new nn(90,1,.5,500)),this.isPointLightShadow=!0,this._frameExtents=new Lt(4,2),this._viewportCount=6,this._viewports=[new Qt(2,1,1,1),new Qt(0,1,1,1),new Qt(3,1,1,1),new Qt(1,1,1,1),new Qt(3,0,1,1),new Qt(1,0,1,1)],this._cubeDirections=[new re(1,0,0),new re(-1,0,0),new re(0,0,1),new re(0,0,-1),new re(0,1,0),new re(0,-1,0)],this._cubeUps=[new re(0,1,0),new re(0,1,0),new re(0,1,0),new re(0,1,0),new re(0,0,1),new re(0,0,-1)]}updateMatrices(t,e=0){const i=this.camera,n=this.matrix,r=t.distance||i.far;r!==i.far&&(i.far=r,i.updateProjectionMatrix()),Mc.setFromMatrixPosition(t.matrixWorld),i.position.copy(Mc),bc.copy(i.position),bc.add(this._cubeDirections[e]),i.up.copy(this._cubeUps[e]),i.lookAt(bc),i.updateMatrixWorld(),n.makeTranslation(-Mc.x,-Mc.y,-Mc.z),yc.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(yc)}}class wc extends dc{constructor(t,e,i=0,n=2){super(t,e),this.isPointLight=!0,this.type="PointLight",this.distance=i,this.decay=n,this.shadow=new Sc}get power(){return 4*this.intensity*Math.PI}set power(t){this.intensity=t/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(t,e){return super.copy(t,e),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}class Tc extends vc{constructor(){super(new Cn(-5,5,5,-5,.5,500)),this.isDirectionalLightShadow=!0}}class Ac extends dc{constructor(t,e){super(t,e),this.isDirectionalLight=!0,this.type="DirectionalLight",this.position.copy(si.DefaultUp),this.updateMatrix(),this.target=new si,this.shadow=new Tc}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}class Ec extends dc{constructor(t,e){super(t,e),this.isAmbientLight=!0,this.type="AmbientLight"}}class Cc extends dc{constructor(t,e,i=10,n=10){super(t,e),this.isRectAreaLight=!0,this.type="RectAreaLight",this.width=i,this.height=n}get power(){return this.intensity*this.width*this.height*Math.PI}set power(t){this.intensity=t/(this.width*this.height*Math.PI)}copy(t){return super.copy(t),this.width=t.width,this.height=t.height,this}toJSON(t){const e=super.toJSON(t);return e.object.width=this.width,e.object.height=this.height,e}}class Lc{constructor(){this.isSphericalHarmonics3=!0,this.coefficients=[];for(let t=0;t<9;t++)this.coefficients.push(new re)}set(t){for(let e=0;e<9;e++)this.coefficients[e].copy(t[e]);return this}zero(){for(let t=0;t<9;t++)this.coefficients[t].set(0,0,0);return this}getAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.282095),e.addScaledVector(s[1],.488603*n),e.addScaledVector(s[2],.488603*r),e.addScaledVector(s[3],.488603*i),e.addScaledVector(s[4],i*n*1.092548),e.addScaledVector(s[5],n*r*1.092548),e.addScaledVector(s[6],.315392*(3*r*r-1)),e.addScaledVector(s[7],i*r*1.092548),e.addScaledVector(s[8],.546274*(i*i-n*n)),e}getIrradianceAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.886227),e.addScaledVector(s[1],1.023328*n),e.addScaledVector(s[2],1.023328*r),e.addScaledVector(s[3],1.023328*i),e.addScaledVector(s[4],.858086*i*n),e.addScaledVector(s[5],.858086*n*r),e.addScaledVector(s[6],.743125*r*r-.247708),e.addScaledVector(s[7],.858086*i*r),e.addScaledVector(s[8],.429043*(i*i-n*n)),e}add(t){for(let e=0;e<9;e++)this.coefficients[e].add(t.coefficients[e]);return this}addScaledSH(t,e){for(let i=0;i<9;i++)this.coefficients[i].addScaledVector(t.coefficients[i],e);return this}scale(t){for(let e=0;e<9;e++)this.coefficients[e].multiplyScalar(t);return this}lerp(t,e){for(let i=0;i<9;i++)this.coefficients[i].lerp(t.coefficients[i],e);return this}equals(t){for(let e=0;e<9;e++)if(!this.coefficients[e].equals(t.coefficients[e]))return!1;return!0}copy(t){return this.set(t.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(t,e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].fromArray(t,e+3*n);return this}toArray(t=[],e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].toArray(t,e+3*n);return t}static getBasisAt(t,e){const i=t.x,n=t.y,r=t.z;e[0]=.282095,e[1]=.488603*n,e[2]=.488603*r,e[3]=.488603*i,e[4]=1.092548*i*n,e[5]=1.092548*n*r,e[6]=.315392*(3*r*r-1),e[7]=1.092548*i*r,e[8]=.546274*(i*i-n*n)}}class Rc extends dc{constructor(t=new Lc,e=1){super(void 0,e),this.isLightProbe=!0,this.sh=t}copy(t){return super.copy(t),this.sh.copy(t.sh),this}fromJSON(t){return this.intensity=t.intensity,this.sh.fromArray(t.sh),this}toJSON(t){const e=super.toJSON(t);return e.object.sh=this.sh.toArray(),e}}class Pc extends oc{constructor(t){super(t),this.textures={}}load(t,e,i,n){const r=this,s=new hc(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)}parse(t){const e=this.textures;function i(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}const n=Pc.createMaterialFromType(t.type);if(void 0!==t.uuid&&(n.uuid=t.uuid),void 0!==t.name&&(n.name=t.name),void 0!==t.color&&void 0!==n.color&&n.color.setHex(t.color),void 0!==t.roughness&&(n.roughness=t.roughness),void 0!==t.metalness&&(n.metalness=t.metalness),void 0!==t.sheen&&(n.sheen=t.sheen),void 0!==t.sheenColor&&(n.sheenColor=(new qt).setHex(t.sheenColor)),void 0!==t.sheenRoughness&&(n.sheenRoughness=t.sheenRoughness),void 0!==t.emissive&&void 0!==n.emissive&&n.emissive.setHex(t.emissive),void 0!==t.specular&&void 0!==n.specular&&n.specular.setHex(t.specular),void 0!==t.specularIntensity&&(n.specularIntensity=t.specularIntensity),void 0!==t.specularColor&&void 0!==n.specularColor&&n.specularColor.setHex(t.specularColor),void 0!==t.shininess&&(n.shininess=t.shininess),void 0!==t.clearcoat&&(n.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(n.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.iridescence&&(n.iridescence=t.iridescence),void 0!==t.iridescenceIOR&&(n.iridescenceIOR=t.iridescenceIOR),void 0!==t.iridescenceThicknessRange&&(n.iridescenceThicknessRange=t.iridescenceThicknessRange),void 0!==t.transmission&&(n.transmission=t.transmission),void 0!==t.thickness&&(n.thickness=t.thickness),void 0!==t.attenuationDistance&&(n.attenuationDistance=t.attenuationDistance),void 0!==t.attenuationColor&&void 0!==n.attenuationColor&&n.attenuationColor.setHex(t.attenuationColor),void 0!==t.fog&&(n.fog=t.fog),void 0!==t.flatShading&&(n.flatShading=t.flatShading),void 0!==t.blending&&(n.blending=t.blending),void 0!==t.combine&&(n.combine=t.combine),void 0!==t.side&&(n.side=t.side),void 0!==t.shadowSide&&(n.shadowSide=t.shadowSide),void 0!==t.opacity&&(n.opacity=t.opacity),void 0!==t.transparent&&(n.transparent=t.transparent),void 0!==t.alphaTest&&(n.alphaTest=t.alphaTest),void 0!==t.depthTest&&(n.depthTest=t.depthTest),void 0!==t.depthWrite&&(n.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(n.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(n.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(n.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(n.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(n.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(n.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(n.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(n.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(n.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(n.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(n.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(n.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(n.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(n.rotation=t.rotation),1!==t.linewidth&&(n.linewidth=t.linewidth),void 0!==t.dashSize&&(n.dashSize=t.dashSize),void 0!==t.gapSize&&(n.gapSize=t.gapSize),void 0!==t.scale&&(n.scale=t.scale),void 0!==t.polygonOffset&&(n.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(n.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(n.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.dithering&&(n.dithering=t.dithering),void 0!==t.alphaToCoverage&&(n.alphaToCoverage=t.alphaToCoverage),void 0!==t.premultipliedAlpha&&(n.premultipliedAlpha=t.premultipliedAlpha),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.toneMapped&&(n.toneMapped=t.toneMapped),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?n.vertexColors=t.vertexColors>0:n.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(n.uniforms[e]={},r.type){case"t":n.uniforms[e].value=i(r.value);break;case"c":n.uniforms[e].value=(new qt).setHex(r.value);break;case"v2":n.uniforms[e].value=(new Lt).fromArray(r.value);break;case"v3":n.uniforms[e].value=(new re).fromArray(r.value);break;case"v4":n.uniforms[e].value=(new Qt).fromArray(r.value);break;case"m3":n.uniforms[e].value=(new Rt).fromArray(r.value);break;case"m4":n.uniforms[e].value=(new Ne).fromArray(r.value);break;default:n.uniforms[e].value=r.value}}if(void 0!==t.defines&&(n.defines=t.defines),void 0!==t.vertexShader&&(n.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(n.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(n.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)n.extensions[e]=t.extensions[e];if(void 0!==t.size&&(n.size=t.size),void 0!==t.sizeAttenuation&&(n.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(n.map=i(t.map)),void 0!==t.matcap&&(n.matcap=i(t.matcap)),void 0!==t.alphaMap&&(n.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(n.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(n.bumpScale=t.bumpScale),void 0!==t.normalMap&&(n.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(n.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),n.normalScale=(new Lt).fromArray(e)}return void 0!==t.displacementMap&&(n.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(n.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(n.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(n.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(n.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(n.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(n.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(n.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(n.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(n.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(n.envMap=i(t.envMap)),void 0!==t.envMapIntensity&&(n.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(n.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(n.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(n.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(n.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(n.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(n.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(n.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(n.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(n.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(n.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(n.clearcoatNormalScale=(new Lt).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(n.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(n.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(n.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(n.thicknessMap=i(t.thicknessMap)),void 0!==t.sheenColorMap&&(n.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(n.sheenRoughnessMap=i(t.sheenRoughnessMap)),n}setTextures(t){return this.textures=t,this}static createMaterialFromType(t){return new{ShadowMaterial:El,SpriteMaterial:ea,RawShaderMaterial:Cl,ShaderMaterial:tn,PointsMaterial:Za,MeshPhysicalMaterial:Rl,MeshStandardMaterial:Ll,MeshPhongMaterial:Pl,MeshToonMaterial:Il,MeshNormalMaterial:Dl,MeshLambertMaterial:Nl,MeshDepthMaterial:Ds,MeshDistanceMaterial:Ns,MeshBasicMaterial:_i,MeshMatcapMaterial:Ol,LineDashedMaterial:zl,LineBasicMaterial:Ba,Material:xi}[t]}}class Ic{static decodeText(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let i=0,n=t.length;i0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,n,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,n);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,n=i*this._origIndex;t.getValue(e,n);for(let t=i,r=n;t!==r;++t)e[t]=e[n+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let n=0;n!==r;++n)t[e+n]=t[i+n]}_slerp(t,e,i,n){ne.slerpFlat(t,e,t,e,t,i,n)}_slerpAdditive(t,e,i,n,r){const s=this._workIndex*r;ne.multiplyQuaternionsFlat(t,s,t,e,t,i),ne.slerpFlat(t,e,t,e,t,s,n)}_lerp(t,e,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[i+a]*n}}_lerpAdditive(t,e,i,n,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[i+s]*n}}}const eh="\\[\\]\\.:\\/",ih=new RegExp("["+eh+"]","g"),nh="[^"+eh+"]",rh="[^"+eh.replace("\\.","")+"]",sh=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",nh)+/(WCOD+)?/.source.replace("WCOD",rh)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",nh)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",nh)+"$"),ah=["material","materials","bones","map"];class oh{constructor(t,e,i){this.path=e,this.parsedPath=i||oh.parseTrackName(e),this.node=oh.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new oh.Composite(t,e,i):new oh(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(ih,"")}static parseTrackName(t){const e=sh.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const t=i.nodeName.substring(n+1);-1!==ah.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let n=0;n0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===st)for(let i=0,n=t.length;i!==n;++i)t[i].evaluate(s),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(s),e[i].accumulate(n,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let n=this.time+t,r=this._loopCount;const s=2202===i;if(0===t)return-1===r?n:s&&1==(1&r)?e-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(n>=e)n=e;else{if(!(n<0)){this.time=n;break t}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=e||n<0){const i=Math.floor(n/e);n-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=t>0?e:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return e-n}return n}_setEndings(t,e,i){const n=this._interpolantSettings;i?(n.endingStart=it,n.endingEnd=it):(n.endingStart=t?this.zeroSlopeAtStart?it:et:nt,n.endingEnd=e?this.zeroSlopeAtEnd?it:et:nt)}_scheduleFading(t,e,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const ch=new Float32Array(1);class hh{constructor(t){this.value=t}clone(){return new hh(void 0===this.value.clone?this.value:this.value.clone())}}let uh=0;function dh(t,e){return t.distance-e.distance}function ph(t,e,i,n){if(t.layers.test(e.layers)&&t.raycast(e,i),!0===n){const n=t.children;for(let t=0,r=n.length;t>-e-14,n[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(n[t]=e+15<<10,n[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(n[t]=31744,n[256|t]=64512,r[t]=24,r[256|t]=24):(n[t]=31744,n[256|t]=64512,r[t]=13,r[256|t]=13)}const s=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;0==(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,s[t]=e|i}for(let t=1024;t<2048;++t)s[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:n,shiftTable:r,mantissaTable:s,exponentTable:a,offsetTable:o}}var Uh=Object.freeze({__proto__:null,toHalfFloat:function(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=yt(t,-65504,65504),Oh.floatView[0]=t;const e=Oh.uint32View[0],i=e>>23&511;return Oh.baseTable[i]+((8388607&e)>>Oh.shiftTable[i])},fromHalfFloat:function(t){const e=t>>10;return Oh.uint32View[0]=Oh.mantissaTable[Oh.offsetTable[e]+(1023&t)]+Oh.exponentTable[e],Oh.floatView[0]}});"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:e}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=e),t.ACESFilmicToneMapping=4,t.AddEquation=i,t.AddOperation=2,t.AdditiveAnimationBlendMode=st,t.AdditiveBlending=2,t.AlphaFormat=1021,t.AlwaysDepth=1,t.AlwaysStencilFunc=519,t.AmbientLight=Ec,t.AmbientLightProbe=class extends Rc{constructor(t,e=1){super(void 0,e),this.isAmbientLightProbe=!0;const i=(new qt).set(t);this.sh.coefficients[0].set(i.r,i.g,i.b).multiplyScalar(2*Math.sqrt(Math.PI))}},t.AnimationClip=ic,t.AnimationLoader=class extends oc{constructor(t){super(t)}load(t,e,i,n){const r=this,s=new hc(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)}parse(t){const e=[];for(let i=0;i=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(n,t,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;t=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=n;t!==e;++t){const e=i[t],n=e[s],r=e[l];e[l]=n,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,n=i.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=n;t!==e;++t){const e=i[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let n=i[t];const r=this._bindings;if(void 0!==n)return r[n];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);n=r.length,i[t]=n,s.push(t),a.push(e),r.push(h);for(let i=c,n=o.length;i!==n;++i){const n=o[i];h[i]=new oh(n,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const n=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=i,s[i]=o,s.pop(),r[i]=r[a],r.pop(),n[i]=n[a],n.pop()}}},t.AnimationUtils=Hl,t.ArcCurve=so,t.ArrayCamera=Fs,t.ArrowHelper=class extends si{constructor(t=new re(0,0,1),e=new re(0,0,0),i=1,n=16776960,r=.2*i,s=.2*r){super(),this.type="ArrowHelper",void 0===Dh&&(Dh=new Di,Dh.setAttribute("position",new Ti([0,0,0,0,1,0],3)),Nh=new Lo(0,.5,1,5,1),Nh.translate(0,-.5,0)),this.position.copy(e),this.line=new Wa(Dh,new Ba({color:n,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Xi(Nh,new _i({color:n,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(i,r,s)}setDirection(t){if(t.y>.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Ih.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Ih,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}},t.Audio=Zc,t.AudioAnalyser=class{constructor(t,e=2048){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=e,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}getFrequencyData(){return this.analyser.getByteFrequencyData(this.data),this.data}getAverageFrequency(){let t=0;const e=this.getFrequencyData();for(let i=0;ithis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return mh.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}},t.Box3=oe,t.Box3Helper=class extends Xa{constructor(t,e=16776960){const i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new Di;n.setIndex(new bi(i,1)),n.setAttribute("position",new Ti([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(n,new Ba({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}dispose(){this.geometry.dispose(),this.material.dispose()}},t.BoxBufferGeometry=class extends Zi{constructor(t,e,i,n,r,s){console.warn("THREE.BoxBufferGeometry has been renamed to THREE.BoxGeometry."),super(t,e,i,n,r,s)}},t.BoxGeometry=Zi,t.BoxHelper=class extends Xa{constructor(t,e=16776960){const i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new Float32Array(24),r=new Di;r.setIndex(new bi(i,1)),r.setAttribute("position",new bi(n,3)),super(r,new Ba({color:e,toneMapped:!1})),this.object=t,this.type="BoxHelper",this.matrixAutoUpdate=!1,this.update()}update(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&Ph.setFromObject(this.object),Ph.isEmpty())return;const e=Ph.min,i=Ph.max,n=this.geometry.attributes.position,r=n.array;r[0]=i.x,r[1]=i.y,r[2]=i.z,r[3]=e.x,r[4]=i.y,r[5]=i.z,r[6]=e.x,r[7]=e.y,r[8]=i.z,r[9]=i.x,r[10]=e.y,r[11]=i.z,r[12]=i.x,r[13]=i.y,r[14]=e.z,r[15]=e.x,r[16]=i.y,r[17]=e.z,r[18]=e.x,r[19]=e.y,r[20]=e.z,r[21]=i.x,r[22]=e.y,r[23]=e.z,n.needsUpdate=!0,this.geometry.computeBoundingSphere()}setFromObject(t){return this.object=t,this.update(),this}copy(t,e){return super.copy(t,e),this.object=t.object,this}dispose(){this.geometry.dispose(),this.material.dispose()}},t.BufferAttribute=bi,t.BufferGeometry=Di,t.BufferGeometryLoader=Nc,t.ByteType=1010,t.Cache=rc,t.Camera=en,t.CameraHelper=class extends Xa{constructor(t){const e=new Di,i=new Ba({color:16777215,vertexColors:!0,toneMapped:!1}),n=[],r=[],s={};function a(t,e){o(t),o(e)}function o(t){n.push(0,0,0),r.push(0,0,0),void 0===s[t]&&(s[t]=[]),s[t].push(n.length/3-1)}a("n1","n2"),a("n2","n4"),a("n4","n3"),a("n3","n1"),a("f1","f2"),a("f2","f4"),a("f4","f3"),a("f3","f1"),a("n1","f1"),a("n2","f2"),a("n3","f3"),a("n4","f4"),a("p","n1"),a("p","n2"),a("p","n3"),a("p","n4"),a("u1","u2"),a("u2","u3"),a("u3","u1"),a("c","t"),a("p","c"),a("cn1","cn2"),a("cn3","cn4"),a("cf1","cf2"),a("cf3","cf4"),e.setAttribute("position",new Ti(n,3)),e.setAttribute("color",new Ti(r,3)),super(e,i),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update();const l=new qt(16755200),c=new qt(16711680),h=new qt(43775),u=new qt(16777215),d=new qt(3355443);this.setColors(l,c,h,u,d)}setColors(t,e,i,n,r){const s=this.geometry.getAttribute("color");s.setXYZ(0,t.r,t.g,t.b),s.setXYZ(1,t.r,t.g,t.b),s.setXYZ(2,t.r,t.g,t.b),s.setXYZ(3,t.r,t.g,t.b),s.setXYZ(4,t.r,t.g,t.b),s.setXYZ(5,t.r,t.g,t.b),s.setXYZ(6,t.r,t.g,t.b),s.setXYZ(7,t.r,t.g,t.b),s.setXYZ(8,t.r,t.g,t.b),s.setXYZ(9,t.r,t.g,t.b),s.setXYZ(10,t.r,t.g,t.b),s.setXYZ(11,t.r,t.g,t.b),s.setXYZ(12,t.r,t.g,t.b),s.setXYZ(13,t.r,t.g,t.b),s.setXYZ(14,t.r,t.g,t.b),s.setXYZ(15,t.r,t.g,t.b),s.setXYZ(16,t.r,t.g,t.b),s.setXYZ(17,t.r,t.g,t.b),s.setXYZ(18,t.r,t.g,t.b),s.setXYZ(19,t.r,t.g,t.b),s.setXYZ(20,t.r,t.g,t.b),s.setXYZ(21,t.r,t.g,t.b),s.setXYZ(22,t.r,t.g,t.b),s.setXYZ(23,t.r,t.g,t.b),s.setXYZ(24,e.r,e.g,e.b),s.setXYZ(25,e.r,e.g,e.b),s.setXYZ(26,e.r,e.g,e.b),s.setXYZ(27,e.r,e.g,e.b),s.setXYZ(28,e.r,e.g,e.b),s.setXYZ(29,e.r,e.g,e.b),s.setXYZ(30,e.r,e.g,e.b),s.setXYZ(31,e.r,e.g,e.b),s.setXYZ(32,i.r,i.g,i.b),s.setXYZ(33,i.r,i.g,i.b),s.setXYZ(34,i.r,i.g,i.b),s.setXYZ(35,i.r,i.g,i.b),s.setXYZ(36,i.r,i.g,i.b),s.setXYZ(37,i.r,i.g,i.b),s.setXYZ(38,n.r,n.g,n.b),s.setXYZ(39,n.r,n.g,n.b),s.setXYZ(40,r.r,r.g,r.b),s.setXYZ(41,r.r,r.g,r.b),s.setXYZ(42,r.r,r.g,r.b),s.setXYZ(43,r.r,r.g,r.b),s.setXYZ(44,r.r,r.g,r.b),s.setXYZ(45,r.r,r.g,r.b),s.setXYZ(46,r.r,r.g,r.b),s.setXYZ(47,r.r,r.g,r.b),s.setXYZ(48,r.r,r.g,r.b),s.setXYZ(49,r.r,r.g,r.b),s.needsUpdate=!0}update(){const t=this.geometry,e=this.pointMap;Lh.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),Rh("c",e,t,Lh,0,0,-1),Rh("t",e,t,Lh,0,0,1),Rh("n1",e,t,Lh,-1,-1,-1),Rh("n2",e,t,Lh,1,-1,-1),Rh("n3",e,t,Lh,-1,1,-1),Rh("n4",e,t,Lh,1,1,-1),Rh("f1",e,t,Lh,-1,-1,1),Rh("f2",e,t,Lh,1,-1,1),Rh("f3",e,t,Lh,-1,1,1),Rh("f4",e,t,Lh,1,1,1),Rh("u1",e,t,Lh,.7,1.1,-1),Rh("u2",e,t,Lh,-.7,1.1,-1),Rh("u3",e,t,Lh,0,2,-1),Rh("cf1",e,t,Lh,-1,0,1),Rh("cf2",e,t,Lh,1,0,1),Rh("cf3",e,t,Lh,0,-1,1),Rh("cf4",e,t,Lh,0,1,1),Rh("cn1",e,t,Lh,-1,0,-1),Rh("cn2",e,t,Lh,1,0,-1),Rh("cn3",e,t,Lh,0,-1,-1),Rh("cn4",e,t,Lh,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasTexture=class extends $t{constructor(t,e,i,n,r,s,a,o,l){super(t,e,i,n,r,s,a,o,l),this.isCanvasTexture=!0,this.needsUpdate=!0}},t.CapsuleBufferGeometry=class extends Eo{constructor(t,e,i,n){console.warn("THREE.CapsuleBufferGeometry has been renamed to THREE.CapsuleGeometry."),super(t,e,i,n)}},t.CapsuleGeometry=Eo,t.CatmullRomCurve3=uo,t.CineonToneMapping=3,t.CircleBufferGeometry=class extends Co{constructor(t,e,i,n){console.warn("THREE.CircleBufferGeometry has been renamed to THREE.CircleGeometry."),super(t,e,i,n)}},t.CircleGeometry=Co,t.ClampToEdgeWrapping=h,t.Clock=Hc,t.Color=qt,t.ColorKeyframeTrack=Jl,t.ColorManagement=Ft,t.CompressedArrayTexture=class extends io{constructor(t,e,i,n,r,s){super(t,e,i,r,s),this.isCompressedArrayTexture=!0,this.image.depth=n,this.wrapR=h}},t.CompressedTexture=io,t.CompressedTextureLoader=class extends oc{constructor(t){super(t)}load(t,e,i,n){const r=this,s=[],a=new io,o=new hc(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const i=r.parse(t,!0);s[c]={width:i.width,height:i.height,format:i.format,mipmaps:i.mipmaps},l+=1,6===l&&(1===i.mipmapCount&&(a.minFilter=f),a.image=s,a.format=i.format,a.needsUpdate=!0,e&&e(a))}),i,n)}if(Array.isArray(t))for(let e=0,i=t.length;e0){const i=new sc(e);r=new uc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){n=new uc(this.manager),n.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e1)for(let i=0;iNumber.EPSILON){if(l<0&&(i=e[s],o=-o,a=e[r],l=-l),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=l*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;n=!n}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return n}const i=hl.isClockWise,n=this.subPaths;if(0===n.length)return[];let r,s,a;const o=[];if(1===n.length)return s=n[0],a=new Bo,a.curves=s.curves,o.push(a),o;let l=!i(n[0].getPoints());l=t?!l:l;const c=[],h=[];let u,d,p=[],m=0;h[m]=void 0,p[m]=[];for(let e=0,a=n.length;e1){let t=!1,i=0;for(let t=0,e=h.length;t0&&!1===t&&(p=c)}for(let t=0,e=h.length;t=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}},t.WebGL1Renderer=Ys,t.WebGL3DRenderTarget=class extends te{constructor(t=1,e=1,i=1){super(t,e),this.isWebGL3DRenderTarget=!0,this.depth=i,this.texture=new ie(null,t,e,i),this.texture.isRenderTargetTexture=!0}},t.WebGLArrayRenderTarget=class extends te{constructor(t=1,e=1,i=1){super(t,e),this.isWebGLArrayRenderTarget=!0,this.depth=i,this.texture=new ee(null,t,e,i),this.texture.isRenderTargetTexture=!0}},t.WebGLCubeRenderTarget=on,t.WebGLMultipleRenderTargets=class extends te{constructor(t=1,e=1,i=1,n={}){super(t,e,n),this.isWebGLMultipleRenderTargets=!0;const r=this.texture;this.texture=[];for(let t=0;t
Reset on {{ object.get_display_name() }}

+

Self score: {{ object.galaxy_user.mass }}

+ + + + + + + + + + + {% for lane in lanes %} + + + + + + + + + + {% endfor %} +
CitizenScoreDistanceFamilyPicturesClubs
Locate{{ lane.other_star_name }}{{ lane.other_star_mass }}{{ lane.distance }}{{ lane.family }}{{ lane.pictures }}{{ lane.clubs }}
+ +
+{% else %} +

This citizen has not yet joined the galaxy

+{% endif %} + +{% endblock %} + +{% block script %} + {{ super() }} + + + + + + + +{% endblock %} + + diff --git a/galaxy/tests.py b/galaxy/tests.py new file mode 100644 index 00000000..595844b2 --- /dev/null +++ b/galaxy/tests.py @@ -0,0 +1,149 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Skia +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.test import TestCase +from django.core.management import call_command + +from core.models import User +from galaxy.models import Galaxy + + +class GalaxyTest(TestCase): + def setUp(self): + call_command("populate") + self.root = User.objects.get(username="root") + self.skia = User.objects.get(username="skia") + self.sli = User.objects.get(username="sli") + self.krophil = User.objects.get(username="krophil") + self.richard = User.objects.get(username="rbatsbak") + self.subscriber = User.objects.get(username="subscriber") + self.public = User.objects.get(username="public") + self.com = User.objects.get(username="comunity") + + def test_user_self_score(self): + with self.assertNumQueries(8): + self.assertEqual(Galaxy.compute_user_score(self.root), 9) + self.assertEqual(Galaxy.compute_user_score(self.skia), 10) + self.assertEqual(Galaxy.compute_user_score(self.sli), 8) + self.assertEqual(Galaxy.compute_user_score(self.krophil), 2) + self.assertEqual(Galaxy.compute_user_score(self.richard), 10) + self.assertEqual(Galaxy.compute_user_score(self.subscriber), 8) + self.assertEqual(Galaxy.compute_user_score(self.public), 8) + self.assertEqual(Galaxy.compute_user_score(self.com), 1) + + def test_users_score(self): + expected_scores = { + "krophil": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "rbatsbak": {"clubs": 100, "family": 0, "pictures": 0, "score": 100}, + "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + }, + "public": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0} + }, + "rbatsbak": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "public": {"clubs": 0, "family": 366, "pictures": 0, "score": 366}, + "subscriber": {"clubs": 0, "family": 366, "pictures": 0, "score": 366}, + }, + "root": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "krophil": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "rbatsbak": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "skia": {"clubs": 0, "family": 732, "pictures": 0, "score": 732}, + "sli": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + }, + "skia": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "krophil": {"clubs": 114, "family": 0, "pictures": 2, "score": 116}, + "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "rbatsbak": {"clubs": 100, "family": 0, "pictures": 0, "score": 100}, + "sli": {"clubs": 0, "family": 366, "pictures": 4, "score": 370}, + "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + }, + "sli": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "krophil": {"clubs": 17, "family": 0, "pictures": 2, "score": 19}, + "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "rbatsbak": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + }, + "subscriber": { + "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, + }, + } + computed_scores = {} + users = [ + self.root, + self.skia, + self.sli, + self.krophil, + self.richard, + self.subscriber, + self.public, + self.com, + ] + + with self.assertNumQueries(100): + while len(users) > 0: + user1 = users.pop(0) + for user2 in users: + score, family, pictures, clubs = Galaxy.compute_users_score( + user1, user2 + ) + u1 = computed_scores.get(user1.username, {}) + u1[user2.username] = { + "score": score, + "family": family, + "pictures": pictures, + "clubs": clubs, + } + computed_scores[user1.username] = u1 + + self.maxDiff = None # Yes, we want to see the diff if any + self.assertDictEqual(expected_scores, computed_scores) + + def test_page_is_citizen(self): + Galaxy.rule() + self.client.login(username="root", password="plop") + response = self.client.get("/galaxy/1/") + self.assertContains( + response, + 'Locate', + status_code=200, + ) + + def test_page_not_citizen(self): + Galaxy.rule() + self.client.login(username="root", password="plop") + response = self.client.get("/galaxy/2/") + self.assertContains( + response, + "Ce citoyen n'a pas encore rejoint la galaxie", + status_code=404, + ) diff --git a/galaxy/urls.py b/galaxy/urls.py new file mode 100644 index 00000000..fcab45bc --- /dev/null +++ b/galaxy/urls.py @@ -0,0 +1,40 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Skia +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.urls import path + +from galaxy.views import * + +urlpatterns = [ + path( + "/", + GalaxyUserView.as_view(), + name="user", + ), + path( + "data.json", + GalaxyDataView.as_view(), + name="data", + ), +] diff --git a/galaxy/views.py b/galaxy/views.py new file mode 100644 index 00000000..47228505 --- /dev/null +++ b/galaxy/views.py @@ -0,0 +1,104 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Skia +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.views.generic import DetailView, View +from django.http import JsonResponse, Http404 +from django.db.models import Q, Case, F, When, Value +from django.db.models.functions import Concat +from django.utils.translation import gettext_lazy as _ + +from core.views import ( + CanViewMixin, + FormerSubscriberMixin, +) +from core.models import User +from core.views import UserTabsMixin +from galaxy.models import Galaxy, GalaxyLane + + +class GalaxyUserView(CanViewMixin, UserTabsMixin, DetailView): + model = User + pk_url_kwarg = "user_id" + template_name = "galaxy/user.jinja" + current_tab = "galaxy" + + def get_object(self, *args, **kwargs): + user: User = super(GalaxyUserView, self).get_object(*args, **kwargs) + if not hasattr(user, "galaxy_user"): + raise Http404(_("This citizen has not yet joined the galaxy")) + return user + + def get_queryset(self): + return super(GalaxyUserView, self).get_queryset().select_related("galaxy_user") + + def get_context_data(self, **kwargs): + kwargs = super(GalaxyUserView, self).get_context_data(**kwargs) + kwargs["lanes"] = ( + GalaxyLane.objects.filter( + Q(star1=self.object.galaxy_user) | Q(star2=self.object.galaxy_user) + ) + .order_by("distance") + .annotate( + other_star_id=Case( + When(star1=self.object.galaxy_user, then=F("star2__owner__id")), + default=F("star1__owner__id"), + ), + other_star_mass=Case( + When(star1=self.object.galaxy_user, then=F("star2__mass")), + default=F("star1__mass"), + ), + other_star_name=Case( + When( + star1=self.object.galaxy_user, + then=Case( + When( + star2__owner__nick_name=None, + then=Concat( + F("star2__owner__first_name"), + Value(" "), + F("star2__owner__last_name"), + ), + ) + ), + ), + default=Case( + When( + star1__owner__nick_name=None, + then=Concat( + F("star1__owner__first_name"), + Value(" "), + F("star1__owner__last_name"), + ), + ) + ), + ), + ) + .select_related("star1", "star2") + ) + return kwargs + + +class GalaxyDataView(FormerSubscriberMixin, View): + def get(self, request, *args, **kwargs): + return JsonResponse(Galaxy.objects.first().state) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index e2b442a5..2ae9a68b 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-28 16:54+0100\n" +"POT-Creation-Date: 2023-03-02 11:02+0100\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \n" "Language-Team: AE info \n" @@ -18,8 +18,8 @@ msgstr "" #: accounting/models.py:61 accounting/models.py:110 accounting/models.py:143 #: accounting/models.py:216 club/models.py:48 com/models.py:279 -#: com/models.py:296 counter/models.py:199 counter/models.py:232 -#: counter/models.py:316 forum/models.py:58 launderette/models.py:38 +#: com/models.py:296 counter/models.py:196 counter/models.py:229 +#: counter/models.py:317 forum/models.py:58 launderette/models.py:38 #: launderette/models.py:93 launderette/models.py:131 stock/models.py:40 #: stock/models.py:63 stock/models.py:105 stock/models.py:133 msgid "name" @@ -66,8 +66,8 @@ msgid "account number" msgstr "numero de compte" #: accounting/models.py:116 accounting/models.py:147 club/models.py:275 -#: com/models.py:75 com/models.py:266 com/models.py:302 counter/models.py:250 -#: counter/models.py:318 trombi/models.py:217 +#: com/models.py:75 com/models.py:266 com/models.py:302 counter/models.py:247 +#: counter/models.py:319 trombi/models.py:217 msgid "club" msgstr "club" @@ -88,12 +88,12 @@ msgstr "Compte club" msgid "%(club_account)s on %(bank_account)s" msgstr "%(club_account)s sur %(bank_account)s" -#: accounting/models.py:214 club/models.py:281 counter/models.py:752 +#: accounting/models.py:214 club/models.py:281 counter/models.py:753 #: election/models.py:18 launderette/models.py:194 msgid "start date" msgstr "date de début" -#: accounting/models.py:215 club/models.py:282 counter/models.py:753 +#: accounting/models.py:215 club/models.py:282 counter/models.py:754 #: election/models.py:19 msgid "end date" msgstr "date de fin" @@ -107,7 +107,7 @@ msgid "club account" msgstr "compte club" #: accounting/models.py:225 accounting/models.py:289 counter/models.py:60 -#: counter/models.py:474 +#: counter/models.py:475 msgid "amount" msgstr "montant" @@ -129,18 +129,18 @@ msgstr "classeur" #: accounting/models.py:290 core/models.py:862 core/models.py:1400 #: core/models.py:1448 core/models.py:1477 core/models.py:1501 -#: counter/models.py:484 counter/models.py:577 counter/models.py:782 -#: eboutic/models.py:66 eboutic/models.py:240 forum/models.py:311 +#: counter/models.py:485 counter/models.py:578 counter/models.py:789 +#: eboutic/models.py:67 eboutic/models.py:236 forum/models.py:311 #: forum/models.py:408 stock/models.py:104 msgid "date" msgstr "date" -#: accounting/models.py:291 counter/models.py:201 counter/models.py:783 +#: accounting/models.py:291 counter/models.py:198 counter/models.py:790 #: pedagogy/models.py:219 stock/models.py:107 msgid "comment" msgstr "commentaire" -#: accounting/models.py:293 counter/models.py:486 counter/models.py:579 +#: accounting/models.py:293 counter/models.py:487 counter/models.py:580 #: subscription/models.py:66 msgid "payment method" msgstr "méthode de paiement" @@ -149,7 +149,7 @@ msgstr "méthode de paiement" msgid "cheque number" msgstr "numéro de chèque" -#: accounting/models.py:303 eboutic/models.py:332 +#: accounting/models.py:303 eboutic/models.py:328 msgid "invoice" msgstr "facture" @@ -167,7 +167,7 @@ msgstr "type comptable" #: accounting/models.py:328 accounting/models.py:475 accounting/models.py:510 #: accounting/models.py:545 core/models.py:1476 core/models.py:1502 -#: counter/models.py:543 +#: counter/models.py:544 msgid "label" msgstr "étiquette" @@ -211,7 +211,7 @@ msgstr "Utilisateur" msgid "Club" msgstr "Club" -#: accounting/models.py:339 core/views/user.py:287 +#: accounting/models.py:339 core/views/user.py:279 msgid "Account" msgstr "Compte" @@ -219,7 +219,7 @@ msgstr "Compte" msgid "Company" msgstr "Entreprise" -#: accounting/models.py:341 core/models.py:230 sith/settings.py:367 +#: accounting/models.py:341 core/models.py:230 sith/settings.py:391 #: stock/templates/stock/shopping_list_items.jinja:37 msgid "Other" msgstr "Autre" @@ -266,7 +266,7 @@ msgstr "" "Vous devez fournir soit un type comptable simplifié ou un type comptable " "standard" -#: accounting/models.py:467 counter/models.py:242 pedagogy/models.py:46 +#: accounting/models.py:467 counter/models.py:239 pedagogy/models.py:46 msgid "code" msgstr "code" @@ -530,7 +530,7 @@ msgid "Effective amount" msgstr "Montant effectif" #: accounting/templates/accounting/club_account_details.jinja:36 -#: sith/settings.py:413 +#: sith/settings.py:437 msgid "Closed" msgstr "Fermé" @@ -670,7 +670,7 @@ msgid "Done" msgstr "Effectuées" #: accounting/templates/accounting/journal_details.jinja:41 -#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:1064 +#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:1072 #: pedagogy/templates/pedagogy/moderation.jinja:13 #: pedagogy/templates/pedagogy/uv_detail.jinja:138 #: trombi/templates/trombi/comment.jinja:4 @@ -935,15 +935,15 @@ msgstr "Retirer" msgid "Action" msgstr "Action" -#: club/forms.py:116 club/tests.py:576 +#: club/forms.py:116 club/tests.py:578 msgid "This field is required" msgstr "Ce champ est obligatoire" -#: club/forms.py:128 club/forms.py:256 club/tests.py:588 +#: club/forms.py:128 club/forms.py:256 club/tests.py:590 msgid "One of the selected users doesn't exist" msgstr "Un des utilisateurs sélectionné n'existe pas" -#: club/forms.py:132 club/tests.py:606 +#: club/forms.py:132 club/tests.py:608 msgid "One of the selected users doesn't have an email address" msgstr "Un des utilisateurs sélectionnés n'a pas d'adresse email" @@ -951,15 +951,15 @@ msgstr "Un des utilisateurs sélectionnés n'a pas d'adresse email" msgid "An action is required" msgstr "Une action est requise" -#: club/forms.py:154 club/tests.py:565 +#: club/forms.py:154 club/tests.py:567 msgid "You must specify at least an user or an email address" msgstr "vous devez spécifier au moins un utilisateur ou une adresse email" -#: club/forms.py:162 counter/forms.py:157 +#: club/forms.py:162 counter/forms.py:165 msgid "Begin date" msgstr "Date de début" -#: club/forms.py:163 com/views.py:84 com/views.py:199 counter/forms.py:158 +#: club/forms.py:163 com/views.py:84 com/views.py:199 counter/forms.py:166 #: election/views.py:172 subscription/views.py:49 msgid "End date" msgstr "Date de fin" @@ -967,15 +967,15 @@ msgstr "Date de fin" #: club/forms.py:166 club/templates/club/club_sellings.jinja:21 #: core/templates/core/user_account_detail.jinja:18 #: core/templates/core/user_account_detail.jinja:51 -#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:148 +#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:156 msgid "Counter" msgstr "Comptoir" -#: club/forms.py:174 counter/views.py:762 +#: club/forms.py:174 counter/views.py:770 msgid "Products" msgstr "Produits" -#: club/forms.py:179 counter/views.py:767 +#: club/forms.py:179 counter/views.py:775 msgid "Archived products" msgstr "Produits archivés" @@ -1045,8 +1045,8 @@ msgstr "Vous ne pouvez pas faire de boucles dans les clubs" msgid "A club with that unix_name already exists" msgstr "Un club avec ce nom UNIX existe déjà." -#: club/models.py:267 counter/models.py:743 counter/models.py:773 -#: eboutic/models.py:62 eboutic/models.py:236 election/models.py:192 +#: club/models.py:267 counter/models.py:744 counter/models.py:780 +#: eboutic/models.py:63 eboutic/models.py:232 election/models.py:192 #: launderette/models.py:145 launderette/models.py:213 sas/models.py:244 #: trombi/models.py:213 msgid "user" @@ -1057,8 +1057,8 @@ msgstr "nom d'utilisateur" msgid "role" msgstr "rôle" -#: club/models.py:289 core/models.py:81 counter/models.py:200 -#: counter/models.py:233 election/models.py:15 election/models.py:120 +#: club/models.py:289 core/models.py:81 counter/models.py:197 +#: counter/models.py:230 election/models.py:15 election/models.py:120 #: election/models.py:197 forum/models.py:59 forum/models.py:240 msgid "description" msgstr "description" @@ -1096,7 +1096,7 @@ msgstr "Liste de diffusion" msgid "At least user or email is required" msgstr "Au moins un utilisateur ou un email est nécessaire" -#: club/models.py:459 club/tests.py:634 +#: club/models.py:459 club/tests.py:636 msgid "This email is already suscribed in this mailing" msgstr "Cet email est déjà abonné à cette mailing" @@ -1362,7 +1362,7 @@ msgstr "Anciens membres" msgid "History" msgstr "Historique" -#: club/views.py:125 core/templates/core/base.jinja:123 core/views/user.py:220 +#: club/views.py:125 core/templates/core/base.jinja:123 core/views/user.py:222 #: sas/templates/sas/picture.jinja:95 trombi/views.py:63 msgid "Tools" msgstr "Outils" @@ -1856,7 +1856,7 @@ msgstr "Retour" #: com/templates/com/weekmail_preview.jinja:13 msgid "The following recipients were refused by the SMTP:" -msgstr "" +msgstr "Les destinataires suivants ont été refusé par le SMTP :" #: com/templates/com/weekmail_preview.jinja:24 msgid "Clean subscribers" @@ -2375,7 +2375,7 @@ msgstr "type d'opération" msgid "403, Forbidden" msgstr "403, Non autorisé" -#: core/templates/core/404.jinja:5 +#: core/templates/core/404.jinja:6 msgid "404, Not Found" msgstr "404. Non trouvé" @@ -2484,13 +2484,13 @@ msgstr "Forum" msgid "Gallery" msgstr "Photos" -#: core/templates/core/base.jinja:187 counter/models.py:326 +#: core/templates/core/base.jinja:187 counter/models.py:327 #: counter/templates/counter/counter_list.jinja:11 #: eboutic/templates/eboutic/eboutic_main.jinja:4 #: eboutic/templates/eboutic/eboutic_main.jinja:23 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:17 #: eboutic/templates/eboutic/eboutic_payment_result.jinja:4 -#: sith/settings.py:366 sith/settings.py:374 +#: sith/settings.py:390 sith/settings.py:398 msgid "Eboutic" msgstr "Eboutic" @@ -3012,7 +3012,7 @@ msgstr "Résultat de la recherche" msgid "Users" msgstr "Utilisateurs" -#: core/templates/core/search.jinja:18 core/views/user.py:248 +#: core/templates/core/search.jinja:18 core/views/user.py:244 #: counter/templates/counter/stats.jinja:17 msgid "Clubs" msgstr "Clubs" @@ -3070,7 +3070,7 @@ msgid "Eboutic invoices" msgstr "Facture eboutic" #: core/templates/core/user_account.jinja:57 -#: core/templates/core/user_tools.jinja:37 counter/views.py:787 +#: core/templates/core/user_tools.jinja:37 counter/views.py:795 msgid "Etickets" msgstr "Etickets" @@ -3259,7 +3259,7 @@ msgstr "Voir l'arbre des ancêtres" msgid "No godfathers / godmothers" msgstr "Pas de famille" -#: core/templates/core/user_godfathers.jinja:25 core/views/user.py:472 +#: core/templates/core/user_godfathers.jinja:25 core/views/user.py:464 msgid "Godchildren" msgstr "Fillots / Fillotes" @@ -3328,7 +3328,7 @@ msgid "Error downloading your pictures" msgstr "Erreur de téléchargement de vos photos" #: core/templates/core/user_preferences.jinja:4 -#: core/templates/core/user_preferences.jinja:8 core/views/user.py:238 +#: core/templates/core/user_preferences.jinja:8 core/views/user.py:236 msgid "Preferences" msgstr "Préférences" @@ -3381,7 +3381,7 @@ msgstr "Achats" msgid "Product top 10" msgstr "Top 10 produits" -#: core/templates/core/user_stats.jinja:27 counter/forms.py:168 +#: core/templates/core/user_stats.jinja:27 counter/forms.py:176 msgid "Product" msgstr "Produit" @@ -3398,7 +3398,7 @@ msgstr "Outils utilisateurs" msgid "Sith management" msgstr "Gestion de Sith" -#: core/templates/core/user_tools.jinja:14 core/views/user.py:258 +#: core/templates/core/user_tools.jinja:14 core/views/user.py:252 msgid "Groups" msgstr "Groupes" @@ -3426,8 +3426,8 @@ msgstr "Cotisations" msgid "Subscription stats" msgstr "Statistiques de cotisation" -#: core/templates/core/user_tools.jinja:29 counter/forms.py:131 -#: counter/views.py:757 +#: core/templates/core/user_tools.jinja:29 counter/forms.py:139 +#: counter/views.py:765 msgid "Counters" msgstr "Comptoirs" @@ -3444,16 +3444,16 @@ msgid "Product types management" msgstr "Gestion des types de produit" #: core/templates/core/user_tools.jinja:35 -#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:777 +#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:785 msgid "Cash register summaries" msgstr "Relevés de caisse" #: core/templates/core/user_tools.jinja:36 -#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:782 +#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:790 msgid "Invoices call" msgstr "Appels à facture" -#: core/templates/core/user_tools.jinja:44 core/views/user.py:278 +#: core/templates/core/user_tools.jinja:44 core/views/user.py:270 #: counter/templates/counter/counter_list.jinja:18 #: counter/templates/counter/counter_list.jinja:34 #: counter/templates/counter/counter_list.jinja:56 @@ -3678,7 +3678,7 @@ msgstr "Parrain / Marraine" msgid "Godchild" msgstr "Fillot / Fillote" -#: core/views/forms.py:348 counter/forms.py:47 trombi/views.py:158 +#: core/views/forms.py:348 counter/forms.py:55 trombi/views.py:158 msgid "Select user" msgstr "Choisir un utilisateur" @@ -3700,37 +3700,41 @@ msgstr "Utilisateurs à retirer du groupe" msgid "Users to add to group" msgstr "Utilisateurs à ajouter au groupe" -#: core/views/user.py:206 core/views/user.py:474 core/views/user.py:476 +#: core/views/user.py:202 core/views/user.py:466 core/views/user.py:468 msgid "Family" msgstr "Famille" -#: core/views/user.py:215 trombi/templates/trombi/export.jinja:25 +#: core/views/user.py:207 trombi/templates/trombi/export.jinja:25 #: trombi/templates/trombi/user_profile.jinja:11 msgid "Pictures" msgstr "Photos" -#: core/views/user.py:618 +#: core/views/user.py:217 +msgid "Galaxy" +msgstr "Galaxie" + +#: core/views/user.py:610 msgid "User already has a profile picture" msgstr "L'utilisateur a déjà une photo de profil" -#: counter/app.py:31 counter/models.py:340 counter/models.py:749 -#: counter/models.py:779 launderette/models.py:41 stock/models.py:43 +#: counter/app.py:31 counter/models.py:341 counter/models.py:750 +#: counter/models.py:786 launderette/models.py:41 stock/models.py:43 msgid "counter" msgstr "comptoir" -#: counter/forms.py:30 +#: counter/forms.py:38 msgid "This UID is invalid" msgstr "Cet UID est invalide" -#: counter/forms.py:69 +#: counter/forms.py:77 msgid "User not found" msgstr "Utilisateur non trouvé" -#: counter/forms.py:117 +#: counter/forms.py:125 msgid "Parent product" msgstr "Produit parent" -#: counter/forms.py:123 +#: counter/forms.py:131 msgid "Buying groups" msgstr "Groupes d'achat" @@ -3754,7 +3758,7 @@ msgstr "client" msgid "customers" msgstr "clients" -#: counter/models.py:126 counter/views.py:309 +#: counter/models.py:126 counter/views.py:317 msgid "Not enough money" msgstr "Solde insuffisant" @@ -3770,133 +3774,133 @@ msgstr "Nom de famille" msgid "Address 1" msgstr "Adresse 1" -#: counter/models.py:161 +#: counter/models.py:160 msgid "Address 2" msgstr "Adresse 2" -#: counter/models.py:163 +#: counter/models.py:161 msgid "Zip code" msgstr "Code postal" -#: counter/models.py:164 +#: counter/models.py:162 msgid "City" msgstr "Ville" -#: counter/models.py:165 +#: counter/models.py:163 msgid "Country" msgstr "Pays" -#: counter/models.py:209 counter/models.py:237 +#: counter/models.py:206 counter/models.py:234 msgid "product type" msgstr "type du produit" -#: counter/models.py:243 +#: counter/models.py:240 msgid "purchase price" msgstr "prix d'achat" -#: counter/models.py:244 +#: counter/models.py:241 msgid "selling price" msgstr "prix de vente" -#: counter/models.py:245 +#: counter/models.py:242 msgid "special selling price" msgstr "prix de vente spécial" -#: counter/models.py:247 +#: counter/models.py:244 msgid "icon" msgstr "icône" -#: counter/models.py:252 +#: counter/models.py:249 msgid "limit age" msgstr "âge limite" -#: counter/models.py:253 +#: counter/models.py:250 msgid "tray price" msgstr "prix plateau" -#: counter/models.py:257 +#: counter/models.py:254 msgid "parent product" msgstr "produit parent" -#: counter/models.py:263 +#: counter/models.py:260 msgid "buying groups" msgstr "groupe d'achat" -#: counter/models.py:265 election/models.py:52 +#: counter/models.py:262 election/models.py:52 msgid "archived" msgstr "archivé" -#: counter/models.py:268 counter/models.py:874 +#: counter/models.py:265 counter/models.py:881 msgid "product" msgstr "produit" -#: counter/models.py:321 +#: counter/models.py:322 msgid "products" msgstr "produits" -#: counter/models.py:324 +#: counter/models.py:325 msgid "counter type" msgstr "type de comptoir" -#: counter/models.py:326 +#: counter/models.py:327 msgid "Bar" msgstr "Bar" -#: counter/models.py:326 +#: counter/models.py:327 msgid "Office" msgstr "Bureau" -#: counter/models.py:329 +#: counter/models.py:330 msgid "sellers" msgstr "vendeurs" -#: counter/models.py:337 launderette/models.py:207 +#: counter/models.py:338 launderette/models.py:207 msgid "token" msgstr "jeton" -#: counter/models.py:492 +#: counter/models.py:493 msgid "bank" msgstr "banque" -#: counter/models.py:494 counter/models.py:584 +#: counter/models.py:495 counter/models.py:585 msgid "is validated" msgstr "est validé" -#: counter/models.py:497 +#: counter/models.py:498 msgid "refilling" msgstr "rechargement" -#: counter/models.py:561 eboutic/models.py:292 +#: counter/models.py:562 eboutic/models.py:288 msgid "unit price" msgstr "prix unitaire" -#: counter/models.py:562 counter/models.py:859 eboutic/models.py:293 +#: counter/models.py:563 counter/models.py:866 eboutic/models.py:289 msgid "quantity" msgstr "quantité" -#: counter/models.py:581 +#: counter/models.py:582 msgid "Sith account" msgstr "Compte utilisateur" -#: counter/models.py:581 sith/settings.py:359 sith/settings.py:364 -#: sith/settings.py:384 +#: counter/models.py:582 sith/settings.py:383 sith/settings.py:388 +#: sith/settings.py:408 msgid "Credit card" msgstr "Carte bancaire" -#: counter/models.py:587 +#: counter/models.py:588 msgid "selling" msgstr "vente" -#: counter/models.py:614 +#: counter/models.py:615 msgid "Unknown event" msgstr "Événement inconnu" -#: counter/models.py:615 +#: counter/models.py:616 #, python-format msgid "Eticket bought for the event %(event)s" msgstr "Eticket acheté pour l'événement %(event)s" -#: counter/models.py:617 counter/models.py:640 +#: counter/models.py:618 counter/models.py:641 #, python-format msgid "" "You bought an eticket for the event %(event)s.\n" @@ -3908,59 +3912,59 @@ msgstr "" "Vous pouvez également retrouver tous vos e-tickets sur votre page de compte " "%(url)s." -#: counter/models.py:754 +#: counter/models.py:755 msgid "last activity date" msgstr "dernière activité" -#: counter/models.py:757 +#: counter/models.py:758 msgid "permanency" msgstr "permanence" -#: counter/models.py:784 +#: counter/models.py:791 msgid "emptied" msgstr "coffre vidée" -#: counter/models.py:787 +#: counter/models.py:794 msgid "cash register summary" msgstr "relevé de caisse" -#: counter/models.py:855 +#: counter/models.py:862 msgid "cash summary" msgstr "relevé" -#: counter/models.py:858 +#: counter/models.py:865 msgid "value" msgstr "valeur" -#: counter/models.py:860 +#: counter/models.py:867 msgid "check" msgstr "chèque" -#: counter/models.py:863 +#: counter/models.py:870 msgid "cash register summary item" msgstr "élément de relevé de caisse" -#: counter/models.py:878 +#: counter/models.py:885 msgid "banner" msgstr "bannière" -#: counter/models.py:880 +#: counter/models.py:887 msgid "event date" msgstr "date de l'événement" -#: counter/models.py:882 +#: counter/models.py:889 msgid "event title" msgstr "titre de l'événement" -#: counter/models.py:884 +#: counter/models.py:891 msgid "secret" msgstr "secret" -#: counter/models.py:940 +#: counter/models.py:947 msgid "uid" msgstr "uid" -#: counter/models.py:945 +#: counter/models.py:952 msgid "student cards" msgstr "cartes étudiante" @@ -4012,7 +4016,7 @@ msgstr "Liste des relevés de caisse" msgid "Theoric sums" msgstr "Sommes théoriques" -#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:1065 +#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:1073 msgid "Emptied" msgstr "Coffre vidé" @@ -4070,11 +4074,11 @@ msgstr "Terminer" msgid "Refilling" msgstr "Rechargement" -#: counter/templates/counter/counter_click.jinja:193 counter/views.py:578 +#: counter/templates/counter/counter_click.jinja:193 counter/views.py:586 msgid "END" msgstr "FIN" -#: counter/templates/counter/counter_click.jinja:193 counter/views.py:580 +#: counter/templates/counter/counter_click.jinja:193 counter/views.py:588 msgid "CAN" msgstr "ANN" @@ -4240,164 +4244,164 @@ msgstr "Temps" msgid "Top 100 barman %(counter_name)s (all semesters)" msgstr "Top 100 barman %(counter_name)s (tous les semestres)" -#: counter/views.py:167 +#: counter/views.py:175 msgid "Cash summary" msgstr "Relevé de caisse" -#: counter/views.py:181 +#: counter/views.py:189 msgid "Last operations" msgstr "Dernières opérations" -#: counter/views.py:196 +#: counter/views.py:204 msgid "Take items from stock" msgstr "Prendre des éléments du stock" -#: counter/views.py:249 +#: counter/views.py:257 msgid "Bad credentials" msgstr "Mauvais identifiants" -#: counter/views.py:251 +#: counter/views.py:259 msgid "User is not barman" msgstr "L'utilisateur n'est pas barman." -#: counter/views.py:256 +#: counter/views.py:264 msgid "Bad location, someone is already logged in somewhere else" msgstr "Mauvais comptoir, quelqu'un est déjà connecté ailleurs" -#: counter/views.py:300 +#: counter/views.py:308 msgid "Too young for that product" msgstr "Trop jeune pour ce produit" -#: counter/views.py:303 +#: counter/views.py:311 msgid "Not allowed for that product" msgstr "Non autorisé pour ce produit" -#: counter/views.py:306 +#: counter/views.py:314 msgid "No date of birth provided" msgstr "Pas de date de naissance renseignée" -#: counter/views.py:603 +#: counter/views.py:611 msgid "You have not enough money to buy all the basket" msgstr "Vous n'avez pas assez d'argent pour acheter le panier" -#: counter/views.py:751 +#: counter/views.py:759 msgid "Counter administration" msgstr "Administration des comptoirs" -#: counter/views.py:753 +#: counter/views.py:761 msgid "Stocks" msgstr "Stocks" -#: counter/views.py:772 +#: counter/views.py:780 msgid "Product types" msgstr "Types de produit" -#: counter/views.py:1022 +#: counter/views.py:1030 msgid "10 cents" msgstr "10 centimes" -#: counter/views.py:1023 +#: counter/views.py:1031 msgid "20 cents" msgstr "20 centimes" -#: counter/views.py:1024 +#: counter/views.py:1032 msgid "50 cents" msgstr "50 centimes" -#: counter/views.py:1025 +#: counter/views.py:1033 msgid "1 euro" msgstr "1 €" -#: counter/views.py:1026 +#: counter/views.py:1034 msgid "2 euros" msgstr "2 €" -#: counter/views.py:1027 +#: counter/views.py:1035 msgid "5 euros" msgstr "5 €" -#: counter/views.py:1028 +#: counter/views.py:1036 msgid "10 euros" msgstr "10 €" -#: counter/views.py:1029 +#: counter/views.py:1037 msgid "20 euros" msgstr "20 €" -#: counter/views.py:1030 +#: counter/views.py:1038 msgid "50 euros" msgstr "50 €" -#: counter/views.py:1032 +#: counter/views.py:1040 msgid "100 euros" msgstr "100 €" -#: counter/views.py:1035 counter/views.py:1041 counter/views.py:1047 -#: counter/views.py:1053 counter/views.py:1059 +#: counter/views.py:1043 counter/views.py:1049 counter/views.py:1055 +#: counter/views.py:1061 counter/views.py:1067 msgid "Check amount" msgstr "Montant du chèque" -#: counter/views.py:1038 counter/views.py:1044 counter/views.py:1050 -#: counter/views.py:1056 counter/views.py:1062 +#: counter/views.py:1046 counter/views.py:1052 counter/views.py:1058 +#: counter/views.py:1064 counter/views.py:1070 msgid "Check quantity" msgstr "Nombre de chèque" -#: counter/views.py:1676 +#: counter/views.py:1684 msgid "people(s)" msgstr "personne(s)" -#: eboutic/forms.py:102 +#: eboutic/forms.py:107 msgid "You have no basket." msgstr "Vous n'avez pas de panier." -#: eboutic/forms.py:107 +#: eboutic/forms.py:120 msgid "The request was badly formatted." msgstr "La requête a été mal formatée." -#: eboutic/forms.py:112 +#: eboutic/forms.py:126 msgid "The basket cookie was badly formatted." msgstr "Le cookie du panier a été mal formaté." -#: eboutic/forms.py:115 +#: eboutic/forms.py:130 msgid "Your basket is empty." msgstr "Votre panier est vide" -#: eboutic/forms.py:125 +#: eboutic/forms.py:141 #, python-format msgid "%(name)s : this product does not exist." msgstr "%(name)s : ce produit n'existe pas." -#: eboutic/forms.py:134 +#: eboutic/forms.py:150 #, python-format msgid "%(name)s : this product does not exist or may no longer be available." msgstr "%(name)s : ce produit n'existe pas ou n'est peut-être plus disponible." -#: eboutic/forms.py:141 +#: eboutic/forms.py:157 #, python-format msgid "You cannot buy %(nbr)d %(name)s." msgstr "Vous ne pouvez pas acheter %(nbr)d %(name)s." -#: eboutic/models.py:241 +#: eboutic/models.py:237 msgid "validated" msgstr "validé" -#: eboutic/models.py:251 +#: eboutic/models.py:247 msgid "Invoice already validated" msgstr "Facture déjà validée" -#: eboutic/models.py:289 +#: eboutic/models.py:285 msgid "product id" msgstr "ID du produit" -#: eboutic/models.py:290 +#: eboutic/models.py:286 msgid "product name" msgstr "nom du produit" -#: eboutic/models.py:291 +#: eboutic/models.py:287 msgid "product type id" msgstr "id du type du produit" -#: eboutic/models.py:308 +#: eboutic/models.py:304 msgid "basket" msgstr "panier" @@ -4463,18 +4467,18 @@ msgstr "" "Vous devez renseigner vos coordonnées de facturation si vous voulez payer " "par carte bancaire" -#: eboutic/templates/eboutic/eboutic_makecommand.jinja:112 +#: eboutic/templates/eboutic/eboutic_makecommand.jinja:111 msgid "Pay with credit card" msgstr "Payer avec une carte bancaire" -#: eboutic/templates/eboutic/eboutic_makecommand.jinja:116 +#: eboutic/templates/eboutic/eboutic_makecommand.jinja:115 msgid "" "AE account payment disabled because your basket contains refilling items." msgstr "" "Paiement par compte AE désactivé parce que votre panier contient des bons de " "rechargement." -#: eboutic/templates/eboutic/eboutic_makecommand.jinja:121 +#: eboutic/templates/eboutic/eboutic_makecommand.jinja:120 msgid "Pay with Sith account" msgstr "Payer avec un compte AE" @@ -4589,11 +4593,11 @@ msgstr "votes" #: election/templates/election/election_detail.jinja:146 msgid "✏️" -msgstr "" +msgstr "✏️" #: election/templates/election/election_detail.jinja:147 msgid "❌" -msgstr "" +msgstr "❌" #: election/templates/election/election_detail.jinja:178 msgid "Add a new list" @@ -4811,6 +4815,50 @@ msgstr "Appliquer les droits et le club propriétaire récursivement" msgid "%(author)s said" msgstr "Citation de %(author)s" +#: galaxy/models.py:52 +msgid "star owner" +msgstr "propriétaire de l'étoile" + +#: galaxy/models.py:57 +msgid "star mass" +msgstr "masse de l'étoile" + +#: galaxy/models.py:74 +msgid "galaxy star 1" +msgstr "étoile 1" + +#: galaxy/models.py:80 +msgid "galaxy star 2" +msgstr "étoile 2" + +#: galaxy/models.py:85 +msgid "distance" +msgstr "distance" + +#: galaxy/models.py:87 +msgid "Distance separating star1 and star2" +msgstr "Distance séparant étoile 1 et étoile 2" + +#: galaxy/models.py:90 +msgid "family score" +msgstr "score de famille" + +#: galaxy/models.py:94 +msgid "pictures score" +msgstr "score de photos" + +#: galaxy/models.py:98 +msgid "clubs score" +msgstr "score de club" + +#: galaxy/templates/galaxy/user.jinja:4 +msgid "%(user_name)s's Galaxy" +msgstr "Galaxie de %(user_name)s" + +#: galaxy/views.py:49 +msgid "This citizen has not yet joined the galaxy" +msgstr "Ce citoyen n'a pas encore rejoint la galaxie" + #: launderette/models.py:97 launderette/models.py:135 msgid "launderette" msgstr "laverie" @@ -4864,12 +4912,12 @@ msgid "Washing and drying" msgstr "Lavage et séchage" #: launderette/templates/launderette/launderette_book.jinja:27 -#: sith/settings.py:596 +#: sith/settings.py:620 msgid "Washing" msgstr "Lavage" #: launderette/templates/launderette/launderette_book.jinja:31 -#: sith/settings.py:596 +#: sith/settings.py:620 msgid "Drying" msgstr "Séchage" @@ -5353,380 +5401,380 @@ msgstr "Erreur de création de l'album %(album)s : %(msg)s" msgid "Add user" msgstr "Ajouter une personne" -#: sith/settings.py:218 sith/settings.py:421 +#: sith/settings.py:242 sith/settings.py:445 msgid "English" msgstr "Anglais" -#: sith/settings.py:218 sith/settings.py:420 +#: sith/settings.py:242 sith/settings.py:444 msgid "French" msgstr "Français" -#: sith/settings.py:340 +#: sith/settings.py:364 msgid "TC" msgstr "TC" -#: sith/settings.py:341 +#: sith/settings.py:365 msgid "IMSI" msgstr "IMSI" -#: sith/settings.py:342 +#: sith/settings.py:366 msgid "IMAP" msgstr "IMAP" -#: sith/settings.py:343 +#: sith/settings.py:367 msgid "INFO" msgstr "INFO" -#: sith/settings.py:344 +#: sith/settings.py:368 msgid "GI" msgstr "GI" -#: sith/settings.py:345 sith/settings.py:431 +#: sith/settings.py:369 sith/settings.py:455 msgid "E" msgstr "E" -#: sith/settings.py:346 +#: sith/settings.py:370 msgid "EE" msgstr "EE" -#: sith/settings.py:347 +#: sith/settings.py:371 msgid "GESC" msgstr "GESC" -#: sith/settings.py:348 +#: sith/settings.py:372 msgid "GMC" msgstr "GMC" -#: sith/settings.py:349 +#: sith/settings.py:373 msgid "MC" msgstr "MC" -#: sith/settings.py:350 +#: sith/settings.py:374 msgid "EDIM" msgstr "EDIM" -#: sith/settings.py:351 +#: sith/settings.py:375 msgid "Humanities" msgstr "Humanités" -#: sith/settings.py:352 +#: sith/settings.py:376 msgid "N/A" msgstr "N/A" -#: sith/settings.py:356 sith/settings.py:363 sith/settings.py:382 +#: sith/settings.py:380 sith/settings.py:387 sith/settings.py:406 msgid "Check" msgstr "Chèque" -#: sith/settings.py:357 sith/settings.py:365 sith/settings.py:383 +#: sith/settings.py:381 sith/settings.py:389 sith/settings.py:407 msgid "Cash" msgstr "Espèces" -#: sith/settings.py:358 +#: sith/settings.py:382 msgid "Transfert" msgstr "Virement" -#: sith/settings.py:371 +#: sith/settings.py:395 msgid "Belfort" msgstr "Belfort" -#: sith/settings.py:372 +#: sith/settings.py:396 msgid "Sevenans" msgstr "Sevenans" -#: sith/settings.py:373 +#: sith/settings.py:397 msgid "Montbéliard" msgstr "Montbéliard" -#: sith/settings.py:401 +#: sith/settings.py:425 msgid "Free" msgstr "Libre" -#: sith/settings.py:402 +#: sith/settings.py:426 msgid "CS" msgstr "CS" -#: sith/settings.py:403 +#: sith/settings.py:427 msgid "TM" msgstr "TM" -#: sith/settings.py:404 +#: sith/settings.py:428 msgid "OM" msgstr "OM" -#: sith/settings.py:405 +#: sith/settings.py:429 msgid "QC" msgstr "QC" -#: sith/settings.py:406 +#: sith/settings.py:430 msgid "EC" msgstr "EC" -#: sith/settings.py:407 +#: sith/settings.py:431 msgid "RN" msgstr "RN" -#: sith/settings.py:408 +#: sith/settings.py:432 msgid "ST" msgstr "ST" -#: sith/settings.py:409 +#: sith/settings.py:433 msgid "EXT" msgstr "EXT" -#: sith/settings.py:414 +#: sith/settings.py:438 msgid "Autumn" msgstr "Automne" -#: sith/settings.py:415 +#: sith/settings.py:439 msgid "Spring" msgstr "Printemps" -#: sith/settings.py:416 +#: sith/settings.py:440 msgid "Autumn and spring" msgstr "Automne et printemps" -#: sith/settings.py:422 +#: sith/settings.py:446 msgid "German" msgstr "Allemant" -#: sith/settings.py:423 +#: sith/settings.py:447 msgid "Spanich" msgstr "Espagnol" -#: sith/settings.py:427 +#: sith/settings.py:451 msgid "A" msgstr "A" -#: sith/settings.py:428 +#: sith/settings.py:452 msgid "B" msgstr "B" -#: sith/settings.py:429 +#: sith/settings.py:453 msgid "C" msgstr "C" -#: sith/settings.py:430 +#: sith/settings.py:454 msgid "D" msgstr "D" -#: sith/settings.py:432 +#: sith/settings.py:456 msgid "FX" msgstr "FX" -#: sith/settings.py:433 +#: sith/settings.py:457 msgid "F" msgstr "F" -#: sith/settings.py:434 +#: sith/settings.py:458 msgid "Abs" msgstr "Abs" -#: sith/settings.py:438 +#: sith/settings.py:462 msgid "Selling deletion" msgstr "Suppression de vente" -#: sith/settings.py:439 +#: sith/settings.py:463 msgid "Refilling deletion" msgstr "Suppression de rechargement" -#: sith/settings.py:476 +#: sith/settings.py:500 msgid "One semester" msgstr "Un semestre, 20 €" -#: sith/settings.py:477 +#: sith/settings.py:501 msgid "Two semesters" msgstr "Deux semestres, 35 €" -#: sith/settings.py:479 +#: sith/settings.py:503 msgid "Common core cursus" msgstr "Cursus tronc commun, 60 €" -#: sith/settings.py:483 +#: sith/settings.py:507 msgid "Branch cursus" msgstr "Cursus branche, 60 €" -#: sith/settings.py:484 +#: sith/settings.py:508 msgid "Alternating cursus" msgstr "Cursus alternant, 30 €" -#: sith/settings.py:485 +#: sith/settings.py:509 msgid "Honorary member" msgstr "Membre honoraire, 0 €" -#: sith/settings.py:486 +#: sith/settings.py:510 msgid "Assidu member" msgstr "Membre d'Assidu, 0 €" -#: sith/settings.py:487 +#: sith/settings.py:511 msgid "Amicale/DOCEO member" msgstr "Membre de l'Amicale/DOCEO, 0 €" -#: sith/settings.py:488 +#: sith/settings.py:512 msgid "UT network member" msgstr "Cotisant du réseau UT, 0 €" -#: sith/settings.py:489 +#: sith/settings.py:513 msgid "CROUS member" msgstr "Membres du CROUS, 0 €" -#: sith/settings.py:490 +#: sith/settings.py:514 msgid "Sbarro/ESTA member" msgstr "Membre de Sbarro ou de l'ESTA, 20 €" -#: sith/settings.py:492 +#: sith/settings.py:516 msgid "One semester Welcome Week" msgstr "Un semestre Welcome Week" -#: sith/settings.py:496 +#: sith/settings.py:520 msgid "One month for free" msgstr "Un mois gratuit" -#: sith/settings.py:497 +#: sith/settings.py:521 msgid "Two months for free" msgstr "Deux mois gratuits" -#: sith/settings.py:498 +#: sith/settings.py:522 msgid "Eurok's volunteer" msgstr "Bénévole Eurockéennes" -#: sith/settings.py:500 +#: sith/settings.py:524 msgid "Six weeks for free" msgstr "6 semaines gratuites" -#: sith/settings.py:504 +#: sith/settings.py:528 msgid "One day" msgstr "Un jour" -#: sith/settings.py:505 +#: sith/settings.py:529 msgid "GA staff member" msgstr "Membre staff GA (2 semaines), 1 €" -#: sith/settings.py:508 +#: sith/settings.py:532 msgid "One semester (-20%)" msgstr "Un semestre (-20%), 12 €" -#: sith/settings.py:513 +#: sith/settings.py:537 msgid "Two semesters (-20%)" msgstr "Deux semestres (-20%), 22 €" -#: sith/settings.py:518 +#: sith/settings.py:542 msgid "Common core cursus (-20%)" msgstr "Cursus tronc commun (-20%), 36 €" -#: sith/settings.py:523 +#: sith/settings.py:547 msgid "Branch cursus (-20%)" msgstr "Cursus branche (-20%), 36 €" -#: sith/settings.py:528 +#: sith/settings.py:552 msgid "Alternating cursus (-20%)" msgstr "Cursus alternant (-20%), 24 €" -#: sith/settings.py:534 +#: sith/settings.py:558 msgid "One year for free(CA offer)" msgstr "Une année offerte (Offre CA)" -#: sith/settings.py:556 +#: sith/settings.py:580 msgid "President" msgstr "Président⸱e" -#: sith/settings.py:557 +#: sith/settings.py:581 msgid "Vice-President" msgstr "Vice-Président⸱e" -#: sith/settings.py:558 +#: sith/settings.py:582 msgid "Treasurer" msgstr "Trésorier⸱e" -#: sith/settings.py:559 +#: sith/settings.py:583 msgid "Communication supervisor" msgstr "Responsable communication" -#: sith/settings.py:560 +#: sith/settings.py:584 msgid "Secretary" msgstr "Secrétaire" -#: sith/settings.py:561 +#: sith/settings.py:585 msgid "IT supervisor" msgstr "Responsable info" -#: sith/settings.py:562 +#: sith/settings.py:586 msgid "Board member" msgstr "Membre du bureau" -#: sith/settings.py:563 +#: sith/settings.py:587 msgid "Active member" msgstr "Membre actif⸱ve" -#: sith/settings.py:564 +#: sith/settings.py:588 msgid "Curious" msgstr "Curieux⸱euse" -#: sith/settings.py:600 +#: sith/settings.py:624 msgid "A new poster needs to be moderated" msgstr "Une nouvelle affiche a besoin d'être modérée" -#: sith/settings.py:601 +#: sith/settings.py:625 msgid "A new mailing list needs to be moderated" msgstr "Une nouvelle mailing list a besoin d'être modérée" -#: sith/settings.py:604 +#: sith/settings.py:628 msgid "A new pedagogy comment has been signaled for moderation" msgstr "" "Un nouveau commentaire de la pédagogie a été signalé pour la modération" -#: sith/settings.py:606 +#: sith/settings.py:630 #, python-format msgid "There are %s fresh news to be moderated" msgstr "Il y a %s nouvelles toutes fraîches à modérer" -#: sith/settings.py:607 +#: sith/settings.py:631 msgid "New files to be moderated" msgstr "Nouveaux fichiers à modérer" -#: sith/settings.py:608 +#: sith/settings.py:632 #, python-format msgid "There are %s pictures to be moderated in the SAS" msgstr "Il y a %s photos à modérer dans le SAS" -#: sith/settings.py:609 +#: sith/settings.py:633 msgid "You've been identified on some pictures" msgstr "Vous avez été identifié sur des photos" -#: sith/settings.py:610 +#: sith/settings.py:634 #, python-format msgid "You just refilled of %s €" msgstr "Vous avez rechargé votre compte de %s€" -#: sith/settings.py:611 +#: sith/settings.py:635 #, python-format msgid "You just bought %s" msgstr "Vous avez acheté %s" -#: sith/settings.py:612 +#: sith/settings.py:636 msgid "You have a notification" msgstr "Vous avez une notification" -#: sith/settings.py:624 +#: sith/settings.py:648 msgid "Success!" msgstr "Succès !" -#: sith/settings.py:625 +#: sith/settings.py:649 msgid "Fail!" msgstr "Échec !" -#: sith/settings.py:626 +#: sith/settings.py:650 msgid "You successfully posted an article in the Weekmail" msgstr "Article posté avec succès dans le Weekmail" -#: sith/settings.py:627 +#: sith/settings.py:651 msgid "You successfully edited an article in the Weekmail" msgstr "Article édité avec succès dans le Weekmail" -#: sith/settings.py:628 +#: sith/settings.py:652 msgid "You successfully sent the Weekmail" msgstr "Weekmail envoyé avec succès" -#: sith/settings.py:636 +#: sith/settings.py:660 msgid "AE tee-shirt" msgstr "Tee-shirt AE" diff --git a/sith/settings.py b/sith/settings.py index 1b0998b7..8cce1144 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -97,6 +97,7 @@ INSTALLED_APPS = ( "trombi", "matmat", "pedagogy", + "galaxy", ) MIDDLEWARE = ( @@ -210,6 +211,29 @@ DATABASES = { } } +# Logging +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "simple": {"format": "%(levelname)s %(message)s"}, + }, + "handlers": { + "log_to_stdout": { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": "simple", + }, + }, + "loggers": { + "main": { + "handlers": ["log_to_stdout"], + "level": "INFO", + "propagate": True, + } + }, +} + # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ @@ -691,4 +715,8 @@ SITH_FRONT_DEP_VERSIONS = { "https://github.com/jhuckaby/webcamjs/": "1.0.0", "https://github.com/vuejs/vue-next": "3.2.18", "https://github.com/alpinejs/alpine": "3.10.5", + "https://github.com/mrdoob/three.js/": "r148", + "https://github.com/vasturiano/three-spritetext": "1.6.5", + "https://github.com/vasturiano/3d-force-graph/": "1.70.19", + "https://github.com/vasturiano/d3-force-3d": "3.0.3", } diff --git a/sith/urls.py b/sith/urls.py index d8086d05..86f59649 100644 --- a/sith/urls.py +++ b/sith/urls.py @@ -76,6 +76,7 @@ urlpatterns = [ path("api/v1/", include(("api.urls", "api"), namespace="api")), path("election/", include(("election.urls", "election"), namespace="election")), path("forum/", include(("forum.urls", "forum"), namespace="forum")), + path("galaxy/", include(("galaxy.urls", "galaxy"), namespace="galaxy")), path("trombi/", include(("trombi.urls", "trombi"), namespace="trombi")), path("matmatronch/", include(("matmat.urls", "matmat"), namespace="matmat")), path("pedagogy/", include(("pedagogy.urls", "pedagogy"), namespace="pedagogy")),

5(o5&UaLw<2hJf+Y{`+T%`K-j)|H2{y{{rko&3E*pe~s$xqD>t? zw66qyz3`C|l~FP*TNX)*0zl}(9YoCt@{#)P#O zTtW@p3G~ox5k6YrEtP1sgxy40W25{Mjv6V*0=dZ&ke_7b=eg ztA6O*xRWTe-abwv_00QAPLjV^wNV9|FUK>FGzx)-_|fmQVO^LGWj>rq;%SZ}MF^3V z+#+gBp3Qd;BhqW@Sa!H1IR74KbFE9?-4)II3OdL-`P@)c_&&`R25*-{tasCOYVYoc z>KNrdh|WlwrM4%u=w)fV`>^5DWi`PhcqPT0diG7{Gcc^yEH$9Ef%7M?^YBm0W_LKW zx)PX2C)fzV1BPiObkVKDZC3K^ZN-fFSjdqSp67`KNdYHOjLE{D6;?1tk`@emC)eE~ zXJXg7e^;}(zW&OBePpi|?dDIH*Qu2@#G>Bo?j?Vhb37RQ^Dm&Jd%CEzd-=Q@h=`?Bid6|9e`OTR(4zNmN-?rmN$+$6cveSV~5oh2yf56#e^f zbBl9t`a*9yoeDe4V#md$dMZ!KPeTMD^KG(K!kGM2&a`T*)|PMeDJhMW-o9BecXmCm zZj`l-Y3a_hMdbcOJ}S>M7}U-@@fNzi5{G)@o9*pNEiBzW`35o+?@LG#w`V9n>Q+a; z=va;M%uX0QU)Bej3LFJWbc7-JEYHsCg6rwCGJnudcr1?$Q64KbN(cJ59<*k>(__yo znM)MGu&^3-F|na`{h(CQQJptx5@l(f5bbIWZM?slZ-YUK+^typ^}M$))umVI$R*2f z8R}>oY9nng0@&AX-GYaa9p?6kZRsdTu6faI-OQDKZM=W-$>V&vGBh{O{x^5r(dZ$a zM8Rp~aCPIy#$rW@KZKR(l~$a_&aO%rw&GL-_61YVgHyCNOyqC6$g7;#4eNbVs~j-9 zj2$p>sst3yJ}1PbW|TUmuzuX6URM$}kyLK%uHnDgc!SKKnLHXnlI)r5PwIuDSIUkm zbuV9Z^SI}}C_MDJc79=o*4$M8d^nbh{5jm~Sh{T8x`d=-FiwkYxt8)C?&OXVE7Kfb zZreFtfpAqkAm-a61af_QXU#&Pft3pH-|5I zAT%1(1g!sJ-L=fJnvnmHFD$q`L--|h?9tyF)FI<#qTJ+b_&VT4egAwSNLzhQ?WC|Y zq|e@YXBL@(!*s%_YVRwNnd~pi3w#d@AWWI^nUI0CI+SjUv3AV*DI*P~O zCHq{R_t7{C3eYVivt&kVwx{-5S(!MPdMsk@ySKwSHv97pj@SGku|h7Ubxj^A;bkW7 zmnlaK`3{E@L7(G}P@2{0q(9xWPyZSz_j_E$i!}h-z5NSNd<6DR3@Ochyz|j?NYk97 zJ^GEypj^n4GBD#!VPZU1o(J*SpKZYP`P!l~gvnPtL;sNdCNtlE=ZGe^JOjhtN+2Nu z`xX!OZgl!g!KhM$YNgT~XC)fAEdDzfdn5`t-yWM@YJtio+{;|6VXI%Ese7vPR2hc# z@MXiBb18Qk`v(Sfz9?~(Bm)^&j z<4CLRVg$T}z81RV{^M8(na0VZo=P$1tvA>dLP~+=VNBk*4^)(S){Ucfm zL1xRL9d41XUkHS-Z>++G zHun8MWi({!l}X`eyGNF@Yrr7)(GWJ_6@4pWzt@VXu5A+mIqyb||CNGnVMNo?`Z{oP zfd77hW?iXYujJbUDFp%hp@C;f*pAG;8rU`es1hCqr%k!Ht~^Scevxuh+zTzeDXiI7 z$v^qRKih^@R=;Pws5Y%i4rR4NavycOvW%N*heAHV2y25jLD=Q3U#wQ9t7ny1n4~1d z2pSJ(k@RK|&PPSZWXB<61{|?$b=utn!?L3h;Qd_X&xVUK<}}yyp0-9vsl!^llQ1Hs z#y>OdP@MhNuQcJQ-aDkOj3ICo@527JQ0*$4!QqkcrJiImNWSnQZTe4I_Nh6`;_Pkq z>-Zp=lADgk9%`1Y&us5Z5ufKljYFN*K0}1{;R`{X^ltrB$H0sjm{g#!5k9RKcN}MR z`|z=A0{`OP7)h$wnu^g6I5Q!aD*nf{q2JCtqUmNq({;xm&U)AX)zmeQh*Bp4g&}S< zAb&e7Evu1sbVjX_;;~CPXg5gbaPa{yIwNge(Iqv(m74YVYW3z+9(rQ_-Vhnp>vIIO zH@>C^7w*AE>G(Q1;ZKrc8~mfkhea&wO1eh@FC^!TeE8=^x9&LKwOR{Pdskl{9Y6GN znoqJkxDYD&JwExG=bSM#&m~zWq~r^f{qf!&=-8YLQeln#Ce_{qW`0E=TO)LCu}K*h z?6mD5upNH(p=B&|p&I_|E~6|mg;dXctJl4b*5@g`!@J=cKiw<)pTRz^QFpe!G`Y6- z*1OyC?Wy})P2)+d)UV>tFLW}zdMvh$9mA5Q+C^zf{1t0c6|v`!T)yR@K)1#%1c4=D zu-(fPtB=*^c_@~AVg{?+1sI369r$7p_DfXLuvvlbywU;Hqe*&=FWgD!d|$BD^}P}& zB9p*{NzS__@!{R`&tD7DEahL{2=}wB&zGm z-`J@UUh}9Wbnw&+%_zrps2?FWWn*bFFSL*9`n=n|e5lo=YS4JrZ@WCdrt_#=K0a%E zy6Cg_`{(d5*fd~;B9|Fe)WznYC(Z(e9C4C;`umX8Y{na#w=>=wQ`e!$g;|l!i{x$aOB4Ec{9!2`lp;4dCr}vvL0;Z%Bth;DiQoI zHPi?zUCl@Dx)#y!MMVn}r>nlrLO`0dstJ(pF@&i;^?w2EzeNgs2aszIi~qSYlm@=2 zcc9R|kYF}0f<%6-tqiNT-Hh>(y<5e&z7sUCd9QZqb?+MZCrX|0t2Z(uiH)Y4f;Zpp zQ5`y+0vQgZtd_Oaw-9;)niUrLUis)IDOx+M{r;a6Rf;nr0%mq6kO-g}7(#4{eZdS>(G7w9% zwRK~6%QI_d%QIHTHIb$zte>|L0&WVf}Nfd z+n!XyS6K22on$Ug8$Mb*MLEHWTqj>$yaRob@>}B^?*@@0^cA(|J=s{?&p?*TRWD9| zkaLnkflHJ7SARFXqk)#Hdji*LpkGJO^yrqr(d_u#)8@O~3B?L!bAgfhb{K5F_1uNa zAC}&&Ap0_^WM~a)3G;5?^|>x+SCX-bkWSeWS#SgOm zKDo5TcD|2e&!UR<-=~imSkKdXx_OY|kHGnqR{PGdX$s}8ZyV`t#*f%gBz;p65|DcO(a>lzsx1kj-niRy_!f&i*8Doe%6Wj4A=`TV?21 zFvy%I3Z-9hXh^s`7F3A`Ql`{rcFv6bhf##fw>!HqAQfjHp6>aCy;VA4hpvrl3#wr| za30mWsowXo^YD8$L)jCT3vwY#3yYJnWD?nzAFS7gcHeeG3Wz?$`?8Xpt0&&s zV9hCfEw@3-TB8dJ@2c5|BU>6yfu`}>>_er5!V-nO+`B|(^;Y<%rf=@fk0jOI+4uee z%J)!@RR&Y*q0E*}c+Wj<12f|&^$ncHP<^ar_NM-sgQLa0Y)y9>{ncHl)A-Eck;3e> zenM)zDEtg1d*^J-b%YPt&B@Uzn$k-r4b1hJ9l~Q@#Ar&YZU|XQs4jARyQnexFwl;Wf#jK4Shw?wdC33|q3RwAk$K^w0gU7i`tFF}Tc$!9N4Rq9rQ z8)(e>Vpc}qldz7SBifo?FtjV=eC3k9%}>}U(B}9<+}o#?W85rA?>D9y1o5CV!bM)c zwT0W8A5{bF8fBwiwa8i?)*R2@Y%ExC+G}_(6*A9KXu>K#J9aFVIv*ICZ@M?<6V!O5 z%-ZX&YWNhRIab0hUs*%dT^ZrVKcEQ%GbB-3sfgMNNi)q`cf@V0^!)kFQ&^#lnLHZe zV&FoknKvM!(SgL~5Y8o6_2_X43dX`DA5=1Buzut*4g0kHn=<)(Z?o@~XvbebkoS?j z-3^tCZTz~Yl;nJX^8iBbP;SvkwN{kaYoMt@StwgJ}~zdu^w@H zDEtU3SK6NaG%xmxd39<`ONrE%>MMf%-4wIqt#2S5tD-5XOP2+xUdxu|&G2sq!S6NK z&1vA2p0wuQ&g|e2opCv+PDJ-@kd;}1+H6{VadBemPq$X#P=p&}+xV3Ollf=E<N=M8b~;s}I9`f)bK z>@*bwAKtOh*;Nxmi<$3L{>=h)fj|qyjv;TLuMfQm6@7Puizsqgs8W-pR)Ta7^uv42 z64b&qj_ZuviLo5*4sY?o>ndfQ_52H9%wmZllB&2Cz59kml*VTw}Evb#=Z$yYU;}`pWnoGvUKaV_}*7)hv zJvlJ=iu|#m-~{Qq_9&g53jB7@J@O~;t22svTA0Lz3EF`Cvevh1xyVCBxfXDFFdv^}KkW*mQAvcAMW#>M)z;6JRVp zS_j@)K|+vkxG|O`6?bj@I|YYU{4S0&s3tyvNHMncK2Edz9+qM(N2kxm;2_*>Zn>o=>&gV zh;>(frD$fFTzk%JXjF6nu6K_0rdsQ=VG%bJRb~B8zah02$-LCXk#&#}t$)VA)uUV( zEN~b^dwC7}(t-eXOpzi-T}<5Sbld{-lg=^{pIR(p-(+5E&DY~LDuyGH0V~#67HIff zgP)o?to%^qlrpLhmi3Dl0%<4*G{>9BmYMDJ6|;eQV|~=1{bSClYEWHOh0@2&rthUH zBa9X$sjw}bgDycySi^+NXNfkR=yP=535ihe1D1{n`!_4nm#;%fmQ9NnU*FD3N4tGr zpipiU!%>Ia!++#c#jgZogdZhnVzr)s1(L9(){p8nO@Vy=;|yf8<;w(S2%Tc&Lo&)# z6Bgr|aM#JpJ#GC(yw$CwDDU@_(l`6a2S33yKOf;5MpDZ+)*dh_|FGP;mC;1CwSYeV z1^C?Pvlhy^)vQBsZ$gq;0FZNRHrgg{*9;X12S@49duTTCLLl0RR8 zujfE>WnRbAm9vBO*8ynEthrnZuWVfzN3g_o^}ao|v#N%y6~_+ixM6e#u2*^a{KQFF zD^$Je*Z`rQG}sghEP2G06Okw3h>gfA zgrJ5b!9$sW_lH4Gf}Qv7MlU1>2O-tJ6wNxsG2Le$PlF{d2TO>@Qypt!b?79QOqGQXxViwjo+WE_D)nRtb!hRX-+ zRU>>Cr(2haQt7Xg4H7T3L1-p4J0p`&efp5NgTDaneQ3P1VDS{ zerafrpW8pNqN9K189#6K4N(TKpFBJ$^gB^8D_lSIX?R`tz`oj1GzEXA)~?S&BlIe7h)TkVlXyZop;L#b}Sw8^sf4gbOe z8KR5a4Y_}#`5z6`(CD{7+4l@FLbf-<789}N)DhQC7n)<9HoIV=S|!9_$&aHOj?4o4 z5yH1eAR9wpZP%C*TWXc)lF7t5#dS+A$7S5^CzYLHT<_ryv)Ye1_cMBvme^as!v;mH zB6jGzO5-upzJi=vbt7CK*-jo73(Yg2`uyIL=(N!p=kbqM4Yv`i9MA_z=*KtsGn;x2 zg?jHYQbdDD`J;<>_>Y-aGsR~4SqR(jD^RUR41}(Ig!**xUAivU zWVn-e(D@BR>viw+4MbcL*j|m%8WZjEFkKl~+CjZf1W)Q<~`p<6s za@+-om;4k+i0W-w=PW{FaL0`~Wzh#3#8w{-j&<3o2(+{U2pi`cB;MaA1|7|K)>W$D zk4R?~2*^mK95!cFvH5)O*u#CVG)OR_%qJ*kiTPDS1C3TNAoR`%lDorD{In=a$ z#0Bbvf&wMf`hZG`4&5uSs~2b3eu2BfnCw&QJaO&zq@%CQ4p|+ym--L+ z+M5eQLG=p=GLK&S<`+g6#J~*V$@lyVkZ%gs&PA3lJqoS=*UohJ6I^b;=*_Dt9kx8> z9SG8%{rdEkJ~_YnXT+>x{5{yAli!l|#{2V6TfrS-4SdCGeVMVh5?nC*#mmlBi-6yKDkor_%GrNp{*Rj>Z%3-{BX}Rt> zq12E2^N$cZ^~7I`;5y}h+=-a*1C9OkX<_m9&I!zBE=;}HBc^P9#fG%e2o-g{t z;Hf}e5{D6bG$?wPk_Io?3qW&V)JJo)AlBy5iPH)><4ooxqfOARSI%ADK%nE?s?z@QBN{5Sj*N-GFLiTzZch7r*+iZ z!3aZ}Te9`wGeq~#`5%q1rxj&8fg{&Rx3Q6n+esG`4ANc9omKj_5Pyk6 zXIX_N;I=hbu1T#wIf;&uYDr0JhlPi%8KCF(uLQQ9TVcnItwt82w|SZxtcvQ1T#uhwcjJGR zs%sLtV%EmpBw(tfTKia&MV?$I6~%FE4p}j^Q`~g+@ru6$Xt=_rg~1?!Czg%pOF0Vh zpBtayU15%1oPkyBy}HQftxxyeD=YtbX;<>53iIXZjXj+Ue;x&<1IH$re_pcVW`p?^ zBf57+KL`vQn&K=#{H%=kd@84%$V(VFJ8t1=&Q>G+0Gpgc*?Us)u2;lpUhHw87jb$& zPd0e3YjNB3TnbCt{HPI7DV&zj!=BpJR;pnd>2$4+Ha|@ML^0W${Wcz2xbXa?&TQ-S zPpB<_a>_KzYl6|HaT|@=h?25g;qWeXdtRfC_}-+$+7b)-xCAsEnrbmD>WLZwre2%N z+n`qQR#aAfvc}$}wS3vB*B15;D_D3=5E^ZF*L}VU_{Y|2)WFq+hwo)5)(ozul~mg0 z6Tpn|vxzf0nf&>MK)_64KBx7S%=a6af8;DP5difcI{SY?vM8tkG;|{3*BB&>qha}vR&A1 zgT2#jkPG#jQyyJ0Z0I?G%lrD#=Jg6vDQ1R#aZ^k+BlR`r|2Q@_)Wmn%X6kVgi9LVe zbOR-}q}>ze8zia|YEi3M;;SH5!-{1iD-kf3j?3jcW-L^&up%4h^=Yf_@bapE_(@$| z@B3}erAd5p@`QkjvR$ZV;BG;9I95u;XliH+n;FcUDGXHf8Vd2N(sDG`+PtY^sWF=1 zvg%_}9RU@lk{=_Y>uS^J=tFFMw3?Ue2Ys{jIw*vk^7;r3cDC*p*~W{rM7p+)n(APz z|3$t>0fS6dg*Seoc%V%sIvF$K&aF&YJ$AV1rbvs@4{}B7YtK4wTkkUuGtiMutm3WO zNq?8+e|=J0tP6)94Zia`2>!F>YIXcYiE3=Z)=H1F>@@(TlD^Z$izyp3TUl@qidIOp zy>aP!*y%xus&V(c8seUa#2a zfjO5Px|PE<*4(J;B=U+WSu2+Aayxsbtp@xRIfJxa0rVtX?IU1PXOE&Sc2VQL9q+XE(`F{|m11pV-slU~!D7nk$r z<_S_C3OD2{HgG-MD}h>1e47>xf@OvI>qsUfuUeO4aqq1|5yGcs!?cg7&yg1{^b7!r<-6Q&7A*Urs3}g)gv5uA$ynrNY zngQ@ES;|POAAG0Rcj8~fv8@)4BPiqu&^B(tkV|{9J>EhNnbCKhg^UMzZcQ7`p!uMt zb7ivRv5vJ_x!PT|Ya5cmC~}+>?r!|VrdDRuUXMi|Rv}X0?X=hw)#g)F$X@^&lu&J| zNB+a23VnC5CtRE8ZTIVPxk%P=yb=oiXrxMb8GdWA1-L*1=Lb4*Wswgd;yDH_%7htw zcv#b+yGF5_PdcI=Gw{UWlHF?A+$+_dh+!~E-g(L_<%I@tdDg5Cyq&s*{{R4#Xrn^n zlu%Iq0_a_incI9{a_xreE%t5XrJXY4SK2K1($iG(6`4wtW5$(|tXsuL!H2AGBD*88 zu~)WOL;XXRgE#zpR%es2$HZ8mW7aBpXL^P=2HNB`d>T+)Y7|-W4*>IWiC~zFud6>2eE<2aKC3X5t$(I;5%t zYz$-3848deWay4&Uhe&S{y{T>;ik?#UWt`pTJjGHly{R#t)NbLLerY$v|8>Mizk5_ z_OfKSo$ZR!ch=y|(@28XufA*(AsVeU9%)*_WFh%WpDK4ai*SE5L#fvmN(m%c1t{Mr zCU8ZvR9i6nsh&QJR$VR!uV6oWhaAcbr7B1Ak^C@8cB#dx(HZk<-ar}cqCQ=N1sg^? z>>oHcISA{#ss2GW&t_zzR^yrCLet5Mnaofm{_4p)r6R&VQ;@%2ZaDl=Rr2|>@3IwT z3o{*^*|2A(o4)w#qQb-vwA5pjluH(ZdldiLz4OGe(tBK$){0enrH!Yo0@7F#d2uhkd&vgC*Vpj`KsmA!n*$|Y+E-KbtY01; z@1AR(L4k@(Ha4M|mCwpHO)xP}Y8z`>)jEHe4su0kK5N;V;|2~g``RG)b+X?ds-<_n z6J8@*%~>uD?8g_J+gr|mIpLpc`U`j^@+q5!c_>vNRp(}j;}_=m5@f1XF99f4wEKl_ zivij8D)r%ye0lZPSzA0^dLt-DahN>U@G@?WRkBU>mpyR{+iwFtwx`}-s6a{NuzDn+ zTPwhsEN_$TcK;~Eekeq*sQ&$jg%A%uSt@s`r3hGT;OJ<*p3MHGnNTM=`P;UZ)G#Z| z`OY7%_i@@PT=)d;j=!PqO=paA4}lykK6;V$IJ467jKf3@2%Q9W&A$LaxuD@)l>v(O zHCiI7nK|-ITIY{It$|j)P3-)kEaXvhg{*`A&rU z3hZduD=n={zEU}%%E)gg$b?P?GV~!|wpyc8#%>PzW~CZ~JA)#vauCnBhMloU1EUeHh8-?`bRB}xE zBk!MM6;Nb3%SpmTvh=OqAkM=2xh9R)y_z|_^f=?J=3noT%i0+aIgq3T_Q2hkn|)7LkoNVc2=fjlD0wWSwC?k zp5AY|qFCPq#$D+Y=P$ncWJNa~@Kup#J~pnT`0hKSPFv__&7nW! z1J`Qxn?ivg>rP=?R>hKau3eW7ugxx!dsd0zNS_~^5UkhDZasB(loPfww&@nqm8gyT z0Uf&K{(7f|?00#8U{EGaVswx3ocE~och+qlnOdevBq-JvLyaa<(;*AwGJzymHpmgB{Gmg-h?y^+ zQeBMUV};@@2fGld;yK`~{IH0W#DtSq)LF!O^SrG>7<9-zycw205pKvPua=3_!!evM zihAa5OKQVrv?TuERWxwlT}$la@aofC!<$sGYtu=kWI+-A*F3ekT1QvJY(;DkL8j0k zq)EF{)6X!8SNp5h!{JZFr1Aj12^>r>bDT@x1uJL4Iy%p+QFMpNm2X8A0{e9lQ>2SY zQY5EaUb4{%!v#HXFr7hL{6OfyWCmSTBt{+PcgrkMwK|g~#xwac5aJ1A6}}oM*ElFx zqQH*dv)PnjhDA=b#F%5}Vuj9KX8c)?JFA`?&}B(k5ZF%wCd)A0}Z<-VT+?g?QDjBKU60kjDy(fQ`-+oB6eCK#6DR zC?8rqpy696JB7Zr!LlHrG(|8nhXdz00b<8x&}d!1g`#qp0TtGbd%GvKxEGq{FeZjl z;59c_)#%*V)&Pj)=RF((9AWP}|M4vx`*9Y*C_bHNv_L0VKF*(Cwp^lWvWPP`RMZL3 z2Oky$Vozwe8sdNKi?s{DVs#6V)N5d(#~zm;uHqSa4z6QI|Al$0P$30Ds=dvU&dC10e2KzsYqoHhMi2goS zzR&SpsWwEb&rC;Uh5XW90VP|QlSPxBa%9>0KQu=gr!1;?hs@HJPnj+#S?Y5DIWbU)rC0|Sjg@*kGDB#&O6{i(GJ%Naz0 zk&?)0=Lu`DGsanrf2S zIND#8=^K?>Hsd;0^4J3a7Bd=fh1=ah0xFO(MqONM3W>5=7e4>6)<~6so-zJ8v1O!C z^S{3=Z1kpTCCBGk zWM7*zEAuTxm-C&Fr>3VS#DFEu$Z{9kTAn}lY@Ri_>DnI+ySZc2W1!@XUQGlUzJn|v zaI91UMV7lwihGYx=;LiQX}9*q+q&e|4{qVe4|M4sO%|~R8cg=u`-vlZxg_|z5~!P< zufz@u^srwwm{p1)yqe`KLv^YPIUA5Le<$slnpAtgU> z-WIAU|K~Ei3TnzaQbnCkNUq=6e6oiM*X5-|8?;;`TYW>DdK zA)m&hw9%ps>bniJvGNjmeB#*C_n?px(3tVknisTn z{THX7j}o8kBZ&-yC?@u>H8$fv&aNPE`bYe%k3C~buUfD%n{dveM!hW>Sorx{AfQ4~ zpP4X@Vlgz3J(CjKcn#ridJ$U(mDy=+ilEnMdV^Y?t>E1FVd2}9^oW;lf4H1(O+{3O zEpJk}@kujafV2hUil;au{I{__OS1#~+=J*(+hHW2G1uZzCKXnuNlhv8VJ5)mOIQzG zO^gFAgq@;Z=TnORrYjfMKbcFB2!Miyf{uZMg^GcW`cLutH;|4>%!KxuUzX^Nrlltd zqkvpQdU4YgIdnj{~wc8 z9G>!DG|k=YQqt7**;8#)_@s(dm*15_4u)TmBK5)S_ZOkzPZ0Qf?zn*6M8b{& zyYBXisYz_v6!|QxpA;1{GLwQKQz}m)p5?b9VPT7YcCpKC~}oOq#M?A4i<{6qi!py10|Hs|lQ0F3B#16!#;;j$1lR zU6+tsN-y(VXZ>i#J9q8lm|Y4&XWmB6u;zRp4S%-yA~~MJ|Kf`#1K#}P{4d|t!R6pA zow~>61mgd-^&iBr`vZP_EB70ypO;rZi(JuGmp7j1p|RN6MZ>0q2iTr=wve<*Y`^vA ziZx`W$g_ZIJl29g>G{cBvn)5`!dIM_8TU_Wj;p16p?W!?dPH?Jp2M-+gf*dGE&KcI z%rjj-_GxXx&J(&w88pk54x}Ac{{pBgRQAndX80IFPijh)#M#$N{}%v(Kz_dsKA{`| z^9UDo0eHd0mppIyEqY&Ycr5)5Nt$$ge@;&d1Wyk zd)6XR=+kn9=80`GJU1eB#x1Fj1m`$jIHK2VpQ5~`>$?f^DjZfSLCQk0KFi5kJ6(b+ zopnkKA4J=0S3k4zh7wfap|@^O5r*(k39R5zb)kQU+WS>TZ**4eK3%*HVKvR5i1pl?Xj(}k?n5t{=c{>7p&m4`t4em zFv_aJ^P6iaqQ{eVx52w&W9*$HTy#@d+GmM8z!M^5UcwNzI@l{F2HX%uKX>Occq-|~ zN1luk(Nt$_Wtt!dS-vD}p;ni!KaAxYkU8L+o#Juag`CdSB)fVn5oitF=yh;cU4oKm zP{j;$Qm;rku1?V5vKGAM5;*3iIkj#Z5G{fxR2!wW7|!G+LEY*UpEPZ)+h*Rjt#aCX z6_tQ%Y{s-}J2S_5(K;?0;}E1&MJhJ$oRDzUIARcVmbtMQb(TYleVe7GBdx#x0FT5I z?XSJJL*nk^`%~Lzb94~lAnlFl`&*n#?pd-Xl_z6ztKtw1>`gni&S|*8?9CRL>Wn^AFGr8Xy%rN)Q`P$MR({i!*F_2q ze%`8SWHr}`@J))2{Cm_00*eIs#w(6G1C4U=K$&a^D6>-S>Bu1F#m7(0lCSA+L8Q)c zteEktWQds2F;pJgrv+wU-LI@vJcy*BXv&;aw^YM{_1>JruE!3<$2MCKrwle|t#lJn zu|q-Gie;N`ywX6JC#8i4iZ>*FVFW-HormaDEFnXs5A`i^+I))FJM>3xjFceOxfaDW zozZU9X?vnWjsiS_b6c;f?VAqKmT4;1XpCPw4GZsmEs6H%6d0-uEfh+~?(>!%M@O|uhc1){fiqVq9#ZR}Lx zP>9p4=KP_JNX6vKXHYW!XWRr~6Rp)2+PGIQVz1CM?c&duPLJs`X zn(9VS$78H6=HYfC>pHQb`o@aqZf zMzxCQzwGyZ2Ne!0Zi~R|U&0RR(7VYumoB}l(e=4rxoE?B$=xf14dd#KgEx65+c#Y6 zCSEpegIX>l|aC=-r*Jhvj(9!zUF7LQoz zqM``RDdvd=@l!GtXEEM}Iq+D)EjzPJwDx{T{{R!>CV*sPcWUHr-F4{oMSjk3rU;n> zr7`wJ=IMFETY8BB!nBRCy*5j;k5HU1+87PU6JOD$f=mQkZ3rhw7Bp5xGil4F1MuWa2czn zF$DJ`iY*vCc1T*zv&-PlbARpI@T;P7Z9?|1YZju#y0${|p3@F_$P*0<#F2GJbCzG5{geF{RY)GMvoBsevil-NgLPRyqE)B6|HLhHoCMlDah@}UxetSo+uV5W=0yFujjp!6t!T@%^@?+<<0S1`+IdH8Xfed0 z%n>UEip62f#Rr{;jB?nT*NT+pJUNH7E5+QSx=p%2>We7u$n#C5cqwQTiId!o;yPPC z>Gy77wcfE;TwAcmGahqbd{?mgrp$osB3tzPqT&P_-Vwigzk9eJuX=Trplw}=A2Kw$ z+us(}{t=3)cEKI{mc_}q9G+{q{gI7a6S^RF@A@dDi`y1_!IN5e{ZRzpxCFp)J_B!J zHZGy0;G1t}s*AN9Lflt!_ih`JzT=dFw|JuI+=IQ6#E*o2d{A?sW3x132GnfCU1=H7 zHPNec3IjRTn5#G<{d;lyD0#yaDZMqOdpML|8wMH#rVA^s@e2738TbWTHVS9mq$;W` z5d8@r1wj?2^&%D54VV?mSlKS1>es(Kbhq`bP4iF?wa9ZLb?b9jOwO&Ck ztxO-nv=uO88vdJ@>(*{_OhjYnl5?KtJhtZIz{y`lkCon-Sktt{!^Crr#uq5#yo+iX$~A=!JXL zr?gs&HbFSo2K>qFYnWTmI`01f*)TAfH?j*EK{?RY0!yY4v2XtX*m_R&;GJ!H&^MxP zfuCSi-wL<|T(nX&3{VSj@B1yDyMGDagfMeUPi%MKnwWDyg?x6ar4!nl$!lV+xU~2D zNbmzc!eJq^ws;|pRGeKK=bc_)L02T}DmBrZM32FQ*nR1|={mbgGCmXQ!4}X~2YNZG zDG9RXPO!-}{VAVWCfUm*#xm}YU`?PN2wwGygfrNIGl8%Jl+dC!l`u4}hlp8~pR z(e*?xe5t0lwGPF1Ia6eJDmQK&sE0YPrmT-R;;&mYR0sE_wCiE&iW{khe}oW_-qbL1 z)u1&oyN4A20B0@sty`{b%fD3XnxZe0KZQ!@#cP+(%l;9$ta@p-b|7DPqypZN+u7Qx zrB!THL83~=1PtXDVtf$o(AMuLpl~pIg#8uLH6wjUC>l|oUxen*uFYU;( zt3VnIbY}B#;k#sQs7Gm9r7{c69a#0nKJH3S=!7)Rfq$o@_E1(^|zKN!j2#HN5 z@yBjx5H_Ik2OO%cY)#<%%$kFXcqxYpf)wbi_IIoHPGsHQt*pyf=GUuxpnYVow6f8S zZPzYH)M1(tUW=93Gpe0wVC$~0;G)_)5rPl2;>E9K?T;EMj*VhSrV+6l*!QO!fulSP zB7UDl8D`cG=Xb9J$61P0W{V)6$kBM+9lMZZ7Bp(+xlebh=R4G@Tp^*sw7=1JY6Rd0 z;D(4)lR=i%c;ifh_4ixk{{U-O`ONzN01ILKeo)!=LMOf04gpgNcS<-DO@^zJ;JCTF z{)cK7y4GdBRoH$L{i)1x)z%7U;WZ8Qy#T}Ou@XKR_1wF?eNc8CsE@xoR@5;=NYe&I z4&@CR)pmOZ^>n~FW1f&{x~feuQK5jFp#K0UFr7UZZv0PXj`4yHFzPw0lx!=Ju zi<$)Vf_;!{U4&KNS1ZvS>KWY|zskIBwyrrVry7(%+}iQtiFvdXGerH^W++wTFb3ct zX}o=RebajN`Bi;t?&IX0(H*dt{IwoqBBBxM9%}YS=w4P){`h%0_PD3xzaEgEB!3Gskctw zE_HNoR8-~!N;@=WvBgp(V~pUUqYbJ_%muMs#+*}~MvYwE81Nre7%tDc$;yLf)E`1U zaZYV7lE|nza45O4n{Y>>_T`GcIMNZJSExStHz>9E=UdlAK#pNcGx)_pdtL zU)%R`vS2SQW#rS*ZQI!>LldUx4a};;HL~OQKxZ%bzKs6>hbz+%b5muE*$-bM52y^xfFIS+8cOMhu3m!P2@1`u zy;eSTpwNk=k2ExLjt$G#nmnUO=(7)mu24nHFfzGE)&OXVDk#wv*o)kKK>YbHhLn!P z)``X51Ao~Fbei=yx!orn>a?Zr2L04sV8=Bc4IFlT&};&6H9L0wf+tzj*fwq({wE+Y z>>2iK9wlw#A9W_^?fZS#ucEpuiSXQ;XgBRov2}3C$VhOD-`f8GvHcUyD4e`>4F_ti zNzgW;E4fcU)(N7bg+j!f{178qT6;aD4PaY4in!xzYSHg~cdI8qqkixFxA0ZfiP^LA zh1NRKc|KD1sf}#)RhL8q$}!EosA9R^%W+d;!?C(yO(+gW1p9@r29Pg&v8s5fEv8iR zSKZTa83v~|Yma;>$z24acJa*0!%Q>Q0a8^bGet!uL7o71epO`UU#hH}g+Ft?%KPWx zp!%NAHTG5YMU#8}-+t{KcXkaS;uEZ2aNvDU(4lD1bHU%ZXWRGYPJv3U?ITYF7aav1 z`YBPMDGM-)&z;z$bgotDB>if&h{{ZaW>42BoJEkkey#v{jy<#Z?VrrtDs0pc@F#4g$xrVTI_W*+q zJyF~1HE3*`?JpXVLw^4NWaAVdI|^co<(N4tICXaZP_nWW*3}V~_*7CfQ`fB24;5Y> zdN2xHc&`#X*0>wwqk!6c@j?$KMCSJlKX2a^1}609JuUm2;#KP9=dcg9Sg3+~zWm$m zM7)jP+&QB)TIREz5{8}%iv)L~iYVv`H=~k;P8gtY{SBHpaN3%}(Pw0A-FTNe8xP7O zte>rEdtF)kJ&pTAssm*0cigY_LTpKM+FO;_Wqdc3%R3Kv>xcfz%J0k3A2NbMg@qN% z0~C^P9gWZMztmc`O(#49ePXQ}W-M;C%)TAjyK?26HDRq^bno>VnR=?V={oEUnSIv| z)lC(Ri^)K)YGc^1Y(fmW{UdvMiWotTn>A-w4=%F0;NYoa3rvRo@|;wkt}PI{3Ya!f?P-xiRDe z>DyMa#Z$34z*#a(nLGDz3AC;fe!)XfaV6q}Q8~P&4jQCpu5zu7Y~8!oO3rQ;mp}Jm zvQc~IA%=+pRbBf}i;AJq0c#adyqvrPypcbIPBa@n`*>iQz^wi-n(m8%?b87d;#;~K zkn1~#!Z>%UCef_A)Ytn>glG0TN{u`8?p^%j`Wuni;v%n-h88D97==S~J{>No(0JX^Xs}2NZE&q>2{A4F5fxf!8ym_Z;4Ebs|~0gi@U!H=mMrT z$u_?%p(mggB`oTD~Ul3xb@?--W_U=G? zB!1NU7vEv784yBstDNVVbFn``xMiX$t!+rU$3|{ALK0&DuH&~skO1}Mn#Zv89iGP~ zyxz1!Ut2jNx? zW4+HQsdcZv)A_zvC)irQlx^RXV2%r_(Np4?7QCpFbZ(Ez{{T&EU2R*}hmy6hb?E78 z?T^Z5von=$wXLiD|T>jA$vpKS4Uy()(=sJwL)@=sG36 zFNCJrHsz+XnlAoRY{`Tg-twqzGj>}Mb~GNaKobUFsh$d`h$vcFhYpqnYcHmXFLck_ z`c-Dn;c)%PSc@DKWn##TH;!3u_d?9wq!&^=kE$nK zFK`iQvn9!b=L(wt04lv$SDPKY5V|Y1JnFPS_`ciKnmBIXMB;oaPW)BU*_a2^BmS1r%yzJ~X~wFgvkEU~ z_JhjZZ@K7RR>9Vu)-G~%aSiI_hu6VL^_q33yKSSQvYN))i%>7#_ir6Y7lWC+n3>rM z8x9_}?pU-50%Yt5E;6HOD-*Q_xv))1l+x(s9p4JfPy@zvMd9iVN7-thl-^M~DpeMv zPpntEv*FK*tn_QNY?pmMSAK$ylc4D+qPJ+>&5=qj{RPYcxZV}52Ix+6u30yfy{+(F zV}5UsZRKZo-Zs?U)inPAqV@}il5M5toUpy~-pLc#gkwK_>C-4O@w3-&!|!TSo@FS>M&uRF7S$ple{8(rAfSa7PRZecfKu znrIECSpCtxmWi(GzhzP~G76yDC8vvj8Y(y}RI{}C0=?X9bBB!me?S?7hB_}f=df^X zJoLtEe}X^n2QrRUcllA%10P#e<~aOE`@YJ+nmXzK0LatPv~S<$T$i+3Sp%xrBWyTG zTQpiR-t9f}eZ&}4yhcFXukvA0~mbg{-``|#a0tR4L{)nt%5TQ z7mg%s9<3$>G!mo1aH)DbND%v-iMrqqt)d*Qx zmuHfTHuFy2X8vja0BJ->-i{a`b&Vl0;yOchPdMr|Zh3T)hnA7mz|ytTGfdyWLh_*VYH z+m@|p59?mVd%EJKrU96aK8kd*^n*TG_9p;as_Jkx%@*;^UIGbe!1sED;y^Wp8Yw(f z*|6=eb}EzE=CuzMHNX{p@O_&=cP^?CcTPOSuS6tKZ zxy|uZMYy1I=ExyKh>hQ6Lc@#|Q`md?ha~N@qjKH;<`n3y-K%;S5C}}Qvbk_O_k9#} zCwoswBGgwc?BV@({{YR0Sxu4su3pz-&W(=C+S;k{$~}$&=5NIesKXUwZ)C%9jJNBx zje(61saoZmJx3ofs@QfWsF0{=V=_H@2sqOUdYshLK@J-ZBkC343r$u(v;IyWMNj_# zU;WpVDy(;_)^BgbWO0ceG8Owh@Cugj((%8F6AlD;`6lG24HuhuVy@b3kbB474Oe_X zd1$7P*EAlvhM$`oy`v2!9(?dXZb0GsN1K|2PX&*z?q%b?I4s2-{jdC@4Mj#s*uPhy zZ0&EA`+u23Zh)KZE_LbT+v5512$r_YH{EU8aHq=E!@V>ywvXvUn;%p3S8Z)A1{Rlp z%4?dRX4c;5&E2VvZtpd6Z7ljANo?RV?9BoJO>oxfDV?6YRodPsAf}sK6d&ba{{XU| zKcLZ^TD@AFq)M&4kT9&aY`Xx@yg_EDP@j%52gwz153JKEv*SJ)1C z9wS9D=gI+8S%EHgUrq|^V?58Shx-}bwO!w{nNv&N^jjb*-N!@IQ5Zdci;0&DTk9h~Vz9{oV<<->%2N?$%5qZwmPE+r432 zB!>F&PPBb`IG?Y2lH;_`;b*j}Pp&A`uSRzo-8I9mD;O^f`eDUa~`3r1X{NUcEG!>Vv~-!Zk=T zYU6lhor1I0WwY+M*7wm}c(k!)qwH?g_j=zezNqZ%`=Hxv7Qq_Dr0zdWCA%?Kq+!86 z%Tm~1XI9g1?)jCB%S>)fZU*zXf7|Gb&OemaHseq3J9iJd1gWj+a73ITp=Pf}?Nh;W zZY_84-TjAX-Q=3)zQx(${KR3qG(*c=>$New{#V6lM*->(4K5ERlLkJ4R5=Tt&syvE zQ5KuQ&S~1y5xi|1m7%4e7KbZL9orvX^Z;magJ>jdo5#4t-2jS-3z2j?_-;C`->~oV zLTOf-{ng*1yNRb_7SCxP!?QCug6yE+Pm<|>PyYZne<%Evi)}4$Ikt9X`kbSHameFR zKBY8?p&M}vf*MIMfTAa8X6*j}3zf8={B~vbf5|}q0Bb0P3_DSHSZ+`$#b9Oz zebfptO>?Ty>BfRewzg*_WvI@#R(?;~izH6B8O<8F8iV*n?G|qRzn)`U*mGoTOqsHE z&ymT^{{YmhNP(!+{chvA7}hn(x%TW%0vaiv)w@B!iXzh^H8gf1U?!bYv+?AlRXWax zSSmyzv?5y|lXEO+SFfU}KM#wYMum3Z_*+=)`ym6Amp9}1e&JH{2zyRr>M?2Jffr5( zC2Q>e0K=DA{{V1Aj3;&lKG^&X^Gw>Uz1fol{Sq(D`a<* z`>{{6!%*jN!2X_(f^=36{)zh)x;qd3Rg?1_htcp%+7&3S>P$J^Xro3IR*x>TYqcBF zfBjqc+JJyCAM8$(f;uHY8}wdjQ-XrgklX7O%K#0bX!(Arp}TQEA8qgV|7Vf7tT%m)=<0d=E6;+pP*TE_gpblwPN z5cq0{HNjHzYCpJr!Wbg$&mJk(eKAjqtH7#ZL_f|boD;|RL|}W9tq!Yu)t!}GX6<;p zZycI33j3$3?2&Ir`cu#FOdQ6~!g=Yo4$<`=P>9|Yo2pnlBzYBP(?*Xo;)7Xw?@JG- zX5W=xwB*`k40s-szjd+y0Q{QJhD&l8Q9Zagrw)(@eh0iK4zV0{zbe`Q4q)2hp6JP1 z`$4^ILt5X28Gpn1$wqVaP(Rw811$v>@F)#XhHCAZtZX%qQM+*3yZ0E@n#Iu(8&o99ym0gMW!-Xa~eEN0AE6)v|kUd@j4JgI$BHj?Sq?)oa3gXnVqb^=H-( z?Sh+h+-@GQPJXicgj{!^&0*8)eUQa8ijLG+Rrf@|5?%7NVt&Y3*q03TEZgDh<-Cna zGUrvtf7oC*b2|~^q_)Y8GcjJ@_b`u1ZBo)SP$oI1`KEa$UN>eY8=3pBXu9XPT=_|_ zYWZ&+yEgo~n9jUtcfm25 zie0RCuC`@NY$7|fc_I$tgNdSU&lEl%60H@dz{^kEt)pJj#=)N@>qmc6kR2O9^mh}v zIftX(eu{dE97HO@Fyi0*dflId%Sf6zxNm95qSFd$GzX2_b|GbETb-p|{{WGlUF92F zO5n)=WDbAQA%nMSymx2LB*3XdRJ$Bhs(-ier`czbTX0ZxGS#}L9|Yp*aWE7Mw@a^j zs&oCPRjsr5e|OBiqB$bLXCkJjyH&7z)25A_DZd2Z;tOHJCEl8B?!-lSovHRNY2^)> z=+nsUPIj{%?|HG;Zrd~e0Ftz{GU8m|?2X=!N}2W}e$E_qo+zsBDol2b0!IWms^FT_ zIc{GIJIZo_tPshnah8vk6pcc7yIC|6U1;vW0pBiCYa6rtIf z>?q+Y5LM}JW6$@@5WTIhFw*}r59Liuiaik%yM%LXyrYj+p=K!pN9l(Uh6}dpxEB1>>T)2Uh$u~YR=#GfdN*E ztK^4bjg_lf;i`Hr?9Y00yM0j$L9fyYq=w+(4jcVoRoHaF!-|@#Yj&GE+Kk)aJz$*y zfK)h#z`<3x!N+3d?Hb$$EbKmPIv9TYfp!Tn8|GH=Vzl>C^MLzpHwt z^=Q{#XbuIjQxL7ap3jnKV0ESA$~JR%{Ex)9rnVsnhU4U^eE9tlI>!^ERJUO-9ugM2 zNW>e;?Wd1ns+OpxnHs(7=&1`{^J+IMqUg^RNg1f8dC+swMR(cm=V<8c7_V~0sQ7W8 z0JV2QzJ6ac8v||wH*np(TxlN&nBUcJYq409(s7b_;-^chdcJ(}p#Wjs9mwL>(BYr1 zD$|HVZGTF5XakvcYpwPCdB9a#&RB0gg1d%UAY0kuw&012H)V$O=eFb9Bo37KPW|Ch zxhV*=L|~n3Xk2Hbhm8>v2Zyc+?#9xaf@5Z7#YvjR#4sO$rydZmGR*G(0E(y^qd-G7 zl4u6;3JHoV7E57LLG`^4${T+DpLAmg39faJt?9twc6`;#5I4C?NRdjOD&!5V!)kl6 z)gHUM6~@|Ibgnm7{;eM~oSgUFJ7xa>zwF+RFqw~1wJ!X>rFH|3r;-sv+OOmJPiM^E zAIgzR>1u5>$*zFf3{gO4iKbq$Q998TqUHbp`WC%Z>- zZUMj;z?h!Y7+*P4A|f`dJ3O=nPG(AMh2hpPqp@EA?8RL>jthFbTv4esUG7~J5uMr` z=mSN-PA6h7w!Csf!Cu2Mh^fU87ykf>cdji9BmUirCq>YS6i|48dGn%H)f`c69B6~E z&;nq^z$-7@ns92XM{1fjr*2wu3VmX-82NEi(#2gA=^Q@k&NB1`6;)iT*cC}l4I`{@ z-SZvWvs)2rf+`im4uf2)0WsnMgR?j)&Eo5cWutyu-lbj6CcF_rM ztcv-#AmD4cVs@%7zF8?!jxF0HcqjUV>A-iX#Y6yk`6vpSNi@Z6S4ps6BntouXV7rM0t~+F7z2#Hbz!DfNfvz#$9a@6(CzC}gEj@Kq{G7Hp;`0rfkF z;Sx<}Zv7ITb%SNII~&r%RjfJTkGm&;9r%3~)k5hNbvNxtBy(1d5*@;ER?~$zc_Y>r zeyiHW7!BUVY)sm;p2S_4XJ!h}9*`*6h$lYD8xw~GIMFrBxGTn8(Qia$#PL%>Mvq;} zyi`|mo+=UAi*Pkhsh;(I1j@k|xG*RIxejqs@!R?`cMTGw4KjmF5iq8zu!97gaA?|d zS6DW?Sq24=_4!#3Teu>5l!?)r)li`w5}F%Kb64IO)NfDb_(uc?BZ`OIH4z|<#|3m= zjZvP?D*dBbwhs~hGEQ@D*@oe=oxBx=hN<_KgBYVmg5elug9Z0@ zW=b~JfzIFt$xX8!O7W%xKewu)R?QvjzeNe|Qgl)`s%e#X*OILj+`3+;u{)G&jCGsq za@L5-XXvlB%(TM4(-9|gt70NW-pWX2ORhVtoYg!Q(p7H8?0!8xeH}ZsgJRC@@pMLFa5x?;d0uhqH(2LIS3N0Chnzwt-qt zQ5P90wrwssA3Ash=baLLQ}Uyj05VZ=rWybn*1Cfm)ihn>re7xj*pJwL!3daLa@N{k5FIzl{^ql+N_026Q5 zf^!`P4)M+Z0P-FCyz~ywEdn%Zs<)Yvb)g}nRAN=wZrpgO^6k-e-zlj3c5{FVYE@(@ zXwn_@D$%r~hmYvNy4-U)4$Zy_YT{PJdQQhJ$~zH{9Wl)=IMYA|xdKk%_a{X{sL@Vk zKInszJ!y$33{Fwlh#I*46S+oxX_7$q@wT)r+(li~) zb3;d0yP6w{2SjrNK_?|b?A&KX=T}8E#*E5^JQhPlVT!ugIGtzz0M)(qIxs4uoD6S9 zHFnp4Mx^cZbl&TIs;us7^ja~&HMW+QLAw-_N56MsqJpu|AmpCP zI0rVc;j`#>D)CZdC2468C@?wpZB1YW*r9-;$wHL}jE?mLY{3@VkT5kx1YM%L5F6I` z3LvY)nRr4i#ORQo%&!gDp|Q&Gpgqb>+?v@uR5UDACqYrBRA`MobAZE-{=1k%gS1dN9DWvuJJ`ztrHTHzzBp9tEr=6mz}x+Ap+ z{Dkd_)PLfhD$>+e18apTxd&?AIO0OFZZhM&Hpps#HX`FbDiwLPYn0QNPKkElutl}+ zQ&0-p3I$IzCJwWE)$8u~pBi-=qKjuX2dXL4+&vGvDlz5(%r{g(cVY&2AO$-UoF+c# zn$Uoq16S7NX6lVou~v3-ed_w46I<0Csq?7T{{Tv~e@U%5eadZ{a9R4UjLs?tK3F*D z$rmWo0(Ps!m3j40AYq~v>fnylMGk_AA+yCo)nd;?HM}(WEHqCKJr|DdY%I~Ne~koJ zn=oo5Q|yaddsxZU;*HSRgJ^nR3Uh4X&AoRA0pgxcKcBjbNStvTa|+`@PIpzKcuvI- zLK=0a_UL)&&lG3kJ^@Bp`mW>{H~A~&WPnxXS4=5mm0&60qKyk`8ZNN#j?$>PGhNA$ zA>Oy94g3}9-{hG9V1`Z|=ozjaX}PAN_js!IE{_ERMyTKr$C?&g*jq|*7p{=ci)zPu zs>YcpHSFdFwm{eNO*R3waX7!NeaAiDMRLw;_r0&PDbVk!U2k1dmRqa($suml$u%|@xB*0C$9`P=9VBkIFi?Cl2Q-+8YSGZ_B<`*XN(m{-2UL&_map%jH zs;Z)@sN>Dgo3lg$xm!xrpvn7bzS$UrL7n<46xTpbxb{2ZLCttCa0EmH(TdVNRR-CH z3J8kpME-mg(J@keN)pnY6!q&QM2x)98#H(68L6{;Y?VzAk1&-xZr$7vm@4}sE|BQ|06USr9nh|~4_j6Q z>{SP6avi+cYlhIG^G;4HImJSO=ciQ!aBK-dx!!kxQ;OIT+oBa?n{aO{SRKjRii1^} zyj5X9l_gU~0Yh|5=+zt+2S%t+RO8Jjf{ht>qibk5(H4PGgeVF$NFdduK?vCsO;27b z>r-CvEgx~Fm$&2)YpQSA+&O1C?oDl@{u|%Z$LP5?+;+2A-CvuEYuyagEhc?=Epp4m zKoH@-BwKZrcJ%NYea*AoQuM|)FG=2ki3XYNSU@@OS;lC}-OM(2&iRz;?^jB`phRdV zf{$4v5YY(e8frp=I!cOn=;)~v*r3kPsGuqJf`I`_s0sqSWm8QhQA<@8Aq;uDROpT< z;k8|D^T2&iGjhHpIB-ChHqoKN>b^^?i(3E&*?|)q_MNEShaY!&x3+)~vJDm{>91VG z(`q57l<5=SzlOy?>Yyb2MyahgqOKt}g!(E(-n+cyu36r{dSfV=@kEKpB93r~;msE8 zx_U#Ro=PIgsZ(DTr8aU+yHpOso9Jlq(HbGz9{K=y zrn99}@Qgc8GA^t}(JENeqE6tTd8()is~!|oD;^psR;m4}3Xq_cb?YLh1I(2eE2Dan zooMM5`XJGCXmJvZ_$Q1(2(ZXaeb)nDg#%w+f@8H z@fiovS=Sd%)W+b*LrxaW7;3wL!1w8>*riH{Q;57WtOR1~bw=;LD{7qqOPW1ZLz~>S zTr^2kQgq;-{mj-iQ2CnjlkpCZ%eqZi+{(+D?M%Hw?i{q+dH;Ssf?W!B$No8j)3;X4SYfzWnD%=5ub{n8CG`5ot#w! zyA0shBirJ+IXS@tM!1(t@eRt?m1A0D8acULO?!1R zq5Go{40`Nd?wu&{YA&<9aTPzHeHBi4&@?gZEN}&`#2ThCoUMe2=`?x5GKtfz#ZGH_ zj%6FhRV{yS)N?D$s>MQ(sHLGnJXEzpygc+>SB}+lUHvS#Xr!+Zqgy3;jR1i`$;dk5r-Se)>f_zfpOPl z{L7MM*HpOWnkX3)t)B0~A?EaJ$bqo|mksKYe<=6!2j~>-$b-xXGCiWqYPy!3a(B^3 z-5nlkBY!qX3Jo$4p^=-+pV~0zPKnbZJwlLpEm+Y-Azd+%P`OtKKvbMPNYG|tiz#1S z1=tBH=S*)+eg`sZlD(A%25~Do)5QYnI_*6Lk=FVvphhRrO~91b3Az5E?bZ!GsGmj_ zuzX)C9KZa&>)zQ0j2=zt)#&&mX4bv#JTlh%Z9qM*G6n>#sugU zyA-?CMePDFdh=B?JEu%*6FVhs5P{E}W-(Kubjk=(9VY7?^Qloy3_7mQJjVsFj@83N zpb>GNez!J?LW@o-4K!6={k^EIR0JH23IfpVdZKe(_{m+>d$oL(n}Foa=S~4$ZnH}_ z9FTaBGt79aLorXU6kPF0_@^}%){#pv{Hig%L-OabSQeKwha0&43OB5*gRa+RJC&;~ zVeP+Xh1T@{0CMG>ZEWUpdg$`b^^zguy;@tc^F|aqFD_0A#|yi6gaVMGiW$_P<0TEs zIfYl45Zb3rH2aVL0CQFw;#KEv8g|oum{ZS{td6KP}#j;GhLKGxK08~t0zS%%v()0B25@Y{{uiI20X$H9Bm4jYew zR+duMS~-$ths8el7q4G1TzW&bPFZ>@8qi_+M9})&RA8Kn+oYn7fueLpG#+NHpYNXq z4JT~|ifP$IcAwI!!8seS zEUg?(M8xeLvRsSH;#%&c(E}3Owd#}`s$Y-9JyBnKwWhfy)Ci%fkZ$y$Ka@Qy_lowt zWhMYN* zV|(E(J}Pt{*D5);PU5o)py`mOK+(lrv}3hgCaotepJicf$%4|ui(3WE*{oV|*)&#c zvlcxZs-4Q+vNxM{^S^$f4rQR+~FJ_@>4aEnvvDgrc31fma+@_-th!=BKpj~WZCUV@2%dFaW0)zE#@_x3i zvrQ4*2<%;@Zb0U@q0HWjHBK2UIg{+RwCa!f4H#(kza>2Lk~!!I9W%|#M1nR~P9sDf zX0VNl)O*18L)rz?h1{fccqTNCQuChz2yU<8Suw6_wVdv(`iA+ZNG%EWj+?heXVz-e zb>DLsPmyRIX96AcR+D>we4yHcdU``<@Sfv(?eB_Ly|bpTUhma5%i7;((z|!0hQh4v zMBwp<*r=fpQ-PMMjE-o8XL4(?5wPu9jh>_;-B$?+I|<>R{hStt{_*KTFs2lmqoerJ1{}d;Yu8Wu@12emG2UBw?~KSDUSe zRct_KC&@OuPH3~*TKdEK+uCsM@X%#n5a18da%6*s)Y2pZ9lH+H627w}Wt49mgR+T+h zQ1GU!g0v#m%;Lt9K35FC3C%i(RgKsE&o`kxz)WFS@LGUlC^T=82xg0nwa~2GT+&+M z5aBW@HuoPsewU;2rbpKN-1BDBZNQC!*K8xurg@z0%fS|HJ?&5C8!J1p@;G0RaF200000 z0096I5Fs%^@KIrLfswHwp~2DN@i70|00;p900BP`D?NW8wPGmnh6XYu1hT9;PUeQ+ zsPS_ssi_P~6hwmKYB=Gt69=rCR7S}(q=}b`Xhr~@>>K|0RHf*-9-#(dKt7&s{N!XN zuD>XYpj%- zC|I>Unm`25NbctQrv{%&BSwQqVf7dYN)Q;C(Z$mrqzTml4hYW?oKM0sKv3!#B*LZ2 zs`g9(1Oah6be#Q=Q3Fu})Pevj1+~dH$)XeiBoN@uXQ^y;hXwxtU^{k)4A7lg%38O8 zfc*r0rtn|J5iuxC?E)lrmkHSl_!xtB1r>lweJX|S!eL!Q9;;321JU`0#JMS6#9HoqG+Zk z6Sg3cayf|v0z6#-P{g)(RcT3TlM)UZxM=`de{TiRaAZg(@Ws`j$!b!2L|CE#k-$4f=bXodWFU^zjt`YUI}#d839L_K z5=4$kJfy#-FjFzEQAIOC)NdCePpLEYtU#cCl7eLlFgh9grwD@)bV-0ogQi^SJFGXn zYtC$V+d_X7PE`9bIzdlSeRj$Z00CTDp?VDBVBNu30_ z1+P+VpwR$_Cv*kXM8-_no#(z$SXvMWD0T#ZTmv59cT-7LboPo}z<};eIYc2@+K4Iw z_-U|+4I8n8h>J4zS;QWNk=a#%aoC1V(jt)wp#Y9csR@%q3yVmJhsuZj17s2~7oroG zl|o86!EP|P5F`-g*_Yx!A>exiFCmXC9G!JsQ}6r6&w{bRfHAsc8(m5aq}j$uM~9@+ zt3QD{$)V^AH`zrF z4BJeBNE2k;ylC*YTv?{GRrq3l%_<7+t~Brc#{)@pzjYsi{S6#l*Hv29UArbGtC~)} z{b~?^W(T483P)-)WX7d5dn#f3gco4V6SR)-xo8kkAh(h5(TElAi0_^&b_iw3rV{xf zoH%2k!{##!K3dYK9gTpng2(%ppn-n4xU4xEO*A`M@QD zo|+m9^h>zw-7ZBaZWdbv<^4%LvnCTw`nOo6j!6tun5;5RRMoRe%(n%Tt<)jx$GQ~g zWE2*93UkgJH7i~M@45Xel29k|ehgso0@qOPV_YHv;v}iT@#GO-_p-E#cU!;K9=IFg z>c%t(r?=cFNnpL5e2zYA)7lY&U(zq4EwY%~E$k(Qw=Co6Af_(5R zZOnHuoIt~XJhk$oXloihQ0J8(7GEIH`^_pm#fg7@+DkYd&QmAyA`fMdn09g&ysUpS z;rfR!%m&=9XGv37Xic+pGW#+m*N{V2Mj$lZUhN~DBpgLavMLTPu6qN8r|g1fsXJDz z`;51mXuiUw^%mY8-GSn`>46QYn`0>t|MFFO@3( zg|zA2)p(uC+tWt9E^H9?l(i-Dh?xrr*_2L4U#h!9EtaAgmG^Ki)mCsxpul>5Jcj4y z{sS5?h-s?B_$F6HFk=ak&f8Z?@+h|li7FENsT;JI#{8YLTKhK=m~KX(pQq}-7PEL| z99~j3C2N^Cl*=qmu+8)MH@cq4QRqfWFqP19d}ZRR#-L2fTe_t+&v9pj+XwB@-*27% z^#&!TFn{JRN_LUxzV`xG4y9C3%usZ2j4X@ypvskt40XsL1vlRQOP5#0bA3zsn@4#BzR|XYZ1_E5~d5&G+&$LVHFON&op8mjwmoQCZqLlTa zGW$idUzEa)Unct8?Vf$<3J2>0>$w#6Y@ioFK8n!o#Mb6HYIX>glho;7yI?PJGH)G9 z;SD=uDY+_%ycMqACP0jJaGtJp#p&mnpAqL4y_L|wEY1U#4 z{w>-^!zNVCqsLP|8DBsPZpd)3MjUq*%^@)09qYBDSh27T7^jnijfhDnWPrYCL2RZ1 z9so+vJ?|8_HnI^r>G|{(azzP4Z$dWVm!9A#yT9%nB>T4v}pJF{uDEqMn=x^)P-?9PP5P(6d zPgJppnUzCnOG(i3S-ltLssxC4GkpABzc%RSr6A(p!7~*1GA8=<%T`Tw;K_tme9-LT zMK7GZr-hed>-VT5X%7(boHJ8lL^5+TFYH>=xnB}2MqJrKj6^M!u&(f>E`muM?5v&c z_hyU;d0`3GotXiW1+UmA0Q{aT1*L4#vTLF;e=O$fT0LHU`PT#matsXAPxF zeDjZqctS#Tqr={430dgOH14oKRmRZwc}3VQPc%8IV>9bBjQfz{1FVo!!6QFv$fcViLH2u>Lf|QY%b=_odYv#(z>o&ZbBT zXWJn#%*wVZvh@Q`-EDX}vLQfG&9R|XUR zKB+pz{OG}u#sWg*M3#hwnR^JeulSXUbIMa6YE}Kh7TvPwl+gHK3`eyd!u~b-T&V#Y zRps*uk`%yP0;oh$Hh70LO#WYtn{&x6yPYv{p=yRVChGL;evO(O{yj)CCd*8-oAb8J z9PT@+a{KZ7P!eA48gZ9-v94m(LH*dEuXu*SuU9{?hJO8N^Avlh&F0x@9)^S2MbP9K zKYe#Isml@1S1mkI)qO4NWhR7tk5!xK1YZLBehw9-pY1wc6uy_5m}sMSb0^yIL)?rc zQ*ME%BrUJ#+;48vfDqs%hRY}PO?qA3Y{x!LK!8BNV04h>{`X!)j&P1~k;!XY;twT^ zqfG`b{!1Jm@Zx`0!v+4RW57iKwwoWl{=8ls5w1zFgtkS zo1Q{H7NBSk`50tFlff42(bH^8eRHZ+4(wFTt3C|(`EYh$i2d1}xE!e^TxGFf^@x(L zNpdpm*wHfg{god7o&2+2Xj9CNH@O@n7Gda@|17mXx8*e&bd~R}+>^%X9?Mi3%td6< z6iKBSV(L3z91y5f{YohdW|C#Fn}dTKyCL745#|j5al7@X2=;_|jK5IhKLDP{sJ`9{ z7$N=u`cYW-eOg9Z|I&^&m-W9M?pvX5*X~icnlZ7U2Gioo}rt~ z4!sIN#Q;Xd%ybC3(B|H4NyNf&C6 z$2Z}#7d6T2c(%)*G}X;<3Il%c^kSK*%G~}RS7phWD%_hQ4Z?LZ1k00EtOC;Zt1h?mP&8GO-_&1e*Mk$j;5i)fshpN` zZ!kN{%Cf-uH6oMX1z)y|R7<{@H-9Gyie#ByO}}zf$~3P?7AamCZ1 ziWt}%?dT%rJBj|WpF4$(`JKLQLfDj9)oS5LYF;lk)HZa+97wF2Nq z4GL=9rh^`dRFS-(NU8xEc1;u8o-7R$pKJ9iB28BU!vLg&z@h}3X>jT2a z8Zv_lYY;fM4VE7Ld-5m1*&A%Y&==z{2zzAW$j-l!^S@lTe2t<+oHdqOJ(xD`(zXz5 zaOGc7ijV)wPrkFd4OgrapY*)|?~4cfJ@}Bp^a_#9!^Enkbw={kH>aWtoZO%^RXB7s zkAQpsJJLpCS?%9I4-|^7@&jT3C^7bp-z^fc{#U64zp=D{vbrM&fs3%E(b42JnZLSf zQ;`aO8OiZn3crVn~aiNhHvJfz_FqXQO=4q2^s|Fvb5 zxK7v0&f8tj6n{9vjxm0oB%AZwW{fJ2s*vn^zEzNdDlo{HvM2=bsXZsMy!w)LGe`$@ zbygF#v|R8BY)QprqS(etpuc!2HiXDnF>wwegbuvLXTbX}fpm4&3DGeHN!|9GqYOtS z-BTk?FPS(GV*v}+zZkba(wmQM*g#N$gb1jqqFPM6&5Q9&|ET&e*T?9~o*QW@1zeU4 z5O;DULGoVkjgy^U@Uc4vOXtMyYF}*z7sCPbo@@clXkj`pN|OnSp|I0UQW|guPzI)Z z{NQaDyvyB|E$iG~E$pJ-0zukw8$8#h{@nAZ;1&WlI{&Vr-cJv%3FpDp2ncEj59& z7nOsC?k88Vb#X#}DWbGVDCs&gH2rC3lQehbA(>Wr)5~LUuVDeyBi))N2i5vVb0`U} zV;8Zyrt{#WgMHU0w4Pa5FQ4qn4^FYEy+~C|d>Qf%$E7sq#%1ea03`97PFU>|E+h|1 zNdM*gjLfT}aGga)@tHe=LKoiQXM)}2Fub6BY62x0!%RLCjk1Q3wHl#vQ_TWrUxU@D z#5_r}Eig#U>$milu{w(doP9mv7_RF*W~ln`$Kv}Pj@@jHarsI6@@qG?^5JrX*`ETT z_3hypF9OXH8aj}hFMylR*_inO!n4E6N8~lUq$PN6k<4WwGcUH0^3;?WfeAMAb!ncz z^O!UQv>1izReAaDw%-7IDvrz0lO$pO{9jY`G|rRBzEzQLH<5%s=SXMfJ#L)A4_~Hm z>6;Jk%ezlS`+*&*(ixO}uC+f0SJ-C~Sd77IOa^p_nQ{z2e@x}Ki~SQ9he9kp6s#?o z9v$t~kHS2`=?dAXd1b;XATzf{g3Wd(FJ|9zKFFQxm1u2k+!Z7{lD^uGfbfi^PCr>Y;v4)37kqk;F)G z$Pu-}XAxc51mxOi>QUTQE3aN*84qi3_Tf<1M+g>ZZ@Tzhpi-Xba8S^m1=cQqq;R z*!zu_>XcB-g^~142NQio{PJvJat#K}Z{ERUY_i}WsQ7G0reX=I(#x%Wd#RFY-}*k} zXYozd!LitcWTxAS(M;kBW*KM5&n+G_Wp8B^E1fG#GBKa{x-erQo--kxN8M25^MLXz z!LIO-vs!x)ya1{-E;evZ8F%S#yEIz7sKZh{0OKDlt01-R$5{Y{E?*dkIKA|Rbp+yju^Dg^qp zVU|SS@ftb0kzB(=7JDbR%RkgME?(kpes06y510547<59rCo5kw6=W4g(V(=MV(TH; z`c_Td2$4In<{^91?OxedQ9!efQVh`3+4%^$>`Aq%g!{l3=_(q$NHctUrk8;OqonDG zoa{X7s8P_ZRU^46dVY?pD_D8(=paOxh)i~omNv?%?()~wyQB8$NPnAuA7oQ7+2|pV zMP(N|GXO7=g4>c9H)4ZY&{da&Z96o17t`Y{o#v5i)gRk-A5y}!bRUW zhq~TdC#3!BrB1Gt2!fQQZKVx**W=sVGv8&SEMRe%3g(duirP1&A~?2LQdqAez#75i&MSX1$3X% zq;)`H6{nB;`1SmoEAV7gpBM1WWEafjbvl>`7vfx4)u*gpFczK-0f~-0H-ct_dFBkm z%`dJ72sPv0_0S+>$pW4}7)YHN7ExwJpfhRnK!%g31sqMcQhNv)$nO> z1<;G3J1UDK$8QHU@#puJ8mrZ00<$TTn0xKi--QYSg$#zD4Y{{V-8&BcK0I)9CX&{r zHV}PMDQm>$W79z{?C4oHnIjC)b~m8iLUp@AkQrR<#i^_W>Ta*eJe$Fg?ffml?`_2Syka_%{1 zHvww(YmhAeg{K%1DMh**@}>S)n0^}FOS>J+^@h+!9?`BBCh!EmIOw1IOS*&0U;~;gLTi^2C21XGfxqFQ^0HIgIQBX zvE09_h-m1mrSOY_cTb!B2Z;NJv{HYAwih{tme|Da7*_9P_>|ewRwsq_uHnG;LDG+v z<=46d54*T_w-ks6R>213Og$Sv`B*j{@phAcNbCFUw=!hcMG!Y~9heK8PC|w)#X00( z@Um@L?Gq>b`48G9e!%(wgmo!@sqv(*{w4sWW;f1h@@o!!5J_A{hsW{ju|8;gZi*w4 z)K-oq92MKp>{ZvNmwA~t=!fUXsF-Nz#$p~3>=N}y=pBH#dS69+`M#D-M6M=i^YfMY zc16=n`7U4m!anOSF_Gk;g7;s!+N>71Y6{~{x23*TB(C_UR%e>D2WuX|{WVJtYyNSj zs3da>icKrG3c1PIp1N)YcT?@Vv#kD*20kA$B2MKqa}VFYOO1y0ltIw;Ir9HZpEFOx z%*kA-=UdxvN#q(*PjkCaA2fhSKpLeX!2*}?#XX}udF0l)rpHG4f)tiz8$C<7rRKe# zStk^o#nrXgy#%s{u1gi!L|Ij8fRGIN`Jnf^f)qyba@uQov?M(MzowqnCqdafLiAA< zmny>H(E!Nz%F}A{8NYh>ZRW#VUCrLq3ry4xAKkmqf|eJ1*nsbQmt!UEtW6YcneC>7 z61>v;PXDTMTYxoMgoAezU_m1&h~N8f|3;#+GOYn2&>oH?!b18(>DA;~$?HlP^!wJ+^aWoFSexbtKC`uUGJkuk%Od zt8ZA31dvz(77^9IJ#Vr(ZLCAzR87qkTxej6HfzE7SL}4zy zRihYx5$D+jxu|vHI#}f`4^_~S{ZVXPSXk-;mn6Ts{3{vWRzzl?493bOX}Zp!WP>ug zmm#@~87yqox&ncIt7(-`4Og%<3H1v<{QU+@qs%rO5K^hLf0MflkSG~H)p7{DV81Fy7^<@O3#n@y$Z9X@cgqC4@2zn zKbz-|TewC5xSD3Yn^|_1*C+#-jRj8$fGZ%|e9OouoS%uFz#F6v^V6aE8K14|?Gqze z+A>Tg8jDKU^AC3}`$PnZj*>@b`{bBk8LQlMx*9>?`ns16GoFoy)w_ols~T{uum(aA z8R_`c1+mR9o9sW5y_LA3=ugz(KO~5;_n;>rqG8Gy&m67}UsJ`?&qBquF!=~YU^IMn zMUiT&_lNCYcB~3HxS}bZ9(KQN>eU;GDQXhI^Q1;n_mV3u%b==;+-MVAHOYQ^8^r`g zF+kExqx~`DF5<$Mbxq7-a z5Cw*n94I&g!-YvOPbYwpyGvJ@&G*@O?8ubzKfsA#B^1a&m_3PRX^MAmT;{~gc>Zf- z9nXEis@IPGVtf7_@nG&D$vzR0r}lNq{ocBgCRKJ`ljDhek5%FpAZ;9ygvyd#Ghl!M z%!iK8^PR4Vps>sI|9cYyz{Ng4-YSJIEAzoUuZc!B;j<%~_Zqcj9Q0o>+`N?8O?QRi zB230^VC-8>lvFUA46cD_P%7h$p(RuX6ER~0YS|0*$!mDWBej1y@|;`PpHSuJ7q(%* zr_;pi4K*{YpGnXzX?I?E!sw01q;apEO$3yL1WlloNf~Dlb|Oext)W zRyI3t#=RMpXw)e1lM0sPYRvO}Y$Tq0e}M&5TK$}w@zO1_I_}uoMemvnz4IN7YV|C@ z%Izod{@oW)<`U*DJ(b_)K^$-Z__jPLX5CaQz{zdimq8^j6$y|H_fb4fphrVPaN}w1 zX6PlBQrZ2pvDdKH)DhXWPc2jtcP`6|opO?-Q#5mKoO}BiYKv62d#QNYSpCONx_-*$ zRP(Io#mfN+=)cgc1jad%jrR$DS%tirsGYNv=!RnycercU+MI5!VCQqx3s%c!HMY^6 z&GMxfTk?P2FN#-~CPE&^=SvS4_!Vn}Ueq&n6S#!Z2}mgX8F%K(c>+YMDNmVsdyNlm z@eOoyE@1s7opi=Jt|T0B*)^KmHkU1xfyn_;SIl^9o00r4>Qd8^Ehw(&r6UXz7U^~q zD=DW3?w8D*DDvq0qpyMH7D;6)NlI)xmS7GsY~7-~d2Ph{-Z%unY-9G59j@ABrFFh8 zD^~+=;)709Z+VvpnGSu297pZ3{8Lr=PbMSNSU?JY1^F%)psvJL(@*)yM{f!woG!$A{3_ z=VRiO_aVSzX|DCcpQUR;CXcc!0L0lB+rn<`A_mzqeXCunQ@8^G3}sHO{TY?gfXTUVo2yyQ0wB<{f(YKYxg1`kMX zKLLa=2&~vry=itx=phkB*R9WIpED%Zu=Pbv2fr`%t6|oqntnC}m74vYUq;!3xm$fB z^26$1{uCBRS+t8?l|D0-Lpm3TEnXpmY|3!x{(`c}v|JO9!J};}NR_mWz1RpjbfY5E z641H>HK}i2gv(WL^#lObNhuo%Vp#+Xf_j-31hfc9>?ZU6bwyfOBit>7rAx1K;rh9) zsL}jzqzN|i&Lxx|2ux+)?S1viW{rE)OxJv;VS^#BSxK2>Xyl?n@~~)S0fGXt+%O}` zm4kP%`+p@+IA*AWOgvb?%qI60HIh_G06I@`@=2V%7H>PFD*x7NuCInKVVA1v?geU< zsfSpndS%F`4UD0}-RBTX4(=@u9R9zX-)Wu+IF(Vd#ZjJ370N&L2%U_$tDK}i1z-|F z0TQfw{!^36DOzGW&cx_UIT)>2J0n+Nw#&IxWc$_qJM&{808`K#4rJ>8(P}9Ss3Xpy zDYp*dcGCn!!!LZCwD=LtP$5J!afuSBN58_^l)|70u0@S5O6@MAr!Ntk){>O%@MaVPRU4!o+v`X`sd&X_c>_ z>mCW^?UENPpB5Nt?PRDYiQ8%sxZ&&$TN~Zs@Zvh(!81N$zO!~M;WkN>SJRl(2pI57 z;g~g3vb-!oFNPa~5$*|&m{Wv>ULP$%$I+Phelk_%pOcneP!}l(gNh{s0yX-#o^Um9 zlHsR9jX~HK#;bwdmX=#6pIF9Q8geo1nr-7ZsbMIY~YIzrTYrUq-mY3q67f(nXG7?6!iZoDr*CU8L)wocgp$Ek!c z$LyZ(5A*+gqe7adMI}&a%bbKsnV$(CtGqE~X%ANXFfYd^)qxe;AcFs<{qH2>N~)RR z8p_MEn6LDscfg0Iei*hbuoz%^Gt|cD^UnqYNj}C`0p&?(Gy4`-`a(AwpqjnA2I(bO z34dUolCyH@%|tRDVc0sR{|OGy>H8R5A8%%r;f>yH?vy zP00Y;$^PhjIZ??%MEr2OUAxem|Mfqh=0i5~QxN4`BDA1F0x63elD?4W$A9< z-~#zuOeXAhHcXgR;5OalHA{RdX2blgm^!gyF`R~SJvUOViaCXDgzFi{Hkc>w!8gW- zqlgLl4-JrynY_&68{965(X(>^OFx*0vR^l6@sV6@lr1h;q6l>^@kwrAnZAUiKE^>0 zV9};ALzl>DQX6ea_Oq6#g z5DV@isLaekeu3_frA4jviteIfpVKR)z8#2ji-7wIh^R7UZQOx~{A*04 zCpCy(LpC%#6d>CNz`!!wppk!!DUB%_oT= zUX1tgjHH9*43oxw#47sVf=I!{zD-sUf)`8(49c9o+7^=|vb--BZNxVQh1?>W=Pbyc zE)w43+Md%{trURoIURTTmmlLrbSot!uG{?Jo(^`zLj#yA?fRe~p}cK4a{9a>t)vVG zPWd5__t*S#DhmOLaQ0bgT!jjZ1>Q(@1Wz>-9&TmfP~#wd2%8Qjd~u{dc=SLeTu!~u z^Prt$6?>;&#mATrtKv4NOoemu&;9J*RRn_uVvC+|;xgeE@{CbKT~jQw+`UD;*_Agz z022f9F~Sg#{&0PS@}iSgt9scA#q*2BzPEwAVjJOgupHFM5|fbpmsqatz@Gbt`j&+_p( zn!$JX;5<+Hn*}Atp@XFu7A6V{y-r%aqbfY@J0Ams1haNNig#<_{|^9RE2TsLFl(!r z4?SymI6Iwd-PaAvF>g#pwulyArg{O|5AnA#1yi6!RQ8k0^SS+=DdvlyFo3 z(FCyv_p(wWQbCBQ=0s!qE^FB`|4|Bv^~9`y-SV!fM=nX^X1-aQ1hJZZWlkLWD~2CV zGAWfB{LWEHr|rA;3X|%?`pxa&6V{Gl^{hc{-YL_d@LRS)CKhBFrkqIv5MoO??*j#S zoJ!;h_AHyINV4ln6h2X{&srFmv&fz1Kn!_dY_5RD({7FyZD7i|6p@<>{5YrzQcF?= zdGQ25pIL>_@T-i>b4A14s8P&00rX>(IEiA%A)aZgolwwqMI%_|33Qf{;1w*a-*0;# z3MUu~Od}EE;b7w|%1KVxZpUMJKY4I^JO6+{TFrkzMd7u(Db;EOiOH28tU*`e?r)+J zi_(&dW+i*zU>~AdJM;J((J=r(YBTc1TfU@6*p+M)q@#T6bCXRbm& zD-dYh7-tSLmxwW8ntDLB2m8dOyi3jEhBZP2qQx`HdcQ6us8ZRP@dyl%>X3*j!IY^a zZFhL`RJmU|G(U5C6%q(Xuf1sGA=?zgpYIHk#NfwZSS*iCN*+oUkI8%`ldGcnWL*9q zj=>#?Rx>ZF5Oa5;29%>zFd=}94L0%m5Hwhf$aXXQ3(+Ee*4X9=8xL%yL8Bo6#W|QN zcB<_sA$Zhg%KDPcW8LjW?zNHE?tbR*OQU~qC`~NnWJZPW5>^|>IcdQY(z-VVNcrgN zKWlU=9|B7=Uoe&g9MS<|pvohi$r2a-#7&aB3(Hvdjpd0s!NxwXzUDCNP-zu~JP7Q$UqIm!h)FDTFf-r<@z)3noz=%PYnV zvXiX&jA}!*_1{*Pn*#a*+y(=-kSH=*vho+#8Mq`thHsAR()FOMg-XE3mX8bg=5Rnn zt6*7v=*!qrB+(6UY+f*pN!`{a7u-**=gYUr+3zZX@1)oK{ebh@c*A~H=#sHJF*Dk2 z^fOPQNcThfMl9^!BhAzLATE~VZEL16zAKajD8h|J;>L{e7i%c-&LBr{D*kFP4OOm< zrQcx4A75(`+(~<5G603+FnF6meEX272M_@xu=CIIb)>+mPND6xs2Ael`dx}#u}>_|j-x<ss7(Lq|V5wI^O<)=uQ5;ri_Kk z>{(8m@q%@8iq!byAp3AY*69K0Q+sLEN1Je@8m;8vG}u)c6f84f6=~?h0*s{yzT`(# z(6&qDXsM^;Z7OwOi5cPM4Z~a980pDI1MzbxE7{E%pC)raQbR;HzrQ(U(pjN*J>f9) z!TG#(rpNw9296)yhURL_Zn}+6k}R<++{zb8F9FSv(gD_FRS!PLG-cIQ?QbRLM2#io zTk+D07teVqH|#N2zGlCT6Q7Q$H-7vqhw{fF@Y!EhS!g6x0F%YGEKZk1*`k{Ehld-y&sB&|i$!e2XJh4fffX%B^ zaj3e4>FHOm6O%A*Ks*KVJ7F&gHQM*7|UN6y}LV8375^W zVhE^#8xOPFK>z2gQ&yz`;t}$6pT5=nQ6qnlc>MYOvi>#1qsd`a!fnDTpLu8QH@EER zeZ)vZdvD=xn%A`(;TXPuvU#^g#X_NpyCXX?KzD1FUk*e&liX)mJ1Cw83KrUGjH<9N zttMp~*|Jm?HpNZSl+(qIVg&Svj>`P4A@jHQ?OZJK5YGXsk~c2=)DTN{$G`D(J~$H6 z&)k|g{x>0ky&MoMeuQ%E+_YZ7f*Ff=+!3pvUxXLvP=mnYooIM}4z~8%IM3mrMmF2v zjMqD9BgBDoAQ3%Yp2n>454NKq{ zQ*4mr2dS_PZ(`OU4f~mj)e)ehtQ$hVrKCwxAg@(dpp7DOV4JsZ6=%r`xv1BG{b{9p zmPfzI_}A`Mv*q%PU|v=^wubL&Rx7-!7gdt~Po7SC+jA<}Ii*c@;7r3g=GE5{Sh-ul z#Ft4VINeb3UNf!(UsIF!bUBXa2Hy){ST1rgECtY>f&{6D1w9MNq#HR{rZj=(O|{u%F-ig>BpKXMVo_=vO1l=IpFzV zN2YtbWu2efW9vzoy;sf?)RmBst6i5G)xDyHh_v9TeCjqvs49T7|1!nNV7P+I7zCyn zUtO+Kt>myIcLV;P7z`)VF<}5(aS?sF9GXIhaF!=;*g!L86VmQ&(1uEpP14t8b z<1I=0$UCN+BbAC&mfsbg%#v0Co*i`|}*@oFyK2JfQd^YT{9SEGWS+-6e<$YB>r50l8S ze(F*<)IC<>dA{IgB=707n`Wo)zqKoT@wxro?`bB7e802_{>Z)=yby9|umfe#(-kI9 zd7^TsXFD@%VWLP?{;%zT2;k@2R&gQwMp}x!J?q_*d>@5xi$MoocmD&DbyQ93cbfb9 zlyh!hmbdZl_A?`m$AreZu4sRRCp!wsZrG%S3Fb~^XlL@ie$Ue8ES&LdhVyy;CXU}d zed5$`VPn5j2o0GLIW#!@t%CHsIaRK`sKB1oR8@UWF8{@j-9xF2cRvlh#s>TP2lOOG z%6+ZkSSFeljuWw=A>ZY%eXVFH-1Kq;+nJx%Vqwq(VvWZN+U7=@Z@TvM*e~7L&7ZsE zZ^z@Hv}N*3?ph`K4eg?GL(e_mHs1z=zTrE}+<(|aI5Nt}Uw^vyC?pDQ(B~jdb#?(B zo7Va6wX(KDV&^r9)$(0WlP+Ql(!9y96a;kSWQz{85DRx+INjiV<&|}5WW?ur_<*Sr zyYiGdUe8b@R3ZPJ+3O7-yvfMT->k} z{|Cfs*)^6mp`bQr?8=Jmq7YB-3V%H+eCQ+`@F#SQE2O2>P55Ke>-^WWUf0WnhKbY{ z+HpnZ=1;V~=7>C_2q`Q4?e@LnZ`D_5=yYko>+(E%8J06CcxSNFT~)>hJRg{Ax?5xf zb?mFfqrQ~xH{=#AsgPC?K|1DkMqF_43WJbYd>Gn?pyC&}ohu8At*n>K{R;O{`I zSJ;SgaBs0A3p!jrHq|!^a;5jH>f7Hh>{JmI`_nD><=QeFM)mq;w~!ELdPhy>oX6^h z=O=h~#CdsBRwHB~tDUx6D!ltyz&F_k@;$F6YOU14O$i!1P;q$X&daMY7wT&H(9c4k zisk?_ASeitFe6sfJP*3y7`id1o$s_e-0$*d?whXOnZwqA4{g~+Vz;M1eQuQN)oqRo zy7R}l+L#eyA61jk%kp~IB|#um?)j-ngEB~&rLIP=ym@^7!1=t`^UqHhcQiUC;k;eXP4n-y-g!kM3n>-5++e1xnZuue*%0pz8HXLC zx_Slw0bAehJbQjs*jb>YS+nC_qw=ZRp}~jXy!W4r6TCZk;gDg2GVqkW>bd3DAR*wS z8?+TKIz5rM(bxy5fr+j+G$z0pfk%t#6GcCq&G4GDJs0k1r)(T3tlYo*e#_r$sA{tj zKmFa3Gj%4`o|lacuasKOS@L{RwR<3T)lviacu%8Osx6dQTy(?U{Im|gu1;R=arupN z&g*vv0vqB*(N|eR_Edh%2o3QpN9!~##onEVqKHsGh(521)*t)JV764C?4!o$s|#Ue zA6hE6zU4>1X>C02+AWKGK|c68`!AsA2hf=|GWPSLj|g%L_g?lY2F>0n7AWyR}LxFLt1~VA^Pc?0yP=#9omY$ zfmAe<-`M}`8>ca0PGiXmX8RfSPx!$=TdiZqs3?zR;rXSqB;5x(l{1;HV|mqfV+S6? zFhp3?qVvIIqW#2SRWQn^k0vmEZDo(xa^u}%gk8-8okx2momvhHvkDQ0ViAG|PLDhT zMjE(<)G%}OUGpKk3o*YETEcD*+#YUfv!d#3&PW!HH2nyo4JznQ&A+Lq+sGz^^IC@! z)=ST>T=Dabfz#k;Uly-q1(to(eNybxnqF+D( zDmr^>cs}k$REFrvadE>Ho%cGaM2jhXZ zHO3>1KIGMRKOrj~-XRZE=cr+Z;OkelR;oLmN#uD)wy1h6#Z13Ge|M_>#!JtFh~p)@ z(bNllN-hSny{T?ss(t;gb(sNn~&D5Ec6m@RX9-vKzvIK4oi1#NQYn zYJ06k=6|qq0pN6#b)R|R{!bcvgMru8L~wO~iLcZ!DZd3Yv&!7edH;F-IJe^t?2^H6 z12(0GcDI)N^A8HoRjx!Vq*Fe0*AwU6j!)i$_!49GV^gA7)s9DS{hf|#dD-1NEv+9U z#s4a`-ECi}u(M@kRh?N?!-+wh)0&%-Lq5=~B5!a=7Z}V7_lzfaz zVzZvGTy9iqiCH-%&q;Q`^$GH~_SYIu<~OL(kJxsFTt&ZyRa`mM9Q(1cz;oZTBN@05FTNJSQ?zz6h^`g6Q-9hTX>5Hy`5$#oUc=%=y-^L4)Vv4?7Du%k9W%p`h8yj)q#cBi>-^j<$iZg+$O+d~o=V z^{o^;#puMm?mh2?f-_$~!jDH==yUup1w%Yte-~#eejDd0{uHThXZ_Mz76Z*h?Yv+a zk_?q7S1OniDpnX8Rp!3?J&;@szq?;6 zcJ^V6P|tWxn2Ya&R~N4YeB;jMllYpQ8w1OX&xiaL2`kyfRwpB^Jx)tAfxL<%>?bXp zX7S8D?_T&meE96CoAm}vQDG>c{e>m{unsb(qhxgO;gLHvtc)JfS>5S)!mke<_R@gg z-{bF|WxG%2w zRnPa%H$$td8@|~uD!u!2Q#7N+%zwG4{Z*Fqd$~Y5+|-~L`QTczYc4ieWZ__|5Wekw zUV-{I&zs@xtu=2wpQ#T%<&f!m#&z-0!;*w*Ui){;kTvgqkwm!rM6Uxp=xtT#X)F62s{Zl)cK#}tzMZxB*23GZO9Uhw zliHRvnI3T0jx>??);ZBoMDzw{VX53*?_0w34sJ)U`+GfIJC$~Xw*`Dus_Mm${2J;< z5tu`^N#aLMG5z~sX*VJ?W*?c$4ac?WD8i2Pgv)Sq#DBN#S}>Lpg)VdN=PZR$@RMLk z*t3}nHtkM%vuTs@7V`&4{g#BgWW@oEPdl4qvZ(+NmdQS@sVNSoVDD^jo)-|f+cDim z0EnwzP+s4>GVQtm!oM&O}{p+1D*`JCJitNgHcS0q_d+_(7*y(+Qm~t zce%Fhb9xq*Ib@UIDHPLROsp@9+Iz#r&b)$)mBAma zGad@=unqu|fd2!NvedyH#tXx9-kvT*uzU-8aLY97krCVz3MpFvIXED99@E2CC+w_~ z0D(^<#==xK5xn9AsOsIAWB1O**Gt+?MWOO_c*QN#)uTwMGFr^{`B@BSvZ-j2AcPiT zO9#xu%Klen`2{8dvlzPFR*f2;>CNsmD?z*_x*eNTGQzAe!4_7Ya8mNc>~1Mh{uC?q zrPhTd2k*v;zz28x>I$=h)ANL#Z_?l@RW?X0ojBwEfFDES$E0&B0rHzk5~Bh6HuPsKiK`K(aGu7Y=PSqPw$v%y(6mg%~QhyEB7}eE_o!FS|9w9Fig0) zgRjIK;W%As+?84%>X6~mO zzCGgq;IM2>*1snv`|ur&MKviOYHFJR8`c_FDk#ZIoJ&TtqQ)n4O=$c%9s|IY z#D`wI4=L*!N*)!<7Yt;JUgK5&FCr%0*~L`@L>MB%As&Eo7zZ|XOeKwM*7dX_kvq~v zFu@vDL|qf~bi~KdjHt>jCoL?<&sY7tWEnWjDl6zTK@7FSIAGs7^6(Ql#Lf*VIwlw( zhAx^RaE4Z4_&aDNrRS*C*;#jC`3th~oghsbdaMFdE1n-80X>emehe@} zJHjBHgW|)mpb}srJOIET(uRj(2qKg8%*GjQdDU7aXw z=x){Z_2dIW2y|eC!4?q02qQ%`pMe;;JMWfl@r`zVxDDiJWUVk?0`5aO%@}?;ragdz z0nrQy3*L=!VbO~iK?E_uiK8om4}w{k=*){Qi(3zFI1Hm5vg`6x(DcT7mFRO_l6LHN#qzJ6GqLb975%+~`*fa?V@`lRmI!Bl8Xb4#;zA(Vh6r_0oF~|^ zZ`m!y8CcEZ^6-u;ClT*UDncSo8f>K2gRp22L;H8zfP8aGL@+@I!CykW_&PJ2A|yJm zUZp=UnFt9_8<1t<%$pe|Os->6xMfGhnArmt6@ZJOzRq)+8ssr{KZylM=DD&oVwVC5 z(eYyCH|K#>liJI}+UDbthn%*~0tr3!W#CxH+IO80!8j)f0FH1NKc5Qv^PB*zVGe=r zht2e^BO+wmkWyrxn6`N5 zh`Dd}QDLZ)J>nz!4bHMQ%Y)VswHq8!)}wVpXm5X{J?vU`&qs9S@{VL|*|CGPTaEpm z7DAPE2){}mlWa4`zPM_agvhY-{{V34*~KB(GcRL*-v;VI(X@=Q?jdT}%YmrPDoI($ z)mc-jl@W1Qm-Q9{}>Mat1?t|_erHl5g84ExyqFDc%Db*qmLMivhY(98EwXJX?u=h{bt zR(vIfGQwt3?Jfe%!Mq)HR$(3PfvB)KU}gURzo0Wc?^ndSM18lLj>;DPW0$Q%&AFv& zh|MxI5lX!3~P{ zmNNx>+R)3*4ELjb+Kyes%I4`@>xZKbe!NwyZDu#_X=4W2Dz(X{H3pJ5ct z{JUU=dc48cY|%$uphSw{J>)m+`8HaP=x6Q*Mr0nOye#f<6EdIOig)hi2OCAO^l_I4 z!+z*HXyvAn_LdwBy9Qm1T(pOy?Drb7iKhcH!}Gak><&0;xHsU)wQko@4GSRKtc}g} z+_i298{hCj6}K*XsMrgA6{EZlUv|?+^VM$DQTw5k8>!TaKAUc%I3X>zhQlK+;w=TE znL^Ml;Zhr_Qc=FQ!dDQD^0?*TcbA&%l>fr+*C`lV9$m+8BlT`4nNlC znchp`c_XAN@2cml9cQ2%q~-;OHZ?Cr+pgaI()+GbI=kLKhN>wRk#ngGYfs3bQO(wR zeK#*=ix&fKPBy~WGoDxi1y4W zTT52%?gUaEqgc6=H$rI3srTFzT2&$C(_B?=*ZM}z!dYc1MRzMzGBp)damI7TL~{P& z+SbZVq8nISgtZz;3_4Yk+`29i$jpfP30X+YiddAm4VI1ZT@O&(ao2nH@?rk~K%>%G z_=3sqz80)Q;|=h%8d6;;l6+=m+H&Lg@zJz}pFDSEd-P+@A2CFvJyDN+)qcG|rq@y) z@;>eqfcH}Mn75?ZiyXhW7Q(WI*$1Nbg(B`*+EgeggqO3;Z$q@MaxMn;l64LouAe1#p#J(aJ0b&4&Yqit@5se7NZ z2gV4aztUAyeemMf@Zn(A(G2|-t@dc_{dl)~nJ5vIt`s~W*`$X9y$%z?D@%j5pa8s?G%Krc{a*<Y--j84o$?ZgQkXSOT9o zR}{i}pZTH6KzCw;^oMqFWGx}T3P@+{kyDCh%b^6cyGKQD;f0`c+z0vp05gZ5DYH6+ zRSRmB>3)>Jqucy3MUU+P#$BiSpPz~L-D(t@SSUFJhO32)ziLtgkLA63nl_3(u7g6P z9H={??*?dZyY{7^vU<(L2AFcCf*fhYeyRrjKa+E#XBadwdRRR(Q-(VETAN`~D@{{RaXn2u0%Jf&uGezE-u`Nzwd zckN7rN@(eIQf7Y7esT+={)B-nv$m zA!JHQibhA;ULURoAEb8yN?v|gqBgDdW(qqr8vSEo`bzDaZpEM1`r}~5-InL0#ok8? z@;mr*R@+#zOOHH`o?0u0mYR+rTQOsP$>8-MQlp<7_*%tY!nIv~OD|F0;`Og9)?cXH z6T4X!D)CpXJZhRKg{U8`n~fYB~9TVz}bZ zfO4R+y_*&tXfsK_DIb)E9NKGCf>GL2@DnpL#LVwiicgTQa=57m!Wvz(YXr5Kr-$JL zC|KMgDRLc`tu)N>Grxq$R8Wyii60Nw8G}4X&rH{r&k652WU{D?s@xFd zSshC@0hXHxq_j?;ltgBv$wWkCY2(1mkBMSeW<}-9U?ih2JBZPl5|x1;VR1jNhvo>1 zNhuE)%~O{QE>9jyiAYvn_(hk*gSJeI78`E%7jfnc_ya9@f-MX*6I*)aPf$H*9mheBF~Cb-$n`5ilqoGzGaJ8-jQP_uCAC#x+?(AdcvK(fCv;(8K}7ctSU7c-i8etukzJf3*XgMMunmCeY^r=jTMG$kb>NuSnSe>qQqaMPZa7v*-h%H;V; zoQpuq0WfjSxX?LF%~L)GM})fw<-_OW*$H~nF2adu`D+@ceYePVLjjLFMU9KM2-0Q1 zr7|Pw7oW>a{B`Atio&j}xg{v@;n|Pt8`TjXM+;@F(Uomy21D<NjI!Td z1{T|vErQ2~j4?CqJ|)?u+bv$g5-1-#IN3XB6tQNZP;ELDIu>E4DDHwwTb$hCiCvlN z;iiWQN+U8Z5;G}z;A9lf^21S8qEMc$6&1KQ&^N-^jjHU?(;nf^M&u7hXE>yYr7jqs zY~d_SPW~K>udb!#!_qE0M0i>wkjD)fl%wJZu46wx_U9|oEE4O9!-IeMc@6%za3Zuf zFEa#J%nogW!k1;Q+ovL!!%q%g#*poFR}Np?hFIHR>p$hgF41y7bqjO72wf{>Y$aS2 zlRqwB1NjUt&KPq^Z8eqA33sVjaiL_NiF1DSy{ioc?9b6ffV6eUHsf{Mc#VdOkV)G1w(C?7iH7T9hX9~3`%nlMEm zQkVR(WbHv}6s2w>bC#Bd5SBce@38&tqprNm!I1SBSy(R5IpJoTW=7KAD>Ku>TLL@( z06)Uzh;GbV+;TKK%kKjZeXZh0u$8GYJu!)+)Z0`@tJ6E_ zzeuWYqB?bJjF&Ek`7=3bjFshMQ6@_C=Oqv)sC2|kqZ1k4l#7qeiz4?g`6)cOV;*sIdl zuJ)(6@?2aeBN{2tg;#f%<$NI+s)X&!qE<@FJ`;o0PcgZgEh1YeLL8wuL=986(lL@# zla)MbBaJ1>Mm&{dQ+7k+pCcRk?@nn_ZqZK|>(svEYMEIj#!t}c_6C@Qn3Sm|Af}2` zC5Yt2uN3BJp~{6mdE?8{Nc2$OuC_0l>}p+8VFoaz$6lescY87zS! zPh6r)e%@bmUG(W!8bp?fCTUc^^qqOqrA03&td7N~RJhV<<8+>wgyo`&f6=utlGl0Z zSHFJUc23Zo)7PhM&CR>2{{S8fUYL?h>wccO@h{d$a}iSm8Yv+P@MNj2En^iYR8#kQ z@OtWOXH!g}3_?dgoBseVGDM<$xhR=h#$3*%b;@+RPEPYr502w?lu8N^-MO2t(L#Ru z_vmZasbbV5CYvdz@WvpRxl>us_pxTRJ@*)!pom#MlYG0sV-)oFY|$j0&bcMp=& zX;Y`B`r6V-Hg~r?nyW;+s;;389d4WW?xvIe-oLIg)mO4lR?!1ZtH_e4B&sPgQeV<8 z?BYD$l6r4RAtak(+{=Nkdh5~=-t{)Lx5l}{8BvC4sk6PNj-$;rRJ^qsMGdD7<&=aa zBQB(Rw@7P9rgNN?64p#&RD_1kx1`%RH|bYfIWL?$)G{9+n#j_mh9QW0L>Tedqt{T| z+Et{hOH6GdR7RT19c^l#d(j>0eOl+0DtX5;)lKBLebObWjNYWFiKRPJsZwOi6{gx6 zVjh_G+DUOt$HmD`TYVVL^yq}iXF1J!^$#ImNhdSkb5wQdZ61=Cc+6_aI!Qupu_v@C zm9{qSl_a&%h~Tx<*8O@#yak=Qc*4ncvn2s{{SVXQO>AjSsCr z{kp(8Yq*ozQK}tV8pt9knF%>(6Qw0U%tO~adCt4m$EWe#t*6%d_tU>}B{R3FujiT! z4^TDh)s%6W7Zaf($k(6dqnz%uDjwO>oaf5dIsV*cIHAueNk$;Jp2WgmNva&ph4RwtWL5M=rNhHy9#y#^-@0@2}`tcE|$69eFX4sR{ zc*JB_mu6Yy^3D{QE=Xyu^GwTTME1w0uANW6>ED#Gxh45-pY(Oor_T;?zFF#<6YAY- z7>W~3G|sd1v`Ko zCsC4qU-+f`+W!D-Z__%2#*(E+o2-LzD;YN2-9);dIb+V?guXL;#bB?~h5R%%&!|qD z{{R&JQ@Te-azbjW($%Cow<4;?IXmSlGBL9ohn7`U?5df~g7Fbkj=wElZ8haXM-*f! z{{WJG-#8|hQk4lxOh>Ncc^*?0aAVagX?f>1tG(P~$B8uT%Y~DY@?lwOQchgCYuEH; zKfZk}cWB~pOOnWGd4lR^BE@>6xoM%Jhd6V|5Bp)hQ0lUEmHE_UQj$2=DS0XX0K&J? zG}4`M7|Wxoa+ob&^!|?c#F*B-dhDJ#uf%b$(52SBW4aK8h9aeYS}Fek$cBk>OF|y3 zx|jVJtNL}mQIBmx^q%M5XafxoAv@%~+@N%AENbOl40whCNZq7t1l^{TQ=ibm}61H~xI& z%hntRr&QWvF%6Dt|T=T^JbqqzA)SYGN689wK{;s`rW7Qb` zB9@r7)YBO1ve8Z_)2^?E+twjzDH|xGf=4(ZX*&{>w96jTI+5P@y=PrFjlhmMLT&sZ zJGw5exS7;CY;Cb?7=-%YN-46p(usZQGLj)_lryQ4xZh6q*RM{y<_s3JwQo(P#8ZPc zRULQfwA<>hT3UxMyX{d!TppPxdW^)9E!r6}pl42q=9)bc;?p~7S6V-!yo8xp-%-?e ztU}V$B2cu4^XHT^)il=g2u(7ZN+%e!#vzPOs#Q9D?lnYQ*RM*1bskQ)V;k>Q`q~%5 z+>N#(iK*1ixoSncf)I|aEpTjaz37U4+$Ld^nMx=5olh+ZQpjCt3*l*RiA<%&jwSBp z9ark#w?aBliTPuF_16A-@hZecyx-EYPES>lW~|ayvOJEy7MO&&q={Ii5~xB&3K~zD z9!hVGt#yd*kcQs7rT#u}swFw+Iwq1$V^yq=BYz0!mo$?Sf(A)=+17IrkyXXyeLBP; z2(nIzJ@@0Ok7+5V1rm~@o?1zXa&*fwC$uqXEpaJak_wq-SviEIQ;`%%nA&0x^*il7 zwAU2;DMD6ol2s|1nU+eKNMbUpFI`(nYmqkPElW;GbXsSrwRvRhjr8hzq#-{|^h^9D zF%YePGBnmTNs3ZriBSf0%$i!_658jpBeId! zBGj=VCNUHt85Sp%BQg+@5<=9JN?PFGxvmtn%2|twYUTH$5!7)ekpBR}UPT!H0GBwG zxpqL@p=yXILMVqtEUBcDUo-JEdGqBEJA1P2N9<71--OY{NvEgw%x7XLDCM~ro+QLE z7E7laM7*8j z{9`DZn{F$u<($#cKBwKS^$3-wb)0%mUtMr|=(L@X*vcfv(U(c)Eir8pk`k24N?P=W z(?%4l1<_SU5hpp$Ehdg@z3+OC{6bOWe;kv8C5bqGRwmi`*&H&iWlPD^bx*oJY4mSZv!%T|&Wl4%a4hjrgqky@tdX4MVK z>sc{z{Uwc9d)Y!Ea@%ZbsAu)()HZn_1H7v0RwMS5;3r)FGDa6gE5>xdnGLq9y zrBlc>KcvocjcJJPmbjm$CWev3_LUNGuFIs;5lYvX!x;U)(f)-t=M+hyD=Iq-bJrWOBxE>TRK!lRA@y3Opy0qLxZfG*W_H zBPmO%`X9sBo^ziK9Mt~+ifbh0>TlzS>DEg!2xd{F)qD3As!Nn1EJj9~D(mzrdga8_ zE2PKw)cfAH_MC110E!kxeeYFwNuh|PjkNxx#~!m~l`3)h^W`hU63s>aee(F^5^ zP3^s7p{M?d_r2?-O~o;7r}vJ(uX!sS4f;f%rg|o;jXC4f6?HKrHlF#;X&p_k_iv)9 zrC8gmUaG3Ll0#{wD2I?^sjV%|D&G@5MVAN%k}wUhe0Z%HvW z^p9~uEfO}X|HJ@45dZ-J1qK2K1qBBM00000009vI0uUe}5+X1$KtWMq10zszfsybN zGD4xTQewf;;WI;1V{(%5U~__#vj5ru2mt~C13v(r?#DCQ{{TXgD8DJMPhj9@%DPUI zMoG|p#&ZhI0;!@5&mjQtsLmG~tCa~0LOx@Jfe6ID&cOzS%Q-A8>2F|HbneC2Yp6gS z*y=PqvOGpue_U$U0Ihb!7>60x8>?$Dy>XwK=#%PuJa3E_A`h?qYdSd}hw|9lTO}#8 z5?%?uq*oM>i{beC@JMmjIU*$9Vry~a23ER~w{!9{$0 zphD5!IR<`Z-53nsuQ8+MaqL3;DMtI6tIv4IJI^1$YtUtf)>_ivjn`$q_WCQ>HNyMN zK+062B|paUTK9FA;O@JZlU61oPldkxFUfhXvVe3q8tYmTU)1k`%LAPDndcp|(Y2?E zc&Y?ks?PhY0ijYeJbyIA2B*GX?QX7RvfCwim{+k!0pQ$+d@Gn|lJipv?ls1*y^U6+ z+nfS1#0WX4jo4Zx(?S^!gB6<0EmulaKIjDaYB|g|Vcgr+VXV7_O=@->6*i^y@i$X?qk?M?TKHFGjdj{{WO+a8`Gv zx<(jb+7yN93itm2nX47RJ(YFr8z~YK<=ocY$GO`58$9#A>@LM)a~0kmd3G1G&{~i3 z+wI_8Ym26$@Iyj|Iu6m1|r|jo@0_K2rXIR#bp8Uo(`(6DXzz_8w!f_sYr4J@! zZFSk)>{9^?-Gh6=drn)QmuGt@*uVXrxMEv+aKClwFX7niAG4veH%8ZbKlbFi9t5Rx4km~~y06bK(27PjdhE+M)_Hb>7e-8O&>gopJl(R+;MHRebaI-R2Rm%2}e4?nR+vH%nS zBnmN&w{H8*_h57uV@O(WYTYC&HI}tr8BvaZEOL#<$)1n2>6*p-9;yIPWj#^v1|22m zKWX)12@eD#FmqP3P4^$?48Bz5EvTcej!?32>7?r+b3(E9p6s0`!_l`&&rh2Y$T{G@ z(cu>JjdT}ct&#H#S1+76{*0snlUD&xA?QnOpZ1N>^mEz5t5|oRs^Y%@4t>}jS}WKo z0!ouXw>ce?;Ejz(7=fN+b_LYQjiKtJ$*McxY_@E4F7$CQTor3SkLlQpF3t3B zgyu5mhL{BRNQ|;&0!s%n&wM^IqMkZo6?7g_KJE={yO_+Jhld}NRY@nGucK@{;*Ox= zunYZCV?XPuD%4O4|yth=ZZr+z&h zg)mc6!Me-8p`}?#fif)^JI(K;h!aSHvfhP9 za{?6$%$6YuE2>dNQ52M zsgX^!74^(PY0a#RFcMm59Shj1tcE}%QrDV^&8)j6T7yZv_i%lip8GsNc+tml3!3dr zfz$5KJvCybHVl$hYQnN6q3d4r8fU@*6A0u=;_g{b(gPFd+34?L-)q{hTo?$}L;zwI zy9?NBw6(yp8}0tnL7oawx0D_vs^>wnGBVJ4vIyRSwHl&jlQ7jdnag_t-jUfWmv?Z* zrEpS0bIFiKgVybP29Tpy9=25YV)bp+>Xf3RDXs+~rv~d)uHqxu-DECXVh%^g7#tdo z_Ne*GRE0+<)+#2uhqO}~{kbn__ku@0XheyhglZ;7n|4^E(^Xos&`t5{%Y9|e8$4^x zw-pV<7WKi1D%-MR zREftgJXi5g2o6#VWSEc5fzF)bu~t3olA%MpBUNC7lU<11{FS+xdQ4Yv#-#Cx)uUSH}*k|y%++e?)KTg6u97!2j9JMfDZ{ literal 0 HcmV?d00001 diff --git a/core/fixtures/images/sas/Pepper/2022-12-06_Rain-City_by-David-Revoy.jpg b/core/fixtures/images/sas/Pepper/2022-12-06_Rain-City_by-David-Revoy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65c3fe4f182691adb1f5ef1c515dcee1f7d5af79 GIT binary patch literal 27752 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 CjrMi` literal 0 HcmV?d00001 diff --git a/core/fixtures/images/sas/Shichimi/2022-06-30_Asleep_by-David-Revoy.jpg b/core/fixtures/images/sas/Shichimi/2022-06-30_Asleep_by-David-Revoy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96ecbec60200c0d857fcb8487672e6a8d4aabc8c GIT binary patch literal 31281 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